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

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

Pull clk updates from Stephen Boyd:
"This time we have a good set of changes to the core framework that do
some general cleanups, but nothing too major. The majority of the diff
goes to two SoCs, Actions Semi and Qualcomm. A brand new driver is
introduced for Actions Semi so it takes up some lines to add all the
different types, and the Qualcomm diff is there because we add support
for two SoCs and it's quite a bit of data.

Otherwise the big driver updates are on TI Davinci and Amlogic
platforms. And then the long tail of driver updates for various fixes
and stuff follows after that.

Core:
- debugfs cleanups removing error checking and an unused provider API
- Removal of a clk init typedef that isn't used
- Usage of match_string() to simplify parent string name matching
- OF clk helpers moved to their own file (linux/of_clk.h)
- Make clk warnings more readable across kernel versions

New Drivers:
- Qualcomm SDM845 GCC and Video clk controllers
- Qualcomm MSM8998 GCC
- Actions Semi S900 SoC support
- Nuvoton npcm750 microcontroller clks
- Amlogic axg AO clock controller

Removed Drivers:
- Deprecated Rockchip clk-gate driver

Updates:
- debugfs functions stopped checking return values
- Support for the MSIOF module clocks on Rensas R-Car M3-N
- Support for the new Rensas RZ/G1C and R-Car E3 SoCs
- Qualcomm GDSC, RCG, and PLL updates for clk changes in new SoCs
- Berlin and Amlogic SPDX tagging
- Usage of of_clk_get_parent_count() in more places
- Proper implementation of the CDEV1/2 clocks on Tegra20
- Allwinner H6 PRCM clock support and R40 EMAC support
- Add critical flag to meson8b's fdiv2 as temporary fixup for ethernet
- Round closest support for meson's mpll driver
- Support for meson8b nand clocks and gxbb video decoder clocks
- Mediatek mali clks
- STM32MP1 fixes
- Uniphier LD11/LD20 stream demux system clock"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (134 commits)
clk: qcom: Export clk_fabia_pll_configure()
clk: bcm: Update and add Stingray clock entries
dt-bindings: clk: Update Stingray binding doc
clk-si544: Properly round requested frequency to nearest match
clk: ingenic: jz4770: Add 150us delay after enabling VPU clock
clk: ingenic: jz4770: Enable power of AHB1 bus after ungating VPU clock
clk: ingenic: jz4770: Modify C1CLK clock to disable CPU clock stop on idle
clk: ingenic: jz4770: Change OTG from custom to standard gated clock
clk: ingenic: Support specifying "wait for clock stable" delay
clk: ingenic: Add support for clocks whose gate bit is inverted
clk: use match_string() helper
clk: bcm2835: use match_string() helper
clk: Return void from debug_init op
clk: remove clk_debugfs_add_file()
clk: tegra: no need to check return value of debugfs_create functions
clk: davinci: no need to check return value of debugfs_create functions
clk: bcm2835: no need to check return value of debugfs_create functions
clk: no need to check return value of debugfs_create functions
clk: imx6: add EPIT clock support
clk: mvebu: use correct bit for 98DX3236 NAND
...

+13843 -1313
+30
Documentation/devicetree/bindings/arm/mediatek/mediatek,g3dsys.txt
··· 1 + MediaTek g3dsys controller 2 + ============================ 3 + 4 + The MediaTek g3dsys controller provides various clocks and reset controller to 5 + the GPU. 6 + 7 + Required Properties: 8 + 9 + - compatible: Should be: 10 + - "mediatek,mt2701-g3dsys", "syscon": 11 + for MT2701 SoC 12 + - "mediatek,mt7623-g3dsys", "mediatek,mt2701-g3dsys", "syscon": 13 + for MT7623 SoC 14 + - #clock-cells: Must be 1 15 + - #reset-cells: Must be 1 16 + 17 + The g3dsys controller uses the common clk binding from 18 + Documentation/devicetree/bindings/clock/clock-bindings.txt 19 + The available clocks are defined in dt-bindings/clock/mt*-clk.h. 20 + 21 + Example: 22 + 23 + g3dsys: clock-controller@13000000 { 24 + compatible = "mediatek,mt7623-g3dsys", 25 + "mediatek,mt2701-g3dsys", 26 + "syscon"; 27 + reg = <0 0x13000000 0 0x200>; 28 + #clock-cells = <1>; 29 + #reset-cells = <1>; 30 + };
+47
Documentation/devicetree/bindings/clock/actions,s900-cmu.txt
··· 1 + * Actions S900 Clock Management Unit (CMU) 2 + 3 + The Actions S900 clock management unit generates and supplies clock to various 4 + controllers within the SoC. The clock binding described here is applicable to 5 + S900 SoC. 6 + 7 + Required Properties: 8 + 9 + - compatible: should be "actions,s900-cmu" 10 + - reg: physical base address of the controller and length of memory mapped 11 + region. 12 + - clocks: Reference to the parent clocks ("hosc", "losc") 13 + - #clock-cells: should be 1. 14 + 15 + Each clock is assigned an identifier, and client nodes can use this identifier 16 + to specify the clock which they consume. 17 + 18 + All available clocks are defined as preprocessor macros in 19 + dt-bindings/clock/actions,s900-cmu.h header and can be used in device 20 + tree sources. 21 + 22 + External clocks: 23 + 24 + The hosc clock used as input for the plls is generated outside the SoC. It is 25 + expected that it is defined using standard clock bindings as "hosc". 26 + 27 + Actions S900 CMU also requires one more clock: 28 + - "losc" - internal low frequency oscillator 29 + 30 + Example: Clock Management Unit node: 31 + 32 + cmu: clock-controller@e0160000 { 33 + compatible = "actions,s900-cmu"; 34 + reg = <0x0 0xe0160000 0x0 0x1000>; 35 + clocks = <&hosc>, <&losc>; 36 + #clock-cells = <1>; 37 + }; 38 + 39 + Example: UART controller node that consumes clock generated by the clock 40 + management unit: 41 + 42 + uart: serial@e012a000 { 43 + compatible = "actions,s900-uart", "actions,owl-uart"; 44 + reg = <0x0 0xe012a000 0x0 0x2000>; 45 + interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>; 46 + clocks = <&cmu CLK_UART5>; 47 + };
+1
Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt
··· 9 9 - GXBB (S905) : "amlogic,meson-gxbb-aoclkc" 10 10 - GXL (S905X, S905D) : "amlogic,meson-gxl-aoclkc" 11 11 - GXM (S912) : "amlogic,meson-gxm-aoclkc" 12 + - AXG (A113D, A113X) : "amlogic,meson-axg-aoclkc" 12 13 followed by the common "amlogic,meson-gx-aoclkc" 13 14 14 15 - #clock-cells: should be 1.
+14 -12
Documentation/devicetree/bindings/clock/brcm,iproc-clocks.txt
··· 276 276 clk_ts_500_ref genpll2 2 BCM_SR_GENPLL2_TS_500_REF_CLK 277 277 clk_125_nitro genpll2 3 BCM_SR_GENPLL2_125_NITRO_CLK 278 278 clk_chimp genpll2 4 BCM_SR_GENPLL2_CHIMP_CLK 279 - clk_nic_flash genpll2 5 BCM_SR_GENPLL2_NIC_FLASH 279 + clk_nic_flash genpll2 5 BCM_SR_GENPLL2_NIC_FLASH_CLK 280 + clk_fs genpll2 6 BCM_SR_GENPLL2_FS_CLK 280 281 281 282 genpll3 crystal 0 BCM_SR_GENPLL3 282 283 clk_hsls genpll3 1 BCM_SR_GENPLL3_HSLS_CLK 283 284 clk_sdio genpll3 2 BCM_SR_GENPLL3_SDIO_CLK 284 285 285 286 genpll4 crystal 0 BCM_SR_GENPLL4 286 - ccn genpll4 1 BCM_SR_GENPLL4_CCN_CLK 287 + clk_ccn genpll4 1 BCM_SR_GENPLL4_CCN_CLK 287 288 clk_tpiu_pll genpll4 2 BCM_SR_GENPLL4_TPIU_PLL_CLK 288 - noc_clk genpll4 3 BCM_SR_GENPLL4_NOC_CLK 289 + clk_noc genpll4 3 BCM_SR_GENPLL4_NOC_CLK 289 290 clk_chclk_fs4 genpll4 4 BCM_SR_GENPLL4_CHCLK_FS4_CLK 290 291 clk_bridge_fscpu genpll4 5 BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK 291 292 292 - 293 293 genpll5 crystal 0 BCM_SR_GENPLL5 294 - fs4_hf_clk genpll5 1 BCM_SR_GENPLL5_FS4_HF_CLK 295 - crypto_ae_clk genpll5 2 BCM_SR_GENPLL5_CRYPTO_AE_CLK 296 - raid_ae_clk genpll5 3 BCM_SR_GENPLL5_RAID_AE_CLK 294 + clk_fs4_hf genpll5 1 BCM_SR_GENPLL5_FS4_HF_CLK 295 + clk_crypto_ae genpll5 2 BCM_SR_GENPLL5_CRYPTO_AE_CLK 296 + clk_raid_ae genpll5 3 BCM_SR_GENPLL5_RAID_AE_CLK 297 297 298 298 genpll6 crystal 0 BCM_SR_GENPLL6 299 - 48_usb genpll6 1 BCM_SR_GENPLL6_48_USB_CLK 299 + clk_48_usb genpll6 1 BCM_SR_GENPLL6_48_USB_CLK 300 300 301 301 lcpll0 crystal 0 BCM_SR_LCPLL0 302 302 clk_sata_refp lcpll0 1 BCM_SR_LCPLL0_SATA_REFP_CLK 303 303 clk_sata_refn lcpll0 2 BCM_SR_LCPLL0_SATA_REFN_CLK 304 - clk_usb_ref lcpll0 3 BCM_SR_LCPLL0_USB_REF_CLK 305 - sata_refpn lcpll0 3 BCM_SR_LCPLL0_SATA_REFPN_CLK 304 + clk_sata_350 lcpll0 3 BCM_SR_LCPLL0_SATA_350_CLK 305 + clk_sata_500 lcpll0 4 BCM_SR_LCPLL0_SATA_500_CLK 306 306 307 307 lcpll1 crystal 0 BCM_SR_LCPLL1 308 - wan lcpll1 1 BCM_SR_LCPLL0_WAN_CLK 308 + clk_wan lcpll1 1 BCM_SR_LCPLL1_WAN_CLK 309 + clk_usb_ref lcpll1 2 BCM_SR_LCPLL1_USB_REF_CLK 310 + clk_crmu_ts lcpll1 3 BCM_SR_LCPLL1_CRMU_TS_CLK 309 311 310 312 lcpll_pcie crystal 0 BCM_SR_LCPLL_PCIE 311 - pcie_phy_ref lcpll1 1 BCM_SR_LCPLL_PCIE_PHY_REF_CLK 313 + clk_pcie_phy_ref lcpll1 1 BCM_SR_LCPLL_PCIE_PHY_REF_CLK
+100
Documentation/devicetree/bindings/clock/nuvoton,npcm750-clk.txt
··· 1 + * Nuvoton NPCM7XX Clock Controller 2 + 3 + Nuvoton Poleg BMC NPCM7XX contains an integrated clock controller, which 4 + generates and supplies clocks to all modules within the BMC. 5 + 6 + External clocks: 7 + 8 + There are six fixed clocks that are generated outside the BMC. All clocks are of 9 + a known fixed value that cannot be changed. clk_refclk, clk_mcbypck and 10 + clk_sysbypck are inputs to the clock controller. 11 + clk_rg1refck, clk_rg2refck and clk_xin are external clocks suppling the 12 + network. They are set on the device tree, but not used by the clock module. The 13 + network devices use them directly. 14 + Example can be found below. 15 + 16 + All available clocks are defined as preprocessor macros in: 17 + dt-bindings/clock/nuvoton,npcm7xx-clock.h 18 + and can be reused as DT sources. 19 + 20 + Required Properties of clock controller: 21 + 22 + - compatible: "nuvoton,npcm750-clk" : for clock controller of Nuvoton 23 + Poleg BMC NPCM750 24 + 25 + - reg: physical base address of the clock controller and length of 26 + memory mapped region. 27 + 28 + - #clock-cells: should be 1. 29 + 30 + Example: Clock controller node: 31 + 32 + clk: clock-controller@f0801000 { 33 + compatible = "nuvoton,npcm750-clk"; 34 + #clock-cells = <1>; 35 + reg = <0xf0801000 0x1000>; 36 + clock-names = "refclk", "sysbypck", "mcbypck"; 37 + clocks = <&clk_refclk>, <&clk_sysbypck>, <&clk_mcbypck>; 38 + }; 39 + 40 + Example: Required external clocks for network: 41 + 42 + /* external reference clock */ 43 + clk_refclk: clk-refclk { 44 + compatible = "fixed-clock"; 45 + #clock-cells = <0>; 46 + clock-frequency = <25000000>; 47 + clock-output-names = "refclk"; 48 + }; 49 + 50 + /* external reference clock for cpu. float in normal operation */ 51 + clk_sysbypck: clk-sysbypck { 52 + compatible = "fixed-clock"; 53 + #clock-cells = <0>; 54 + clock-frequency = <800000000>; 55 + clock-output-names = "sysbypck"; 56 + }; 57 + 58 + /* external reference clock for MC. float in normal operation */ 59 + clk_mcbypck: clk-mcbypck { 60 + compatible = "fixed-clock"; 61 + #clock-cells = <0>; 62 + clock-frequency = <800000000>; 63 + clock-output-names = "mcbypck"; 64 + }; 65 + 66 + /* external clock signal rg1refck, supplied by the phy */ 67 + clk_rg1refck: clk-rg1refck { 68 + compatible = "fixed-clock"; 69 + #clock-cells = <0>; 70 + clock-frequency = <125000000>; 71 + clock-output-names = "clk_rg1refck"; 72 + }; 73 + 74 + /* external clock signal rg2refck, supplied by the phy */ 75 + clk_rg2refck: clk-rg2refck { 76 + compatible = "fixed-clock"; 77 + #clock-cells = <0>; 78 + clock-frequency = <125000000>; 79 + clock-output-names = "clk_rg2refck"; 80 + }; 81 + 82 + clk_xin: clk-xin { 83 + compatible = "fixed-clock"; 84 + #clock-cells = <0>; 85 + clock-frequency = <50000000>; 86 + clock-output-names = "clk_xin"; 87 + }; 88 + 89 + 90 + Example: GMAC controller node that consumes two clocks: a generated clk by the 91 + clock controller and a fixed clock from DT (clk_rg1refck). 92 + 93 + ethernet0: ethernet@f0802000 { 94 + compatible = "snps,dwmac"; 95 + reg = <0xf0802000 0x2000>; 96 + interrupts = <0 14 4>; 97 + interrupt-names = "macirq"; 98 + clocks = <&clk_rg1refck>, <&clk NPCM7XX_CLK_AHB>; 99 + clock-names = "stmmaceth", "clk_gmac"; 100 + };
+2
Documentation/devicetree/bindings/clock/qcom,gcc.txt
··· 17 17 "qcom,gcc-msm8974pro-ac" 18 18 "qcom,gcc-msm8994" 19 19 "qcom,gcc-msm8996" 20 + "qcom,gcc-msm8998" 20 21 "qcom,gcc-mdm9615" 22 + "qcom,gcc-sdm845" 21 23 22 24 - reg : shall contain base register location and length 23 25 - #clock-cells : shall contain 1
+22
Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt
··· 1 + Qualcomm Technologies, Inc. RPMh Clocks 2 + ------------------------------------------------------- 3 + 4 + Resource Power Manager Hardened (RPMh) manages shared resources on 5 + some Qualcomm Technologies Inc. SoCs. It accepts clock requests from 6 + other hardware subsystems via RSC to control clocks. 7 + 8 + Required properties : 9 + - compatible : shall contain "qcom,sdm845-rpmh-clk" 10 + 11 + - #clock-cells : must contain 1 12 + 13 + Example : 14 + 15 + #include <dt-bindings/clock/qcom,rpmh.h> 16 + 17 + &apps_rsc { 18 + rpmhcc: clock-controller { 19 + compatible = "qcom,sdm845-rpmh-clk"; 20 + #clock-cells = <1>; 21 + }; 22 + };
+19
Documentation/devicetree/bindings/clock/qcom,videocc.txt
··· 1 + Qualcomm Video Clock & Reset Controller Binding 2 + ----------------------------------------------- 3 + 4 + Required properties : 5 + - compatible : shall contain "qcom,sdm845-videocc" 6 + - reg : shall contain base register location and length 7 + - #clock-cells : from common clock binding, shall contain 1. 8 + - #power-domain-cells : from generic power domain binding, shall contain 1. 9 + 10 + Optional properties : 11 + - #reset-cells : from common reset binding, shall contain 1. 12 + 13 + Example: 14 + videocc: clock-controller@ab00000 { 15 + compatible = "qcom,sdm845-videocc"; 16 + reg = <0xab00000 0x10000>; 17 + #clock-cells = <1>; 18 + #power-domain-cells = <1>; 19 + };
+7 -3
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
··· 15 15 - compatible: Must be one of: 16 16 - "renesas,r8a7743-cpg-mssr" for the r8a7743 SoC (RZ/G1M) 17 17 - "renesas,r8a7745-cpg-mssr" for the r8a7745 SoC (RZ/G1E) 18 + - "renesas,r8a77470-cpg-mssr" for the r8a77470 SoC (RZ/G1C) 18 19 - "renesas,r8a7790-cpg-mssr" for the r8a7790 SoC (R-Car H2) 19 20 - "renesas,r8a7791-cpg-mssr" for the r8a7791 SoC (R-Car M2-W) 20 21 - "renesas,r8a7792-cpg-mssr" for the r8a7792 SoC (R-Car V2H) ··· 26 25 - "renesas,r8a77965-cpg-mssr" for the r8a77965 SoC (R-Car M3-N) 27 26 - "renesas,r8a77970-cpg-mssr" for the r8a77970 SoC (R-Car V3M) 28 27 - "renesas,r8a77980-cpg-mssr" for the r8a77980 SoC (R-Car V3H) 28 + - "renesas,r8a77990-cpg-mssr" for the r8a77990 SoC (R-Car E3) 29 29 - "renesas,r8a77995-cpg-mssr" for the r8a77995 SoC (R-Car D3) 30 30 31 31 - reg: Base address and length of the memory resource used by the CPG/MSSR ··· 35 33 - clocks: References to external parent clocks, one entry for each entry in 36 34 clock-names 37 35 - clock-names: List of external parent clock names. Valid names are: 38 - - "extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794, 39 - r8a7795, r8a7796, r8a77965, r8a77970, r8a77980, r8a77995) 36 + - "extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7792, 37 + r8a7793, r8a7794, r8a7795, r8a7796, r8a77965, r8a77970, 38 + r8a77980, r8a77990, r8a77995) 40 39 - "extalr" (r8a7795, r8a7796, r8a77965, r8a77970, r8a77980) 41 - - "usb_extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7793, r8a7794) 40 + - "usb_extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7793, 41 + r8a7794) 42 42 43 43 - #clock-cells: Must be 2 44 44 - For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
-77
Documentation/devicetree/bindings/clock/rockchip.txt
··· 1 - Device Tree Clock bindings for arch-rockchip 2 - 3 - This binding uses the common clock binding[1]. 4 - 5 - [1] Documentation/devicetree/bindings/clock/clock-bindings.txt 6 - 7 - == Gate clocks == 8 - 9 - These bindings are deprecated! 10 - Please use the soc specific CRU bindings instead. 11 - 12 - The gate registers form a continuos block which makes the dt node 13 - structure a matter of taste, as either all gates can be put into 14 - one gate clock spanning all registers or they can be divided into 15 - the 10 individual gates containing 16 clocks each. 16 - The code supports both approaches. 17 - 18 - Required properties: 19 - - compatible : "rockchip,rk2928-gate-clk" 20 - - reg : shall be the control register address(es) for the clock. 21 - - #clock-cells : from common clock binding; shall be set to 1 22 - - clock-output-names : the corresponding gate names that the clock controls 23 - - clocks : should contain the parent clock for each individual gate, 24 - therefore the number of clocks elements should match the number of 25 - clock-output-names 26 - 27 - Example using multiple gate clocks: 28 - 29 - clk_gates0: gate-clk@200000d0 { 30 - compatible = "rockchip,rk2928-gate-clk"; 31 - reg = <0x200000d0 0x4>; 32 - clocks = <&dummy>, <&dummy>, 33 - <&dummy>, <&dummy>, 34 - <&dummy>, <&dummy>, 35 - <&dummy>, <&dummy>, 36 - <&dummy>, <&dummy>, 37 - <&dummy>, <&dummy>, 38 - <&dummy>, <&dummy>, 39 - <&dummy>, <&dummy>; 40 - 41 - clock-output-names = 42 - "gate_core_periph", "gate_cpu_gpll", 43 - "gate_ddrphy", "gate_aclk_cpu", 44 - "gate_hclk_cpu", "gate_pclk_cpu", 45 - "gate_atclk_cpu", "gate_i2s0", 46 - "gate_i2s0_frac", "gate_i2s1", 47 - "gate_i2s1_frac", "gate_i2s2", 48 - "gate_i2s2_frac", "gate_spdif", 49 - "gate_spdif_frac", "gate_testclk"; 50 - 51 - #clock-cells = <1>; 52 - }; 53 - 54 - clk_gates1: gate-clk@200000d4 { 55 - compatible = "rockchip,rk2928-gate-clk"; 56 - reg = <0x200000d4 0x4>; 57 - clocks = <&xin24m>, <&xin24m>, 58 - <&xin24m>, <&dummy>, 59 - <&dummy>, <&xin24m>, 60 - <&xin24m>, <&dummy>, 61 - <&xin24m>, <&dummy>, 62 - <&xin24m>, <&dummy>, 63 - <&xin24m>, <&dummy>, 64 - <&xin24m>, <&dummy>; 65 - 66 - clock-output-names = 67 - "gate_timer0", "gate_timer1", 68 - "gate_timer2", "gate_jtag", 69 - "gate_aclk_lcdc1_src", "gate_otgphy0", 70 - "gate_otgphy1", "gate_ddr_gpll", 71 - "gate_uart0", "gate_frac_uart0", 72 - "gate_uart1", "gate_frac_uart1", 73 - "gate_uart2", "gate_frac_uart2", 74 - "gate_uart3", "gate_frac_uart3"; 75 - 76 - #clock-cells = <1>; 77 - };
+2 -1
Documentation/devicetree/bindings/clock/sunxi-ccu.txt
··· 21 21 - "allwinner,sun50i-a64-r-ccu" 22 22 - "allwinner,sun50i-h5-ccu" 23 23 - "allwinner,sun50i-h6-ccu" 24 + - "allwinner,sun50i-h6-r-ccu" 24 25 - "nextthing,gr8-ccu" 25 26 26 27 - reg: Must contain the registers base address and length ··· 36 35 For the main CCU on H6, one more clock is needed: 37 36 - "iosc": the SoC's internal frequency oscillator 38 37 39 - For the PRCM CCUs on A83T/H3/A64, two more clocks are needed: 38 + For the PRCM CCUs on A83T/H3/A64/H6, two more clocks are needed: 40 39 - "pll-periph": the SoC's peripheral PLL from the main CCU 41 40 - "iosc": the SoC's internal frequency oscillator 42 41
+1 -1
Documentation/driver-api/clk.rst
··· 96 96 int (*get_phase)(struct clk_hw *hw); 97 97 int (*set_phase)(struct clk_hw *hw, int degrees); 98 98 void (*init)(struct clk_hw *hw); 99 - int (*debug_init)(struct clk_hw *hw, 99 + void (*debug_init)(struct clk_hw *hw, 100 100 struct dentry *dentry); 101 101 }; 102 102
+1
MAINTAINERS
··· 3587 3587 X: drivers/clk/clkdev.c 3588 3588 F: include/linux/clk-pr* 3589 3589 F: include/linux/clk/ 3590 + F: include/linux/of_clk.h 3590 3591 3591 3592 COMMON INTERNET FILE SYSTEM (CIFS) 3592 3593 M: Steve French <sfrench@samba.org>
+1 -1
arch/arm/boot/dts/imx7d.dtsi
··· 120 120 <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>, 121 121 <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>, 122 122 <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; 123 - clocks = <&clks IMX7D_ENET_AXI_ROOT_CLK>, 123 + clocks = <&clks IMX7D_ENET2_IPG_ROOT_CLK>, 124 124 <&clks IMX7D_ENET_AXI_ROOT_CLK>, 125 125 <&clks IMX7D_ENET2_TIME_ROOT_CLK>, 126 126 <&clks IMX7D_PLL_ENET_MAIN_125M_CLK>,
+1 -1
arch/arm/boot/dts/imx7s.dtsi
··· 1092 1092 <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, 1093 1093 <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>, 1094 1094 <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; 1095 - clocks = <&clks IMX7D_ENET_AXI_ROOT_CLK>, 1095 + clocks = <&clks IMX7D_ENET1_IPG_ROOT_CLK>, 1096 1096 <&clks IMX7D_ENET_AXI_ROOT_CLK>, 1097 1097 <&clks IMX7D_ENET1_TIME_ROOT_CLK>, 1098 1098 <&clks IMX7D_PLL_ENET_MAIN_125M_CLK>,
+1
drivers/clk/Kconfig
··· 277 277 ---help--- 278 278 Support for stm32h7 SoC family clocks 279 279 280 + source "drivers/clk/actions/Kconfig" 280 281 source "drivers/clk/bcm/Kconfig" 281 282 source "drivers/clk/hisilicon/Kconfig" 282 283 source "drivers/clk/imgtec/Kconfig"
+2
drivers/clk/Makefile
··· 33 33 obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o 34 34 obj-$(CONFIG_ARCH_MOXART) += clk-moxart.o 35 35 obj-$(CONFIG_ARCH_NOMADIK) += clk-nomadik.o 36 + obj-$(CONFIG_ARCH_NPCM7XX) += clk-npcm7xx.o 36 37 obj-$(CONFIG_ARCH_NSPIRE) += clk-nspire.o 37 38 obj-$(CONFIG_COMMON_CLK_OXNAS) += clk-oxnas.o 38 39 obj-$(CONFIG_COMMON_CLK_PALMAS) += clk-palmas.o ··· 60 59 obj-$(CONFIG_COMMON_CLK_XGENE) += clk-xgene.o 61 60 62 61 # please keep this section sorted lexicographically by directory path name 62 + obj-y += actions/ 63 63 obj-$(CONFIG_COMMON_CLK_AT91) += at91/ 64 64 obj-$(CONFIG_ARCH_ARTPEC) += axis/ 65 65 obj-$(CONFIG_ARC_PLAT_AXS10X) += axs10x/
+14
drivers/clk/actions/Kconfig
··· 1 + config CLK_ACTIONS 2 + bool "Clock driver for Actions Semi SoCs" 3 + depends on ARCH_ACTIONS || COMPILE_TEST 4 + default ARCH_ACTIONS 5 + 6 + if CLK_ACTIONS 7 + 8 + # SoC Drivers 9 + 10 + config CLK_OWL_S900 11 + bool "Support for the Actions Semi OWL S900 clocks" 12 + depends on (ARM64 && ARCH_ACTIONS) || COMPILE_TEST 13 + default ARM64 && ARCH_ACTIONS 14 + endif
+12
drivers/clk/actions/Makefile
··· 1 + obj-$(CONFIG_CLK_ACTIONS) += clk-owl.o 2 + 3 + clk-owl-y += owl-common.o 4 + clk-owl-y += owl-gate.o 5 + clk-owl-y += owl-mux.o 6 + clk-owl-y += owl-divider.o 7 + clk-owl-y += owl-factor.o 8 + clk-owl-y += owl-composite.o 9 + clk-owl-y += owl-pll.o 10 + 11 + # SoC support 12 + obj-$(CONFIG_CLK_OWL_S900) += owl-s900.o
+89
drivers/clk/actions/owl-common.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL common clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/of_address.h> 12 + #include <linux/of_platform.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/regmap.h> 15 + 16 + #include "owl-common.h" 17 + 18 + static const struct regmap_config owl_regmap_config = { 19 + .reg_bits = 32, 20 + .reg_stride = 4, 21 + .val_bits = 32, 22 + .max_register = 0x00cc, 23 + .fast_io = true, 24 + }; 25 + 26 + static void owl_clk_set_regmap(const struct owl_clk_desc *desc, 27 + struct regmap *regmap) 28 + { 29 + int i; 30 + struct owl_clk_common *clks; 31 + 32 + for (i = 0; i < desc->num_clks; i++) { 33 + clks = desc->clks[i]; 34 + if (!clks) 35 + continue; 36 + 37 + clks->regmap = regmap; 38 + } 39 + } 40 + 41 + int owl_clk_regmap_init(struct platform_device *pdev, 42 + const struct owl_clk_desc *desc) 43 + { 44 + void __iomem *base; 45 + struct regmap *regmap; 46 + struct resource *res; 47 + 48 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 49 + base = devm_ioremap_resource(&pdev->dev, res); 50 + if (IS_ERR(base)) 51 + return PTR_ERR(base); 52 + 53 + regmap = devm_regmap_init_mmio(&pdev->dev, base, &owl_regmap_config); 54 + if (IS_ERR(regmap)) { 55 + pr_err("failed to init regmap\n"); 56 + return PTR_ERR(regmap); 57 + } 58 + 59 + owl_clk_set_regmap(desc, regmap); 60 + 61 + return 0; 62 + } 63 + 64 + int owl_clk_probe(struct device *dev, struct clk_hw_onecell_data *hw_clks) 65 + { 66 + int i, ret; 67 + struct clk_hw *hw; 68 + 69 + for (i = 0; i < hw_clks->num; i++) { 70 + 71 + hw = hw_clks->hws[i]; 72 + 73 + if (IS_ERR_OR_NULL(hw)) 74 + continue; 75 + 76 + ret = devm_clk_hw_register(dev, hw); 77 + if (ret) { 78 + dev_err(dev, "Couldn't register clock %d - %s\n", 79 + i, hw->init->name); 80 + return ret; 81 + } 82 + } 83 + 84 + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, hw_clks); 85 + if (ret) 86 + dev_err(dev, "Failed to add clock provider\n"); 87 + 88 + return ret; 89 + }
+41
drivers/clk/actions/owl-common.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL common clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_COMMON_H_ 12 + #define _OWL_COMMON_H_ 13 + 14 + #include <linux/clk-provider.h> 15 + #include <linux/of_platform.h> 16 + #include <linux/regmap.h> 17 + 18 + struct device_node; 19 + 20 + struct owl_clk_common { 21 + struct regmap *regmap; 22 + struct clk_hw hw; 23 + }; 24 + 25 + struct owl_clk_desc { 26 + struct owl_clk_common **clks; 27 + unsigned long num_clks; 28 + struct clk_hw_onecell_data *hw_clks; 29 + }; 30 + 31 + static inline struct owl_clk_common * 32 + hw_to_owl_clk_common(const struct clk_hw *hw) 33 + { 34 + return container_of(hw, struct owl_clk_common, hw); 35 + } 36 + 37 + int owl_clk_regmap_init(struct platform_device *pdev, 38 + const struct owl_clk_desc *desc); 39 + int owl_clk_probe(struct device *dev, struct clk_hw_onecell_data *hw_clks); 40 + 41 + #endif /* _OWL_COMMON_H_ */
+199
drivers/clk/actions/owl-composite.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL composite clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/regmap.h> 13 + 14 + #include "owl-composite.h" 15 + 16 + static u8 owl_comp_get_parent(struct clk_hw *hw) 17 + { 18 + struct owl_composite *comp = hw_to_owl_comp(hw); 19 + 20 + return owl_mux_helper_get_parent(&comp->common, &comp->mux_hw); 21 + } 22 + 23 + static int owl_comp_set_parent(struct clk_hw *hw, u8 index) 24 + { 25 + struct owl_composite *comp = hw_to_owl_comp(hw); 26 + 27 + return owl_mux_helper_set_parent(&comp->common, &comp->mux_hw, index); 28 + } 29 + 30 + static void owl_comp_disable(struct clk_hw *hw) 31 + { 32 + struct owl_composite *comp = hw_to_owl_comp(hw); 33 + struct owl_clk_common *common = &comp->common; 34 + 35 + owl_gate_set(common, &comp->gate_hw, false); 36 + } 37 + 38 + static int owl_comp_enable(struct clk_hw *hw) 39 + { 40 + struct owl_composite *comp = hw_to_owl_comp(hw); 41 + struct owl_clk_common *common = &comp->common; 42 + 43 + owl_gate_set(common, &comp->gate_hw, true); 44 + 45 + return 0; 46 + } 47 + 48 + static int owl_comp_is_enabled(struct clk_hw *hw) 49 + { 50 + struct owl_composite *comp = hw_to_owl_comp(hw); 51 + struct owl_clk_common *common = &comp->common; 52 + 53 + return owl_gate_clk_is_enabled(common, &comp->gate_hw); 54 + } 55 + 56 + static long owl_comp_div_round_rate(struct clk_hw *hw, unsigned long rate, 57 + unsigned long *parent_rate) 58 + { 59 + struct owl_composite *comp = hw_to_owl_comp(hw); 60 + 61 + return owl_divider_helper_round_rate(&comp->common, &comp->rate.div_hw, 62 + rate, parent_rate); 63 + } 64 + 65 + static unsigned long owl_comp_div_recalc_rate(struct clk_hw *hw, 66 + unsigned long parent_rate) 67 + { 68 + struct owl_composite *comp = hw_to_owl_comp(hw); 69 + 70 + return owl_divider_helper_recalc_rate(&comp->common, &comp->rate.div_hw, 71 + parent_rate); 72 + } 73 + 74 + static int owl_comp_div_set_rate(struct clk_hw *hw, unsigned long rate, 75 + unsigned long parent_rate) 76 + { 77 + struct owl_composite *comp = hw_to_owl_comp(hw); 78 + 79 + return owl_divider_helper_set_rate(&comp->common, &comp->rate.div_hw, 80 + rate, parent_rate); 81 + } 82 + 83 + static long owl_comp_fact_round_rate(struct clk_hw *hw, unsigned long rate, 84 + unsigned long *parent_rate) 85 + { 86 + struct owl_composite *comp = hw_to_owl_comp(hw); 87 + 88 + return owl_factor_helper_round_rate(&comp->common, 89 + &comp->rate.factor_hw, 90 + rate, parent_rate); 91 + } 92 + 93 + static unsigned long owl_comp_fact_recalc_rate(struct clk_hw *hw, 94 + unsigned long parent_rate) 95 + { 96 + struct owl_composite *comp = hw_to_owl_comp(hw); 97 + 98 + return owl_factor_helper_recalc_rate(&comp->common, 99 + &comp->rate.factor_hw, 100 + parent_rate); 101 + } 102 + 103 + static int owl_comp_fact_set_rate(struct clk_hw *hw, unsigned long rate, 104 + unsigned long parent_rate) 105 + { 106 + struct owl_composite *comp = hw_to_owl_comp(hw); 107 + 108 + return owl_factor_helper_set_rate(&comp->common, 109 + &comp->rate.factor_hw, 110 + rate, parent_rate); 111 + } 112 + 113 + static long owl_comp_fix_fact_round_rate(struct clk_hw *hw, unsigned long rate, 114 + unsigned long *parent_rate) 115 + { 116 + struct owl_composite *comp = hw_to_owl_comp(hw); 117 + struct clk_fixed_factor *fix_fact_hw = &comp->rate.fix_fact_hw; 118 + 119 + return comp->fix_fact_ops->round_rate(&fix_fact_hw->hw, rate, parent_rate); 120 + } 121 + 122 + static unsigned long owl_comp_fix_fact_recalc_rate(struct clk_hw *hw, 123 + unsigned long parent_rate) 124 + { 125 + struct owl_composite *comp = hw_to_owl_comp(hw); 126 + struct clk_fixed_factor *fix_fact_hw = &comp->rate.fix_fact_hw; 127 + 128 + return comp->fix_fact_ops->recalc_rate(&fix_fact_hw->hw, parent_rate); 129 + 130 + } 131 + 132 + static int owl_comp_fix_fact_set_rate(struct clk_hw *hw, unsigned long rate, 133 + unsigned long parent_rate) 134 + { 135 + /* 136 + * We must report success but we can do so unconditionally because 137 + * owl_comp_fix_fact_round_rate returns values that ensure this call is 138 + * a nop. 139 + */ 140 + 141 + return 0; 142 + } 143 + 144 + const struct clk_ops owl_comp_div_ops = { 145 + /* mux_ops */ 146 + .get_parent = owl_comp_get_parent, 147 + .set_parent = owl_comp_set_parent, 148 + 149 + /* gate_ops */ 150 + .disable = owl_comp_disable, 151 + .enable = owl_comp_enable, 152 + .is_enabled = owl_comp_is_enabled, 153 + 154 + /* div_ops */ 155 + .round_rate = owl_comp_div_round_rate, 156 + .recalc_rate = owl_comp_div_recalc_rate, 157 + .set_rate = owl_comp_div_set_rate, 158 + }; 159 + 160 + 161 + const struct clk_ops owl_comp_fact_ops = { 162 + /* mux_ops */ 163 + .get_parent = owl_comp_get_parent, 164 + .set_parent = owl_comp_set_parent, 165 + 166 + /* gate_ops */ 167 + .disable = owl_comp_disable, 168 + .enable = owl_comp_enable, 169 + .is_enabled = owl_comp_is_enabled, 170 + 171 + /* fact_ops */ 172 + .round_rate = owl_comp_fact_round_rate, 173 + .recalc_rate = owl_comp_fact_recalc_rate, 174 + .set_rate = owl_comp_fact_set_rate, 175 + }; 176 + 177 + const struct clk_ops owl_comp_fix_fact_ops = { 178 + /* gate_ops */ 179 + .disable = owl_comp_disable, 180 + .enable = owl_comp_enable, 181 + .is_enabled = owl_comp_is_enabled, 182 + 183 + /* fix_fact_ops */ 184 + .round_rate = owl_comp_fix_fact_round_rate, 185 + .recalc_rate = owl_comp_fix_fact_recalc_rate, 186 + .set_rate = owl_comp_fix_fact_set_rate, 187 + }; 188 + 189 + 190 + const struct clk_ops owl_comp_pass_ops = { 191 + /* mux_ops */ 192 + .get_parent = owl_comp_get_parent, 193 + .set_parent = owl_comp_set_parent, 194 + 195 + /* gate_ops */ 196 + .disable = owl_comp_disable, 197 + .enable = owl_comp_enable, 198 + .is_enabled = owl_comp_is_enabled, 199 + };
+124
drivers/clk/actions/owl-composite.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL composite clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_COMPOSITE_H_ 12 + #define _OWL_COMPOSITE_H_ 13 + 14 + #include "owl-common.h" 15 + #include "owl-mux.h" 16 + #include "owl-gate.h" 17 + #include "owl-factor.h" 18 + #include "owl-fixed-factor.h" 19 + #include "owl-divider.h" 20 + 21 + union owl_rate { 22 + struct owl_divider_hw div_hw; 23 + struct owl_factor_hw factor_hw; 24 + struct clk_fixed_factor fix_fact_hw; 25 + }; 26 + 27 + struct owl_composite { 28 + struct owl_mux_hw mux_hw; 29 + struct owl_gate_hw gate_hw; 30 + union owl_rate rate; 31 + 32 + const struct clk_ops *fix_fact_ops; 33 + 34 + struct owl_clk_common common; 35 + }; 36 + 37 + #define OWL_COMP_DIV(_struct, _name, _parent, \ 38 + _mux, _gate, _div, _flags) \ 39 + struct owl_composite _struct = { \ 40 + .mux_hw = _mux, \ 41 + .gate_hw = _gate, \ 42 + .rate.div_hw = _div, \ 43 + .common = { \ 44 + .regmap = NULL, \ 45 + .hw.init = CLK_HW_INIT_PARENTS(_name, \ 46 + _parent, \ 47 + &owl_comp_div_ops,\ 48 + _flags), \ 49 + }, \ 50 + } 51 + 52 + #define OWL_COMP_DIV_FIXED(_struct, _name, _parent, \ 53 + _gate, _div, _flags) \ 54 + struct owl_composite _struct = { \ 55 + .gate_hw = _gate, \ 56 + .rate.div_hw = _div, \ 57 + .common = { \ 58 + .regmap = NULL, \ 59 + .hw.init = CLK_HW_INIT(_name, \ 60 + _parent, \ 61 + &owl_comp_div_ops,\ 62 + _flags), \ 63 + }, \ 64 + } 65 + 66 + #define OWL_COMP_FACTOR(_struct, _name, _parent, \ 67 + _mux, _gate, _factor, _flags) \ 68 + struct owl_composite _struct = { \ 69 + .mux_hw = _mux, \ 70 + .gate_hw = _gate, \ 71 + .rate.factor_hw = _factor, \ 72 + .common = { \ 73 + .regmap = NULL, \ 74 + .hw.init = CLK_HW_INIT_PARENTS(_name, \ 75 + _parent, \ 76 + &owl_comp_fact_ops,\ 77 + _flags), \ 78 + }, \ 79 + } 80 + 81 + #define OWL_COMP_FIXED_FACTOR(_struct, _name, _parent, \ 82 + _gate, _mul, _div, _flags) \ 83 + struct owl_composite _struct = { \ 84 + .gate_hw = _gate, \ 85 + .rate.fix_fact_hw.mult = _mul, \ 86 + .rate.fix_fact_hw.div = _div, \ 87 + .fix_fact_ops = &clk_fixed_factor_ops, \ 88 + .common = { \ 89 + .regmap = NULL, \ 90 + .hw.init = CLK_HW_INIT(_name, \ 91 + _parent, \ 92 + &owl_comp_fix_fact_ops,\ 93 + _flags), \ 94 + }, \ 95 + } 96 + 97 + #define OWL_COMP_PASS(_struct, _name, _parent, \ 98 + _mux, _gate, _flags) \ 99 + struct owl_composite _struct = { \ 100 + .mux_hw = _mux, \ 101 + .gate_hw = _gate, \ 102 + .common = { \ 103 + .regmap = NULL, \ 104 + .hw.init = CLK_HW_INIT_PARENTS(_name, \ 105 + _parent, \ 106 + &owl_comp_pass_ops,\ 107 + _flags), \ 108 + }, \ 109 + } 110 + 111 + static inline struct owl_composite *hw_to_owl_comp(const struct clk_hw *hw) 112 + { 113 + struct owl_clk_common *common = hw_to_owl_clk_common(hw); 114 + 115 + return container_of(common, struct owl_composite, common); 116 + } 117 + 118 + extern const struct clk_ops owl_comp_div_ops; 119 + extern const struct clk_ops owl_comp_fact_ops; 120 + extern const struct clk_ops owl_comp_fix_fact_ops; 121 + extern const struct clk_ops owl_comp_pass_ops; 122 + extern const struct clk_ops clk_fixed_factor_ops; 123 + 124 + #endif /* _OWL_COMPOSITE_H_ */
+94
drivers/clk/actions/owl-divider.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL divider clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/regmap.h> 13 + 14 + #include "owl-divider.h" 15 + 16 + long owl_divider_helper_round_rate(struct owl_clk_common *common, 17 + const struct owl_divider_hw *div_hw, 18 + unsigned long rate, 19 + unsigned long *parent_rate) 20 + { 21 + return divider_round_rate(&common->hw, rate, parent_rate, 22 + div_hw->table, div_hw->width, 23 + div_hw->div_flags); 24 + } 25 + 26 + static long owl_divider_round_rate(struct clk_hw *hw, unsigned long rate, 27 + unsigned long *parent_rate) 28 + { 29 + struct owl_divider *div = hw_to_owl_divider(hw); 30 + 31 + return owl_divider_helper_round_rate(&div->common, &div->div_hw, 32 + rate, parent_rate); 33 + } 34 + 35 + unsigned long owl_divider_helper_recalc_rate(struct owl_clk_common *common, 36 + const struct owl_divider_hw *div_hw, 37 + unsigned long parent_rate) 38 + { 39 + unsigned long val; 40 + unsigned int reg; 41 + 42 + regmap_read(common->regmap, div_hw->reg, &reg); 43 + val = reg >> div_hw->shift; 44 + val &= (1 << div_hw->width) - 1; 45 + 46 + return divider_recalc_rate(&common->hw, parent_rate, 47 + val, div_hw->table, 48 + div_hw->div_flags, 49 + div_hw->width); 50 + } 51 + 52 + static unsigned long owl_divider_recalc_rate(struct clk_hw *hw, 53 + unsigned long parent_rate) 54 + { 55 + struct owl_divider *div = hw_to_owl_divider(hw); 56 + 57 + return owl_divider_helper_recalc_rate(&div->common, 58 + &div->div_hw, parent_rate); 59 + } 60 + 61 + int owl_divider_helper_set_rate(const struct owl_clk_common *common, 62 + const struct owl_divider_hw *div_hw, 63 + unsigned long rate, 64 + unsigned long parent_rate) 65 + { 66 + unsigned long val; 67 + unsigned int reg; 68 + 69 + val = divider_get_val(rate, parent_rate, div_hw->table, 70 + div_hw->width, 0); 71 + 72 + regmap_read(common->regmap, div_hw->reg, &reg); 73 + reg &= ~GENMASK(div_hw->width + div_hw->shift - 1, div_hw->shift); 74 + 75 + regmap_write(common->regmap, div_hw->reg, 76 + reg | (val << div_hw->shift)); 77 + 78 + return 0; 79 + } 80 + 81 + static int owl_divider_set_rate(struct clk_hw *hw, unsigned long rate, 82 + unsigned long parent_rate) 83 + { 84 + struct owl_divider *div = hw_to_owl_divider(hw); 85 + 86 + return owl_divider_helper_set_rate(&div->common, &div->div_hw, 87 + rate, parent_rate); 88 + } 89 + 90 + const struct clk_ops owl_divider_ops = { 91 + .recalc_rate = owl_divider_recalc_rate, 92 + .round_rate = owl_divider_round_rate, 93 + .set_rate = owl_divider_set_rate, 94 + };
+75
drivers/clk/actions/owl-divider.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL divider clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_DIVIDER_H_ 12 + #define _OWL_DIVIDER_H_ 13 + 14 + #include "owl-common.h" 15 + 16 + struct owl_divider_hw { 17 + u32 reg; 18 + u8 shift; 19 + u8 width; 20 + u8 div_flags; 21 + struct clk_div_table *table; 22 + }; 23 + 24 + struct owl_divider { 25 + struct owl_divider_hw div_hw; 26 + struct owl_clk_common common; 27 + }; 28 + 29 + #define OWL_DIVIDER_HW(_reg, _shift, _width, _div_flags, _table) \ 30 + { \ 31 + .reg = _reg, \ 32 + .shift = _shift, \ 33 + .width = _width, \ 34 + .div_flags = _div_flags, \ 35 + .table = _table, \ 36 + } 37 + 38 + #define OWL_DIVIDER(_struct, _name, _parent, _reg, \ 39 + _shift, _width, _table, _div_flags, _flags) \ 40 + struct owl_divider _struct = { \ 41 + .div_hw = OWL_DIVIDER_HW(_reg, _shift, _width, \ 42 + _div_flags, _table), \ 43 + .common = { \ 44 + .regmap = NULL, \ 45 + .hw.init = CLK_HW_INIT(_name, \ 46 + _parent, \ 47 + &owl_divider_ops, \ 48 + _flags), \ 49 + }, \ 50 + } 51 + 52 + static inline struct owl_divider *hw_to_owl_divider(const struct clk_hw *hw) 53 + { 54 + struct owl_clk_common *common = hw_to_owl_clk_common(hw); 55 + 56 + return container_of(common, struct owl_divider, common); 57 + } 58 + 59 + long owl_divider_helper_round_rate(struct owl_clk_common *common, 60 + const struct owl_divider_hw *div_hw, 61 + unsigned long rate, 62 + unsigned long *parent_rate); 63 + 64 + unsigned long owl_divider_helper_recalc_rate(struct owl_clk_common *common, 65 + const struct owl_divider_hw *div_hw, 66 + unsigned long parent_rate); 67 + 68 + int owl_divider_helper_set_rate(const struct owl_clk_common *common, 69 + const struct owl_divider_hw *div_hw, 70 + unsigned long rate, 71 + unsigned long parent_rate); 72 + 73 + extern const struct clk_ops owl_divider_ops; 74 + 75 + #endif /* _OWL_DIVIDER_H_ */
+222
drivers/clk/actions/owl-factor.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL factor clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/regmap.h> 13 + #include <linux/slab.h> 14 + 15 + #include "owl-factor.h" 16 + 17 + static unsigned int _get_table_maxval(const struct clk_factor_table *table) 18 + { 19 + unsigned int maxval = 0; 20 + const struct clk_factor_table *clkt; 21 + 22 + for (clkt = table; clkt->div; clkt++) 23 + if (clkt->val > maxval) 24 + maxval = clkt->val; 25 + return maxval; 26 + } 27 + 28 + static int _get_table_div_mul(const struct clk_factor_table *table, 29 + unsigned int val, unsigned int *mul, unsigned int *div) 30 + { 31 + const struct clk_factor_table *clkt; 32 + 33 + for (clkt = table; clkt->div; clkt++) { 34 + if (clkt->val == val) { 35 + *mul = clkt->mul; 36 + *div = clkt->div; 37 + return 1; 38 + } 39 + } 40 + 41 + return 0; 42 + } 43 + 44 + static unsigned int _get_table_val(const struct clk_factor_table *table, 45 + unsigned long rate, unsigned long parent_rate) 46 + { 47 + const struct clk_factor_table *clkt; 48 + int val = -1; 49 + u64 calc_rate; 50 + 51 + for (clkt = table; clkt->div; clkt++) { 52 + calc_rate = parent_rate * clkt->mul; 53 + do_div(calc_rate, clkt->div); 54 + 55 + if ((unsigned long)calc_rate <= rate) { 56 + val = clkt->val; 57 + break; 58 + } 59 + } 60 + 61 + if (val == -1) 62 + val = _get_table_maxval(table); 63 + 64 + return val; 65 + } 66 + 67 + static int clk_val_best(struct clk_hw *hw, unsigned long rate, 68 + unsigned long *best_parent_rate) 69 + { 70 + struct owl_factor *factor = hw_to_owl_factor(hw); 71 + struct owl_factor_hw *factor_hw = &factor->factor_hw; 72 + const struct clk_factor_table *clkt = factor_hw->table; 73 + unsigned long parent_rate, try_parent_rate, best = 0, cur_rate; 74 + unsigned long parent_rate_saved = *best_parent_rate; 75 + int bestval = 0; 76 + 77 + if (!rate) 78 + rate = 1; 79 + 80 + if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { 81 + parent_rate = *best_parent_rate; 82 + bestval = _get_table_val(clkt, rate, parent_rate); 83 + return bestval; 84 + } 85 + 86 + for (clkt = factor_hw->table; clkt->div; clkt++) { 87 + try_parent_rate = rate * clkt->div / clkt->mul; 88 + 89 + if (try_parent_rate == parent_rate_saved) { 90 + pr_debug("%s: [%d %d %d] found try_parent_rate %ld\n", 91 + __func__, clkt->val, clkt->mul, clkt->div, 92 + try_parent_rate); 93 + /* 94 + * It's the most ideal case if the requested rate can be 95 + * divided from parent clock without any need to change 96 + * parent rate, so return the divider immediately. 97 + */ 98 + *best_parent_rate = parent_rate_saved; 99 + return clkt->val; 100 + } 101 + 102 + parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), 103 + try_parent_rate); 104 + cur_rate = DIV_ROUND_UP(parent_rate, clkt->div) * clkt->mul; 105 + if (cur_rate <= rate && cur_rate > best) { 106 + bestval = clkt->val; 107 + best = cur_rate; 108 + *best_parent_rate = parent_rate; 109 + } 110 + } 111 + 112 + if (!bestval) { 113 + bestval = _get_table_maxval(clkt); 114 + *best_parent_rate = clk_hw_round_rate( 115 + clk_hw_get_parent(hw), 1); 116 + } 117 + 118 + return bestval; 119 + } 120 + 121 + long owl_factor_helper_round_rate(struct owl_clk_common *common, 122 + const struct owl_factor_hw *factor_hw, 123 + unsigned long rate, 124 + unsigned long *parent_rate) 125 + { 126 + const struct clk_factor_table *clkt = factor_hw->table; 127 + unsigned int val, mul = 0, div = 1; 128 + 129 + val = clk_val_best(&common->hw, rate, parent_rate); 130 + _get_table_div_mul(clkt, val, &mul, &div); 131 + 132 + return *parent_rate * mul / div; 133 + } 134 + 135 + static long owl_factor_round_rate(struct clk_hw *hw, unsigned long rate, 136 + unsigned long *parent_rate) 137 + { 138 + struct owl_factor *factor = hw_to_owl_factor(hw); 139 + struct owl_factor_hw *factor_hw = &factor->factor_hw; 140 + 141 + return owl_factor_helper_round_rate(&factor->common, factor_hw, 142 + rate, parent_rate); 143 + } 144 + 145 + unsigned long owl_factor_helper_recalc_rate(struct owl_clk_common *common, 146 + const struct owl_factor_hw *factor_hw, 147 + unsigned long parent_rate) 148 + { 149 + const struct clk_factor_table *clkt = factor_hw->table; 150 + unsigned long long int rate; 151 + u32 reg, val, mul, div; 152 + 153 + div = 0; 154 + mul = 0; 155 + 156 + regmap_read(common->regmap, factor_hw->reg, &reg); 157 + 158 + val = reg >> factor_hw->shift; 159 + val &= div_mask(factor_hw); 160 + 161 + _get_table_div_mul(clkt, val, &mul, &div); 162 + if (!div) { 163 + WARN(!(factor_hw->fct_flags & CLK_DIVIDER_ALLOW_ZERO), 164 + "%s: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set\n", 165 + __clk_get_name(common->hw.clk)); 166 + return parent_rate; 167 + } 168 + 169 + rate = (unsigned long long int)parent_rate * mul; 170 + do_div(rate, div); 171 + 172 + return rate; 173 + } 174 + 175 + static unsigned long owl_factor_recalc_rate(struct clk_hw *hw, 176 + unsigned long parent_rate) 177 + { 178 + struct owl_factor *factor = hw_to_owl_factor(hw); 179 + struct owl_factor_hw *factor_hw = &factor->factor_hw; 180 + struct owl_clk_common *common = &factor->common; 181 + 182 + return owl_factor_helper_recalc_rate(common, factor_hw, parent_rate); 183 + } 184 + 185 + int owl_factor_helper_set_rate(const struct owl_clk_common *common, 186 + const struct owl_factor_hw *factor_hw, 187 + unsigned long rate, 188 + unsigned long parent_rate) 189 + { 190 + u32 val, reg; 191 + 192 + val = _get_table_val(factor_hw->table, rate, parent_rate); 193 + 194 + if (val > div_mask(factor_hw)) 195 + val = div_mask(factor_hw); 196 + 197 + regmap_read(common->regmap, factor_hw->reg, &reg); 198 + 199 + reg &= ~(div_mask(factor_hw) << factor_hw->shift); 200 + reg |= val << factor_hw->shift; 201 + 202 + regmap_write(common->regmap, factor_hw->reg, reg); 203 + 204 + return 0; 205 + } 206 + 207 + static int owl_factor_set_rate(struct clk_hw *hw, unsigned long rate, 208 + unsigned long parent_rate) 209 + { 210 + struct owl_factor *factor = hw_to_owl_factor(hw); 211 + struct owl_factor_hw *factor_hw = &factor->factor_hw; 212 + struct owl_clk_common *common = &factor->common; 213 + 214 + return owl_factor_helper_set_rate(common, factor_hw, 215 + rate, parent_rate); 216 + } 217 + 218 + const struct clk_ops owl_factor_ops = { 219 + .round_rate = owl_factor_round_rate, 220 + .recalc_rate = owl_factor_recalc_rate, 221 + .set_rate = owl_factor_set_rate, 222 + };
+83
drivers/clk/actions/owl-factor.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL factor clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_FACTOR_H_ 12 + #define _OWL_FACTOR_H_ 13 + 14 + #include "owl-common.h" 15 + 16 + struct clk_factor_table { 17 + unsigned int val; 18 + unsigned int mul; 19 + unsigned int div; 20 + }; 21 + 22 + struct owl_factor_hw { 23 + u32 reg; 24 + u8 shift; 25 + u8 width; 26 + u8 fct_flags; 27 + struct clk_factor_table *table; 28 + }; 29 + 30 + struct owl_factor { 31 + struct owl_factor_hw factor_hw; 32 + struct owl_clk_common common; 33 + }; 34 + 35 + #define OWL_FACTOR_HW(_reg, _shift, _width, _fct_flags, _table) \ 36 + { \ 37 + .reg = _reg, \ 38 + .shift = _shift, \ 39 + .width = _width, \ 40 + .fct_flags = _fct_flags, \ 41 + .table = _table, \ 42 + } 43 + 44 + #define OWL_FACTOR(_struct, _name, _parent, _reg, \ 45 + _shift, _width, _table, _fct_flags, _flags) \ 46 + struct owl_factor _struct = { \ 47 + .factor_hw = OWL_FACTOR_HW(_reg, _shift, \ 48 + _width, _fct_flags, _table), \ 49 + .common = { \ 50 + .regmap = NULL, \ 51 + .hw.init = CLK_HW_INIT(_name, \ 52 + _parent, \ 53 + &owl_factor_ops, \ 54 + _flags), \ 55 + }, \ 56 + } 57 + 58 + #define div_mask(d) ((1 << ((d)->width)) - 1) 59 + 60 + static inline struct owl_factor *hw_to_owl_factor(const struct clk_hw *hw) 61 + { 62 + struct owl_clk_common *common = hw_to_owl_clk_common(hw); 63 + 64 + return container_of(common, struct owl_factor, common); 65 + } 66 + 67 + long owl_factor_helper_round_rate(struct owl_clk_common *common, 68 + const struct owl_factor_hw *factor_hw, 69 + unsigned long rate, 70 + unsigned long *parent_rate); 71 + 72 + unsigned long owl_factor_helper_recalc_rate(struct owl_clk_common *common, 73 + const struct owl_factor_hw *factor_hw, 74 + unsigned long parent_rate); 75 + 76 + int owl_factor_helper_set_rate(const struct owl_clk_common *common, 77 + const struct owl_factor_hw *factor_hw, 78 + unsigned long rate, 79 + unsigned long parent_rate); 80 + 81 + extern const struct clk_ops owl_factor_ops; 82 + 83 + #endif /* _OWL_FACTOR_H_ */
+28
drivers/clk/actions/owl-fixed-factor.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL fixed factor clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_FIXED_FACTOR_H_ 12 + #define _OWL_FIXED_FACTOR_H_ 13 + 14 + #include "owl-common.h" 15 + 16 + #define OWL_FIX_FACT(_struct, _name, _parent, _mul, _div, _flags) \ 17 + struct clk_fixed_factor _struct = { \ 18 + .mult = _mul, \ 19 + .div = _div, \ 20 + .hw.init = CLK_HW_INIT(_name, \ 21 + _parent, \ 22 + &clk_fixed_factor_ops, \ 23 + _flags), \ 24 + } 25 + 26 + extern const struct clk_ops clk_fixed_factor_ops; 27 + 28 + #endif /* _OWL_FIXED_FACTOR_H_ */
+77
drivers/clk/actions/owl-gate.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL gate clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/regmap.h> 13 + 14 + #include "owl-gate.h" 15 + 16 + void owl_gate_set(const struct owl_clk_common *common, 17 + const struct owl_gate_hw *gate_hw, bool enable) 18 + { 19 + int set = gate_hw->gate_flags & CLK_GATE_SET_TO_DISABLE ? 1 : 0; 20 + u32 reg; 21 + 22 + set ^= enable; 23 + 24 + regmap_read(common->regmap, gate_hw->reg, &reg); 25 + 26 + if (set) 27 + reg |= BIT(gate_hw->bit_idx); 28 + else 29 + reg &= ~BIT(gate_hw->bit_idx); 30 + 31 + regmap_write(common->regmap, gate_hw->reg, reg); 32 + } 33 + 34 + static void owl_gate_disable(struct clk_hw *hw) 35 + { 36 + struct owl_gate *gate = hw_to_owl_gate(hw); 37 + struct owl_clk_common *common = &gate->common; 38 + 39 + owl_gate_set(common, &gate->gate_hw, false); 40 + } 41 + 42 + static int owl_gate_enable(struct clk_hw *hw) 43 + { 44 + struct owl_gate *gate = hw_to_owl_gate(hw); 45 + struct owl_clk_common *common = &gate->common; 46 + 47 + owl_gate_set(common, &gate->gate_hw, true); 48 + 49 + return 0; 50 + } 51 + 52 + int owl_gate_clk_is_enabled(const struct owl_clk_common *common, 53 + const struct owl_gate_hw *gate_hw) 54 + { 55 + u32 reg; 56 + 57 + regmap_read(common->regmap, gate_hw->reg, &reg); 58 + 59 + if (gate_hw->gate_flags & CLK_GATE_SET_TO_DISABLE) 60 + reg ^= BIT(gate_hw->bit_idx); 61 + 62 + return !!(reg & BIT(gate_hw->bit_idx)); 63 + } 64 + 65 + static int owl_gate_is_enabled(struct clk_hw *hw) 66 + { 67 + struct owl_gate *gate = hw_to_owl_gate(hw); 68 + struct owl_clk_common *common = &gate->common; 69 + 70 + return owl_gate_clk_is_enabled(common, &gate->gate_hw); 71 + } 72 + 73 + const struct clk_ops owl_gate_ops = { 74 + .disable = owl_gate_disable, 75 + .enable = owl_gate_enable, 76 + .is_enabled = owl_gate_is_enabled, 77 + };
+73
drivers/clk/actions/owl-gate.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL gate clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_GATE_H_ 12 + #define _OWL_GATE_H_ 13 + 14 + #include "owl-common.h" 15 + 16 + struct owl_gate_hw { 17 + u32 reg; 18 + u8 bit_idx; 19 + u8 gate_flags; 20 + }; 21 + 22 + struct owl_gate { 23 + struct owl_gate_hw gate_hw; 24 + struct owl_clk_common common; 25 + }; 26 + 27 + #define OWL_GATE_HW(_reg, _bit_idx, _gate_flags) \ 28 + { \ 29 + .reg = _reg, \ 30 + .bit_idx = _bit_idx, \ 31 + .gate_flags = _gate_flags, \ 32 + } 33 + 34 + #define OWL_GATE(_struct, _name, _parent, _reg, \ 35 + _bit_idx, _gate_flags, _flags) \ 36 + struct owl_gate _struct = { \ 37 + .gate_hw = OWL_GATE_HW(_reg, _bit_idx, _gate_flags), \ 38 + .common = { \ 39 + .regmap = NULL, \ 40 + .hw.init = CLK_HW_INIT(_name, \ 41 + _parent, \ 42 + &owl_gate_ops, \ 43 + _flags), \ 44 + } \ 45 + } \ 46 + 47 + #define OWL_GATE_NO_PARENT(_struct, _name, _reg, \ 48 + _bit_idx, _gate_flags, _flags) \ 49 + struct owl_gate _struct = { \ 50 + .gate_hw = OWL_GATE_HW(_reg, _bit_idx, _gate_flags), \ 51 + .common = { \ 52 + .regmap = NULL, \ 53 + .hw.init = CLK_HW_INIT_NO_PARENT(_name, \ 54 + &owl_gate_ops, \ 55 + _flags), \ 56 + }, \ 57 + } \ 58 + 59 + static inline struct owl_gate *hw_to_owl_gate(const struct clk_hw *hw) 60 + { 61 + struct owl_clk_common *common = hw_to_owl_clk_common(hw); 62 + 63 + return container_of(common, struct owl_gate, common); 64 + } 65 + 66 + void owl_gate_set(const struct owl_clk_common *common, 67 + const struct owl_gate_hw *gate_hw, bool enable); 68 + int owl_gate_clk_is_enabled(const struct owl_clk_common *common, 69 + const struct owl_gate_hw *gate_hw); 70 + 71 + extern const struct clk_ops owl_gate_ops; 72 + 73 + #endif /* _OWL_GATE_H_ */
+60
drivers/clk/actions/owl-mux.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL mux clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/regmap.h> 13 + 14 + #include "owl-mux.h" 15 + 16 + u8 owl_mux_helper_get_parent(const struct owl_clk_common *common, 17 + const struct owl_mux_hw *mux_hw) 18 + { 19 + u32 reg; 20 + u8 parent; 21 + 22 + regmap_read(common->regmap, mux_hw->reg, &reg); 23 + parent = reg >> mux_hw->shift; 24 + parent &= BIT(mux_hw->width) - 1; 25 + 26 + return parent; 27 + } 28 + 29 + static u8 owl_mux_get_parent(struct clk_hw *hw) 30 + { 31 + struct owl_mux *mux = hw_to_owl_mux(hw); 32 + 33 + return owl_mux_helper_get_parent(&mux->common, &mux->mux_hw); 34 + } 35 + 36 + int owl_mux_helper_set_parent(const struct owl_clk_common *common, 37 + struct owl_mux_hw *mux_hw, u8 index) 38 + { 39 + u32 reg; 40 + 41 + regmap_read(common->regmap, mux_hw->reg, &reg); 42 + reg &= ~GENMASK(mux_hw->width + mux_hw->shift - 1, mux_hw->shift); 43 + regmap_write(common->regmap, mux_hw->reg, 44 + reg | (index << mux_hw->shift)); 45 + 46 + return 0; 47 + } 48 + 49 + static int owl_mux_set_parent(struct clk_hw *hw, u8 index) 50 + { 51 + struct owl_mux *mux = hw_to_owl_mux(hw); 52 + 53 + return owl_mux_helper_set_parent(&mux->common, &mux->mux_hw, index); 54 + } 55 + 56 + const struct clk_ops owl_mux_ops = { 57 + .get_parent = owl_mux_get_parent, 58 + .set_parent = owl_mux_set_parent, 59 + .determine_rate = __clk_mux_determine_rate, 60 + };
+61
drivers/clk/actions/owl-mux.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL mux clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_MUX_H_ 12 + #define _OWL_MUX_H_ 13 + 14 + #include "owl-common.h" 15 + 16 + struct owl_mux_hw { 17 + u32 reg; 18 + u8 shift; 19 + u8 width; 20 + }; 21 + 22 + struct owl_mux { 23 + struct owl_mux_hw mux_hw; 24 + struct owl_clk_common common; 25 + }; 26 + 27 + #define OWL_MUX_HW(_reg, _shift, _width) \ 28 + { \ 29 + .reg = _reg, \ 30 + .shift = _shift, \ 31 + .width = _width, \ 32 + } 33 + 34 + #define OWL_MUX(_struct, _name, _parents, _reg, \ 35 + _shift, _width, _flags) \ 36 + struct owl_mux _struct = { \ 37 + .mux_hw = OWL_MUX_HW(_reg, _shift, _width), \ 38 + .common = { \ 39 + .regmap = NULL, \ 40 + .hw.init = CLK_HW_INIT_PARENTS(_name, \ 41 + _parents, \ 42 + &owl_mux_ops, \ 43 + _flags), \ 44 + }, \ 45 + } 46 + 47 + static inline struct owl_mux *hw_to_owl_mux(const struct clk_hw *hw) 48 + { 49 + struct owl_clk_common *common = hw_to_owl_clk_common(hw); 50 + 51 + return container_of(common, struct owl_mux, common); 52 + } 53 + 54 + u8 owl_mux_helper_get_parent(const struct owl_clk_common *common, 55 + const struct owl_mux_hw *mux_hw); 56 + int owl_mux_helper_set_parent(const struct owl_clk_common *common, 57 + struct owl_mux_hw *mux_hw, u8 index); 58 + 59 + extern const struct clk_ops owl_mux_ops; 60 + 61 + #endif /* _OWL_MUX_H_ */
+194
drivers/clk/actions/owl-pll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL pll clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/slab.h> 13 + #include <linux/io.h> 14 + #include <linux/delay.h> 15 + 16 + #include "owl-pll.h" 17 + 18 + static u32 owl_pll_calculate_mul(struct owl_pll_hw *pll_hw, unsigned long rate) 19 + { 20 + u32 mul; 21 + 22 + mul = DIV_ROUND_CLOSEST(rate, pll_hw->bfreq); 23 + if (mul < pll_hw->min_mul) 24 + mul = pll_hw->min_mul; 25 + else if (mul > pll_hw->max_mul) 26 + mul = pll_hw->max_mul; 27 + 28 + return mul &= mul_mask(pll_hw); 29 + } 30 + 31 + static unsigned long _get_table_rate(const struct clk_pll_table *table, 32 + unsigned int val) 33 + { 34 + const struct clk_pll_table *clkt; 35 + 36 + for (clkt = table; clkt->rate; clkt++) 37 + if (clkt->val == val) 38 + return clkt->rate; 39 + 40 + return 0; 41 + } 42 + 43 + static const struct clk_pll_table *_get_pll_table( 44 + const struct clk_pll_table *table, unsigned long rate) 45 + { 46 + const struct clk_pll_table *clkt; 47 + 48 + for (clkt = table; clkt->rate; clkt++) { 49 + if (clkt->rate == rate) { 50 + table = clkt; 51 + break; 52 + } else if (clkt->rate < rate) 53 + table = clkt; 54 + } 55 + 56 + return table; 57 + } 58 + 59 + static long owl_pll_round_rate(struct clk_hw *hw, unsigned long rate, 60 + unsigned long *parent_rate) 61 + { 62 + struct owl_pll *pll = hw_to_owl_pll(hw); 63 + struct owl_pll_hw *pll_hw = &pll->pll_hw; 64 + const struct clk_pll_table *clkt; 65 + u32 mul; 66 + 67 + if (pll_hw->table) { 68 + clkt = _get_pll_table(pll_hw->table, rate); 69 + return clkt->rate; 70 + } 71 + 72 + /* fixed frequency */ 73 + if (pll_hw->width == 0) 74 + return pll_hw->bfreq; 75 + 76 + mul = owl_pll_calculate_mul(pll_hw, rate); 77 + 78 + return pll_hw->bfreq * mul; 79 + } 80 + 81 + static unsigned long owl_pll_recalc_rate(struct clk_hw *hw, 82 + unsigned long parent_rate) 83 + { 84 + struct owl_pll *pll = hw_to_owl_pll(hw); 85 + struct owl_pll_hw *pll_hw = &pll->pll_hw; 86 + const struct owl_clk_common *common = &pll->common; 87 + u32 val; 88 + 89 + if (pll_hw->table) { 90 + regmap_read(common->regmap, pll_hw->reg, &val); 91 + 92 + val = val >> pll_hw->shift; 93 + val &= mul_mask(pll_hw); 94 + 95 + return _get_table_rate(pll_hw->table, val); 96 + } 97 + 98 + /* fixed frequency */ 99 + if (pll_hw->width == 0) 100 + return pll_hw->bfreq; 101 + 102 + regmap_read(common->regmap, pll_hw->reg, &val); 103 + 104 + val = val >> pll_hw->shift; 105 + val &= mul_mask(pll_hw); 106 + 107 + return pll_hw->bfreq * val; 108 + } 109 + 110 + static int owl_pll_is_enabled(struct clk_hw *hw) 111 + { 112 + struct owl_pll *pll = hw_to_owl_pll(hw); 113 + struct owl_pll_hw *pll_hw = &pll->pll_hw; 114 + const struct owl_clk_common *common = &pll->common; 115 + u32 reg; 116 + 117 + regmap_read(common->regmap, pll_hw->reg, &reg); 118 + 119 + return !!(reg & BIT(pll_hw->bit_idx)); 120 + } 121 + 122 + static void owl_pll_set(const struct owl_clk_common *common, 123 + const struct owl_pll_hw *pll_hw, bool enable) 124 + { 125 + u32 reg; 126 + 127 + regmap_read(common->regmap, pll_hw->reg, &reg); 128 + 129 + if (enable) 130 + reg |= BIT(pll_hw->bit_idx); 131 + else 132 + reg &= ~BIT(pll_hw->bit_idx); 133 + 134 + regmap_write(common->regmap, pll_hw->reg, reg); 135 + } 136 + 137 + static int owl_pll_enable(struct clk_hw *hw) 138 + { 139 + struct owl_pll *pll = hw_to_owl_pll(hw); 140 + const struct owl_clk_common *common = &pll->common; 141 + 142 + owl_pll_set(common, &pll->pll_hw, true); 143 + 144 + return 0; 145 + } 146 + 147 + static void owl_pll_disable(struct clk_hw *hw) 148 + { 149 + struct owl_pll *pll = hw_to_owl_pll(hw); 150 + const struct owl_clk_common *common = &pll->common; 151 + 152 + owl_pll_set(common, &pll->pll_hw, false); 153 + } 154 + 155 + static int owl_pll_set_rate(struct clk_hw *hw, unsigned long rate, 156 + unsigned long parent_rate) 157 + { 158 + struct owl_pll *pll = hw_to_owl_pll(hw); 159 + struct owl_pll_hw *pll_hw = &pll->pll_hw; 160 + const struct owl_clk_common *common = &pll->common; 161 + const struct clk_pll_table *clkt; 162 + u32 val, reg; 163 + 164 + /* fixed frequency */ 165 + if (pll_hw->width == 0) 166 + return 0; 167 + 168 + if (pll_hw->table) { 169 + clkt = _get_pll_table(pll_hw->table, rate); 170 + val = clkt->val; 171 + } else { 172 + val = owl_pll_calculate_mul(pll_hw, rate); 173 + } 174 + 175 + regmap_read(common->regmap, pll_hw->reg, &reg); 176 + 177 + reg &= ~mul_mask(pll_hw); 178 + reg |= val << pll_hw->shift; 179 + 180 + regmap_write(common->regmap, pll_hw->reg, reg); 181 + 182 + udelay(PLL_STABILITY_WAIT_US); 183 + 184 + return 0; 185 + } 186 + 187 + const struct clk_ops owl_pll_ops = { 188 + .enable = owl_pll_enable, 189 + .disable = owl_pll_disable, 190 + .is_enabled = owl_pll_is_enabled, 191 + .round_rate = owl_pll_round_rate, 192 + .recalc_rate = owl_pll_recalc_rate, 193 + .set_rate = owl_pll_set_rate, 194 + };
+92
drivers/clk/actions/owl-pll.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL pll clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #ifndef _OWL_PLL_H_ 12 + #define _OWL_PLL_H_ 13 + 14 + #include "owl-common.h" 15 + 16 + /* last entry should have rate = 0 */ 17 + struct clk_pll_table { 18 + unsigned int val; 19 + unsigned long rate; 20 + }; 21 + 22 + struct owl_pll_hw { 23 + u32 reg; 24 + u32 bfreq; 25 + u8 bit_idx; 26 + u8 shift; 27 + u8 width; 28 + u8 min_mul; 29 + u8 max_mul; 30 + const struct clk_pll_table *table; 31 + }; 32 + 33 + struct owl_pll { 34 + struct owl_pll_hw pll_hw; 35 + struct owl_clk_common common; 36 + }; 37 + 38 + #define OWL_PLL_HW(_reg, _bfreq, _bit_idx, _shift, \ 39 + _width, _min_mul, _max_mul, _table) \ 40 + { \ 41 + .reg = _reg, \ 42 + .bfreq = _bfreq, \ 43 + .bit_idx = _bit_idx, \ 44 + .shift = _shift, \ 45 + .width = _width, \ 46 + .min_mul = _min_mul, \ 47 + .max_mul = _max_mul, \ 48 + .table = _table, \ 49 + } 50 + 51 + #define OWL_PLL(_struct, _name, _parent, _reg, _bfreq, _bit_idx, \ 52 + _shift, _width, _min_mul, _max_mul, _table, _flags) \ 53 + struct owl_pll _struct = { \ 54 + .pll_hw = OWL_PLL_HW(_reg, _bfreq, _bit_idx, _shift, \ 55 + _width, _min_mul, \ 56 + _max_mul, _table), \ 57 + .common = { \ 58 + .regmap = NULL, \ 59 + .hw.init = CLK_HW_INIT(_name, \ 60 + _parent, \ 61 + &owl_pll_ops, \ 62 + _flags), \ 63 + }, \ 64 + } 65 + 66 + #define OWL_PLL_NO_PARENT(_struct, _name, _reg, _bfreq, _bit_idx, \ 67 + _shift, _width, _min_mul, _max_mul, _table, _flags) \ 68 + struct owl_pll _struct = { \ 69 + .pll_hw = OWL_PLL_HW(_reg, _bfreq, _bit_idx, _shift, \ 70 + _width, _min_mul, \ 71 + _max_mul, _table), \ 72 + .common = { \ 73 + .regmap = NULL, \ 74 + .hw.init = CLK_HW_INIT_NO_PARENT(_name, \ 75 + &owl_pll_ops, \ 76 + _flags), \ 77 + }, \ 78 + } 79 + 80 + #define mul_mask(m) ((1 << ((m)->width)) - 1) 81 + #define PLL_STABILITY_WAIT_US (50) 82 + 83 + static inline struct owl_pll *hw_to_owl_pll(const struct clk_hw *hw) 84 + { 85 + struct owl_clk_common *common = hw_to_owl_clk_common(hw); 86 + 87 + return container_of(common, struct owl_pll, common); 88 + } 89 + 90 + extern const struct clk_ops owl_pll_ops; 91 + 92 + #endif /* _OWL_PLL_H_ */
+721
drivers/clk/actions/owl-s900.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // OWL S900 SoC clock driver 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Author: David Liu <liuwei@actions-semi.com> 7 + // 8 + // Copyright (c) 2018 Linaro Ltd. 9 + // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 10 + 11 + #include <linux/clk-provider.h> 12 + #include <linux/platform_device.h> 13 + 14 + #include "owl-common.h" 15 + #include "owl-composite.h" 16 + #include "owl-divider.h" 17 + #include "owl-factor.h" 18 + #include "owl-fixed-factor.h" 19 + #include "owl-gate.h" 20 + #include "owl-mux.h" 21 + #include "owl-pll.h" 22 + 23 + #include <dt-bindings/clock/actions,s900-cmu.h> 24 + 25 + #define CMU_COREPLL (0x0000) 26 + #define CMU_DEVPLL (0x0004) 27 + #define CMU_DDRPLL (0x0008) 28 + #define CMU_NANDPLL (0x000C) 29 + #define CMU_DISPLAYPLL (0x0010) 30 + #define CMU_AUDIOPLL (0x0014) 31 + #define CMU_TVOUTPLL (0x0018) 32 + #define CMU_BUSCLK (0x001C) 33 + #define CMU_SENSORCLK (0x0020) 34 + #define CMU_LCDCLK (0x0024) 35 + #define CMU_DSICLK (0x0028) 36 + #define CMU_CSICLK (0x002C) 37 + #define CMU_DECLK (0x0030) 38 + #define CMU_BISPCLK (0x0034) 39 + #define CMU_IMXCLK (0x0038) 40 + #define CMU_HDECLK (0x003C) 41 + #define CMU_VDECLK (0x0040) 42 + #define CMU_VCECLK (0x0044) 43 + #define CMU_NANDCCLK (0x004C) 44 + #define CMU_SD0CLK (0x0050) 45 + #define CMU_SD1CLK (0x0054) 46 + #define CMU_SD2CLK (0x0058) 47 + #define CMU_UART0CLK (0x005C) 48 + #define CMU_UART1CLK (0x0060) 49 + #define CMU_UART2CLK (0x0064) 50 + #define CMU_PWM0CLK (0x0070) 51 + #define CMU_PWM1CLK (0x0074) 52 + #define CMU_PWM2CLK (0x0078) 53 + #define CMU_PWM3CLK (0x007C) 54 + #define CMU_USBPLL (0x0080) 55 + #define CMU_ASSISTPLL (0x0084) 56 + #define CMU_EDPCLK (0x0088) 57 + #define CMU_GPU3DCLK (0x0090) 58 + #define CMU_CORECTL (0x009C) 59 + #define CMU_DEVCLKEN0 (0x00A0) 60 + #define CMU_DEVCLKEN1 (0x00A4) 61 + #define CMU_DEVRST0 (0x00A8) 62 + #define CMU_DEVRST1 (0x00AC) 63 + #define CMU_UART3CLK (0x00B0) 64 + #define CMU_UART4CLK (0x00B4) 65 + #define CMU_UART5CLK (0x00B8) 66 + #define CMU_UART6CLK (0x00BC) 67 + #define CMU_TLSCLK (0x00C0) 68 + #define CMU_SD3CLK (0x00C4) 69 + #define CMU_PWM4CLK (0x00C8) 70 + #define CMU_PWM5CLK (0x00CC) 71 + 72 + static struct clk_pll_table clk_audio_pll_table[] = { 73 + { 0, 45158400 }, { 1, 49152000 }, 74 + { 0, 0 }, 75 + }; 76 + 77 + static struct clk_pll_table clk_edp_pll_table[] = { 78 + { 0, 810000000 }, { 1, 135000000 }, { 2, 270000000 }, 79 + { 0, 0 }, 80 + }; 81 + 82 + /* pll clocks */ 83 + static OWL_PLL_NO_PARENT(core_pll_clk, "core_pll_clk", CMU_COREPLL, 24000000, 9, 0, 8, 5, 107, NULL, CLK_IGNORE_UNUSED); 84 + static OWL_PLL_NO_PARENT(dev_pll_clk, "dev_pll_clk", CMU_DEVPLL, 6000000, 8, 0, 8, 20, 180, NULL, CLK_IGNORE_UNUSED); 85 + static OWL_PLL_NO_PARENT(ddr_pll_clk, "ddr_pll_clk", CMU_DDRPLL, 24000000, 8, 0, 8, 5, 45, NULL, CLK_IGNORE_UNUSED); 86 + static OWL_PLL_NO_PARENT(nand_pll_clk, "nand_pll_clk", CMU_NANDPLL, 6000000, 8, 0, 8, 4, 100, NULL, CLK_IGNORE_UNUSED); 87 + static OWL_PLL_NO_PARENT(display_pll_clk, "display_pll_clk", CMU_DISPLAYPLL, 6000000, 8, 0, 8, 20, 180, NULL, CLK_IGNORE_UNUSED); 88 + static OWL_PLL_NO_PARENT(assist_pll_clk, "assist_pll_clk", CMU_ASSISTPLL, 500000000, 0, 0, 0, 0, 0, NULL, CLK_IGNORE_UNUSED); 89 + static OWL_PLL_NO_PARENT(audio_pll_clk, "audio_pll_clk", CMU_AUDIOPLL, 0, 4, 0, 1, 0, 0, clk_audio_pll_table, CLK_IGNORE_UNUSED); 90 + static OWL_PLL(edp_pll_clk, "edp_pll_clk", "edp24M_clk", CMU_EDPCLK, 0, 9, 0, 2, 0, 0, clk_edp_pll_table, CLK_IGNORE_UNUSED); 91 + 92 + static const char *cpu_clk_mux_p[] = { "losc", "hosc", "core_pll_clk", }; 93 + static const char *dev_clk_p[] = { "hosc", "dev_pll_clk", }; 94 + static const char *noc_clk_mux_p[] = { "dev_clk", "assist_pll_clk", }; 95 + static const char *dmm_clk_mux_p[] = { "dev_clk", "nand_pll_clk", "assist_pll_clk", "ddr_clk_src", }; 96 + static const char *bisp_clk_mux_p[] = { "assist_pll_clk", "dev_clk", }; 97 + static const char *csi_clk_mux_p[] = { "display_pll_clk", "dev_clk", }; 98 + static const char *de_clk_mux_p[] = { "assist_pll_clk", "dev_clk", }; 99 + static const char *gpu_clk_mux_p[] = { "dev_clk", "display_pll_clk", "ddr_clk_src", }; 100 + static const char *hde_clk_mux_p[] = { "dev_clk", "display_pll_clk", "ddr_clk_src", }; 101 + static const char *imx_clk_mux_p[] = { "assist_pll_clk", "dev_clk", }; 102 + static const char *lcd_clk_mux_p[] = { "display_pll_clk", "nand_pll_clk", }; 103 + static const char *nand_clk_mux_p[] = { "dev_clk", "nand_pll_clk", }; 104 + static const char *sd_clk_mux_p[] = { "dev_clk", "nand_pll_clk", }; 105 + static const char *sensor_clk_mux_p[] = { "hosc", "bisp_clk", }; 106 + static const char *uart_clk_mux_p[] = { "hosc", "dev_pll_clk", }; 107 + static const char *vce_clk_mux_p[] = { "dev_clk", "display_pll_clk", "assist_pll_clk", "ddr_clk_src", }; 108 + static const char *i2s_clk_mux_p[] = { "audio_pll_clk", }; 109 + static const char *edp_clk_mux_p[] = { "assist_pll_clk", "display_pll_clk", }; 110 + 111 + /* mux clocks */ 112 + static OWL_MUX(cpu_clk, "cpu_clk", cpu_clk_mux_p, CMU_BUSCLK, 0, 2, CLK_SET_RATE_PARENT); 113 + static OWL_MUX(dev_clk, "dev_clk", dev_clk_p, CMU_DEVPLL, 12, 1, CLK_SET_RATE_PARENT); 114 + static OWL_MUX(noc_clk_mux, "noc_clk_mux", noc_clk_mux_p, CMU_BUSCLK, 7, 1, CLK_SET_RATE_PARENT); 115 + 116 + static struct clk_div_table nand_div_table[] = { 117 + { 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 6 }, 118 + { 4, 8 }, { 5, 10 }, { 6, 12 }, { 7, 14 }, 119 + { 8, 16 }, { 9, 18 }, { 10, 20 }, { 11, 22 }, 120 + { 12, 24 }, { 13, 26 }, { 14, 28 }, { 15, 30 }, 121 + { 0, 0 }, 122 + }; 123 + 124 + static struct clk_div_table apb_div_table[] = { 125 + { 1, 2 }, { 2, 3 }, { 3, 4 }, 126 + { 0, 0 }, 127 + }; 128 + 129 + static struct clk_div_table eth_mac_div_table[] = { 130 + { 0, 2 }, { 1, 4 }, 131 + { 0, 0 }, 132 + }; 133 + 134 + static struct clk_div_table rmii_ref_div_table[] = { 135 + { 0, 4 }, { 1, 10 }, 136 + { 0, 0 }, 137 + }; 138 + 139 + static struct clk_div_table usb3_mac_div_table[] = { 140 + { 1, 2 }, { 2, 3 }, { 3, 4 }, 141 + { 0, 8 }, 142 + }; 143 + 144 + static struct clk_div_table i2s_div_table[] = { 145 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 146 + { 4, 6 }, { 5, 8 }, { 6, 12 }, { 7, 16 }, 147 + { 8, 24 }, 148 + { 0, 0 }, 149 + }; 150 + 151 + static struct clk_div_table hdmia_div_table[] = { 152 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 153 + { 4, 6 }, { 5, 8 }, { 6, 12 }, { 7, 16 }, 154 + { 8, 24 }, 155 + { 0, 0 }, 156 + }; 157 + 158 + /* divider clocks */ 159 + static OWL_DIVIDER(noc_clk_div, "noc_clk_div", "noc_clk", CMU_BUSCLK, 19, 1, NULL, 0, 0); 160 + static OWL_DIVIDER(ahb_clk, "ahb_clk", "noc_clk_div", CMU_BUSCLK, 4, 1, NULL, 0, 0); 161 + static OWL_DIVIDER(apb_clk, "apb_clk", "ahb_clk", CMU_BUSCLK, 8, 2, apb_div_table, 0, 0); 162 + static OWL_DIVIDER(usb3_mac_clk, "usb3_mac_clk", "assist_pll_clk", CMU_ASSISTPLL, 12, 2, usb3_mac_div_table, 0, 0); 163 + static OWL_DIVIDER(rmii_ref_clk, "rmii_ref_clk", "assist_pll_clk", CMU_ASSISTPLL, 8, 1, rmii_ref_div_table, 0, 0); 164 + 165 + static struct clk_factor_table sd_factor_table[] = { 166 + /* bit0 ~ 4 */ 167 + { 0, 1, 1 }, { 1, 1, 2 }, { 2, 1, 3 }, { 3, 1, 4 }, 168 + { 4, 1, 5 }, { 5, 1, 6 }, { 6, 1, 7 }, { 7, 1, 8 }, 169 + { 8, 1, 9 }, { 9, 1, 10 }, { 10, 1, 11 }, { 11, 1, 12 }, 170 + { 12, 1, 13 }, { 13, 1, 14 }, { 14, 1, 15 }, { 15, 1, 16 }, 171 + { 16, 1, 17 }, { 17, 1, 18 }, { 18, 1, 19 }, { 19, 1, 20 }, 172 + { 20, 1, 21 }, { 21, 1, 22 }, { 22, 1, 23 }, { 23, 1, 24 }, 173 + { 24, 1, 25 }, { 25, 1, 26 }, { 26, 1, 27 }, { 27, 1, 28 }, 174 + { 28, 1, 29 }, { 29, 1, 30 }, { 30, 1, 31 }, { 31, 1, 32 }, 175 + 176 + /* bit8: /128 */ 177 + { 256, 1, 1 * 128 }, { 257, 1, 2 * 128 }, { 258, 1, 3 * 128 }, { 259, 1, 4 * 128 }, 178 + { 260, 1, 5 * 128 }, { 261, 1, 6 * 128 }, { 262, 1, 7 * 128 }, { 263, 1, 8 * 128 }, 179 + { 264, 1, 9 * 128 }, { 265, 1, 10 * 128 }, { 266, 1, 11 * 128 }, { 267, 1, 12 * 128 }, 180 + { 268, 1, 13 * 128 }, { 269, 1, 14 * 128 }, { 270, 1, 15 * 128 }, { 271, 1, 16 * 128 }, 181 + { 272, 1, 17 * 128 }, { 273, 1, 18 * 128 }, { 274, 1, 19 * 128 }, { 275, 1, 20 * 128 }, 182 + { 276, 1, 21 * 128 }, { 277, 1, 22 * 128 }, { 278, 1, 23 * 128 }, { 279, 1, 24 * 128 }, 183 + { 280, 1, 25 * 128 }, { 281, 1, 26 * 128 }, { 282, 1, 27 * 128 }, { 283, 1, 28 * 128 }, 184 + { 284, 1, 29 * 128 }, { 285, 1, 30 * 128 }, { 286, 1, 31 * 128 }, { 287, 1, 32 * 128 }, 185 + 186 + { 0, 0 }, 187 + }; 188 + 189 + static struct clk_factor_table dmm_factor_table[] = { 190 + { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 1, 3 }, 191 + { 4, 1, 4 }, 192 + { 0, 0, 0 }, 193 + }; 194 + 195 + static struct clk_factor_table noc_factor_table[] = { 196 + { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 1, 3 }, { 4, 1, 4 }, 197 + { 0, 0, 0 }, 198 + }; 199 + 200 + static struct clk_factor_table bisp_factor_table[] = { 201 + { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 5 }, 202 + { 4, 1, 3 }, { 5, 1, 4 }, { 6, 1, 6 }, { 7, 1, 8 }, 203 + { 0, 0, 0 }, 204 + }; 205 + 206 + /* factor clocks */ 207 + static OWL_FACTOR(noc_clk, "noc_clk", "noc_clk_mux", CMU_BUSCLK, 16, 3, noc_factor_table, 0, 0); 208 + static OWL_FACTOR(de_clk1, "de_clk1", "de_clk", CMU_DECLK, 0, 3, bisp_factor_table, 0, 0); 209 + static OWL_FACTOR(de_clk2, "de_clk2", "de_clk", CMU_DECLK, 4, 3, bisp_factor_table, 0, 0); 210 + static OWL_FACTOR(de_clk3, "de_clk3", "de_clk", CMU_DECLK, 8, 3, bisp_factor_table, 0, 0); 211 + 212 + /* gate clocks */ 213 + static OWL_GATE(gpio_clk, "gpio_clk", "apb_clk", CMU_DEVCLKEN0, 18, 0, 0); 214 + static OWL_GATE_NO_PARENT(gpu_clk, "gpu_clk", CMU_DEVCLKEN0, 30, 0, 0); 215 + static OWL_GATE(dmac_clk, "dmac_clk", "noc_clk_div", CMU_DEVCLKEN0, 1, 0, 0); 216 + static OWL_GATE(timer_clk, "timer_clk", "hosc", CMU_DEVCLKEN1, 27, 0, 0); 217 + static OWL_GATE_NO_PARENT(dsi_clk, "dsi_clk", CMU_DEVCLKEN0, 12, 0, 0); 218 + static OWL_GATE(ddr0_clk, "ddr0_clk", "ddr_pll_clk", CMU_DEVCLKEN0, 31, 0, CLK_IGNORE_UNUSED); 219 + static OWL_GATE(ddr1_clk, "ddr1_clk", "ddr_pll_clk", CMU_DEVCLKEN0, 29, 0, CLK_IGNORE_UNUSED); 220 + static OWL_GATE_NO_PARENT(usb3_480mpll0_clk, "usb3_480mpll0_clk", CMU_USBPLL, 3, 0, 0); 221 + static OWL_GATE_NO_PARENT(usb3_480mphy0_clk, "usb3_480mphy0_clk", CMU_USBPLL, 2, 0, 0); 222 + static OWL_GATE_NO_PARENT(usb3_5gphy_clk, "usb3_5gphy_clk", CMU_USBPLL, 1, 0, 0); 223 + static OWL_GATE_NO_PARENT(usb3_cce_clk, "usb3_cce_clk", CMU_USBPLL, 0, 0, 0); 224 + static OWL_GATE(edp24M_clk, "edp24M_clk", "diff24M", CMU_EDPCLK, 8, 0, 0); 225 + static OWL_GATE(edp_link_clk, "edp_link_clk", "edp_pll_clk", CMU_DEVCLKEN0, 10, 0, 0); 226 + static OWL_GATE_NO_PARENT(usbh0_pllen_clk, "usbh0_pllen_clk", CMU_USBPLL, 12, 0, 0); 227 + static OWL_GATE_NO_PARENT(usbh0_phy_clk, "usbh0_phy_clk", CMU_USBPLL, 10, 0, 0); 228 + static OWL_GATE_NO_PARENT(usbh0_cce_clk, "usbh0_cce_clk", CMU_USBPLL, 8, 0, 0); 229 + static OWL_GATE_NO_PARENT(usbh1_pllen_clk, "usbh1_pllen_clk", CMU_USBPLL, 13, 0, 0); 230 + static OWL_GATE_NO_PARENT(usbh1_phy_clk, "usbh1_phy_clk", CMU_USBPLL, 11, 0, 0); 231 + static OWL_GATE_NO_PARENT(usbh1_cce_clk, "usbh1_cce_clk", CMU_USBPLL, 9, 0, 0); 232 + static OWL_GATE(spi0_clk, "spi0_clk", "ahb_clk", CMU_DEVCLKEN1, 10, 0, CLK_IGNORE_UNUSED); 233 + static OWL_GATE(spi1_clk, "spi1_clk", "ahb_clk", CMU_DEVCLKEN1, 11, 0, CLK_IGNORE_UNUSED); 234 + static OWL_GATE(spi2_clk, "spi2_clk", "ahb_clk", CMU_DEVCLKEN1, 12, 0, CLK_IGNORE_UNUSED); 235 + static OWL_GATE(spi3_clk, "spi3_clk", "ahb_clk", CMU_DEVCLKEN1, 13, 0, CLK_IGNORE_UNUSED); 236 + 237 + /* composite clocks */ 238 + static OWL_COMP_FACTOR(bisp_clk, "bisp_clk", bisp_clk_mux_p, 239 + OWL_MUX_HW(CMU_BISPCLK, 4, 1), 240 + OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0), 241 + OWL_FACTOR_HW(CMU_BISPCLK, 0, 3, 0, bisp_factor_table), 242 + 0); 243 + 244 + static OWL_COMP_DIV(csi0_clk, "csi0_clk", csi_clk_mux_p, 245 + OWL_MUX_HW(CMU_CSICLK, 4, 1), 246 + OWL_GATE_HW(CMU_DEVCLKEN0, 13, 0), 247 + OWL_DIVIDER_HW(CMU_CSICLK, 0, 4, 0, NULL), 248 + 0); 249 + 250 + static OWL_COMP_DIV(csi1_clk, "csi1_clk", csi_clk_mux_p, 251 + OWL_MUX_HW(CMU_CSICLK, 20, 1), 252 + OWL_GATE_HW(CMU_DEVCLKEN0, 15, 0), 253 + OWL_DIVIDER_HW(CMU_CSICLK, 16, 4, 0, NULL), 254 + 0); 255 + 256 + static OWL_COMP_PASS(de_clk, "de_clk", de_clk_mux_p, 257 + OWL_MUX_HW(CMU_DECLK, 12, 1), 258 + OWL_GATE_HW(CMU_DEVCLKEN0, 8, 0), 259 + 0); 260 + 261 + static OWL_COMP_FACTOR(dmm_clk, "dmm_clk", dmm_clk_mux_p, 262 + OWL_MUX_HW(CMU_BUSCLK, 10, 2), 263 + OWL_GATE_HW(CMU_DEVCLKEN0, 19, 0), 264 + OWL_FACTOR_HW(CMU_BUSCLK, 12, 3, 0, dmm_factor_table), 265 + CLK_IGNORE_UNUSED); 266 + 267 + static OWL_COMP_FACTOR(edp_clk, "edp_clk", edp_clk_mux_p, 268 + OWL_MUX_HW(CMU_EDPCLK, 19, 1), 269 + OWL_GATE_HW(CMU_DEVCLKEN0, 10, 0), 270 + OWL_FACTOR_HW(CMU_EDPCLK, 16, 3, 0, bisp_factor_table), 271 + 0); 272 + 273 + static OWL_COMP_DIV_FIXED(eth_mac_clk, "eth_mac_clk", "assist_pll_clk", 274 + OWL_GATE_HW(CMU_DEVCLKEN1, 22, 0), 275 + OWL_DIVIDER_HW(CMU_ASSISTPLL, 10, 1, 0, eth_mac_div_table), 276 + 0); 277 + 278 + static OWL_COMP_FACTOR(gpu_core_clk, "gpu_core_clk", gpu_clk_mux_p, 279 + OWL_MUX_HW(CMU_GPU3DCLK, 4, 2), 280 + OWL_GATE_HW(CMU_GPU3DCLK, 15, 0), 281 + OWL_FACTOR_HW(CMU_GPU3DCLK, 0, 3, 0, bisp_factor_table), 282 + 0); 283 + 284 + static OWL_COMP_FACTOR(gpu_mem_clk, "gpu_mem_clk", gpu_clk_mux_p, 285 + OWL_MUX_HW(CMU_GPU3DCLK, 20, 2), 286 + OWL_GATE_HW(CMU_GPU3DCLK, 14, 0), 287 + OWL_FACTOR_HW(CMU_GPU3DCLK, 16, 3, 0, bisp_factor_table), 288 + 0); 289 + 290 + static OWL_COMP_FACTOR(gpu_sys_clk, "gpu_sys_clk", gpu_clk_mux_p, 291 + OWL_MUX_HW(CMU_GPU3DCLK, 28, 2), 292 + OWL_GATE_HW(CMU_GPU3DCLK, 13, 0), 293 + OWL_FACTOR_HW(CMU_GPU3DCLK, 24, 3, 0, bisp_factor_table), 294 + 0); 295 + 296 + static OWL_COMP_FACTOR(hde_clk, "hde_clk", hde_clk_mux_p, 297 + OWL_MUX_HW(CMU_HDECLK, 4, 2), 298 + OWL_GATE_HW(CMU_DEVCLKEN0, 27, 0), 299 + OWL_FACTOR_HW(CMU_HDECLK, 0, 3, 0, bisp_factor_table), 300 + 0); 301 + 302 + static OWL_COMP_DIV(hdmia_clk, "hdmia_clk", i2s_clk_mux_p, 303 + OWL_MUX_HW(CMU_AUDIOPLL, 24, 1), 304 + OWL_GATE_HW(CMU_DEVCLKEN0, 22, 0), 305 + OWL_DIVIDER_HW(CMU_AUDIOPLL, 24, 4, 0, hdmia_div_table), 306 + 0); 307 + 308 + static OWL_COMP_FIXED_FACTOR(i2c0_clk, "i2c0_clk", "assist_pll_clk", 309 + OWL_GATE_HW(CMU_DEVCLKEN1, 14, 0), 310 + 1, 5, 0); 311 + 312 + static OWL_COMP_FIXED_FACTOR(i2c1_clk, "i2c1_clk", "assist_pll_clk", 313 + OWL_GATE_HW(CMU_DEVCLKEN1, 15, 0), 314 + 1, 5, 0); 315 + 316 + static OWL_COMP_FIXED_FACTOR(i2c2_clk, "i2c2_clk", "assist_pll_clk", 317 + OWL_GATE_HW(CMU_DEVCLKEN1, 30, 0), 318 + 1, 5, 0); 319 + 320 + static OWL_COMP_FIXED_FACTOR(i2c3_clk, "i2c3_clk", "assist_pll_clk", 321 + OWL_GATE_HW(CMU_DEVCLKEN1, 31, 0), 322 + 1, 5, 0); 323 + 324 + static OWL_COMP_FIXED_FACTOR(i2c4_clk, "i2c4_clk", "assist_pll_clk", 325 + OWL_GATE_HW(CMU_DEVCLKEN0, 17, 0), 326 + 1, 5, 0); 327 + 328 + static OWL_COMP_FIXED_FACTOR(i2c5_clk, "i2c5_clk", "assist_pll_clk", 329 + OWL_GATE_HW(CMU_DEVCLKEN1, 1, 0), 330 + 1, 5, 0); 331 + 332 + static OWL_COMP_DIV(i2srx_clk, "i2srx_clk", i2s_clk_mux_p, 333 + OWL_MUX_HW(CMU_AUDIOPLL, 24, 1), 334 + OWL_GATE_HW(CMU_DEVCLKEN0, 21, 0), 335 + OWL_DIVIDER_HW(CMU_AUDIOPLL, 20, 4, 0, i2s_div_table), 336 + 0); 337 + 338 + static OWL_COMP_DIV(i2stx_clk, "i2stx_clk", i2s_clk_mux_p, 339 + OWL_MUX_HW(CMU_AUDIOPLL, 24, 1), 340 + OWL_GATE_HW(CMU_DEVCLKEN0, 20, 0), 341 + OWL_DIVIDER_HW(CMU_AUDIOPLL, 16, 4, 0, i2s_div_table), 342 + 0); 343 + 344 + static OWL_COMP_FACTOR(imx_clk, "imx_clk", imx_clk_mux_p, 345 + OWL_MUX_HW(CMU_IMXCLK, 4, 1), 346 + OWL_GATE_HW(CMU_DEVCLKEN1, 17, 0), 347 + OWL_FACTOR_HW(CMU_IMXCLK, 0, 3, 0, bisp_factor_table), 348 + 0); 349 + 350 + static OWL_COMP_DIV(lcd_clk, "lcd_clk", lcd_clk_mux_p, 351 + OWL_MUX_HW(CMU_LCDCLK, 12, 2), 352 + OWL_GATE_HW(CMU_DEVCLKEN0, 9, 0), 353 + OWL_DIVIDER_HW(CMU_LCDCLK, 0, 5, 0, NULL), 354 + 0); 355 + 356 + static OWL_COMP_DIV(nand0_clk, "nand0_clk", nand_clk_mux_p, 357 + OWL_MUX_HW(CMU_NANDCCLK, 8, 1), 358 + OWL_GATE_HW(CMU_DEVCLKEN0, 4, 0), 359 + OWL_DIVIDER_HW(CMU_NANDCCLK, 0, 4, 0, nand_div_table), 360 + CLK_SET_RATE_PARENT); 361 + 362 + static OWL_COMP_DIV(nand1_clk, "nand1_clk", nand_clk_mux_p, 363 + OWL_MUX_HW(CMU_NANDCCLK, 24, 1), 364 + OWL_GATE_HW(CMU_DEVCLKEN0, 11, 0), 365 + OWL_DIVIDER_HW(CMU_NANDCCLK, 16, 4, 0, nand_div_table), 366 + CLK_SET_RATE_PARENT); 367 + 368 + static OWL_COMP_DIV_FIXED(pwm0_clk, "pwm0_clk", "hosc", 369 + OWL_GATE_HW(CMU_DEVCLKEN1, 23, 0), 370 + OWL_DIVIDER_HW(CMU_PWM0CLK, 0, 6, 0, NULL), 371 + 0); 372 + 373 + static OWL_COMP_DIV_FIXED(pwm1_clk, "pwm1_clk", "hosc", 374 + OWL_GATE_HW(CMU_DEVCLKEN1, 24, 0), 375 + OWL_DIVIDER_HW(CMU_PWM1CLK, 0, 6, 0, NULL), 376 + 0); 377 + /* 378 + * pwm2 may be for backlight, do not gate it 379 + * even it is "unused", because it may be 380 + * enabled at boot stage, and in kernel, driver 381 + * has no effective method to know the real status, 382 + * so, the best way is keeping it as what it was. 383 + */ 384 + static OWL_COMP_DIV_FIXED(pwm2_clk, "pwm2_clk", "hosc", 385 + OWL_GATE_HW(CMU_DEVCLKEN1, 25, 0), 386 + OWL_DIVIDER_HW(CMU_PWM2CLK, 0, 6, 0, NULL), 387 + CLK_IGNORE_UNUSED); 388 + 389 + static OWL_COMP_DIV_FIXED(pwm3_clk, "pwm3_clk", "hosc", 390 + OWL_GATE_HW(CMU_DEVCLKEN1, 26, 0), 391 + OWL_DIVIDER_HW(CMU_PWM3CLK, 0, 6, 0, NULL), 392 + 0); 393 + 394 + static OWL_COMP_DIV_FIXED(pwm4_clk, "pwm4_clk", "hosc", 395 + OWL_GATE_HW(CMU_DEVCLKEN1, 4, 0), 396 + OWL_DIVIDER_HW(CMU_PWM4CLK, 0, 6, 0, NULL), 397 + 0); 398 + 399 + static OWL_COMP_DIV_FIXED(pwm5_clk, "pwm5_clk", "hosc", 400 + OWL_GATE_HW(CMU_DEVCLKEN1, 5, 0), 401 + OWL_DIVIDER_HW(CMU_PWM5CLK, 0, 6, 0, NULL), 402 + 0); 403 + 404 + static OWL_COMP_FACTOR(sd0_clk, "sd0_clk", sd_clk_mux_p, 405 + OWL_MUX_HW(CMU_SD0CLK, 9, 1), 406 + OWL_GATE_HW(CMU_DEVCLKEN0, 5, 0), 407 + OWL_FACTOR_HW(CMU_SD0CLK, 0, 9, 0, sd_factor_table), 408 + 0); 409 + 410 + static OWL_COMP_FACTOR(sd1_clk, "sd1_clk", sd_clk_mux_p, 411 + OWL_MUX_HW(CMU_SD1CLK, 9, 1), 412 + OWL_GATE_HW(CMU_DEVCLKEN0, 6, 0), 413 + OWL_FACTOR_HW(CMU_SD1CLK, 0, 9, 0, sd_factor_table), 414 + 0); 415 + 416 + static OWL_COMP_FACTOR(sd2_clk, "sd2_clk", sd_clk_mux_p, 417 + OWL_MUX_HW(CMU_SD2CLK, 9, 1), 418 + OWL_GATE_HW(CMU_DEVCLKEN0, 7, 0), 419 + OWL_FACTOR_HW(CMU_SD2CLK, 0, 9, 0, sd_factor_table), 420 + 0); 421 + 422 + static OWL_COMP_FACTOR(sd3_clk, "sd3_clk", sd_clk_mux_p, 423 + OWL_MUX_HW(CMU_SD3CLK, 9, 1), 424 + OWL_GATE_HW(CMU_DEVCLKEN0, 16, 0), 425 + OWL_FACTOR_HW(CMU_SD3CLK, 0, 9, 0, sd_factor_table), 426 + 0); 427 + 428 + static OWL_COMP_DIV(sensor_clk, "sensor_clk", sensor_clk_mux_p, 429 + OWL_MUX_HW(CMU_SENSORCLK, 4, 1), 430 + OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0), 431 + OWL_DIVIDER_HW(CMU_SENSORCLK, 0, 4, 0, NULL), 432 + 0); 433 + 434 + static OWL_COMP_DIV_FIXED(speed_sensor_clk, "speed_sensor_clk", 435 + "hosc", 436 + OWL_GATE_HW(CMU_DEVCLKEN1, 0, 0), 437 + OWL_DIVIDER_HW(CMU_TLSCLK, 0, 4, CLK_DIVIDER_POWER_OF_TWO, NULL), 438 + 0); 439 + 440 + static OWL_COMP_DIV_FIXED(thermal_sensor_clk, "thermal_sensor_clk", 441 + "hosc", 442 + OWL_GATE_HW(CMU_DEVCLKEN1, 2, 0), 443 + OWL_DIVIDER_HW(CMU_TLSCLK, 8, 4, CLK_DIVIDER_POWER_OF_TWO, NULL), 444 + 0); 445 + 446 + static OWL_COMP_DIV(uart0_clk, "uart0_clk", uart_clk_mux_p, 447 + OWL_MUX_HW(CMU_UART0CLK, 16, 1), 448 + OWL_GATE_HW(CMU_DEVCLKEN1, 6, 0), 449 + OWL_DIVIDER_HW(CMU_UART0CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 450 + CLK_IGNORE_UNUSED); 451 + 452 + static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p, 453 + OWL_MUX_HW(CMU_UART1CLK, 16, 1), 454 + OWL_GATE_HW(CMU_DEVCLKEN1, 7, 0), 455 + OWL_DIVIDER_HW(CMU_UART1CLK, 1, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 456 + CLK_IGNORE_UNUSED); 457 + 458 + static OWL_COMP_DIV(uart2_clk, "uart2_clk", uart_clk_mux_p, 459 + OWL_MUX_HW(CMU_UART2CLK, 16, 1), 460 + OWL_GATE_HW(CMU_DEVCLKEN1, 8, 0), 461 + OWL_DIVIDER_HW(CMU_UART2CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 462 + CLK_IGNORE_UNUSED); 463 + 464 + static OWL_COMP_DIV(uart3_clk, "uart3_clk", uart_clk_mux_p, 465 + OWL_MUX_HW(CMU_UART3CLK, 16, 1), 466 + OWL_GATE_HW(CMU_DEVCLKEN1, 19, 0), 467 + OWL_DIVIDER_HW(CMU_UART3CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 468 + CLK_IGNORE_UNUSED); 469 + 470 + static OWL_COMP_DIV(uart4_clk, "uart4_clk", uart_clk_mux_p, 471 + OWL_MUX_HW(CMU_UART4CLK, 16, 1), 472 + OWL_GATE_HW(CMU_DEVCLKEN1, 20, 0), 473 + OWL_DIVIDER_HW(CMU_UART4CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 474 + CLK_IGNORE_UNUSED); 475 + 476 + static OWL_COMP_DIV(uart5_clk, "uart5_clk", uart_clk_mux_p, 477 + OWL_MUX_HW(CMU_UART5CLK, 16, 1), 478 + OWL_GATE_HW(CMU_DEVCLKEN1, 21, 0), 479 + OWL_DIVIDER_HW(CMU_UART5CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 480 + CLK_IGNORE_UNUSED); 481 + 482 + static OWL_COMP_DIV(uart6_clk, "uart6_clk", uart_clk_mux_p, 483 + OWL_MUX_HW(CMU_UART6CLK, 16, 1), 484 + OWL_GATE_HW(CMU_DEVCLKEN1, 18, 0), 485 + OWL_DIVIDER_HW(CMU_UART6CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), 486 + CLK_IGNORE_UNUSED); 487 + 488 + static OWL_COMP_FACTOR(vce_clk, "vce_clk", vce_clk_mux_p, 489 + OWL_MUX_HW(CMU_VCECLK, 4, 2), 490 + OWL_GATE_HW(CMU_DEVCLKEN0, 26, 0), 491 + OWL_FACTOR_HW(CMU_VCECLK, 0, 3, 0, bisp_factor_table), 492 + 0); 493 + 494 + static OWL_COMP_FACTOR(vde_clk, "vde_clk", hde_clk_mux_p, 495 + OWL_MUX_HW(CMU_VDECLK, 4, 2), 496 + OWL_GATE_HW(CMU_DEVCLKEN0, 25, 0), 497 + OWL_FACTOR_HW(CMU_VDECLK, 0, 3, 0, bisp_factor_table), 498 + 0); 499 + 500 + static struct owl_clk_common *s900_clks[] = { 501 + &core_pll_clk.common, 502 + &dev_pll_clk.common, 503 + &ddr_pll_clk.common, 504 + &nand_pll_clk.common, 505 + &display_pll_clk.common, 506 + &assist_pll_clk.common, 507 + &audio_pll_clk.common, 508 + &edp_pll_clk.common, 509 + &cpu_clk.common, 510 + &dev_clk.common, 511 + &noc_clk_mux.common, 512 + &noc_clk_div.common, 513 + &ahb_clk.common, 514 + &apb_clk.common, 515 + &usb3_mac_clk.common, 516 + &rmii_ref_clk.common, 517 + &noc_clk.common, 518 + &de_clk1.common, 519 + &de_clk2.common, 520 + &de_clk3.common, 521 + &gpio_clk.common, 522 + &gpu_clk.common, 523 + &dmac_clk.common, 524 + &timer_clk.common, 525 + &dsi_clk.common, 526 + &ddr0_clk.common, 527 + &ddr1_clk.common, 528 + &usb3_480mpll0_clk.common, 529 + &usb3_480mphy0_clk.common, 530 + &usb3_5gphy_clk.common, 531 + &usb3_cce_clk.common, 532 + &edp24M_clk.common, 533 + &edp_link_clk.common, 534 + &usbh0_pllen_clk.common, 535 + &usbh0_phy_clk.common, 536 + &usbh0_cce_clk.common, 537 + &usbh1_pllen_clk.common, 538 + &usbh1_phy_clk.common, 539 + &usbh1_cce_clk.common, 540 + &i2c0_clk.common, 541 + &i2c1_clk.common, 542 + &i2c2_clk.common, 543 + &i2c3_clk.common, 544 + &i2c4_clk.common, 545 + &i2c5_clk.common, 546 + &spi0_clk.common, 547 + &spi1_clk.common, 548 + &spi2_clk.common, 549 + &spi3_clk.common, 550 + &bisp_clk.common, 551 + &csi0_clk.common, 552 + &csi1_clk.common, 553 + &de_clk.common, 554 + &dmm_clk.common, 555 + &edp_clk.common, 556 + &eth_mac_clk.common, 557 + &gpu_core_clk.common, 558 + &gpu_mem_clk.common, 559 + &gpu_sys_clk.common, 560 + &hde_clk.common, 561 + &hdmia_clk.common, 562 + &i2srx_clk.common, 563 + &i2stx_clk.common, 564 + &imx_clk.common, 565 + &lcd_clk.common, 566 + &nand0_clk.common, 567 + &nand1_clk.common, 568 + &pwm0_clk.common, 569 + &pwm1_clk.common, 570 + &pwm2_clk.common, 571 + &pwm3_clk.common, 572 + &pwm4_clk.common, 573 + &pwm5_clk.common, 574 + &sd0_clk.common, 575 + &sd1_clk.common, 576 + &sd2_clk.common, 577 + &sd3_clk.common, 578 + &sensor_clk.common, 579 + &speed_sensor_clk.common, 580 + &thermal_sensor_clk.common, 581 + &uart0_clk.common, 582 + &uart1_clk.common, 583 + &uart2_clk.common, 584 + &uart3_clk.common, 585 + &uart4_clk.common, 586 + &uart5_clk.common, 587 + &uart6_clk.common, 588 + &vce_clk.common, 589 + &vde_clk.common, 590 + }; 591 + 592 + static struct clk_hw_onecell_data s900_hw_clks = { 593 + .hws = { 594 + [CLK_CORE_PLL] = &core_pll_clk.common.hw, 595 + [CLK_DEV_PLL] = &dev_pll_clk.common.hw, 596 + [CLK_DDR_PLL] = &ddr_pll_clk.common.hw, 597 + [CLK_NAND_PLL] = &nand_pll_clk.common.hw, 598 + [CLK_DISPLAY_PLL] = &display_pll_clk.common.hw, 599 + [CLK_ASSIST_PLL] = &assist_pll_clk.common.hw, 600 + [CLK_AUDIO_PLL] = &audio_pll_clk.common.hw, 601 + [CLK_EDP_PLL] = &edp_pll_clk.common.hw, 602 + [CLK_CPU] = &cpu_clk.common.hw, 603 + [CLK_DEV] = &dev_clk.common.hw, 604 + [CLK_NOC_MUX] = &noc_clk_mux.common.hw, 605 + [CLK_NOC_DIV] = &noc_clk_div.common.hw, 606 + [CLK_AHB] = &ahb_clk.common.hw, 607 + [CLK_APB] = &apb_clk.common.hw, 608 + [CLK_USB3_MAC] = &usb3_mac_clk.common.hw, 609 + [CLK_RMII_REF] = &rmii_ref_clk.common.hw, 610 + [CLK_NOC] = &noc_clk.common.hw, 611 + [CLK_DE1] = &de_clk1.common.hw, 612 + [CLK_DE2] = &de_clk2.common.hw, 613 + [CLK_DE3] = &de_clk3.common.hw, 614 + [CLK_GPIO] = &gpio_clk.common.hw, 615 + [CLK_GPU] = &gpu_clk.common.hw, 616 + [CLK_DMAC] = &dmac_clk.common.hw, 617 + [CLK_TIMER] = &timer_clk.common.hw, 618 + [CLK_DSI] = &dsi_clk.common.hw, 619 + [CLK_DDR0] = &ddr0_clk.common.hw, 620 + [CLK_DDR1] = &ddr1_clk.common.hw, 621 + [CLK_USB3_480MPLL0] = &usb3_480mpll0_clk.common.hw, 622 + [CLK_USB3_480MPHY0] = &usb3_480mphy0_clk.common.hw, 623 + [CLK_USB3_5GPHY] = &usb3_5gphy_clk.common.hw, 624 + [CLK_USB3_CCE] = &usb3_cce_clk.common.hw, 625 + [CLK_24M_EDP] = &edp24M_clk.common.hw, 626 + [CLK_EDP_LINK] = &edp_link_clk.common.hw, 627 + [CLK_USB2H0_PLLEN] = &usbh0_pllen_clk.common.hw, 628 + [CLK_USB2H0_PHY] = &usbh0_phy_clk.common.hw, 629 + [CLK_USB2H0_CCE] = &usbh0_cce_clk.common.hw, 630 + [CLK_USB2H1_PLLEN] = &usbh1_pllen_clk.common.hw, 631 + [CLK_USB2H1_PHY] = &usbh1_phy_clk.common.hw, 632 + [CLK_USB2H1_CCE] = &usbh1_cce_clk.common.hw, 633 + [CLK_I2C0] = &i2c0_clk.common.hw, 634 + [CLK_I2C1] = &i2c1_clk.common.hw, 635 + [CLK_I2C2] = &i2c2_clk.common.hw, 636 + [CLK_I2C3] = &i2c3_clk.common.hw, 637 + [CLK_I2C4] = &i2c4_clk.common.hw, 638 + [CLK_I2C5] = &i2c5_clk.common.hw, 639 + [CLK_SPI0] = &spi0_clk.common.hw, 640 + [CLK_SPI1] = &spi1_clk.common.hw, 641 + [CLK_SPI2] = &spi2_clk.common.hw, 642 + [CLK_SPI3] = &spi3_clk.common.hw, 643 + [CLK_BISP] = &bisp_clk.common.hw, 644 + [CLK_CSI0] = &csi0_clk.common.hw, 645 + [CLK_CSI1] = &csi1_clk.common.hw, 646 + [CLK_DE0] = &de_clk.common.hw, 647 + [CLK_DMM] = &dmm_clk.common.hw, 648 + [CLK_EDP] = &edp_clk.common.hw, 649 + [CLK_ETH_MAC] = &eth_mac_clk.common.hw, 650 + [CLK_GPU_CORE] = &gpu_core_clk.common.hw, 651 + [CLK_GPU_MEM] = &gpu_mem_clk.common.hw, 652 + [CLK_GPU_SYS] = &gpu_sys_clk.common.hw, 653 + [CLK_HDE] = &hde_clk.common.hw, 654 + [CLK_HDMI_AUDIO] = &hdmia_clk.common.hw, 655 + [CLK_I2SRX] = &i2srx_clk.common.hw, 656 + [CLK_I2STX] = &i2stx_clk.common.hw, 657 + [CLK_IMX] = &imx_clk.common.hw, 658 + [CLK_LCD] = &lcd_clk.common.hw, 659 + [CLK_NAND0] = &nand0_clk.common.hw, 660 + [CLK_NAND1] = &nand1_clk.common.hw, 661 + [CLK_PWM0] = &pwm0_clk.common.hw, 662 + [CLK_PWM1] = &pwm1_clk.common.hw, 663 + [CLK_PWM2] = &pwm2_clk.common.hw, 664 + [CLK_PWM3] = &pwm3_clk.common.hw, 665 + [CLK_PWM4] = &pwm4_clk.common.hw, 666 + [CLK_PWM5] = &pwm5_clk.common.hw, 667 + [CLK_SD0] = &sd0_clk.common.hw, 668 + [CLK_SD1] = &sd1_clk.common.hw, 669 + [CLK_SD2] = &sd2_clk.common.hw, 670 + [CLK_SD3] = &sd3_clk.common.hw, 671 + [CLK_SENSOR] = &sensor_clk.common.hw, 672 + [CLK_SPEED_SENSOR] = &speed_sensor_clk.common.hw, 673 + [CLK_THERMAL_SENSOR] = &thermal_sensor_clk.common.hw, 674 + [CLK_UART0] = &uart0_clk.common.hw, 675 + [CLK_UART1] = &uart1_clk.common.hw, 676 + [CLK_UART2] = &uart2_clk.common.hw, 677 + [CLK_UART3] = &uart3_clk.common.hw, 678 + [CLK_UART4] = &uart4_clk.common.hw, 679 + [CLK_UART5] = &uart5_clk.common.hw, 680 + [CLK_UART6] = &uart6_clk.common.hw, 681 + [CLK_VCE] = &vce_clk.common.hw, 682 + [CLK_VDE] = &vde_clk.common.hw, 683 + }, 684 + .num = CLK_NR_CLKS, 685 + }; 686 + 687 + static const struct owl_clk_desc s900_clk_desc = { 688 + .clks = s900_clks, 689 + .num_clks = ARRAY_SIZE(s900_clks), 690 + 691 + .hw_clks = &s900_hw_clks, 692 + }; 693 + 694 + static int s900_clk_probe(struct platform_device *pdev) 695 + { 696 + const struct owl_clk_desc *desc; 697 + 698 + desc = &s900_clk_desc; 699 + owl_clk_regmap_init(pdev, desc); 700 + 701 + return owl_clk_probe(&pdev->dev, desc->hw_clks); 702 + } 703 + 704 + static const struct of_device_id s900_clk_of_match[] = { 705 + { .compatible = "actions,s900-cmu", }, 706 + { /* sentinel */ } 707 + }; 708 + 709 + static struct platform_driver s900_clk_driver = { 710 + .probe = s900_clk_probe, 711 + .driver = { 712 + .name = "s900-cmu", 713 + .of_match_table = s900_clk_of_match, 714 + }, 715 + }; 716 + 717 + static int __init s900_clk_init(void) 718 + { 719 + return platform_driver_register(&s900_clk_driver); 720 + } 721 + core_initcall(s900_clk_init);
+1 -12
drivers/clk/at91/clk-pll.c
··· 132 132 unsigned long parent_rate) 133 133 { 134 134 struct clk_pll *pll = to_clk_pll(hw); 135 - unsigned int pllr; 136 - u16 mul; 137 - u8 div; 138 135 139 - regmap_read(pll->regmap, PLL_REG(pll->id), &pllr); 140 - 141 - div = PLL_DIV(pllr); 142 - mul = PLL_MUL(pllr, pll->layout); 143 - 144 - if (!div || !mul) 145 - return 0; 146 - 147 - return (parent_rate / div) * (mul + 1); 136 + return (parent_rate / pll->div) * (pll->mul + 1); 148 137 } 149 138 150 139 static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate,
+18 -24
drivers/clk/bcm/clk-bcm2835.c
··· 394 394 return count * 1000; 395 395 } 396 396 397 - static int bcm2835_debugfs_regset(struct bcm2835_cprman *cprman, u32 base, 397 + static void bcm2835_debugfs_regset(struct bcm2835_cprman *cprman, u32 base, 398 398 struct debugfs_reg32 *regs, size_t nregs, 399 399 struct dentry *dentry) 400 400 { 401 - struct dentry *regdump; 402 401 struct debugfs_regset32 *regset; 403 402 404 403 regset = devm_kzalloc(cprman->dev, sizeof(*regset), GFP_KERNEL); 405 404 if (!regset) 406 - return -ENOMEM; 405 + return; 407 406 408 407 regset->regs = regs; 409 408 regset->nregs = nregs; 410 409 regset->base = cprman->regs + base; 411 410 412 - regdump = debugfs_create_regset32("regdump", S_IRUGO, dentry, 413 - regset); 414 - 415 - return regdump ? 0 : -ENOMEM; 411 + debugfs_create_regset32("regdump", S_IRUGO, dentry, regset); 416 412 } 417 413 418 414 struct bcm2835_pll_data { ··· 726 730 return 0; 727 731 } 728 732 729 - static int bcm2835_pll_debug_init(struct clk_hw *hw, 733 + static void bcm2835_pll_debug_init(struct clk_hw *hw, 730 734 struct dentry *dentry) 731 735 { 732 736 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw); ··· 736 740 737 741 regs = devm_kzalloc(cprman->dev, 7 * sizeof(*regs), GFP_KERNEL); 738 742 if (!regs) 739 - return -ENOMEM; 743 + return; 740 744 741 745 regs[0].name = "cm_ctrl"; 742 746 regs[0].offset = data->cm_ctrl_reg; ··· 753 757 regs[6].name = "ana3"; 754 758 regs[6].offset = data->ana_reg_base + 3 * 4; 755 759 756 - return bcm2835_debugfs_regset(cprman, 0, regs, 7, dentry); 760 + bcm2835_debugfs_regset(cprman, 0, regs, 7, dentry); 757 761 } 758 762 759 763 static const struct clk_ops bcm2835_pll_clk_ops = { ··· 857 861 return 0; 858 862 } 859 863 860 - static int bcm2835_pll_divider_debug_init(struct clk_hw *hw, 861 - struct dentry *dentry) 864 + static void bcm2835_pll_divider_debug_init(struct clk_hw *hw, 865 + struct dentry *dentry) 862 866 { 863 867 struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw); 864 868 struct bcm2835_cprman *cprman = divider->cprman; ··· 867 871 868 872 regs = devm_kzalloc(cprman->dev, 7 * sizeof(*regs), GFP_KERNEL); 869 873 if (!regs) 870 - return -ENOMEM; 874 + return; 871 875 872 876 regs[0].name = "cm"; 873 877 regs[0].offset = data->cm_reg; 874 878 regs[1].name = "a2w"; 875 879 regs[1].offset = data->a2w_reg; 876 880 877 - return bcm2835_debugfs_regset(cprman, 0, regs, 2, dentry); 881 + bcm2835_debugfs_regset(cprman, 0, regs, 2, dentry); 878 882 } 879 883 880 884 static const struct clk_ops bcm2835_pll_divider_clk_ops = { ··· 1250 1254 }, 1251 1255 }; 1252 1256 1253 - static int bcm2835_clock_debug_init(struct clk_hw *hw, 1257 + static void bcm2835_clock_debug_init(struct clk_hw *hw, 1254 1258 struct dentry *dentry) 1255 1259 { 1256 1260 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); 1257 1261 struct bcm2835_cprman *cprman = clock->cprman; 1258 1262 const struct bcm2835_clock_data *data = clock->data; 1259 1263 1260 - return bcm2835_debugfs_regset( 1261 - cprman, data->ctl_reg, 1264 + bcm2835_debugfs_regset(cprman, data->ctl_reg, 1262 1265 bcm2835_debugfs_clock_reg32, 1263 1266 ARRAY_SIZE(bcm2835_debugfs_clock_reg32), 1264 1267 dentry); ··· 1390 1395 struct bcm2835_clock *clock; 1391 1396 struct clk_init_data init; 1392 1397 const char *parents[1 << CM_SRC_BITS]; 1393 - size_t i, j; 1398 + size_t i; 1394 1399 int ret; 1395 1400 1396 1401 /* ··· 1400 1405 for (i = 0; i < data->num_mux_parents; i++) { 1401 1406 parents[i] = data->parents[i]; 1402 1407 1403 - for (j = 0; j < ARRAY_SIZE(cprman_parent_names); j++) { 1404 - if (strcmp(parents[i], cprman_parent_names[j]) == 0) { 1405 - parents[i] = cprman->real_parent_names[j]; 1406 - break; 1407 - } 1408 - } 1408 + ret = match_string(cprman_parent_names, 1409 + ARRAY_SIZE(cprman_parent_names), 1410 + parents[i]); 1411 + if (ret >= 0) 1412 + parents[i] = cprman->real_parent_names[ret]; 1409 1413 } 1410 1414 1411 1415 memset(&init, 0, sizeof(init));
+120 -15
drivers/clk/bcm/clk-sr.c
··· 56 56 }; 57 57 58 58 static const struct iproc_clk_ctrl sr_genpll0_clk[] = { 59 - [BCM_SR_GENPLL0_SATA_CLK] = { 60 - .channel = BCM_SR_GENPLL0_SATA_CLK, 59 + [BCM_SR_GENPLL0_125M_CLK] = { 60 + .channel = BCM_SR_GENPLL0_125M_CLK, 61 61 .flags = IPROC_CLK_AON, 62 62 .enable = ENABLE_VAL(0x4, 6, 0, 12), 63 63 .mdiv = REG_VAL(0x18, 0, 9), ··· 99 99 iproc_pll_clk_setup(pdev->dev.of_node, 100 100 &sr_genpll0, NULL, 0, sr_genpll0_clk, 101 101 ARRAY_SIZE(sr_genpll0_clk)); 102 + return 0; 103 + } 104 + 105 + static const struct iproc_pll_ctrl sr_genpll2 = { 106 + .flags = IPROC_CLK_AON | IPROC_CLK_PLL_HAS_NDIV_FRAC | 107 + IPROC_CLK_PLL_NEEDS_SW_CFG, 108 + .aon = AON_VAL(0x0, 1, 13, 12), 109 + .reset = RESET_VAL(0x0, 12, 11), 110 + .dig_filter = DF_VAL(0x0, 4, 3, 0, 4, 7, 3), 111 + .sw_ctrl = SW_CTRL_VAL(0x10, 31), 112 + .ndiv_int = REG_VAL(0x10, 20, 10), 113 + .ndiv_frac = REG_VAL(0x10, 0, 20), 114 + .pdiv = REG_VAL(0x14, 0, 4), 115 + .status = REG_VAL(0x30, 12, 1), 116 + }; 117 + 118 + static const struct iproc_clk_ctrl sr_genpll2_clk[] = { 119 + [BCM_SR_GENPLL2_NIC_CLK] = { 120 + .channel = BCM_SR_GENPLL2_NIC_CLK, 121 + .flags = IPROC_CLK_AON, 122 + .enable = ENABLE_VAL(0x4, 6, 0, 12), 123 + .mdiv = REG_VAL(0x18, 0, 9), 124 + }, 125 + [BCM_SR_GENPLL2_TS_500_CLK] = { 126 + .channel = BCM_SR_GENPLL2_TS_500_CLK, 127 + .flags = IPROC_CLK_AON, 128 + .enable = ENABLE_VAL(0x4, 7, 1, 13), 129 + .mdiv = REG_VAL(0x18, 10, 9), 130 + }, 131 + [BCM_SR_GENPLL2_125_NITRO_CLK] = { 132 + .channel = BCM_SR_GENPLL2_125_NITRO_CLK, 133 + .flags = IPROC_CLK_AON, 134 + .enable = ENABLE_VAL(0x4, 8, 2, 14), 135 + .mdiv = REG_VAL(0x18, 20, 9), 136 + }, 137 + [BCM_SR_GENPLL2_CHIMP_CLK] = { 138 + .channel = BCM_SR_GENPLL2_CHIMP_CLK, 139 + .flags = IPROC_CLK_AON, 140 + .enable = ENABLE_VAL(0x4, 9, 3, 15), 141 + .mdiv = REG_VAL(0x1c, 0, 9), 142 + }, 143 + [BCM_SR_GENPLL2_NIC_FLASH_CLK] = { 144 + .channel = BCM_SR_GENPLL2_NIC_FLASH_CLK, 145 + .flags = IPROC_CLK_AON, 146 + .enable = ENABLE_VAL(0x4, 10, 4, 16), 147 + .mdiv = REG_VAL(0x1c, 10, 9), 148 + }, 149 + [BCM_SR_GENPLL2_FS4_CLK] = { 150 + .channel = BCM_SR_GENPLL2_FS4_CLK, 151 + .enable = ENABLE_VAL(0x4, 11, 5, 17), 152 + .mdiv = REG_VAL(0x1c, 20, 9), 153 + }, 154 + }; 155 + 156 + static int sr_genpll2_clk_init(struct platform_device *pdev) 157 + { 158 + iproc_pll_clk_setup(pdev->dev.of_node, 159 + &sr_genpll2, NULL, 0, sr_genpll2_clk, 160 + ARRAY_SIZE(sr_genpll2_clk)); 102 161 return 0; 103 162 } 104 163 ··· 216 157 .enable = ENABLE_VAL(0x4, 6, 0, 12), 217 158 .mdiv = REG_VAL(0x18, 0, 9), 218 159 }, 160 + [BCM_SR_GENPLL4_TPIU_PLL_CLK] = { 161 + .channel = BCM_SR_GENPLL4_TPIU_PLL_CLK, 162 + .flags = IPROC_CLK_AON, 163 + .enable = ENABLE_VAL(0x4, 7, 1, 13), 164 + .mdiv = REG_VAL(0x18, 10, 9), 165 + }, 166 + [BCM_SR_GENPLL4_NOC_CLK] = { 167 + .channel = BCM_SR_GENPLL4_NOC_CLK, 168 + .flags = IPROC_CLK_AON, 169 + .enable = ENABLE_VAL(0x4, 8, 2, 14), 170 + .mdiv = REG_VAL(0x18, 20, 9), 171 + }, 172 + [BCM_SR_GENPLL4_CHCLK_FS4_CLK] = { 173 + .channel = BCM_SR_GENPLL4_CHCLK_FS4_CLK, 174 + .flags = IPROC_CLK_AON, 175 + .enable = ENABLE_VAL(0x4, 9, 3, 15), 176 + .mdiv = REG_VAL(0x1c, 0, 9), 177 + }, 178 + [BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK] = { 179 + .channel = BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK, 180 + .flags = IPROC_CLK_AON, 181 + .enable = ENABLE_VAL(0x4, 10, 4, 16), 182 + .mdiv = REG_VAL(0x1c, 10, 9), 183 + }, 219 184 }; 220 185 221 186 static int sr_genpll4_clk_init(struct platform_device *pdev) ··· 264 181 }; 265 182 266 183 static const struct iproc_clk_ctrl sr_genpll5_clk[] = { 267 - [BCM_SR_GENPLL5_FS_CLK] = { 268 - .channel = BCM_SR_GENPLL5_FS_CLK, 269 - .flags = IPROC_CLK_AON, 184 + [BCM_SR_GENPLL5_FS4_HF_CLK] = { 185 + .channel = BCM_SR_GENPLL5_FS4_HF_CLK, 270 186 .enable = ENABLE_VAL(0x4, 6, 0, 12), 271 187 .mdiv = REG_VAL(0x18, 0, 9), 272 188 }, 273 - [BCM_SR_GENPLL5_SPU_CLK] = { 274 - .channel = BCM_SR_GENPLL5_SPU_CLK, 275 - .flags = IPROC_CLK_AON, 276 - .enable = ENABLE_VAL(0x4, 6, 0, 12), 189 + [BCM_SR_GENPLL5_CRYPTO_AE_CLK] = { 190 + .channel = BCM_SR_GENPLL5_CRYPTO_AE_CLK, 191 + .enable = ENABLE_VAL(0x4, 7, 1, 12), 277 192 .mdiv = REG_VAL(0x18, 10, 9), 193 + }, 194 + [BCM_SR_GENPLL5_RAID_AE_CLK] = { 195 + .channel = BCM_SR_GENPLL5_RAID_AE_CLK, 196 + .enable = ENABLE_VAL(0x4, 8, 2, 14), 197 + .mdiv = REG_VAL(0x18, 20, 9), 278 198 }, 279 199 }; 280 200 ··· 300 214 }; 301 215 302 216 static const struct iproc_clk_ctrl sr_lcpll0_clk[] = { 303 - [BCM_SR_LCPLL0_SATA_REF_CLK] = { 304 - .channel = BCM_SR_LCPLL0_SATA_REF_CLK, 217 + [BCM_SR_LCPLL0_SATA_REFP_CLK] = { 218 + .channel = BCM_SR_LCPLL0_SATA_REFP_CLK, 305 219 .flags = IPROC_CLK_AON, 306 220 .enable = ENABLE_VAL(0x0, 7, 1, 13), 307 221 .mdiv = REG_VAL(0x14, 0, 9), 308 222 }, 309 - [BCM_SR_LCPLL0_USB_REF_CLK] = { 310 - .channel = BCM_SR_LCPLL0_USB_REF_CLK, 223 + [BCM_SR_LCPLL0_SATA_REFN_CLK] = { 224 + .channel = BCM_SR_LCPLL0_SATA_REFN_CLK, 311 225 .flags = IPROC_CLK_AON, 312 226 .enable = ENABLE_VAL(0x0, 8, 2, 14), 313 227 .mdiv = REG_VAL(0x14, 10, 9), 314 228 }, 315 - [BCM_SR_LCPLL0_SATA_REFPN_CLK] = { 316 - .channel = BCM_SR_LCPLL0_SATA_REFPN_CLK, 229 + [BCM_SR_LCPLL0_SATA_350_CLK] = { 230 + .channel = BCM_SR_LCPLL0_SATA_350_CLK, 317 231 .flags = IPROC_CLK_AON, 318 232 .enable = ENABLE_VAL(0x0, 9, 3, 15), 319 233 .mdiv = REG_VAL(0x14, 20, 9), 234 + }, 235 + [BCM_SR_LCPLL0_SATA_500_CLK] = { 236 + .channel = BCM_SR_LCPLL0_SATA_500_CLK, 237 + .flags = IPROC_CLK_AON, 238 + .enable = ENABLE_VAL(0x0, 10, 4, 16), 239 + .mdiv = REG_VAL(0x18, 0, 9), 320 240 }, 321 241 }; 322 242 ··· 350 258 .flags = IPROC_CLK_AON, 351 259 .enable = ENABLE_VAL(0x0, 7, 1, 13), 352 260 .mdiv = REG_VAL(0x14, 0, 9), 261 + }, 262 + [BCM_SR_LCPLL1_USB_REF_CLK] = { 263 + .channel = BCM_SR_LCPLL1_USB_REF_CLK, 264 + .flags = IPROC_CLK_AON, 265 + .enable = ENABLE_VAL(0x0, 8, 2, 14), 266 + .mdiv = REG_VAL(0x14, 10, 9), 267 + }, 268 + [BCM_SR_LCPLL1_CRMU_TS_CLK] = { 269 + .channel = BCM_SR_LCPLL1_CRMU_TS_CLK, 270 + .flags = IPROC_CLK_AON, 271 + .enable = ENABLE_VAL(0x0, 9, 3, 15), 272 + .mdiv = REG_VAL(0x14, 20, 9), 353 273 }, 354 274 }; 355 275 ··· 402 298 403 299 static const struct of_device_id sr_clk_dt_ids[] = { 404 300 { .compatible = "brcm,sr-genpll0", .data = sr_genpll0_clk_init }, 301 + { .compatible = "brcm,sr-genpll2", .data = sr_genpll2_clk_init }, 405 302 { .compatible = "brcm,sr-genpll4", .data = sr_genpll4_clk_init }, 406 303 { .compatible = "brcm,sr-genpll5", .data = sr_genpll5_clk_init }, 407 304 { .compatible = "brcm,sr-lcpll0", .data = sr_lcpll0_clk_init },
+1 -12
drivers/clk/berlin/berlin2-avpll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 5 6 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #include <linux/clk-provider.h> 20 9 #include <linux/io.h>
+1 -12
drivers/clk/berlin/berlin2-avpll.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 5 6 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #ifndef __BERLIN2_AVPLL_H 20 9 #define __BERLIN2_AVPLL_H
+1 -12
drivers/clk/berlin/berlin2-div.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 5 6 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #include <linux/bitops.h> 20 9 #include <linux/clk-provider.h>
+1 -12
drivers/clk/berlin/berlin2-div.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 5 6 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #ifndef __BERLIN2_DIV_H 20 9 #define __BERLIN2_DIV_H
+1 -12
drivers/clk/berlin/berlin2-pll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 5 6 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #include <linux/clk-provider.h> 20 9 #include <linux/io.h>
+1 -12
drivers/clk/berlin/berlin2-pll.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 5 6 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #ifndef __BERLIN2_PLL_H 20 9 #define __BERLIN2_PLL_H
+1 -12
drivers/clk/berlin/bg2.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 5 6 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 20 9 #include <linux/clk.h>
+1 -12
drivers/clk/berlin/bg2q.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 5 6 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 20 9 #include <linux/clk.h>
+1 -12
drivers/clk/berlin/common.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2014 Marvell Technology Group Ltd. 3 4 * 4 5 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> 5 6 * Alexandre Belloni <alexandre.belloni@free-electrons.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 7 */ 19 8 #ifndef __BERLIN2_COMMON_H 20 9 #define __BERLIN2_COMMON_H
+46 -11
drivers/clk/clk-aspeed.c
··· 14 14 15 15 #include <dt-bindings/clock/aspeed-clock.h> 16 16 17 - #define ASPEED_NUM_CLKS 35 17 + #define ASPEED_NUM_CLKS 36 18 + 19 + #define ASPEED_RESET2_OFFSET 32 18 20 19 21 #define ASPEED_RESET_CTRL 0x04 20 22 #define ASPEED_CLK_SELECTION 0x08 ··· 32 30 #define CLKIN_25MHZ_EN BIT(23) 33 31 #define AST2400_CLK_SOURCE_SEL BIT(18) 34 32 #define ASPEED_CLK_SELECTION_2 0xd8 33 + #define ASPEED_RESET_CTRL2 0xd4 35 34 36 35 /* Globally visible clocks */ 37 36 static DEFINE_SPINLOCK(aspeed_clk_lock); ··· 91 88 [ASPEED_CLK_GATE_GCLK] = { 1, 7, "gclk-gate", NULL, 0 }, /* 2D engine */ 92 89 [ASPEED_CLK_GATE_MCLK] = { 2, -1, "mclk-gate", "mpll", CLK_IS_CRITICAL }, /* SDRAM */ 93 90 [ASPEED_CLK_GATE_VCLK] = { 3, 6, "vclk-gate", NULL, 0 }, /* Video Capture */ 94 - [ASPEED_CLK_GATE_BCLK] = { 4, 10, "bclk-gate", "bclk", 0 }, /* PCIe/PCI */ 91 + [ASPEED_CLK_GATE_BCLK] = { 4, 8, "bclk-gate", "bclk", 0 }, /* PCIe/PCI */ 95 92 [ASPEED_CLK_GATE_DCLK] = { 5, -1, "dclk-gate", NULL, 0 }, /* DAC */ 96 93 [ASPEED_CLK_GATE_REFCLK] = { 6, -1, "refclk-gate", "clkin", CLK_IS_CRITICAL }, 97 94 [ASPEED_CLK_GATE_USBPORT2CLK] = { 7, 3, "usb-port2-gate", NULL, 0 }, /* USB2.0 Host port 2 */ ··· 294 291 #define to_aspeed_reset(p) container_of((p), struct aspeed_reset, rcdev) 295 292 296 293 static const u8 aspeed_resets[] = { 294 + /* SCU04 resets */ 297 295 [ASPEED_RESET_XDMA] = 25, 298 296 [ASPEED_RESET_MCTP] = 24, 299 297 [ASPEED_RESET_ADC] = 23, 300 298 [ASPEED_RESET_JTAG_MASTER] = 22, 301 299 [ASPEED_RESET_MIC] = 18, 302 300 [ASPEED_RESET_PWM] = 9, 303 - [ASPEED_RESET_PCIVGA] = 8, 301 + [ASPEED_RESET_PECI] = 10, 304 302 [ASPEED_RESET_I2C] = 2, 305 303 [ASPEED_RESET_AHB] = 1, 304 + 305 + /* 306 + * SCUD4 resets start at an offset to separate them from 307 + * the SCU04 resets. 308 + */ 309 + [ASPEED_RESET_CRT1] = ASPEED_RESET2_OFFSET + 5, 306 310 }; 307 311 308 312 static int aspeed_reset_deassert(struct reset_controller_dev *rcdev, 309 313 unsigned long id) 310 314 { 311 315 struct aspeed_reset *ar = to_aspeed_reset(rcdev); 312 - u32 rst = BIT(aspeed_resets[id]); 316 + u32 reg = ASPEED_RESET_CTRL; 317 + u32 bit = aspeed_resets[id]; 313 318 314 - return regmap_update_bits(ar->map, ASPEED_RESET_CTRL, rst, 0); 319 + if (bit >= ASPEED_RESET2_OFFSET) { 320 + bit -= ASPEED_RESET2_OFFSET; 321 + reg = ASPEED_RESET_CTRL2; 322 + } 323 + 324 + return regmap_update_bits(ar->map, reg, BIT(bit), 0); 315 325 } 316 326 317 327 static int aspeed_reset_assert(struct reset_controller_dev *rcdev, 318 328 unsigned long id) 319 329 { 320 330 struct aspeed_reset *ar = to_aspeed_reset(rcdev); 321 - u32 rst = BIT(aspeed_resets[id]); 331 + u32 reg = ASPEED_RESET_CTRL; 332 + u32 bit = aspeed_resets[id]; 322 333 323 - return regmap_update_bits(ar->map, ASPEED_RESET_CTRL, rst, rst); 334 + if (bit >= ASPEED_RESET2_OFFSET) { 335 + bit -= ASPEED_RESET2_OFFSET; 336 + reg = ASPEED_RESET_CTRL2; 337 + } 338 + 339 + return regmap_update_bits(ar->map, reg, BIT(bit), BIT(bit)); 324 340 } 325 341 326 342 static int aspeed_reset_status(struct reset_controller_dev *rcdev, 327 343 unsigned long id) 328 344 { 329 345 struct aspeed_reset *ar = to_aspeed_reset(rcdev); 330 - u32 val, rst = BIT(aspeed_resets[id]); 331 - int ret; 346 + u32 reg = ASPEED_RESET_CTRL; 347 + u32 bit = aspeed_resets[id]; 348 + int ret, val; 332 349 333 - ret = regmap_read(ar->map, ASPEED_RESET_CTRL, &val); 350 + if (bit >= ASPEED_RESET2_OFFSET) { 351 + bit -= ASPEED_RESET2_OFFSET; 352 + reg = ASPEED_RESET_CTRL2; 353 + } 354 + 355 + ret = regmap_read(ar->map, reg, &val); 334 356 if (ret) 335 357 return ret; 336 358 337 - return !!(val & rst); 359 + return !!(val & BIT(bit)); 338 360 } 339 361 340 362 static const struct reset_control_ops aspeed_reset_ops = { ··· 501 473 if (IS_ERR(hw)) 502 474 return PTR_ERR(hw); 503 475 aspeed_clk_data->hws[ASPEED_CLK_BCLK] = hw; 476 + 477 + /* Fixed 24MHz clock */ 478 + hw = clk_hw_register_fixed_rate(NULL, "fixed-24m", "clkin", 479 + 0, 24000000); 480 + if (IS_ERR(hw)) 481 + return PTR_ERR(hw); 482 + aspeed_clk_data->hws[ASPEED_CLK_24M] = hw; 504 483 505 484 /* 506 485 * TODO: There are a number of clocks that not included in this driver
+3 -2
drivers/clk/clk-bulk.c
··· 42 42 clks[i].clk = clk_get(dev, clks[i].id); 43 43 if (IS_ERR(clks[i].clk)) { 44 44 ret = PTR_ERR(clks[i].clk); 45 - dev_err(dev, "Failed to get clk '%s': %d\n", 46 - clks[i].id, ret); 45 + if (ret != -EPROBE_DEFER) 46 + dev_err(dev, "Failed to get clk '%s': %d\n", 47 + clks[i].id, ret); 47 48 clks[i].clk = NULL; 48 49 goto err; 49 50 }
+656
drivers/clk/clk-npcm7xx.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Nuvoton NPCM7xx Clock Generator 4 + * All the clocks are initialized by the bootloader, so this driver allow only 5 + * reading of current settings directly from the hardware. 6 + * 7 + * Copyright (C) 2018 Nuvoton Technologies tali.perry@nuvoton.com 8 + */ 9 + 10 + #include <linux/module.h> 11 + #include <linux/clk-provider.h> 12 + #include <linux/io.h> 13 + #include <linux/kernel.h> 14 + #include <linux/of.h> 15 + #include <linux/of_address.h> 16 + #include <linux/slab.h> 17 + #include <linux/err.h> 18 + #include <linux/bitfield.h> 19 + 20 + #include <dt-bindings/clock/nuvoton,npcm7xx-clock.h> 21 + 22 + struct npcm7xx_clk_pll { 23 + struct clk_hw hw; 24 + void __iomem *pllcon; 25 + u8 flags; 26 + }; 27 + 28 + #define to_npcm7xx_clk_pll(_hw) container_of(_hw, struct npcm7xx_clk_pll, hw) 29 + 30 + #define PLLCON_LOKI BIT(31) 31 + #define PLLCON_LOKS BIT(30) 32 + #define PLLCON_FBDV GENMASK(27, 16) 33 + #define PLLCON_OTDV2 GENMASK(15, 13) 34 + #define PLLCON_PWDEN BIT(12) 35 + #define PLLCON_OTDV1 GENMASK(10, 8) 36 + #define PLLCON_INDV GENMASK(5, 0) 37 + 38 + static unsigned long npcm7xx_clk_pll_recalc_rate(struct clk_hw *hw, 39 + unsigned long parent_rate) 40 + { 41 + struct npcm7xx_clk_pll *pll = to_npcm7xx_clk_pll(hw); 42 + unsigned long fbdv, indv, otdv1, otdv2; 43 + unsigned int val; 44 + u64 ret; 45 + 46 + if (parent_rate == 0) { 47 + pr_err("%s: parent rate is zero", __func__); 48 + return 0; 49 + } 50 + 51 + val = readl_relaxed(pll->pllcon); 52 + 53 + indv = FIELD_GET(PLLCON_INDV, val); 54 + fbdv = FIELD_GET(PLLCON_FBDV, val); 55 + otdv1 = FIELD_GET(PLLCON_OTDV1, val); 56 + otdv2 = FIELD_GET(PLLCON_OTDV2, val); 57 + 58 + ret = (u64)parent_rate * fbdv; 59 + do_div(ret, indv * otdv1 * otdv2); 60 + 61 + return ret; 62 + } 63 + 64 + static const struct clk_ops npcm7xx_clk_pll_ops = { 65 + .recalc_rate = npcm7xx_clk_pll_recalc_rate, 66 + }; 67 + 68 + static struct clk_hw * 69 + npcm7xx_clk_register_pll(void __iomem *pllcon, const char *name, 70 + const char *parent_name, unsigned long flags) 71 + { 72 + struct npcm7xx_clk_pll *pll; 73 + struct clk_init_data init; 74 + struct clk_hw *hw; 75 + int ret; 76 + 77 + pll = kzalloc(sizeof(*pll), GFP_KERNEL); 78 + if (!pll) 79 + return ERR_PTR(-ENOMEM); 80 + 81 + pr_debug("%s reg, name=%s, p=%s\n", __func__, name, parent_name); 82 + 83 + init.name = name; 84 + init.ops = &npcm7xx_clk_pll_ops; 85 + init.parent_names = &parent_name; 86 + init.num_parents = 1; 87 + init.flags = flags; 88 + 89 + pll->pllcon = pllcon; 90 + pll->hw.init = &init; 91 + 92 + hw = &pll->hw; 93 + 94 + ret = clk_hw_register(NULL, hw); 95 + if (ret) { 96 + kfree(pll); 97 + hw = ERR_PTR(ret); 98 + } 99 + 100 + return hw; 101 + } 102 + 103 + #define NPCM7XX_CLKEN1 (0x00) 104 + #define NPCM7XX_CLKEN2 (0x28) 105 + #define NPCM7XX_CLKEN3 (0x30) 106 + #define NPCM7XX_CLKSEL (0x04) 107 + #define NPCM7XX_CLKDIV1 (0x08) 108 + #define NPCM7XX_CLKDIV2 (0x2C) 109 + #define NPCM7XX_CLKDIV3 (0x58) 110 + #define NPCM7XX_PLLCON0 (0x0C) 111 + #define NPCM7XX_PLLCON1 (0x10) 112 + #define NPCM7XX_PLLCON2 (0x54) 113 + #define NPCM7XX_SWRSTR (0x14) 114 + #define NPCM7XX_IRQWAKECON (0x18) 115 + #define NPCM7XX_IRQWAKEFLAG (0x1C) 116 + #define NPCM7XX_IPSRST1 (0x20) 117 + #define NPCM7XX_IPSRST2 (0x24) 118 + #define NPCM7XX_IPSRST3 (0x34) 119 + #define NPCM7XX_WD0RCR (0x38) 120 + #define NPCM7XX_WD1RCR (0x3C) 121 + #define NPCM7XX_WD2RCR (0x40) 122 + #define NPCM7XX_SWRSTC1 (0x44) 123 + #define NPCM7XX_SWRSTC2 (0x48) 124 + #define NPCM7XX_SWRSTC3 (0x4C) 125 + #define NPCM7XX_SWRSTC4 (0x50) 126 + #define NPCM7XX_CORSTC (0x5C) 127 + #define NPCM7XX_PLLCONG (0x60) 128 + #define NPCM7XX_AHBCKFI (0x64) 129 + #define NPCM7XX_SECCNT (0x68) 130 + #define NPCM7XX_CNTR25M (0x6C) 131 + 132 + struct npcm7xx_clk_gate_data { 133 + u32 reg; 134 + u8 bit_idx; 135 + const char *name; 136 + const char *parent_name; 137 + unsigned long flags; 138 + /* 139 + * If this clock is exported via DT, set onecell_idx to constant 140 + * defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for 141 + * this specific clock. Otherwise, set to -1. 142 + */ 143 + int onecell_idx; 144 + }; 145 + 146 + struct npcm7xx_clk_mux_data { 147 + u8 shift; 148 + u8 mask; 149 + u32 *table; 150 + const char *name; 151 + const char * const *parent_names; 152 + u8 num_parents; 153 + unsigned long flags; 154 + /* 155 + * If this clock is exported via DT, set onecell_idx to constant 156 + * defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for 157 + * this specific clock. Otherwise, set to -1. 158 + */ 159 + int onecell_idx; 160 + 161 + }; 162 + 163 + struct npcm7xx_clk_div_fixed_data { 164 + u8 mult; 165 + u8 div; 166 + const char *name; 167 + const char *parent_name; 168 + u8 clk_divider_flags; 169 + /* 170 + * If this clock is exported via DT, set onecell_idx to constant 171 + * defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for 172 + * this specific clock. Otherwise, set to -1. 173 + */ 174 + int onecell_idx; 175 + }; 176 + 177 + 178 + struct npcm7xx_clk_div_data { 179 + u32 reg; 180 + u8 shift; 181 + u8 width; 182 + const char *name; 183 + const char *parent_name; 184 + u8 clk_divider_flags; 185 + unsigned long flags; 186 + /* 187 + * If this clock is exported via DT, set onecell_idx to constant 188 + * defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for 189 + * this specific clock. Otherwise, set to -1. 190 + */ 191 + int onecell_idx; 192 + }; 193 + 194 + struct npcm7xx_clk_pll_data { 195 + u32 reg; 196 + const char *name; 197 + const char *parent_name; 198 + unsigned long flags; 199 + /* 200 + * If this clock is exported via DT, set onecell_idx to constant 201 + * defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for 202 + * this specific clock. Otherwise, set to -1. 203 + */ 204 + int onecell_idx; 205 + }; 206 + 207 + /* 208 + * Single copy of strings used to refer to clocks within this driver indexed by 209 + * above enum. 210 + */ 211 + #define NPCM7XX_CLK_S_REFCLK "refclk" 212 + #define NPCM7XX_CLK_S_SYSBYPCK "sysbypck" 213 + #define NPCM7XX_CLK_S_MCBYPCK "mcbypck" 214 + #define NPCM7XX_CLK_S_GFXBYPCK "gfxbypck" 215 + #define NPCM7XX_CLK_S_PLL0 "pll0" 216 + #define NPCM7XX_CLK_S_PLL1 "pll1" 217 + #define NPCM7XX_CLK_S_PLL1_DIV2 "pll1_div2" 218 + #define NPCM7XX_CLK_S_PLL2 "pll2" 219 + #define NPCM7XX_CLK_S_PLL_GFX "pll_gfx" 220 + #define NPCM7XX_CLK_S_PLL2_DIV2 "pll2_div2" 221 + #define NPCM7XX_CLK_S_PIX_MUX "gfx_pixel" 222 + #define NPCM7XX_CLK_S_GPRFSEL_MUX "gprfsel_mux" 223 + #define NPCM7XX_CLK_S_MC_MUX "mc_phy" 224 + #define NPCM7XX_CLK_S_CPU_MUX "cpu" /*AKA system clock.*/ 225 + #define NPCM7XX_CLK_S_MC "mc" 226 + #define NPCM7XX_CLK_S_AXI "axi" /*AKA CLK2*/ 227 + #define NPCM7XX_CLK_S_AHB "ahb" /*AKA CLK4*/ 228 + #define NPCM7XX_CLK_S_CLKOUT_MUX "clkout_mux" 229 + #define NPCM7XX_CLK_S_UART_MUX "uart_mux" 230 + #define NPCM7XX_CLK_S_TIM_MUX "timer_mux" 231 + #define NPCM7XX_CLK_S_SD_MUX "sd_mux" 232 + #define NPCM7XX_CLK_S_GFXM_MUX "gfxm_mux" 233 + #define NPCM7XX_CLK_S_SU_MUX "serial_usb_mux" 234 + #define NPCM7XX_CLK_S_DVC_MUX "dvc_mux" 235 + #define NPCM7XX_CLK_S_GFX_MUX "gfx_mux" 236 + #define NPCM7XX_CLK_S_GFX_PIXEL "gfx_pixel" 237 + #define NPCM7XX_CLK_S_SPI0 "spi0" 238 + #define NPCM7XX_CLK_S_SPI3 "spi3" 239 + #define NPCM7XX_CLK_S_SPIX "spix" 240 + #define NPCM7XX_CLK_S_APB1 "apb1" 241 + #define NPCM7XX_CLK_S_APB2 "apb2" 242 + #define NPCM7XX_CLK_S_APB3 "apb3" 243 + #define NPCM7XX_CLK_S_APB4 "apb4" 244 + #define NPCM7XX_CLK_S_APB5 "apb5" 245 + #define NPCM7XX_CLK_S_TOCK "tock" 246 + #define NPCM7XX_CLK_S_CLKOUT "clkout" 247 + #define NPCM7XX_CLK_S_UART "uart" 248 + #define NPCM7XX_CLK_S_TIMER "timer" 249 + #define NPCM7XX_CLK_S_MMC "mmc" 250 + #define NPCM7XX_CLK_S_SDHC "sdhc" 251 + #define NPCM7XX_CLK_S_ADC "adc" 252 + #define NPCM7XX_CLK_S_GFX "gfx0_gfx1_mem" 253 + #define NPCM7XX_CLK_S_USBIF "serial_usbif" 254 + #define NPCM7XX_CLK_S_USB_HOST "usb_host" 255 + #define NPCM7XX_CLK_S_USB_BRIDGE "usb_bridge" 256 + #define NPCM7XX_CLK_S_PCI "pci" 257 + 258 + static u32 pll_mux_table[] = {0, 1, 2, 3}; 259 + static const char * const pll_mux_parents[] __initconst = { 260 + NPCM7XX_CLK_S_PLL0, 261 + NPCM7XX_CLK_S_PLL1_DIV2, 262 + NPCM7XX_CLK_S_REFCLK, 263 + NPCM7XX_CLK_S_PLL2_DIV2, 264 + }; 265 + 266 + static u32 cpuck_mux_table[] = {0, 1, 2, 3}; 267 + static const char * const cpuck_mux_parents[] __initconst = { 268 + NPCM7XX_CLK_S_PLL0, 269 + NPCM7XX_CLK_S_PLL1_DIV2, 270 + NPCM7XX_CLK_S_REFCLK, 271 + NPCM7XX_CLK_S_SYSBYPCK, 272 + }; 273 + 274 + static u32 pixcksel_mux_table[] = {0, 2}; 275 + static const char * const pixcksel_mux_parents[] __initconst = { 276 + NPCM7XX_CLK_S_PLL_GFX, 277 + NPCM7XX_CLK_S_REFCLK, 278 + }; 279 + 280 + static u32 sucksel_mux_table[] = {2, 3}; 281 + static const char * const sucksel_mux_parents[] __initconst = { 282 + NPCM7XX_CLK_S_REFCLK, 283 + NPCM7XX_CLK_S_PLL2_DIV2, 284 + }; 285 + 286 + static u32 mccksel_mux_table[] = {0, 2, 3}; 287 + static const char * const mccksel_mux_parents[] __initconst = { 288 + NPCM7XX_CLK_S_PLL1_DIV2, 289 + NPCM7XX_CLK_S_REFCLK, 290 + NPCM7XX_CLK_S_MCBYPCK, 291 + }; 292 + 293 + static u32 clkoutsel_mux_table[] = {0, 1, 2, 3, 4}; 294 + static const char * const clkoutsel_mux_parents[] __initconst = { 295 + NPCM7XX_CLK_S_PLL0, 296 + NPCM7XX_CLK_S_PLL1_DIV2, 297 + NPCM7XX_CLK_S_REFCLK, 298 + NPCM7XX_CLK_S_PLL_GFX, // divided by 2 299 + NPCM7XX_CLK_S_PLL2_DIV2, 300 + }; 301 + 302 + static u32 gfxmsel_mux_table[] = {2, 3}; 303 + static const char * const gfxmsel_mux_parents[] __initconst = { 304 + NPCM7XX_CLK_S_REFCLK, 305 + NPCM7XX_CLK_S_PLL2_DIV2, 306 + }; 307 + 308 + static u32 dvcssel_mux_table[] = {2, 3}; 309 + static const char * const dvcssel_mux_parents[] __initconst = { 310 + NPCM7XX_CLK_S_REFCLK, 311 + NPCM7XX_CLK_S_PLL2, 312 + }; 313 + 314 + static const struct npcm7xx_clk_pll_data npcm7xx_plls[] __initconst = { 315 + {NPCM7XX_PLLCON0, NPCM7XX_CLK_S_PLL0, NPCM7XX_CLK_S_REFCLK, 0, -1}, 316 + 317 + {NPCM7XX_PLLCON1, NPCM7XX_CLK_S_PLL1, 318 + NPCM7XX_CLK_S_REFCLK, 0, -1}, 319 + 320 + {NPCM7XX_PLLCON2, NPCM7XX_CLK_S_PLL2, 321 + NPCM7XX_CLK_S_REFCLK, 0, -1}, 322 + 323 + {NPCM7XX_PLLCONG, NPCM7XX_CLK_S_PLL_GFX, 324 + NPCM7XX_CLK_S_REFCLK, 0, -1}, 325 + }; 326 + 327 + static const struct npcm7xx_clk_mux_data npcm7xx_muxes[] __initconst = { 328 + {0, GENMASK(1, 0), cpuck_mux_table, NPCM7XX_CLK_S_CPU_MUX, 329 + cpuck_mux_parents, ARRAY_SIZE(cpuck_mux_parents), CLK_IS_CRITICAL, 330 + NPCM7XX_CLK_CPU}, 331 + 332 + {4, GENMASK(1, 0), pixcksel_mux_table, NPCM7XX_CLK_S_PIX_MUX, 333 + pixcksel_mux_parents, ARRAY_SIZE(pixcksel_mux_parents), 0, 334 + NPCM7XX_CLK_GFX_PIXEL}, 335 + 336 + {6, GENMASK(1, 0), pll_mux_table, NPCM7XX_CLK_S_SD_MUX, 337 + pll_mux_parents, ARRAY_SIZE(pll_mux_parents), 0, -1}, 338 + 339 + {8, GENMASK(1, 0), pll_mux_table, NPCM7XX_CLK_S_UART_MUX, 340 + pll_mux_parents, ARRAY_SIZE(pll_mux_parents), 0, -1}, 341 + 342 + {10, GENMASK(1, 0), sucksel_mux_table, NPCM7XX_CLK_S_SU_MUX, 343 + sucksel_mux_parents, ARRAY_SIZE(sucksel_mux_parents), 0, -1}, 344 + 345 + {12, GENMASK(1, 0), mccksel_mux_table, NPCM7XX_CLK_S_MC_MUX, 346 + mccksel_mux_parents, ARRAY_SIZE(mccksel_mux_parents), 0, -1}, 347 + 348 + {14, GENMASK(1, 0), pll_mux_table, NPCM7XX_CLK_S_TIM_MUX, 349 + pll_mux_parents, ARRAY_SIZE(pll_mux_parents), 0, -1}, 350 + 351 + {16, GENMASK(1, 0), pll_mux_table, NPCM7XX_CLK_S_GFX_MUX, 352 + pll_mux_parents, ARRAY_SIZE(pll_mux_parents), 0, -1}, 353 + 354 + {18, GENMASK(2, 0), clkoutsel_mux_table, NPCM7XX_CLK_S_CLKOUT_MUX, 355 + clkoutsel_mux_parents, ARRAY_SIZE(clkoutsel_mux_parents), 0, -1}, 356 + 357 + {21, GENMASK(1, 0), gfxmsel_mux_table, NPCM7XX_CLK_S_GFXM_MUX, 358 + gfxmsel_mux_parents, ARRAY_SIZE(gfxmsel_mux_parents), 0, -1}, 359 + 360 + {23, GENMASK(1, 0), dvcssel_mux_table, NPCM7XX_CLK_S_DVC_MUX, 361 + dvcssel_mux_parents, ARRAY_SIZE(dvcssel_mux_parents), 0, -1}, 362 + }; 363 + 364 + /* fixed ratio dividers (no register): */ 365 + static const struct npcm7xx_clk_div_fixed_data npcm7xx_divs_fx[] __initconst = { 366 + { 1, 2, NPCM7XX_CLK_S_MC, NPCM7XX_CLK_S_MC_MUX, 0, NPCM7XX_CLK_MC}, 367 + { 1, 2, NPCM7XX_CLK_S_PLL1_DIV2, NPCM7XX_CLK_S_PLL1, 0, -1}, 368 + { 1, 2, NPCM7XX_CLK_S_PLL2_DIV2, NPCM7XX_CLK_S_PLL2, 0, -1}, 369 + }; 370 + 371 + /* configurable dividers: */ 372 + static const struct npcm7xx_clk_div_data npcm7xx_divs[] __initconst = { 373 + {NPCM7XX_CLKDIV1, 28, 3, NPCM7XX_CLK_S_ADC, 374 + NPCM7XX_CLK_S_TIMER, CLK_DIVIDER_POWER_OF_TWO, 0, NPCM7XX_CLK_ADC}, 375 + /*30-28 ADCCKDIV*/ 376 + {NPCM7XX_CLKDIV1, 26, 2, NPCM7XX_CLK_S_AHB, 377 + NPCM7XX_CLK_S_AXI, 0, CLK_IS_CRITICAL, NPCM7XX_CLK_AHB}, 378 + /*27-26 CLK4DIV*/ 379 + {NPCM7XX_CLKDIV1, 21, 5, NPCM7XX_CLK_S_TIMER, 380 + NPCM7XX_CLK_S_TIM_MUX, 0, 0, NPCM7XX_CLK_TIMER}, 381 + /*25-21 TIMCKDIV*/ 382 + {NPCM7XX_CLKDIV1, 16, 5, NPCM7XX_CLK_S_UART, 383 + NPCM7XX_CLK_S_UART_MUX, 0, 0, NPCM7XX_CLK_UART}, 384 + /*20-16 UARTDIV*/ 385 + {NPCM7XX_CLKDIV1, 11, 5, NPCM7XX_CLK_S_MMC, 386 + NPCM7XX_CLK_S_SD_MUX, 0, 0, NPCM7XX_CLK_MMC}, 387 + /*15-11 MMCCKDIV*/ 388 + {NPCM7XX_CLKDIV1, 6, 5, NPCM7XX_CLK_S_SPI3, 389 + NPCM7XX_CLK_S_AHB, 0, 0, NPCM7XX_CLK_SPI3}, 390 + /*10-6 AHB3CKDIV*/ 391 + {NPCM7XX_CLKDIV1, 2, 4, NPCM7XX_CLK_S_PCI, 392 + NPCM7XX_CLK_S_GFX_MUX, 0, 0, NPCM7XX_CLK_PCI}, 393 + /*5-2 PCICKDIV*/ 394 + {NPCM7XX_CLKDIV1, 0, 1, NPCM7XX_CLK_S_AXI, 395 + NPCM7XX_CLK_S_CPU_MUX, CLK_DIVIDER_POWER_OF_TWO, CLK_IS_CRITICAL, 396 + NPCM7XX_CLK_AXI},/*0 CLK2DIV*/ 397 + 398 + {NPCM7XX_CLKDIV2, 30, 2, NPCM7XX_CLK_S_APB4, 399 + NPCM7XX_CLK_S_AHB, CLK_DIVIDER_POWER_OF_TWO, 0, NPCM7XX_CLK_APB4}, 400 + /*31-30 APB4CKDIV*/ 401 + {NPCM7XX_CLKDIV2, 28, 2, NPCM7XX_CLK_S_APB3, 402 + NPCM7XX_CLK_S_AHB, CLK_DIVIDER_POWER_OF_TWO, 0, NPCM7XX_CLK_APB3}, 403 + /*29-28 APB3CKDIV*/ 404 + {NPCM7XX_CLKDIV2, 26, 2, NPCM7XX_CLK_S_APB2, 405 + NPCM7XX_CLK_S_AHB, CLK_DIVIDER_POWER_OF_TWO, 0, NPCM7XX_CLK_APB2}, 406 + /*27-26 APB2CKDIV*/ 407 + {NPCM7XX_CLKDIV2, 24, 2, NPCM7XX_CLK_S_APB1, 408 + NPCM7XX_CLK_S_AHB, CLK_DIVIDER_POWER_OF_TWO, 0, NPCM7XX_CLK_APB1}, 409 + /*25-24 APB1CKDIV*/ 410 + {NPCM7XX_CLKDIV2, 22, 2, NPCM7XX_CLK_S_APB5, 411 + NPCM7XX_CLK_S_AHB, CLK_DIVIDER_POWER_OF_TWO, 0, NPCM7XX_CLK_APB5}, 412 + /*23-22 APB5CKDIV*/ 413 + {NPCM7XX_CLKDIV2, 16, 5, NPCM7XX_CLK_S_CLKOUT, 414 + NPCM7XX_CLK_S_CLKOUT_MUX, 0, 0, NPCM7XX_CLK_CLKOUT}, 415 + /*20-16 CLKOUTDIV*/ 416 + {NPCM7XX_CLKDIV2, 13, 3, NPCM7XX_CLK_S_GFX, 417 + NPCM7XX_CLK_S_GFX_MUX, 0, 0, NPCM7XX_CLK_GFX}, 418 + /*15-13 GFXCKDIV*/ 419 + {NPCM7XX_CLKDIV2, 8, 5, NPCM7XX_CLK_S_USB_BRIDGE, 420 + NPCM7XX_CLK_S_SU_MUX, 0, 0, NPCM7XX_CLK_SU}, 421 + /*12-8 SUCKDIV*/ 422 + {NPCM7XX_CLKDIV2, 4, 4, NPCM7XX_CLK_S_USB_HOST, 423 + NPCM7XX_CLK_S_SU_MUX, 0, 0, NPCM7XX_CLK_SU48}, 424 + /*7-4 SU48CKDIV*/ 425 + {NPCM7XX_CLKDIV2, 0, 4, NPCM7XX_CLK_S_SDHC, 426 + NPCM7XX_CLK_S_SD_MUX, 0, 0, NPCM7XX_CLK_SDHC} 427 + ,/*3-0 SD1CKDIV*/ 428 + 429 + {NPCM7XX_CLKDIV3, 6, 5, NPCM7XX_CLK_S_SPI0, 430 + NPCM7XX_CLK_S_AHB, 0, 0, NPCM7XX_CLK_SPI0}, 431 + /*10-6 SPI0CKDV*/ 432 + {NPCM7XX_CLKDIV3, 1, 5, NPCM7XX_CLK_S_SPIX, 433 + NPCM7XX_CLK_S_AHB, 0, 0, NPCM7XX_CLK_SPIX}, 434 + /*5-1 SPIXCKDV*/ 435 + 436 + }; 437 + 438 + static const struct npcm7xx_clk_gate_data npcm7xx_gates[] __initconst = { 439 + {NPCM7XX_CLKEN1, 31, "smb1-gate", NPCM7XX_CLK_S_APB2, 0}, 440 + {NPCM7XX_CLKEN1, 30, "smb0-gate", NPCM7XX_CLK_S_APB2, 0}, 441 + {NPCM7XX_CLKEN1, 29, "smb7-gate", NPCM7XX_CLK_S_APB2, 0}, 442 + {NPCM7XX_CLKEN1, 28, "smb6-gate", NPCM7XX_CLK_S_APB2, 0}, 443 + {NPCM7XX_CLKEN1, 27, "adc-gate", NPCM7XX_CLK_S_APB1, 0}, 444 + {NPCM7XX_CLKEN1, 26, "wdt-gate", NPCM7XX_CLK_S_TIMER, 0}, 445 + {NPCM7XX_CLKEN1, 25, "usbdev3-gate", NPCM7XX_CLK_S_AHB, 0}, 446 + {NPCM7XX_CLKEN1, 24, "usbdev6-gate", NPCM7XX_CLK_S_AHB, 0}, 447 + {NPCM7XX_CLKEN1, 23, "usbdev5-gate", NPCM7XX_CLK_S_AHB, 0}, 448 + {NPCM7XX_CLKEN1, 22, "usbdev4-gate", NPCM7XX_CLK_S_AHB, 0}, 449 + {NPCM7XX_CLKEN1, 21, "emc2-gate", NPCM7XX_CLK_S_AHB, 0}, 450 + {NPCM7XX_CLKEN1, 20, "timer5_9-gate", NPCM7XX_CLK_S_APB1, 0}, 451 + {NPCM7XX_CLKEN1, 19, "timer0_4-gate", NPCM7XX_CLK_S_APB1, 0}, 452 + {NPCM7XX_CLKEN1, 18, "pwmm0-gate", NPCM7XX_CLK_S_APB3, 0}, 453 + {NPCM7XX_CLKEN1, 17, "huart-gate", NPCM7XX_CLK_S_UART, 0}, 454 + {NPCM7XX_CLKEN1, 16, "smb5-gate", NPCM7XX_CLK_S_APB2, 0}, 455 + {NPCM7XX_CLKEN1, 15, "smb4-gate", NPCM7XX_CLK_S_APB2, 0}, 456 + {NPCM7XX_CLKEN1, 14, "smb3-gate", NPCM7XX_CLK_S_APB2, 0}, 457 + {NPCM7XX_CLKEN1, 13, "smb2-gate", NPCM7XX_CLK_S_APB2, 0}, 458 + {NPCM7XX_CLKEN1, 12, "mc-gate", NPCM7XX_CLK_S_MC, 0}, 459 + {NPCM7XX_CLKEN1, 11, "uart01-gate", NPCM7XX_CLK_S_APB1, 0}, 460 + {NPCM7XX_CLKEN1, 10, "aes-gate", NPCM7XX_CLK_S_AHB, 0}, 461 + {NPCM7XX_CLKEN1, 9, "peci-gate", NPCM7XX_CLK_S_APB3, 0}, 462 + {NPCM7XX_CLKEN1, 8, "usbdev2-gate", NPCM7XX_CLK_S_AHB, 0}, 463 + {NPCM7XX_CLKEN1, 7, "uart23-gate", NPCM7XX_CLK_S_APB1, 0}, 464 + {NPCM7XX_CLKEN1, 6, "emc1-gate", NPCM7XX_CLK_S_AHB, 0}, 465 + {NPCM7XX_CLKEN1, 5, "usbdev1-gate", NPCM7XX_CLK_S_AHB, 0}, 466 + {NPCM7XX_CLKEN1, 4, "shm-gate", NPCM7XX_CLK_S_AHB, 0}, 467 + /* bit 3 is reserved */ 468 + {NPCM7XX_CLKEN1, 2, "kcs-gate", NPCM7XX_CLK_S_APB1, 0}, 469 + {NPCM7XX_CLKEN1, 1, "spi3-gate", NPCM7XX_CLK_S_AHB, 0}, 470 + {NPCM7XX_CLKEN1, 0, "spi0-gate", NPCM7XX_CLK_S_AHB, 0}, 471 + 472 + {NPCM7XX_CLKEN2, 31, "cp-gate", NPCM7XX_CLK_S_AHB, 0}, 473 + {NPCM7XX_CLKEN2, 30, "tock-gate", NPCM7XX_CLK_S_TOCK, 0}, 474 + /* bit 29 is reserved */ 475 + {NPCM7XX_CLKEN2, 28, "gmac1-gate", NPCM7XX_CLK_S_AHB, 0}, 476 + {NPCM7XX_CLKEN2, 27, "usbif-gate", NPCM7XX_CLK_S_USBIF, 0}, 477 + {NPCM7XX_CLKEN2, 26, "usbhost-gate", NPCM7XX_CLK_S_AHB, 0}, 478 + {NPCM7XX_CLKEN2, 25, "gmac2-gate", NPCM7XX_CLK_S_AHB, 0}, 479 + /* bit 24 is reserved */ 480 + {NPCM7XX_CLKEN2, 23, "pspi2-gate", NPCM7XX_CLK_S_APB5, 0}, 481 + {NPCM7XX_CLKEN2, 22, "pspi1-gate", NPCM7XX_CLK_S_APB5, 0}, 482 + {NPCM7XX_CLKEN2, 21, "3des-gate", NPCM7XX_CLK_S_AHB, 0}, 483 + /* bit 20 is reserved */ 484 + {NPCM7XX_CLKEN2, 19, "siox2-gate", NPCM7XX_CLK_S_APB3, 0}, 485 + {NPCM7XX_CLKEN2, 18, "siox1-gate", NPCM7XX_CLK_S_APB3, 0}, 486 + /* bit 17 is reserved */ 487 + {NPCM7XX_CLKEN2, 16, "fuse-gate", NPCM7XX_CLK_S_APB4, 0}, 488 + /* bit 15 is reserved */ 489 + {NPCM7XX_CLKEN2, 14, "vcd-gate", NPCM7XX_CLK_S_AHB, 0}, 490 + {NPCM7XX_CLKEN2, 13, "ece-gate", NPCM7XX_CLK_S_AHB, 0}, 491 + {NPCM7XX_CLKEN2, 12, "vdma-gate", NPCM7XX_CLK_S_AHB, 0}, 492 + {NPCM7XX_CLKEN2, 11, "ahbpcibrg-gate", NPCM7XX_CLK_S_AHB, 0}, 493 + {NPCM7XX_CLKEN2, 10, "gfxsys-gate", NPCM7XX_CLK_S_APB1, 0}, 494 + {NPCM7XX_CLKEN2, 9, "sdhc-gate", NPCM7XX_CLK_S_AHB, 0}, 495 + {NPCM7XX_CLKEN2, 8, "mmc-gate", NPCM7XX_CLK_S_AHB, 0}, 496 + {NPCM7XX_CLKEN2, 7, "mft7-gate", NPCM7XX_CLK_S_APB4, 0}, 497 + {NPCM7XX_CLKEN2, 6, "mft6-gate", NPCM7XX_CLK_S_APB4, 0}, 498 + {NPCM7XX_CLKEN2, 5, "mft5-gate", NPCM7XX_CLK_S_APB4, 0}, 499 + {NPCM7XX_CLKEN2, 4, "mft4-gate", NPCM7XX_CLK_S_APB4, 0}, 500 + {NPCM7XX_CLKEN2, 3, "mft3-gate", NPCM7XX_CLK_S_APB4, 0}, 501 + {NPCM7XX_CLKEN2, 2, "mft2-gate", NPCM7XX_CLK_S_APB4, 0}, 502 + {NPCM7XX_CLKEN2, 1, "mft1-gate", NPCM7XX_CLK_S_APB4, 0}, 503 + {NPCM7XX_CLKEN2, 0, "mft0-gate", NPCM7XX_CLK_S_APB4, 0}, 504 + 505 + {NPCM7XX_CLKEN3, 31, "gpiom7-gate", NPCM7XX_CLK_S_APB1, 0}, 506 + {NPCM7XX_CLKEN3, 30, "gpiom6-gate", NPCM7XX_CLK_S_APB1, 0}, 507 + {NPCM7XX_CLKEN3, 29, "gpiom5-gate", NPCM7XX_CLK_S_APB1, 0}, 508 + {NPCM7XX_CLKEN3, 28, "gpiom4-gate", NPCM7XX_CLK_S_APB1, 0}, 509 + {NPCM7XX_CLKEN3, 27, "gpiom3-gate", NPCM7XX_CLK_S_APB1, 0}, 510 + {NPCM7XX_CLKEN3, 26, "gpiom2-gate", NPCM7XX_CLK_S_APB1, 0}, 511 + {NPCM7XX_CLKEN3, 25, "gpiom1-gate", NPCM7XX_CLK_S_APB1, 0}, 512 + {NPCM7XX_CLKEN3, 24, "gpiom0-gate", NPCM7XX_CLK_S_APB1, 0}, 513 + {NPCM7XX_CLKEN3, 23, "espi-gate", NPCM7XX_CLK_S_APB2, 0}, 514 + {NPCM7XX_CLKEN3, 22, "smb11-gate", NPCM7XX_CLK_S_APB2, 0}, 515 + {NPCM7XX_CLKEN3, 21, "smb10-gate", NPCM7XX_CLK_S_APB2, 0}, 516 + {NPCM7XX_CLKEN3, 20, "smb9-gate", NPCM7XX_CLK_S_APB2, 0}, 517 + {NPCM7XX_CLKEN3, 19, "smb8-gate", NPCM7XX_CLK_S_APB2, 0}, 518 + {NPCM7XX_CLKEN3, 18, "smb15-gate", NPCM7XX_CLK_S_APB2, 0}, 519 + {NPCM7XX_CLKEN3, 17, "rng-gate", NPCM7XX_CLK_S_APB1, 0}, 520 + {NPCM7XX_CLKEN3, 16, "timer10_14-gate", NPCM7XX_CLK_S_APB1, 0}, 521 + {NPCM7XX_CLKEN3, 15, "pcirc-gate", NPCM7XX_CLK_S_AHB, 0}, 522 + {NPCM7XX_CLKEN3, 14, "sececc-gate", NPCM7XX_CLK_S_AHB, 0}, 523 + {NPCM7XX_CLKEN3, 13, "sha-gate", NPCM7XX_CLK_S_AHB, 0}, 524 + {NPCM7XX_CLKEN3, 12, "smb14-gate", NPCM7XX_CLK_S_APB2, 0}, 525 + /* bit 11 is reserved */ 526 + /* bit 10 is reserved */ 527 + {NPCM7XX_CLKEN3, 9, "pcimbx-gate", NPCM7XX_CLK_S_AHB, 0}, 528 + /* bit 8 is reserved */ 529 + {NPCM7XX_CLKEN3, 7, "usbdev9-gate", NPCM7XX_CLK_S_AHB, 0}, 530 + {NPCM7XX_CLKEN3, 6, "usbdev8-gate", NPCM7XX_CLK_S_AHB, 0}, 531 + {NPCM7XX_CLKEN3, 5, "usbdev7-gate", NPCM7XX_CLK_S_AHB, 0}, 532 + {NPCM7XX_CLKEN3, 4, "usbdev0-gate", NPCM7XX_CLK_S_AHB, 0}, 533 + {NPCM7XX_CLKEN3, 3, "smb13-gate", NPCM7XX_CLK_S_APB2, 0}, 534 + {NPCM7XX_CLKEN3, 2, "spix-gate", NPCM7XX_CLK_S_AHB, 0}, 535 + {NPCM7XX_CLKEN3, 1, "smb12-gate", NPCM7XX_CLK_S_APB2, 0}, 536 + {NPCM7XX_CLKEN3, 0, "pwmm1-gate", NPCM7XX_CLK_S_APB3, 0}, 537 + }; 538 + 539 + static DEFINE_SPINLOCK(npcm7xx_clk_lock); 540 + 541 + static void __init npcm7xx_clk_init(struct device_node *clk_np) 542 + { 543 + struct clk_hw_onecell_data *npcm7xx_clk_data; 544 + void __iomem *clk_base; 545 + struct resource res; 546 + struct clk_hw *hw; 547 + int ret; 548 + int i; 549 + 550 + ret = of_address_to_resource(clk_np, 0, &res); 551 + if (ret) { 552 + pr_err("%s: failed to get resource, ret %d\n", clk_np->name, 553 + ret); 554 + return; 555 + } 556 + 557 + clk_base = ioremap(res.start, resource_size(&res)); 558 + if (!clk_base) 559 + goto npcm7xx_init_error; 560 + 561 + npcm7xx_clk_data = kzalloc(sizeof(*npcm7xx_clk_data->hws) * 562 + NPCM7XX_NUM_CLOCKS + sizeof(npcm7xx_clk_data), GFP_KERNEL); 563 + if (!npcm7xx_clk_data) 564 + goto npcm7xx_init_np_err; 565 + 566 + npcm7xx_clk_data->num = NPCM7XX_NUM_CLOCKS; 567 + 568 + for (i = 0; i < NPCM7XX_NUM_CLOCKS; i++) 569 + npcm7xx_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER); 570 + 571 + /* Register plls */ 572 + for (i = 0; i < ARRAY_SIZE(npcm7xx_plls); i++) { 573 + const struct npcm7xx_clk_pll_data *pll_data = &npcm7xx_plls[i]; 574 + 575 + hw = npcm7xx_clk_register_pll(clk_base + pll_data->reg, 576 + pll_data->name, pll_data->parent_name, pll_data->flags); 577 + if (IS_ERR(hw)) { 578 + pr_err("npcm7xx_clk: Can't register pll\n"); 579 + goto npcm7xx_init_fail; 580 + } 581 + 582 + if (pll_data->onecell_idx >= 0) 583 + npcm7xx_clk_data->hws[pll_data->onecell_idx] = hw; 584 + } 585 + 586 + /* Register fixed dividers */ 587 + hw = clk_hw_register_fixed_factor(NULL, NPCM7XX_CLK_S_PLL1_DIV2, 588 + NPCM7XX_CLK_S_PLL1, 0, 1, 2); 589 + if (IS_ERR(hw)) { 590 + pr_err("npcm7xx_clk: Can't register fixed div\n"); 591 + goto npcm7xx_init_fail; 592 + } 593 + 594 + hw = clk_hw_register_fixed_factor(NULL, NPCM7XX_CLK_S_PLL2_DIV2, 595 + NPCM7XX_CLK_S_PLL2, 0, 1, 2); 596 + if (IS_ERR(hw)) { 597 + pr_err("npcm7xx_clk: Can't register div2\n"); 598 + goto npcm7xx_init_fail; 599 + } 600 + 601 + /* Register muxes */ 602 + for (i = 0; i < ARRAY_SIZE(npcm7xx_muxes); i++) { 603 + const struct npcm7xx_clk_mux_data *mux_data = &npcm7xx_muxes[i]; 604 + 605 + hw = clk_hw_register_mux_table(NULL, 606 + mux_data->name, 607 + mux_data->parent_names, mux_data->num_parents, 608 + mux_data->flags, clk_base + NPCM7XX_CLKSEL, 609 + mux_data->shift, mux_data->mask, 0, 610 + mux_data->table, &npcm7xx_clk_lock); 611 + 612 + if (IS_ERR(hw)) { 613 + pr_err("npcm7xx_clk: Can't register mux\n"); 614 + goto npcm7xx_init_fail; 615 + } 616 + 617 + if (mux_data->onecell_idx >= 0) 618 + npcm7xx_clk_data->hws[mux_data->onecell_idx] = hw; 619 + } 620 + 621 + /* Register clock dividers specified in npcm7xx_divs */ 622 + for (i = 0; i < ARRAY_SIZE(npcm7xx_divs); i++) { 623 + const struct npcm7xx_clk_div_data *div_data = &npcm7xx_divs[i]; 624 + 625 + hw = clk_hw_register_divider(NULL, div_data->name, 626 + div_data->parent_name, 627 + div_data->flags, 628 + clk_base + div_data->reg, 629 + div_data->shift, div_data->width, 630 + div_data->clk_divider_flags, &npcm7xx_clk_lock); 631 + if (IS_ERR(hw)) { 632 + pr_err("npcm7xx_clk: Can't register div table\n"); 633 + goto npcm7xx_init_fail; 634 + } 635 + 636 + if (div_data->onecell_idx >= 0) 637 + npcm7xx_clk_data->hws[div_data->onecell_idx] = hw; 638 + } 639 + 640 + ret = of_clk_add_hw_provider(clk_np, of_clk_hw_onecell_get, 641 + npcm7xx_clk_data); 642 + if (ret) 643 + pr_err("failed to add DT provider: %d\n", ret); 644 + 645 + of_node_put(clk_np); 646 + 647 + return; 648 + 649 + npcm7xx_init_fail: 650 + kfree(npcm7xx_clk_data->hws); 651 + npcm7xx_init_np_err: 652 + iounmap(clk_base); 653 + npcm7xx_init_error: 654 + of_node_put(clk_np); 655 + } 656 + CLK_OF_DECLARE(npcm7xx_clk_init, "nuvoton,npcm750-clk", npcm7xx_clk_init);
+1
drivers/clk/clk-si544.c
··· 207 207 208 208 /* And the fractional bits using the remainder */ 209 209 vco = (u64)tmp << 32; 210 + vco += FXO / 2; /* Round to nearest multiple */ 210 211 do_div(vco, FXO); 211 212 settings->fb_div_frac = vco; 212 213
+3 -9
drivers/clk/clk-stm32mp1.c
··· 579 579 spinlock_t *lock) 580 580 { 581 581 struct clk_init_data init = { NULL }; 582 - struct clk_gate *gate; 583 582 struct clk_hw *hw; 584 583 int ret; 585 - 586 - gate = kzalloc(sizeof(*gate), GFP_KERNEL); 587 - if (!gate) 588 - return ERR_PTR(-ENOMEM); 589 584 590 585 init.name = name; 591 586 init.parent_names = &parent_name; ··· 599 604 hw->init = &init; 600 605 601 606 ret = clk_hw_register(dev, hw); 602 - if (ret) { 603 - kfree(gate); 607 + if (ret) 604 608 hw = ERR_PTR(ret); 605 - } 606 609 607 610 return hw; 608 611 } ··· 1981 1988 _DIV(RCC_MCO2CFGR, 4, 4, 0, NULL)), 1982 1989 1983 1990 /* Debug clocks */ 1984 - GATE(CK_DBG, "ck_sys_dbg", "ck_axi", 0, RCC_DBGCFGR, 8, 0), 1991 + GATE(CK_DBG, "ck_sys_dbg", "ck_axi", CLK_IGNORE_UNUSED, 1992 + RCC_DBGCFGR, 8, 0), 1985 1993 1986 1994 COMPOSITE(CK_TRACE, "ck_trace", ck_trace_src, CLK_OPS_PARENT_ENABLE, 1987 1995 _GATE(RCC_DBGCFGR, 9, 0),
+45 -126
drivers/clk/clk.c
··· 549 549 if (!core) 550 550 return; 551 551 552 - if (WARN_ON(core->protect_count == 0)) 552 + if (WARN(core->protect_count == 0, 553 + "%s already unprotected\n", core->name)) 553 554 return; 554 555 555 556 if (--core->protect_count > 0) ··· 683 682 if (!core) 684 683 return; 685 684 686 - if (WARN_ON(core->prepare_count == 0)) 685 + if (WARN(core->prepare_count == 0, 686 + "%s already unprepared\n", core->name)) 687 687 return; 688 688 689 - if (WARN_ON(core->prepare_count == 1 && core->flags & CLK_IS_CRITICAL)) 689 + if (WARN(core->prepare_count == 1 && core->flags & CLK_IS_CRITICAL, 690 + "Unpreparing critical %s\n", core->name)) 690 691 return; 691 692 692 693 if (--core->prepare_count > 0) 693 694 return; 694 695 695 - WARN_ON(core->enable_count > 0); 696 + WARN(core->enable_count > 0, "Unpreparing enabled %s\n", core->name); 696 697 697 698 trace_clk_unprepare(core); 698 699 ··· 812 809 if (!core) 813 810 return; 814 811 815 - if (WARN_ON(core->enable_count == 0)) 812 + if (WARN(core->enable_count == 0, "%s already disabled\n", core->name)) 816 813 return; 817 814 818 - if (WARN_ON(core->enable_count == 1 && core->flags & CLK_IS_CRITICAL)) 815 + if (WARN(core->enable_count == 1 && core->flags & CLK_IS_CRITICAL, 816 + "Disabling critical %s\n", core->name)) 819 817 return; 820 818 821 819 if (--core->enable_count > 0) ··· 871 867 if (!core) 872 868 return 0; 873 869 874 - if (WARN_ON(core->prepare_count == 0)) 870 + if (WARN(core->prepare_count == 0, 871 + "Enabling unprepared %s\n", core->name)) 875 872 return -ESHUTDOWN; 876 873 877 874 if (core->enable_count == 0) { ··· 2176 2171 bool clk_has_parent(struct clk *clk, struct clk *parent) 2177 2172 { 2178 2173 struct clk_core *core, *parent_core; 2179 - unsigned int i; 2180 2174 2181 2175 /* NULL clocks should be nops, so return success if either is NULL. */ 2182 2176 if (!clk || !parent) ··· 2188 2184 if (core->parent == parent_core) 2189 2185 return true; 2190 2186 2191 - for (i = 0; i < core->num_parents; i++) 2192 - if (strcmp(core->parent_names[i], parent_core->name) == 0) 2193 - return true; 2194 - 2195 - return false; 2187 + return match_string(core->parent_names, core->num_parents, 2188 + parent_core->name) >= 0; 2196 2189 } 2197 2190 EXPORT_SYMBOL_GPL(clk_has_parent); 2198 2191 ··· 2610 2609 } 2611 2610 DEFINE_SHOW_ATTRIBUTE(possible_parents); 2612 2611 2613 - static int clk_debug_create_one(struct clk_core *core, struct dentry *pdentry) 2612 + static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry) 2614 2613 { 2615 - struct dentry *d; 2616 - int ret = -ENOMEM; 2614 + struct dentry *root; 2617 2615 2618 - if (!core || !pdentry) { 2619 - ret = -EINVAL; 2620 - goto out; 2621 - } 2616 + if (!core || !pdentry) 2617 + return; 2622 2618 2623 - d = debugfs_create_dir(core->name, pdentry); 2624 - if (!d) 2625 - goto out; 2619 + root = debugfs_create_dir(core->name, pdentry); 2620 + core->dentry = root; 2626 2621 2627 - core->dentry = d; 2622 + debugfs_create_ulong("clk_rate", 0444, root, &core->rate); 2623 + debugfs_create_ulong("clk_accuracy", 0444, root, &core->accuracy); 2624 + debugfs_create_u32("clk_phase", 0444, root, &core->phase); 2625 + debugfs_create_file("clk_flags", 0444, root, core, &clk_flags_fops); 2626 + debugfs_create_u32("clk_prepare_count", 0444, root, &core->prepare_count); 2627 + debugfs_create_u32("clk_enable_count", 0444, root, &core->enable_count); 2628 + debugfs_create_u32("clk_protect_count", 0444, root, &core->protect_count); 2629 + debugfs_create_u32("clk_notifier_count", 0444, root, &core->notifier_count); 2628 2630 2629 - d = debugfs_create_ulong("clk_rate", 0444, core->dentry, &core->rate); 2630 - if (!d) 2631 - goto err_out; 2631 + if (core->num_parents > 1) 2632 + debugfs_create_file("clk_possible_parents", 0444, root, core, 2633 + &possible_parents_fops); 2632 2634 2633 - d = debugfs_create_ulong("clk_accuracy", 0444, core->dentry, 2634 - &core->accuracy); 2635 - if (!d) 2636 - goto err_out; 2637 - 2638 - d = debugfs_create_u32("clk_phase", 0444, core->dentry, &core->phase); 2639 - if (!d) 2640 - goto err_out; 2641 - 2642 - d = debugfs_create_file("clk_flags", 0444, core->dentry, core, 2643 - &clk_flags_fops); 2644 - if (!d) 2645 - goto err_out; 2646 - 2647 - d = debugfs_create_u32("clk_prepare_count", 0444, core->dentry, 2648 - &core->prepare_count); 2649 - if (!d) 2650 - goto err_out; 2651 - 2652 - d = debugfs_create_u32("clk_enable_count", 0444, core->dentry, 2653 - &core->enable_count); 2654 - if (!d) 2655 - goto err_out; 2656 - 2657 - d = debugfs_create_u32("clk_protect_count", 0444, core->dentry, 2658 - &core->protect_count); 2659 - if (!d) 2660 - goto err_out; 2661 - 2662 - d = debugfs_create_u32("clk_notifier_count", 0444, core->dentry, 2663 - &core->notifier_count); 2664 - if (!d) 2665 - goto err_out; 2666 - 2667 - if (core->num_parents > 1) { 2668 - d = debugfs_create_file("clk_possible_parents", 0444, 2669 - core->dentry, core, &possible_parents_fops); 2670 - if (!d) 2671 - goto err_out; 2672 - } 2673 - 2674 - if (core->ops->debug_init) { 2675 - ret = core->ops->debug_init(core->hw, core->dentry); 2676 - if (ret) 2677 - goto err_out; 2678 - } 2679 - 2680 - ret = 0; 2681 - goto out; 2682 - 2683 - err_out: 2684 - debugfs_remove_recursive(core->dentry); 2685 - core->dentry = NULL; 2686 - out: 2687 - return ret; 2635 + if (core->ops->debug_init) 2636 + core->ops->debug_init(core->hw, core->dentry); 2688 2637 } 2689 2638 2690 2639 /** ··· 2645 2694 * initialized. Otherwise it bails out early since the debugfs clk directory 2646 2695 * will be created lazily by clk_debug_init as part of a late_initcall. 2647 2696 */ 2648 - static int clk_debug_register(struct clk_core *core) 2697 + static void clk_debug_register(struct clk_core *core) 2649 2698 { 2650 - int ret = 0; 2651 - 2652 2699 mutex_lock(&clk_debug_lock); 2653 2700 hlist_add_head(&core->debug_node, &clk_debug_list); 2654 2701 if (inited) 2655 - ret = clk_debug_create_one(core, rootdir); 2702 + clk_debug_create_one(core, rootdir); 2656 2703 mutex_unlock(&clk_debug_lock); 2657 - 2658 - return ret; 2659 2704 } 2660 2705 2661 2706 /** ··· 2671 2724 mutex_unlock(&clk_debug_lock); 2672 2725 } 2673 2726 2674 - struct dentry *clk_debugfs_add_file(struct clk_hw *hw, char *name, umode_t mode, 2675 - void *data, const struct file_operations *fops) 2676 - { 2677 - struct dentry *d = NULL; 2678 - 2679 - if (hw->core->dentry) 2680 - d = debugfs_create_file(name, mode, hw->core->dentry, data, 2681 - fops); 2682 - 2683 - return d; 2684 - } 2685 - EXPORT_SYMBOL_GPL(clk_debugfs_add_file); 2686 - 2687 2727 /** 2688 2728 * clk_debug_init - lazily populate the debugfs clk directory 2689 2729 * ··· 2683 2749 static int __init clk_debug_init(void) 2684 2750 { 2685 2751 struct clk_core *core; 2686 - struct dentry *d; 2687 2752 2688 2753 rootdir = debugfs_create_dir("clk", NULL); 2689 2754 2690 - if (!rootdir) 2691 - return -ENOMEM; 2692 - 2693 - d = debugfs_create_file("clk_summary", 0444, rootdir, &all_lists, 2694 - &clk_summary_fops); 2695 - if (!d) 2696 - return -ENOMEM; 2697 - 2698 - d = debugfs_create_file("clk_dump", 0444, rootdir, &all_lists, 2699 - &clk_dump_fops); 2700 - if (!d) 2701 - return -ENOMEM; 2702 - 2703 - d = debugfs_create_file("clk_orphan_summary", 0444, rootdir, 2704 - &orphan_list, &clk_summary_fops); 2705 - if (!d) 2706 - return -ENOMEM; 2707 - 2708 - d = debugfs_create_file("clk_orphan_dump", 0444, rootdir, 2709 - &orphan_list, &clk_dump_fops); 2710 - if (!d) 2711 - return -ENOMEM; 2755 + debugfs_create_file("clk_summary", 0444, rootdir, &all_lists, 2756 + &clk_summary_fops); 2757 + debugfs_create_file("clk_dump", 0444, rootdir, &all_lists, 2758 + &clk_dump_fops); 2759 + debugfs_create_file("clk_orphan_summary", 0444, rootdir, &orphan_list, 2760 + &clk_summary_fops); 2761 + debugfs_create_file("clk_orphan_dump", 0444, rootdir, &orphan_list, 2762 + &clk_dump_fops); 2712 2763 2713 2764 mutex_lock(&clk_debug_lock); 2714 2765 hlist_for_each_entry(core, &clk_debug_list, debug_node) ··· 2706 2787 } 2707 2788 late_initcall(clk_debug_init); 2708 2789 #else 2709 - static inline int clk_debug_register(struct clk_core *core) { return 0; } 2790 + static inline void clk_debug_register(struct clk_core *core) { } 2710 2791 static inline void clk_debug_reparent(struct clk_core *core, 2711 2792 struct clk_core *new_parent) 2712 2793 { ··· 3826 3907 EXPORT_SYMBOL_GPL(of_clk_parent_fill); 3827 3908 3828 3909 struct clock_provider { 3829 - of_clk_init_cb_t clk_init_cb; 3910 + void (*clk_init_cb)(struct device_node *); 3830 3911 struct device_node *np; 3831 3912 struct list_head node; 3832 3913 };
+3 -2
drivers/clk/davinci/pll-da830.c
··· 6 6 */ 7 7 8 8 #include <linux/clkdev.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/bitops.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 37 36 SYSCLK(6, pll0_sysclk6, pll0_pllen, 5, SYSCLK_FIXED_DIV); 38 37 SYSCLK(7, pll0_sysclk7, pll0_pllen, 5, 0); 39 38 40 - int da830_pll_init(struct device *dev, void __iomem *base) 39 + int da830_pll_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 41 40 { 42 41 struct clk *clk; 43 42 44 - davinci_pll_clk_register(dev, &da830_pll_info, "ref_clk", base); 43 + davinci_pll_clk_register(dev, &da830_pll_info, "ref_clk", base, cfgchip); 45 44 46 45 clk = davinci_pll_sysclk_register(dev, &pll0_sysclk2, base); 47 46 clk_register_clkdev(clk, "pll0_sysclk2", "da830-psc0");
+26 -11
drivers/clk/davinci/pll-da850.c
··· 7 7 8 8 #include <linux/bitops.h> 9 9 #include <linux/clk-provider.h> 10 + #include <linux/clk/davinci.h> 10 11 #include <linux/clkdev.h> 12 + #include <linux/device.h> 11 13 #include <linux/init.h> 12 14 #include <linux/kernel.h> 13 15 #include <linux/mfd/da8xx-cfgchip.h> 16 + #include <linux/mfd/syscon.h> 17 + #include <linux/of_address.h> 14 18 #include <linux/of.h> 15 19 #include <linux/types.h> 16 20 ··· 85 81 .ocsrc_mask = GENMASK(4, 0), 86 82 }; 87 83 88 - int da850_pll0_init(struct device *dev, void __iomem *base) 84 + int da850_pll0_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 89 85 { 90 86 struct clk *clk; 91 87 92 - davinci_pll_clk_register(dev, &da850_pll0_info, "ref_clk", base); 88 + davinci_pll_clk_register(dev, &da850_pll0_info, "ref_clk", base, cfgchip); 93 89 94 90 clk = davinci_pll_sysclk_register(dev, &pll0_sysclk1, base); 95 91 clk_register_clkdev(clk, "pll0_sysclk1", "da850-psc0"); ··· 138 134 NULL 139 135 }; 140 136 141 - int of_da850_pll0_init(struct device *dev, void __iomem *base) 137 + void of_da850_pll0_init(struct device_node *node) 142 138 { 143 - return of_davinci_pll_init(dev, &da850_pll0_info, 144 - &da850_pll0_obsclk_info, 145 - da850_pll0_sysclk_info, 7, base); 139 + void __iomem *base; 140 + struct regmap *cfgchip; 141 + 142 + base = of_iomap(node, 0); 143 + if (!base) { 144 + pr_err("%s: ioremap failed\n", __func__); 145 + return; 146 + } 147 + 148 + cfgchip = syscon_regmap_lookup_by_compatible("ti,da830-cfgchip"); 149 + 150 + of_davinci_pll_init(NULL, node, &da850_pll0_info, 151 + &da850_pll0_obsclk_info, 152 + da850_pll0_sysclk_info, 7, base, cfgchip); 146 153 } 147 154 148 155 static const struct davinci_pll_clk_info da850_pll1_info = { ··· 194 179 .ocsrc_mask = GENMASK(4, 0), 195 180 }; 196 181 197 - int da850_pll1_init(struct device *dev, void __iomem *base) 182 + int da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 198 183 { 199 184 struct clk *clk; 200 185 201 - davinci_pll_clk_register(dev, &da850_pll1_info, "oscin", base); 186 + davinci_pll_clk_register(dev, &da850_pll1_info, "oscin", base, cfgchip); 202 187 203 188 davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 204 189 ··· 219 204 NULL 220 205 }; 221 206 222 - int of_da850_pll1_init(struct device *dev, void __iomem *base) 207 + int of_da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 223 208 { 224 - return of_davinci_pll_init(dev, &da850_pll1_info, 209 + return of_davinci_pll_init(dev, dev->of_node, &da850_pll1_info, 225 210 &da850_pll1_obsclk_info, 226 - da850_pll1_sysclk_info, 3, base); 211 + da850_pll1_sysclk_info, 3, base, cfgchip); 227 212 }
+10 -12
drivers/clk/davinci/pll-dm355.c
··· 6 6 */ 7 7 8 8 #include <linux/bitops.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clkdev.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 23 22 PLL_POSTDIV_ALWAYS_ENABLED | PLL_POSTDIV_FIXED_DIV, 24 23 }; 25 24 26 - SYSCLK(1, pll1_sysclk1, pll1, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 27 - SYSCLK(2, pll1_sysclk2, pll1, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 28 - SYSCLK(3, pll1_sysclk3, pll1, 5, SYSCLK_ALWAYS_ENABLED); 29 - SYSCLK(4, pll1_sysclk4, pll1, 5, SYSCLK_ALWAYS_ENABLED); 25 + SYSCLK(1, pll1_sysclk1, pll1_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 26 + SYSCLK(2, pll1_sysclk2, pll1_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 27 + SYSCLK(3, pll1_sysclk3, pll1_pllen, 5, SYSCLK_ALWAYS_ENABLED); 28 + SYSCLK(4, pll1_sysclk4, pll1_pllen, 5, SYSCLK_ALWAYS_ENABLED); 30 29 31 - int dm355_pll1_init(struct device *dev, void __iomem *base) 30 + int dm355_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 32 31 { 33 32 struct clk *clk; 34 33 35 - davinci_pll_clk_register(dev, &dm355_pll1_info, "ref_clk", base); 34 + davinci_pll_clk_register(dev, &dm355_pll1_info, "ref_clk", base, cfgchip); 36 35 37 36 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 38 37 clk_register_clkdev(clk, "pll1_sysclk1", "dm355-psc"); ··· 63 62 PLL_POSTDIV_ALWAYS_ENABLED | PLL_POSTDIV_FIXED_DIV, 64 63 }; 65 64 66 - SYSCLK(1, pll2_sysclk1, pll2, 5, SYSCLK_FIXED_DIV); 67 - SYSCLK(2, pll2_sysclk2, pll2, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 65 + SYSCLK(1, pll2_sysclk1, pll2_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 68 66 69 - int dm355_pll2_init(struct device *dev, void __iomem *base) 67 + int dm355_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 70 68 { 71 - davinci_pll_clk_register(dev, &dm355_pll2_info, "oscin", base); 69 + davinci_pll_clk_register(dev, &dm355_pll2_info, "oscin", base, cfgchip); 72 70 73 71 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 74 - 75 - davinci_pll_sysclk_register(dev, &pll2_sysclk2, base); 76 72 77 73 davinci_pll_sysclkbp_clk_register(dev, "pll2_sysclkbp", base); 78 74
+5 -4
drivers/clk/davinci/pll-dm365.c
··· 7 7 8 8 #include <linux/bitops.h> 9 9 #include <linux/clkdev.h> 10 + #include <linux/clk/davinci.h> 10 11 #include <linux/init.h> 11 12 #include <linux/kernel.h> 12 13 #include <linux/types.h> ··· 57 56 .ocsrc_mask = BIT(4), 58 57 }; 59 58 60 - int dm365_pll1_init(struct device *dev, void __iomem *base) 59 + int dm365_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 61 60 { 62 61 struct clk *clk; 63 62 64 - davinci_pll_clk_register(dev, &dm365_pll1_info, "ref_clk", base); 63 + davinci_pll_clk_register(dev, &dm365_pll1_info, "ref_clk", base, cfgchip); 65 64 66 65 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 67 66 clk_register_clkdev(clk, "pll1_sysclk1", "dm365-psc"); ··· 120 119 .ocsrc_mask = BIT(4), 121 120 }; 122 121 123 - int dm365_pll2_init(struct device *dev, void __iomem *base) 122 + int dm365_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 124 123 { 125 124 struct clk *clk; 126 125 127 - davinci_pll_clk_register(dev, &dm365_pll2_info, "oscin", base); 126 + davinci_pll_clk_register(dev, &dm365_pll2_info, "oscin", base, cfgchip); 128 127 129 128 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 130 129
+5 -4
drivers/clk/davinci/pll-dm644x.c
··· 6 6 */ 7 7 8 8 #include <linux/bitops.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clkdev.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 28 27 SYSCLK(3, pll1_sysclk3, pll1_pllen, 4, SYSCLK_FIXED_DIV); 29 28 SYSCLK(5, pll1_sysclk5, pll1_pllen, 4, SYSCLK_FIXED_DIV); 30 29 31 - int dm644x_pll1_init(struct device *dev, void __iomem *base) 30 + int dm644x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 32 31 { 33 32 struct clk *clk; 34 33 35 - davinci_pll_clk_register(dev, &dm644x_pll1_info, "ref_clk", base); 34 + davinci_pll_clk_register(dev, &dm644x_pll1_info, "ref_clk", base, cfgchip); 36 35 37 36 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 38 37 clk_register_clkdev(clk, "pll1_sysclk1", "dm644x-psc"); ··· 67 66 SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, 0); 68 67 SYSCLK(2, pll2_sysclk2, pll2_pllen, 4, 0); 69 68 70 - int dm644x_pll2_init(struct device *dev, void __iomem *base) 69 + int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 71 70 { 72 - davinci_pll_clk_register(dev, &dm644x_pll2_info, "oscin", base); 71 + davinci_pll_clk_register(dev, &dm644x_pll2_info, "oscin", base, cfgchip); 73 72 74 73 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 75 74
+6 -5
drivers/clk/davinci/pll-dm646x.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clkdev.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 30 29 SYSCLK(8, pll1_sysclk8, pll1_pllen, 4, 0); 31 30 SYSCLK(9, pll1_sysclk9, pll1_pllen, 4, 0); 32 31 33 - int dm646x_pll1_init(struct device *dev, void __iomem *base) 32 + int dm646x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 34 33 { 35 34 struct clk *clk; 36 35 37 - davinci_pll_clk_register(dev, &dm646x_pll1_info, "ref_clk", base); 36 + davinci_pll_clk_register(dev, &dm646x_pll1_info, "ref_clk", base, cfgchip); 38 37 39 38 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 40 39 clk_register_clkdev(clk, "pll1_sysclk1", "dm646x-psc"); ··· 73 72 .flags = 0, 74 73 }; 75 74 76 - SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, 0); 75 + SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, SYSCLK_ALWAYS_ENABLED); 77 76 78 - int dm646x_pll2_init(struct device *dev, void __iomem *base) 77 + int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 79 78 { 80 - davinci_pll_clk_register(dev, &dm646x_pll2_info, "oscin", base); 79 + davinci_pll_clk_register(dev, &dm646x_pll2_info, "oscin", base, cfgchip); 81 80 82 81 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 83 82
+211 -103
drivers/clk/davinci/pll.c
··· 11 11 12 12 #include <linux/clk-provider.h> 13 13 #include <linux/clk.h> 14 + #include <linux/clk/davinci.h> 14 15 #include <linux/delay.h> 15 16 #include <linux/err.h> 16 17 #include <linux/io.h> ··· 191 190 } 192 191 193 192 #ifdef CONFIG_DEBUG_FS 194 - static int davinci_pll_debug_init(struct clk_hw *hw, struct dentry *dentry); 193 + static void davinci_pll_debug_init(struct clk_hw *hw, struct dentry *dentry); 195 194 #else 196 195 #define davinci_pll_debug_init NULL 197 196 #endif ··· 224 223 225 224 /** 226 225 * davinci_pll_div_register - common *DIV clock implementation 226 + * @dev: The PLL platform device or NULL 227 227 * @name: the clock name 228 228 * @parent_name: the parent clock name 229 229 * @reg: the *DIV register ··· 242 240 const struct clk_ops *divider_ops = &clk_divider_ops; 243 241 struct clk_gate *gate; 244 242 struct clk_divider *divider; 243 + struct clk *clk; 244 + int ret; 245 245 246 - gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL); 246 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 247 247 if (!gate) 248 248 return ERR_PTR(-ENOMEM); 249 249 250 250 gate->reg = reg; 251 251 gate->bit_idx = DIV_ENABLE_SHIFT; 252 252 253 - divider = devm_kzalloc(dev, sizeof(*divider), GFP_KERNEL); 254 - if (!divider) 255 - return ERR_PTR(-ENOMEM); 253 + divider = kzalloc(sizeof(*divider), GFP_KERNEL); 254 + if (!divider) { 255 + ret = -ENOMEM; 256 + goto err_free_gate; 257 + } 256 258 257 259 divider->reg = reg; 258 260 divider->shift = DIV_RATIO_SHIFT; ··· 267 261 divider_ops = &clk_divider_ro_ops; 268 262 } 269 263 270 - return clk_register_composite(dev, name, parent_names, num_parents, 271 - NULL, NULL, &divider->hw, divider_ops, 272 - &gate->hw, &clk_gate_ops, flags); 264 + clk = clk_register_composite(dev, name, parent_names, num_parents, 265 + NULL, NULL, &divider->hw, divider_ops, 266 + &gate->hw, &clk_gate_ops, flags); 267 + if (IS_ERR(clk)) { 268 + ret = PTR_ERR(clk); 269 + goto err_free_divider; 270 + } 271 + 272 + return clk; 273 + 274 + err_free_divider: 275 + kfree(divider); 276 + err_free_gate: 277 + kfree(gate); 278 + 279 + return ERR_PTR(ret); 273 280 } 274 281 275 282 struct davinci_pllen_clk { ··· 340 321 return NOTIFY_OK; 341 322 } 342 323 343 - static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *dev) 344 - { 345 - struct davinci_pll_platform_data *pdata = dev_get_platdata(dev); 346 - 347 - /* 348 - * Platform data is optional, so allocate a new struct if one was not 349 - * provided. For device tree, this will always be the case. 350 - */ 351 - if (!pdata) 352 - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 353 - if (!pdata) 354 - return NULL; 355 - 356 - /* for device tree, we need to fill in the struct */ 357 - if (dev->of_node) 358 - pdata->cfgchip = 359 - syscon_regmap_lookup_by_compatible("ti,da830-cfgchip"); 360 - 361 - return pdata; 362 - } 363 - 364 324 static struct notifier_block davinci_pllen_notifier = { 365 325 .notifier_call = davinci_pllen_rate_change, 366 326 }; 367 327 368 328 /** 369 329 * davinci_pll_clk_register - Register a PLL clock 330 + * @dev: The PLL platform device or NULL 370 331 * @info: The device-specific clock info 371 332 * @parent_name: The parent clock name 372 333 * @base: The PLL's memory region 334 + * @cfgchip: CFGCHIP syscon regmap for info->unlock_reg or NULL 373 335 * 374 336 * This creates a series of clocks that represent the PLL. 375 337 * ··· 366 366 struct clk *davinci_pll_clk_register(struct device *dev, 367 367 const struct davinci_pll_clk_info *info, 368 368 const char *parent_name, 369 - void __iomem *base) 369 + void __iomem *base, 370 + struct regmap *cfgchip) 370 371 { 371 - struct davinci_pll_platform_data *pdata; 372 372 char prediv_name[MAX_NAME_SIZE]; 373 373 char pllout_name[MAX_NAME_SIZE]; 374 374 char postdiv_name[MAX_NAME_SIZE]; ··· 376 376 struct clk_init_data init; 377 377 struct davinci_pll_clk *pllout; 378 378 struct davinci_pllen_clk *pllen; 379 - struct clk *pllout_clk, *clk; 380 - 381 - pdata = davinci_pll_get_pdata(dev); 382 - if (!pdata) 383 - return ERR_PTR(-ENOMEM); 379 + struct clk *oscin_clk = NULL; 380 + struct clk *prediv_clk = NULL; 381 + struct clk *pllout_clk; 382 + struct clk *postdiv_clk = NULL; 383 + struct clk *pllen_clk; 384 + int ret; 384 385 385 386 if (info->flags & PLL_HAS_CLKMODE) { 386 387 /* ··· 393 392 * a number of different things. In this driver we use it to 394 393 * mean the signal after the PLLCTL[CLKMODE] switch. 395 394 */ 396 - clk = clk_register_fixed_factor(dev, OSCIN_CLK_NAME, 397 - parent_name, 0, 1, 1); 398 - if (IS_ERR(clk)) 399 - return clk; 395 + oscin_clk = clk_register_fixed_factor(dev, OSCIN_CLK_NAME, 396 + parent_name, 0, 1, 1); 397 + if (IS_ERR(oscin_clk)) 398 + return oscin_clk; 400 399 401 400 parent_name = OSCIN_CLK_NAME; 402 401 } ··· 412 411 413 412 /* Some? DM355 chips don't correctly report the PREDIV value */ 414 413 if (info->flags & PLL_PREDIV_FIXED8) 415 - clk = clk_register_fixed_factor(dev, prediv_name, 416 - parent_name, flags, 1, 8); 414 + prediv_clk = clk_register_fixed_factor(dev, prediv_name, 415 + parent_name, flags, 1, 8); 417 416 else 418 - clk = davinci_pll_div_register(dev, prediv_name, 417 + prediv_clk = davinci_pll_div_register(dev, prediv_name, 419 418 parent_name, base + PREDIV, fixed, flags); 420 - if (IS_ERR(clk)) 421 - return clk; 419 + if (IS_ERR(prediv_clk)) { 420 + ret = PTR_ERR(prediv_clk); 421 + goto err_unregister_oscin; 422 + } 422 423 423 424 parent_name = prediv_name; 424 425 } 425 426 426 427 /* Unlock writing to PLL registers */ 427 428 if (info->unlock_reg) { 428 - if (IS_ERR_OR_NULL(pdata->cfgchip)) 429 + if (IS_ERR_OR_NULL(cfgchip)) 429 430 dev_warn(dev, "Failed to get CFGCHIP (%ld)\n", 430 - PTR_ERR(pdata->cfgchip)); 431 + PTR_ERR(cfgchip)); 431 432 else 432 - regmap_write_bits(pdata->cfgchip, info->unlock_reg, 433 + regmap_write_bits(cfgchip, info->unlock_reg, 433 434 info->unlock_mask, 0); 434 435 } 435 436 436 - pllout = devm_kzalloc(dev, sizeof(*pllout), GFP_KERNEL); 437 - if (!pllout) 438 - return ERR_PTR(-ENOMEM); 437 + pllout = kzalloc(sizeof(*pllout), GFP_KERNEL); 438 + if (!pllout) { 439 + ret = -ENOMEM; 440 + goto err_unregister_prediv; 441 + } 439 442 440 443 snprintf(pllout_name, MAX_NAME_SIZE, "%s_pllout", info->name); 441 444 ··· 461 456 pllout->pllm_min = info->pllm_min; 462 457 pllout->pllm_max = info->pllm_max; 463 458 464 - pllout_clk = devm_clk_register(dev, &pllout->hw); 465 - if (IS_ERR(pllout_clk)) 466 - return pllout_clk; 459 + pllout_clk = clk_register(dev, &pllout->hw); 460 + if (IS_ERR(pllout_clk)) { 461 + ret = PTR_ERR(pllout_clk); 462 + goto err_free_pllout; 463 + } 467 464 468 465 clk_hw_set_rate_range(&pllout->hw, info->pllout_min_rate, 469 466 info->pllout_max_rate); ··· 481 474 if (info->flags & PLL_POSTDIV_ALWAYS_ENABLED) 482 475 flags |= CLK_IS_CRITICAL; 483 476 484 - clk = davinci_pll_div_register(dev, postdiv_name, parent_name, 485 - base + POSTDIV, fixed, flags); 486 - if (IS_ERR(clk)) 487 - return clk; 477 + postdiv_clk = davinci_pll_div_register(dev, postdiv_name, 478 + parent_name, base + POSTDIV, fixed, flags); 479 + if (IS_ERR(postdiv_clk)) { 480 + ret = PTR_ERR(postdiv_clk); 481 + goto err_unregister_pllout; 482 + } 488 483 489 484 parent_name = postdiv_name; 490 485 } 491 486 492 - pllen = devm_kzalloc(dev, sizeof(*pllout), GFP_KERNEL); 493 - if (!pllen) 494 - return ERR_PTR(-ENOMEM); 487 + pllen = kzalloc(sizeof(*pllout), GFP_KERNEL); 488 + if (!pllen) { 489 + ret = -ENOMEM; 490 + goto err_unregister_postdiv; 491 + } 495 492 496 493 snprintf(pllen_name, MAX_NAME_SIZE, "%s_pllen", info->name); 497 494 ··· 508 497 pllen->hw.init = &init; 509 498 pllen->base = base; 510 499 511 - clk = devm_clk_register(dev, &pllen->hw); 512 - if (IS_ERR(clk)) 513 - return clk; 500 + pllen_clk = clk_register(dev, &pllen->hw); 501 + if (IS_ERR(pllen_clk)) { 502 + ret = PTR_ERR(pllen_clk); 503 + goto err_free_pllen; 504 + } 514 505 515 - clk_notifier_register(clk, &davinci_pllen_notifier); 506 + clk_notifier_register(pllen_clk, &davinci_pllen_notifier); 516 507 517 508 return pllout_clk; 509 + 510 + err_free_pllen: 511 + kfree(pllen); 512 + err_unregister_postdiv: 513 + clk_unregister(postdiv_clk); 514 + err_unregister_pllout: 515 + clk_unregister(pllout_clk); 516 + err_free_pllout: 517 + kfree(pllout); 518 + err_unregister_prediv: 519 + clk_unregister(prediv_clk); 520 + err_unregister_oscin: 521 + clk_unregister(oscin_clk); 522 + 523 + return ERR_PTR(ret); 518 524 } 519 525 520 526 /** 521 527 * davinci_pll_auxclk_register - Register bypass clock (AUXCLK) 528 + * @dev: The PLL platform device or NULL 522 529 * @name: The clock name 523 530 * @base: The PLL memory region 524 531 */ ··· 550 521 551 522 /** 552 523 * davinci_pll_sysclkbp_clk_register - Register bypass divider clock (SYSCLKBP) 524 + * @dev: The PLL platform device or NULL 553 525 * @name: The clock name 554 526 * @base: The PLL memory region 555 527 */ ··· 565 535 566 536 /** 567 537 * davinci_pll_obsclk_register - Register oscillator divider clock (OBSCLK) 538 + * @dev: The PLL platform device or NULL 568 539 * @info: The clock info 569 540 * @base: The PLL memory region 570 541 */ ··· 577 546 struct clk_mux *mux; 578 547 struct clk_gate *gate; 579 548 struct clk_divider *divider; 549 + struct clk *clk; 580 550 u32 oscdiv; 551 + int ret; 581 552 582 - mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL); 553 + mux = kzalloc(sizeof(*mux), GFP_KERNEL); 583 554 if (!mux) 584 555 return ERR_PTR(-ENOMEM); 585 556 ··· 589 556 mux->table = info->table; 590 557 mux->mask = info->ocsrc_mask; 591 558 592 - gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL); 593 - if (!gate) 594 - return ERR_PTR(-ENOMEM); 559 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 560 + if (!gate) { 561 + ret = -ENOMEM; 562 + goto err_free_mux; 563 + } 595 564 596 565 gate->reg = base + CKEN; 597 566 gate->bit_idx = CKEN_OBSCLK_SHIFT; 598 567 599 - divider = devm_kzalloc(dev, sizeof(*divider), GFP_KERNEL); 600 - if (!divider) 601 - return ERR_PTR(-ENOMEM); 568 + divider = kzalloc(sizeof(*divider), GFP_KERNEL); 569 + if (!divider) { 570 + ret = -ENOMEM; 571 + goto err_free_gate; 572 + } 602 573 603 574 divider->reg = base + OSCDIV; 604 575 divider->shift = DIV_RATIO_SHIFT; ··· 613 576 oscdiv |= BIT(DIV_ENABLE_SHIFT); 614 577 writel(oscdiv, base + OSCDIV); 615 578 616 - return clk_register_composite(dev, info->name, info->parent_names, 617 - info->num_parents, 618 - &mux->hw, &clk_mux_ops, 619 - &divider->hw, &clk_divider_ops, 620 - &gate->hw, &clk_gate_ops, 0); 579 + clk = clk_register_composite(dev, info->name, info->parent_names, 580 + info->num_parents, 581 + &mux->hw, &clk_mux_ops, 582 + &divider->hw, &clk_divider_ops, 583 + &gate->hw, &clk_gate_ops, 0); 584 + 585 + if (IS_ERR(clk)) { 586 + ret = PTR_ERR(clk); 587 + goto err_free_divider; 588 + } 589 + 590 + return clk; 591 + 592 + err_free_divider: 593 + kfree(divider); 594 + err_free_gate: 595 + kfree(gate); 596 + err_free_mux: 597 + kfree(mux); 598 + 599 + return ERR_PTR(ret); 621 600 } 622 601 623 602 /* The PLL SYSCLKn clocks have a mechanism for synchronizing rate changes. */ ··· 669 616 670 617 /** 671 618 * davinci_pll_sysclk_register - Register divider clocks (SYSCLKn) 619 + * @dev: The PLL platform device or NULL 672 620 * @info: The clock info 673 621 * @base: The PLL memory region 674 622 */ ··· 684 630 struct clk *clk; 685 631 u32 reg; 686 632 u32 flags = 0; 633 + int ret; 687 634 688 635 /* PLLDIVn registers are not entirely consecutive */ 689 636 if (info->id < 4) ··· 692 637 else 693 638 reg = PLLDIV4 + 4 * (info->id - 4); 694 639 695 - gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL); 640 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 696 641 if (!gate) 697 642 return ERR_PTR(-ENOMEM); 698 643 699 644 gate->reg = base + reg; 700 645 gate->bit_idx = DIV_ENABLE_SHIFT; 701 646 702 - divider = devm_kzalloc(dev, sizeof(*divider), GFP_KERNEL); 703 - if (!divider) 704 - return ERR_PTR(-ENOMEM); 647 + divider = kzalloc(sizeof(*divider), GFP_KERNEL); 648 + if (!divider) { 649 + ret = -ENOMEM; 650 + goto err_free_gate; 651 + } 705 652 706 653 divider->reg = base + reg; 707 654 divider->shift = DIV_RATIO_SHIFT; ··· 725 668 clk = clk_register_composite(dev, info->name, &info->parent_name, 1, 726 669 NULL, NULL, &divider->hw, divider_ops, 727 670 &gate->hw, &clk_gate_ops, flags); 728 - if (IS_ERR(clk)) 729 - return clk; 671 + if (IS_ERR(clk)) { 672 + ret = PTR_ERR(clk); 673 + goto err_free_divider; 674 + } 730 675 731 676 clk_notifier_register(clk, &davinci_pll_sysclk_notifier); 732 677 733 678 return clk; 679 + 680 + err_free_divider: 681 + kfree(divider); 682 + err_free_gate: 683 + kfree(gate); 684 + 685 + return ERR_PTR(ret); 734 686 } 735 687 736 - int of_davinci_pll_init(struct device *dev, 688 + int of_davinci_pll_init(struct device *dev, struct device_node *node, 737 689 const struct davinci_pll_clk_info *info, 738 690 const struct davinci_pll_obsclk_info *obsclk_info, 739 691 const struct davinci_pll_sysclk_info **div_info, 740 692 u8 max_sysclk_id, 741 - void __iomem *base) 693 + void __iomem *base, 694 + struct regmap *cfgchip) 742 695 { 743 - struct device_node *node = dev->of_node; 744 696 struct device_node *child; 745 697 const char *parent_name; 746 698 struct clk *clk; ··· 759 693 else 760 694 parent_name = OSCIN_CLK_NAME; 761 695 762 - clk = davinci_pll_clk_register(dev, info, parent_name, base); 696 + clk = davinci_pll_clk_register(dev, info, parent_name, base, cfgchip); 763 697 if (IS_ERR(clk)) { 764 698 dev_err(dev, "failed to register %s\n", info->name); 765 699 return PTR_ERR(clk); ··· 777 711 int n_clks = max_sysclk_id + 1; 778 712 int i; 779 713 780 - clk_data = devm_kzalloc(dev, sizeof(*clk_data), GFP_KERNEL); 714 + clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL); 781 715 if (!clk_data) 782 716 return -ENOMEM; 783 717 784 - clks = devm_kmalloc_array(dev, n_clks, sizeof(*clks), GFP_KERNEL); 785 - if (!clks) 718 + clks = kmalloc_array(n_clks, sizeof(*clks), GFP_KERNEL); 719 + if (!clks) { 720 + kfree(clk_data); 786 721 return -ENOMEM; 722 + } 787 723 788 724 clk_data->clks = clks; 789 725 clk_data->clk_num = n_clks; ··· 838 770 return 0; 839 771 } 840 772 773 + static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *dev) 774 + { 775 + struct davinci_pll_platform_data *pdata = dev_get_platdata(dev); 776 + 777 + /* 778 + * Platform data is optional, so allocate a new struct if one was not 779 + * provided. For device tree, this will always be the case. 780 + */ 781 + if (!pdata) 782 + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 783 + if (!pdata) 784 + return NULL; 785 + 786 + /* for device tree, we need to fill in the struct */ 787 + if (dev->of_node) 788 + pdata->cfgchip = 789 + syscon_regmap_lookup_by_compatible("ti,da830-cfgchip"); 790 + 791 + return pdata; 792 + } 793 + 794 + /* needed in early boot for clocksource/clockevent */ 795 + #ifdef CONFIG_ARCH_DAVINCI_DA850 796 + CLK_OF_DECLARE(da850_pll0, "ti,da850-pll0", of_da850_pll0_init); 797 + #endif 798 + 841 799 static const struct of_device_id davinci_pll_of_match[] = { 842 - { .compatible = "ti,da850-pll0", .data = of_da850_pll0_init }, 800 + #ifdef CONFIG_ARCH_DAVINCI_DA850 843 801 { .compatible = "ti,da850-pll1", .data = of_da850_pll1_init }, 802 + #endif 844 803 { } 845 804 }; 846 805 847 806 static const struct platform_device_id davinci_pll_id_table[] = { 807 + #ifdef CONFIG_ARCH_DAVINCI_DA830 848 808 { .name = "da830-pll", .driver_data = (kernel_ulong_t)da830_pll_init }, 809 + #endif 810 + #ifdef CONFIG_ARCH_DAVINCI_DA850 849 811 { .name = "da850-pll0", .driver_data = (kernel_ulong_t)da850_pll0_init }, 850 812 { .name = "da850-pll1", .driver_data = (kernel_ulong_t)da850_pll1_init }, 813 + #endif 814 + #ifdef CONFIG_ARCH_DAVINCI_DM355 851 815 { .name = "dm355-pll1", .driver_data = (kernel_ulong_t)dm355_pll1_init }, 852 816 { .name = "dm355-pll2", .driver_data = (kernel_ulong_t)dm355_pll2_init }, 817 + #endif 818 + #ifdef CONFIG_ARCH_DAVINCI_DM365 853 819 { .name = "dm365-pll1", .driver_data = (kernel_ulong_t)dm365_pll1_init }, 854 820 { .name = "dm365-pll2", .driver_data = (kernel_ulong_t)dm365_pll2_init }, 821 + #endif 822 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 855 823 { .name = "dm644x-pll1", .driver_data = (kernel_ulong_t)dm644x_pll1_init }, 856 824 { .name = "dm644x-pll2", .driver_data = (kernel_ulong_t)dm644x_pll2_init }, 825 + #endif 826 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 857 827 { .name = "dm646x-pll1", .driver_data = (kernel_ulong_t)dm646x_pll1_init }, 858 828 { .name = "dm646x-pll2", .driver_data = (kernel_ulong_t)dm646x_pll2_init }, 829 + #endif 859 830 { } 860 831 }; 861 832 862 - typedef int (*davinci_pll_init)(struct device *dev, void __iomem *base); 833 + typedef int (*davinci_pll_init)(struct device *dev, void __iomem *base, 834 + struct regmap *cfgchip); 863 835 864 836 static int davinci_pll_probe(struct platform_device *pdev) 865 837 { 866 838 struct device *dev = &pdev->dev; 839 + struct davinci_pll_platform_data *pdata; 867 840 const struct of_device_id *of_id; 868 841 davinci_pll_init pll_init = NULL; 869 842 struct resource *res; ··· 921 812 return -EINVAL; 922 813 } 923 814 815 + pdata = davinci_pll_get_pdata(dev); 816 + if (!pdata) { 817 + dev_err(dev, "missing platform data\n"); 818 + return -EINVAL; 819 + } 820 + 924 821 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 925 822 base = devm_ioremap_resource(dev, res); 926 823 if (IS_ERR(base)) 927 824 return PTR_ERR(base); 928 825 929 - return pll_init(dev, base); 826 + return pll_init(dev, base, pdata->cfgchip); 930 827 } 931 828 932 829 static struct platform_driver davinci_pll_driver = { ··· 989 874 DEBUG_REG(PLLDIV9), 990 875 }; 991 876 992 - static int davinci_pll_debug_init(struct clk_hw *hw, struct dentry *dentry) 877 + static void davinci_pll_debug_init(struct clk_hw *hw, struct dentry *dentry) 993 878 { 994 879 struct davinci_pll_clk *pll = to_davinci_pll_clk(hw); 995 880 struct debugfs_regset32 *regset; 996 - struct dentry *d; 997 881 998 882 regset = kzalloc(sizeof(*regset), GFP_KERNEL); 999 883 if (!regset) 1000 - return -ENOMEM; 884 + return; 1001 885 1002 886 regset->regs = davinci_pll_regs; 1003 887 regset->nregs = ARRAY_SIZE(davinci_pll_regs); 1004 888 regset->base = pll->base; 1005 889 1006 - d = debugfs_create_regset32("registers", 0400, dentry, regset); 1007 - if (IS_ERR(d)) { 1008 - kfree(regset); 1009 - return PTR_ERR(d); 1010 - } 1011 - 1012 - return 0; 890 + debugfs_create_regset32("registers", 0400, dentry, regset); 1013 891 } 1014 892 #endif
+20 -21
drivers/clk/davinci/pll.h
··· 11 11 #include <linux/bitops.h> 12 12 #include <linux/clk-provider.h> 13 13 #include <linux/of.h> 14 + #include <linux/regmap.h> 14 15 #include <linux/types.h> 15 16 16 17 #define PLL_HAS_CLKMODE BIT(0) /* PLL has PLLCTL[CLKMODE] */ ··· 95 94 struct clk *davinci_pll_clk_register(struct device *dev, 96 95 const struct davinci_pll_clk_info *info, 97 96 const char *parent_name, 98 - void __iomem *base); 97 + void __iomem *base, 98 + struct regmap *cfgchip); 99 99 struct clk *davinci_pll_auxclk_register(struct device *dev, 100 100 const char *name, 101 101 void __iomem *base); ··· 112 110 const struct davinci_pll_sysclk_info *info, 113 111 void __iomem *base); 114 112 115 - int of_davinci_pll_init(struct device *dev, 113 + int of_davinci_pll_init(struct device *dev, struct device_node *node, 116 114 const struct davinci_pll_clk_info *info, 117 115 const struct davinci_pll_obsclk_info *obsclk_info, 118 116 const struct davinci_pll_sysclk_info **div_info, 119 117 u8 max_sysclk_id, 120 - void __iomem *base); 118 + void __iomem *base, 119 + struct regmap *cfgchip); 121 120 122 121 /* Platform-specific callbacks */ 123 122 124 - int da830_pll_init(struct device *dev, void __iomem *base); 125 - 126 - int da850_pll0_init(struct device *dev, void __iomem *base); 127 - int da850_pll1_init(struct device *dev, void __iomem *base); 128 - int of_da850_pll0_init(struct device *dev, void __iomem *base); 129 - int of_da850_pll1_init(struct device *dev, void __iomem *base); 130 - 131 - int dm355_pll1_init(struct device *dev, void __iomem *base); 132 - int dm355_pll2_init(struct device *dev, void __iomem *base); 133 - 134 - int dm365_pll1_init(struct device *dev, void __iomem *base); 135 - int dm365_pll2_init(struct device *dev, void __iomem *base); 136 - 137 - int dm644x_pll1_init(struct device *dev, void __iomem *base); 138 - int dm644x_pll2_init(struct device *dev, void __iomem *base); 139 - 140 - int dm646x_pll1_init(struct device *dev, void __iomem *base); 141 - int dm646x_pll2_init(struct device *dev, void __iomem *base); 123 + #ifdef CONFIG_ARCH_DAVINCI_DA850 124 + int da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 125 + void of_da850_pll0_init(struct device_node *node); 126 + int of_da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 127 + #endif 128 + #ifdef CONFIG_ARCH_DAVINCI_DM355 129 + int dm355_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 130 + #endif 131 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 132 + int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 133 + #endif 134 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 135 + int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 136 + #endif 142 137 143 138 #endif /* __CLK_DAVINCI_PLL_H___ */
+2 -1
drivers/clk/davinci/psc-da830.c
··· 55 55 .psc_init = &da830_psc0_init, 56 56 }; 57 57 58 - LPSC_CLKDEV2(usb0_clkdev, NULL, "musb-da8xx", 58 + LPSC_CLKDEV3(usb0_clkdev, "fck", "da830-usb-phy-clks", 59 + NULL, "musb-da8xx", 59 60 NULL, "cppi41-dmaengine"); 60 61 LPSC_CLKDEV1(usb1_clkdev, NULL, "ohci-da8xx"); 61 62 /* REVISIT: gpio-davinci.c should be modified to drop con_id */
+4 -3
drivers/clk/davinci/psc-dm355.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 42 41 LPSC(5, 0, timer3, pll1_auxclk, NULL, 0), 43 42 LPSC(6, 0, spi1, pll1_sysclk2, spi1_clkdev, 0), 44 43 LPSC(7, 0, mmcsd1, pll1_sysclk2, mmcsd1_clkdev, 0), 45 - LPSC(8, 0, asp1, pll1_sysclk2, NULL, 0), 44 + LPSC(8, 0, asp1, pll1_sysclk2, mcbsp1_clkdev, 0), 46 45 LPSC(9, 0, usb, pll1_sysclk2, usb_clkdev, 0), 47 46 LPSC(10, 0, pwm3, pll1_auxclk, NULL, 0), 48 47 LPSC(11, 0, spi2, pll1_sysclk2, spi2_clkdev, 0), 49 48 LPSC(12, 0, rto, pll1_auxclk, NULL, 0), 50 49 LPSC(14, 0, aemif, pll1_sysclk2, aemif_clkdev, 0), 51 50 LPSC(15, 0, mmcsd0, pll1_sysclk2, mmcsd0_clkdev, 0), 52 - LPSC(17, 0, asp0, pll1_sysclk2, NULL, 0), 51 + LPSC(17, 0, asp0, pll1_sysclk2, mcbsp0_clkdev, 0), 53 52 LPSC(18, 0, i2c, pll1_auxclk, i2c_clkdev, 0), 54 53 LPSC(19, 0, uart0, pll1_auxclk, uart0_clkdev, 0), 55 54 LPSC(20, 0, uart1, pll1_auxclk, uart1_clkdev, 0), ··· 69 68 { } 70 69 }; 71 70 72 - static int dm355_psc_init(struct device *dev, void __iomem *base) 71 + int dm355_psc_init(struct device *dev, void __iomem *base) 73 72 { 74 73 return davinci_psc_register_clocks(dev, dm355_psc_info, 42, base); 75 74 }
+18 -4
drivers/clk/davinci/psc-dm365.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 66 65 LPSC(31, 0, arm, pll2_sysclk2, NULL, LPSC_ALWAYS_ENABLED), 67 66 LPSC(38, 0, spi3, pll1_sysclk4, spi3_clkdev, 0), 68 67 LPSC(39, 0, spi4, pll1_auxclk, spi4_clkdev, 0), 69 - LPSC(40, 0, emac, pll2_sysclk4, emac_clkdev, 0), 70 - LPSC(44, 1, voice_codec, pll1_sysclk3, voice_codec_clkdev, 0), 71 - LPSC(46, 1, vpss_dac, pll1_sysclk3, vpss_dac_clkdev, 0), 68 + LPSC(40, 0, emac, pll1_sysclk4, emac_clkdev, 0), 69 + /* 70 + * The TRM (ARM Subsystem User's Guide) shows two clocks input into 71 + * voice codec module (PLL2 SYSCLK4 with a DIV2 and PLL1 SYSCLK4). Its 72 + * not fully clear from documentation which clock should be considered 73 + * as parent for PSC. The clock chosen here is to maintain 74 + * compatibility with existing code in arch/arm/mach-davinci/dm365.c 75 + */ 76 + LPSC(44, 0, voice_codec, pll2_sysclk4, voice_codec_clkdev, 0), 77 + /* 78 + * Its not fully clear from TRM (ARM Subsystem User's Guide) as to what 79 + * the parent of VPSS DAC LPSC should actually be. PLL1 SYSCLK3 feeds 80 + * into HDVICP and MJCP. The clock chosen here is to remain compatible 81 + * with code existing in arch/arm/mach-davinci/dm365.c 82 + */ 83 + LPSC(46, 0, vpss_dac, pll1_sysclk3, vpss_dac_clkdev, 0), 72 84 LPSC(47, 0, vpss_master, pll1_sysclk5, vpss_master_clkdev, 0), 73 85 LPSC(50, 0, mjcp, pll1_sysclk3, NULL, 0), 74 86 { } 75 87 }; 76 88 77 - static int dm365_psc_init(struct device *dev, void __iomem *base) 89 + int dm365_psc_init(struct device *dev, void __iomem *base) 78 90 { 79 91 return davinci_psc_register_clocks(dev, dm365_psc_info, 52, base); 80 92 }
+2 -1
drivers/clk/davinci/psc-dm644x.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 64 63 { } 65 64 }; 66 65 67 - static int dm644x_psc_init(struct device *dev, void __iomem *base) 66 + int dm644x_psc_init(struct device *dev, void __iomem *base) 68 67 { 69 68 return davinci_psc_register_clocks(dev, dm644x_psc_info, 41, base); 70 69 }
+2 -1
drivers/clk/davinci/psc-dm646x.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 59 58 { } 60 59 }; 61 60 62 - static int dm646x_psc_init(struct device *dev, void __iomem *base) 61 + int dm646x_psc_init(struct device *dev, void __iomem *base) 63 62 { 64 63 return davinci_psc_register_clocks(dev, dm646x_psc_info, 46, base); 65 64 }
+58 -14
drivers/clk/davinci/psc.c
··· 15 15 16 16 #include <linux/clk-provider.h> 17 17 #include <linux/clk.h> 18 + #include <linux/clk/davinci.h> 18 19 #include <linux/clkdev.h> 19 20 #include <linux/err.h> 20 21 #include <linux/of_address.h> ··· 64 63 65 64 /** 66 65 * struct davinci_lpsc_clk - LPSC clock structure 67 - * @dev: the device that provides this LPSC 66 + * @dev: the device that provides this LPSC or NULL 68 67 * @hw: clk_hw for the LPSC 69 68 * @pm_domain: power domain for the LPSC 70 69 * @genpd_clk: clock reference owned by @pm_domain ··· 222 221 223 222 /** 224 223 * davinci_lpsc_clk_register - register LPSC clock 224 + * @dev: the clocks's device or NULL 225 225 * @name: name of this clock 226 226 * @parent_name: name of clock's parent 227 227 * @regmap: PSC MMIO region ··· 240 238 int ret; 241 239 bool is_on; 242 240 243 - lpsc = devm_kzalloc(dev, sizeof(*lpsc), GFP_KERNEL); 241 + lpsc = kzalloc(sizeof(*lpsc), GFP_KERNEL); 244 242 if (!lpsc) 245 243 return ERR_PTR(-ENOMEM); 246 244 ··· 263 261 lpsc->pd = pd; 264 262 lpsc->flags = flags; 265 263 266 - ret = devm_clk_hw_register(dev, &lpsc->hw); 267 - if (ret < 0) 264 + ret = clk_hw_register(dev, &lpsc->hw); 265 + if (ret < 0) { 266 + kfree(lpsc); 268 267 return ERR_PTR(ret); 268 + } 269 + 270 + /* for now, genpd is only registered when using device-tree */ 271 + if (!dev || !dev->of_node) 272 + return lpsc; 269 273 270 274 /* genpd attach needs a way to look up this clock */ 271 275 ret = clk_hw_register_clkdev(&lpsc->hw, name, best_dev_name(dev)); ··· 386 378 struct regmap *regmap; 387 379 int i, ret; 388 380 389 - psc = devm_kzalloc(dev, sizeof(*psc), GFP_KERNEL); 381 + psc = kzalloc(sizeof(*psc), GFP_KERNEL); 390 382 if (!psc) 391 383 return ERR_PTR(-ENOMEM); 392 384 393 - clks = devm_kmalloc_array(dev, num_clks, sizeof(*clks), GFP_KERNEL); 394 - if (!clks) 395 - return ERR_PTR(-ENOMEM); 385 + clks = kmalloc_array(num_clks, sizeof(*clks), GFP_KERNEL); 386 + if (!clks) { 387 + ret = -ENOMEM; 388 + goto err_free_psc; 389 + } 396 390 397 391 psc->clk_data.clks = clks; 398 392 psc->clk_data.clk_num = num_clks; ··· 406 396 for (i = 0; i < num_clks; i++) 407 397 clks[i] = ERR_PTR(-ENOENT); 408 398 409 - pm_domains = devm_kcalloc(dev, num_clks, sizeof(*pm_domains), GFP_KERNEL); 410 - if (!pm_domains) 411 - return ERR_PTR(-ENOMEM); 399 + pm_domains = kcalloc(num_clks, sizeof(*pm_domains), GFP_KERNEL); 400 + if (!pm_domains) { 401 + ret = -ENOMEM; 402 + goto err_free_clks; 403 + } 412 404 413 405 psc->pm_data.domains = pm_domains; 414 406 psc->pm_data.num_domains = num_clks; 415 407 416 - regmap = devm_regmap_init_mmio(dev, base, &davinci_psc_regmap_config); 417 - if (IS_ERR(regmap)) 418 - return ERR_CAST(regmap); 408 + regmap = regmap_init_mmio(dev, base, &davinci_psc_regmap_config); 409 + if (IS_ERR(regmap)) { 410 + ret = PTR_ERR(regmap); 411 + goto err_free_pm_domains; 412 + } 419 413 420 414 for (; info->name; info++) { 421 415 struct davinci_lpsc_clk *lpsc; ··· 437 423 pm_domains[info->md] = &lpsc->pm_domain; 438 424 } 439 425 426 + /* 427 + * for now, a reset controller is only registered when there is a device 428 + * to associate it with. 429 + */ 430 + if (!dev) 431 + return psc; 432 + 440 433 psc->rcdev.ops = &davinci_psc_reset_ops; 441 434 psc->rcdev.owner = THIS_MODULE; 442 435 psc->rcdev.dev = dev; ··· 457 436 dev_warn(dev, "Failed to register reset controller (%d)\n", ret); 458 437 459 438 return psc; 439 + 440 + err_free_pm_domains: 441 + kfree(pm_domains); 442 + err_free_clks: 443 + kfree(clks); 444 + err_free_psc: 445 + kfree(psc); 446 + 447 + return ERR_PTR(ret); 460 448 } 461 449 462 450 int davinci_psc_register_clocks(struct device *dev, ··· 513 483 } 514 484 515 485 static const struct of_device_id davinci_psc_of_match[] = { 486 + #ifdef CONFIG_ARCH_DAVINCI_DA850 516 487 { .compatible = "ti,da850-psc0", .data = &of_da850_psc0_init_data }, 517 488 { .compatible = "ti,da850-psc1", .data = &of_da850_psc1_init_data }, 489 + #endif 518 490 { } 519 491 }; 520 492 521 493 static const struct platform_device_id davinci_psc_id_table[] = { 494 + #ifdef CONFIG_ARCH_DAVINCI_DA830 522 495 { .name = "da830-psc0", .driver_data = (kernel_ulong_t)&da830_psc0_init_data }, 523 496 { .name = "da830-psc1", .driver_data = (kernel_ulong_t)&da830_psc1_init_data }, 497 + #endif 498 + #ifdef CONFIG_ARCH_DAVINCI_DA850 524 499 { .name = "da850-psc0", .driver_data = (kernel_ulong_t)&da850_psc0_init_data }, 525 500 { .name = "da850-psc1", .driver_data = (kernel_ulong_t)&da850_psc1_init_data }, 501 + #endif 502 + #ifdef CONFIG_ARCH_DAVINCI_DM355 526 503 { .name = "dm355-psc", .driver_data = (kernel_ulong_t)&dm355_psc_init_data }, 504 + #endif 505 + #ifdef CONFIG_ARCH_DAVINCI_DM365 527 506 { .name = "dm365-psc", .driver_data = (kernel_ulong_t)&dm365_psc_init_data }, 507 + #endif 508 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 528 509 { .name = "dm644x-psc", .driver_data = (kernel_ulong_t)&dm644x_psc_init_data }, 510 + #endif 511 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 529 512 { .name = "dm646x-psc", .driver_data = (kernel_ulong_t)&dm646x_psc_init_data }, 513 + #endif 530 514 { } 531 515 }; 532 516
+12
drivers/clk/davinci/psc.h
··· 94 94 int (*psc_init)(struct device *dev, void __iomem *base); 95 95 }; 96 96 97 + #ifdef CONFIG_ARCH_DAVINCI_DA830 97 98 extern const struct davinci_psc_init_data da830_psc0_init_data; 98 99 extern const struct davinci_psc_init_data da830_psc1_init_data; 100 + #endif 101 + #ifdef CONFIG_ARCH_DAVINCI_DA850 99 102 extern const struct davinci_psc_init_data da850_psc0_init_data; 100 103 extern const struct davinci_psc_init_data da850_psc1_init_data; 101 104 extern const struct davinci_psc_init_data of_da850_psc0_init_data; 102 105 extern const struct davinci_psc_init_data of_da850_psc1_init_data; 106 + #endif 107 + #ifdef CONFIG_ARCH_DAVINCI_DM355 103 108 extern const struct davinci_psc_init_data dm355_psc_init_data; 109 + #endif 110 + #ifdef CONFIG_ARCH_DAVINCI_DM356 104 111 extern const struct davinci_psc_init_data dm365_psc_init_data; 112 + #endif 113 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 105 114 extern const struct davinci_psc_init_data dm644x_psc_init_data; 115 + #endif 116 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 106 117 extern const struct davinci_psc_init_data dm646x_psc_init_data; 118 + #endif 107 119 108 120 #endif /* __CLK_DAVINCI_PSC_H__ */
+8 -5
drivers/clk/hisilicon/Kconfig
··· 44 44 Build reset controller driver for HiSilicon device chipsets. 45 45 46 46 config STUB_CLK_HI6220 47 - bool "Hi6220 Stub Clock Driver" 48 - depends on COMMON_CLK_HI6220 && MAILBOX 49 - default ARCH_HISI 47 + bool "Hi6220 Stub Clock Driver" if EXPERT 48 + depends on (COMMON_CLK_HI6220 || COMPILE_TEST) 49 + depends on MAILBOX 50 + default COMMON_CLK_HI6220 50 51 help 51 52 Build the Hisilicon Hi6220 stub clock driver. 52 53 53 54 config STUB_CLK_HI3660 54 - bool "Hi3660 Stub Clock Driver" 55 - depends on COMMON_CLK_HI3660 && MAILBOX 55 + bool "Hi3660 Stub Clock Driver" if EXPERT 56 + depends on (COMMON_CLK_HI3660 || COMPILE_TEST) 57 + depends on MAILBOX 58 + default COMMON_CLK_HI3660 56 59 help 57 60 Build the Hisilicon Hi3660 stub clock driver.
+17
drivers/clk/hisilicon/crg-hi3798cv200.c
··· 186 186 CLK_SET_RATE_PARENT, 0xbc, 0, 0 }, 187 187 { HISTB_USB2_PHY2_REF_CLK, "clk_u2_phy2_ref", "24m", 188 188 CLK_SET_RATE_PARENT, 0xbc, 2, 0 }, 189 + /* USB3 */ 190 + { HISTB_USB3_BUS_CLK, "clk_u3_bus", NULL, 191 + CLK_SET_RATE_PARENT, 0xb0, 0, 0 }, 192 + { HISTB_USB3_UTMI_CLK, "clk_u3_utmi", NULL, 193 + CLK_SET_RATE_PARENT, 0xb0, 4, 0 }, 194 + { HISTB_USB3_PIPE_CLK, "clk_u3_pipe", NULL, 195 + CLK_SET_RATE_PARENT, 0xb0, 3, 0 }, 196 + { HISTB_USB3_SUSPEND_CLK, "clk_u3_suspend", NULL, 197 + CLK_SET_RATE_PARENT, 0xb0, 2, 0 }, 198 + { HISTB_USB3_BUS_CLK1, "clk_u3_bus1", NULL, 199 + CLK_SET_RATE_PARENT, 0xb0, 16, 0 }, 200 + { HISTB_USB3_UTMI_CLK1, "clk_u3_utmi1", NULL, 201 + CLK_SET_RATE_PARENT, 0xb0, 20, 0 }, 202 + { HISTB_USB3_PIPE_CLK1, "clk_u3_pipe1", NULL, 203 + CLK_SET_RATE_PARENT, 0xb0, 19, 0 }, 204 + { HISTB_USB3_SUSPEND_CLK1, "clk_u3_suspend1", NULL, 205 + CLK_SET_RATE_PARENT, 0xb0, 18, 0 }, 189 206 }; 190 207 191 208 static struct hisi_clock_data *hi3798cv200_clk_register(
+2
drivers/clk/imx/clk-imx6q.c
··· 753 753 else 754 754 clk[IMX6Q_CLK_ECSPI5] = imx_clk_gate2("ecspi5", "ecspi_root", base + 0x6c, 8); 755 755 clk[IMX6QDL_CLK_ENET] = imx_clk_gate2("enet", "ipg", base + 0x6c, 10); 756 + clk[IMX6QDL_CLK_EPIT1] = imx_clk_gate2("epit1", "ipg", base + 0x6c, 12); 757 + clk[IMX6QDL_CLK_EPIT2] = imx_clk_gate2("epit2", "ipg", base + 0x6c, 14); 756 758 clk[IMX6QDL_CLK_ESAI_EXTAL] = imx_clk_gate2_shared("esai_extal", "esai_podf", base + 0x6c, 16, &share_count_esai); 757 759 clk[IMX6QDL_CLK_ESAI_IPG] = imx_clk_gate2_shared("esai_ipg", "ahb", base + 0x6c, 16, &share_count_esai); 758 760 clk[IMX6QDL_CLK_ESAI_MEM] = imx_clk_gate2_shared("esai_mem", "ahb", base + 0x6c, 16, &share_count_esai);
+1 -1
drivers/clk/imx/clk-imx6sl.c
··· 330 330 clks[IMX6SL_CLK_PERIPH2] = imx_clk_busy_mux("periph2", base + 0x14, 26, 1, base + 0x48, 3, periph2_sels, ARRAY_SIZE(periph2_sels)); 331 331 332 332 /* name parent_name reg shift width */ 333 - clks[IMX6SL_CLK_OCRAM_PODF] = imx_clk_divider("ocram_podf", "ocram_sel", base + 0x14, 16, 3); 333 + clks[IMX6SL_CLK_OCRAM_PODF] = imx_clk_busy_divider("ocram_podf", "ocram_sel", base + 0x14, 16, 3, base + 0x48, 0); 334 334 clks[IMX6SL_CLK_PERIPH_CLK2_PODF] = imx_clk_divider("periph_clk2_podf", "periph_clk2_sel", base + 0x14, 27, 3); 335 335 clks[IMX6SL_CLK_PERIPH2_CLK2_PODF] = imx_clk_divider("periph2_clk2_podf", "periph2_clk2_sel", base + 0x14, 0, 3); 336 336 clks[IMX6SL_CLK_IPG] = imx_clk_divider("ipg", "ahb", base + 0x14, 8, 2);
+8 -9
drivers/clk/imx/clk-imx6sx.c
··· 80 80 "arm", "pll1_sys", "dummy", "dummy", "dummy", "dummy", "dummy", "pll5_video_div", 81 81 "dummy", "dummy", "pcie_ref_125m", "dummy", "usbphy1", "usbphy2", 82 82 }; 83 - static const char *pll_bypass_src_sels[] = { "osc", "lvds1_in", }; 83 + static const char *pll_bypass_src_sels[] = { "osc", "lvds1_in", "lvds2_in", "dummy", }; 84 84 static const char *pll1_bypass_sels[] = { "pll1", "pll1_bypass_src", }; 85 85 static const char *pll2_bypass_sels[] = { "pll2", "pll2_bypass_src", }; 86 86 static const char *pll3_bypass_sels[] = { "pll3", "pll3_bypass_src", }; ··· 97 97 IMX6SX_CLK_IPMUX1, IMX6SX_CLK_IPMUX2, IMX6SX_CLK_IPMUX3, 98 98 IMX6SX_CLK_WAKEUP, IMX6SX_CLK_MMDC_P0_FAST, IMX6SX_CLK_MMDC_P0_IPG, 99 99 IMX6SX_CLK_ROM, IMX6SX_CLK_ARM, IMX6SX_CLK_IPG, IMX6SX_CLK_OCRAM, 100 - IMX6SX_CLK_PER2_MAIN, IMX6SX_CLK_PERCLK, IMX6SX_CLK_M4, 101 - IMX6SX_CLK_QSPI1, IMX6SX_CLK_QSPI2, IMX6SX_CLK_UART_IPG, 102 - IMX6SX_CLK_UART_SERIAL, IMX6SX_CLK_I2C3, IMX6SX_CLK_ECSPI5, 103 - IMX6SX_CLK_CAN1_IPG, IMX6SX_CLK_CAN1_SERIAL, IMX6SX_CLK_CAN2_IPG, 104 - IMX6SX_CLK_CAN2_SERIAL, IMX6SX_CLK_CANFD, IMX6SX_CLK_EPIT1, 105 - IMX6SX_CLK_EPIT2, 100 + IMX6SX_CLK_PER2_MAIN, IMX6SX_CLK_PERCLK, IMX6SX_CLK_TZASC1, 106 101 }; 107 102 108 103 static const struct clk_div_table clk_enet_ref_table[] = { ··· 153 158 clks[IMX6SX_CLK_IPP_DI0] = of_clk_get_by_name(ccm_node, "ipp_di0"); 154 159 clks[IMX6SX_CLK_IPP_DI1] = of_clk_get_by_name(ccm_node, "ipp_di1"); 155 160 156 - /* Clock source from external clock via CLK1 PAD */ 157 - clks[IMX6SX_CLK_ANACLK1] = imx_obtain_fixed_clock("anaclk1", 0); 161 + /* Clock source from external clock via CLK1/2 PAD */ 162 + clks[IMX6SX_CLK_ANACLK1] = of_clk_get_by_name(ccm_node, "anaclk1"); 163 + clks[IMX6SX_CLK_ANACLK2] = of_clk_get_by_name(ccm_node, "anaclk2"); 158 164 159 165 np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); 160 166 base = of_iomap(np, 0); ··· 224 228 clks[IMX6SX_CLK_PCIE_REF_125M] = imx_clk_gate("pcie_ref_125m", "pcie_ref", base + 0xe0, 19); 225 229 226 230 clks[IMX6SX_CLK_LVDS1_OUT] = imx_clk_gate_exclusive("lvds1_out", "lvds1_sel", base + 0x160, 10, BIT(12)); 231 + clks[IMX6SX_CLK_LVDS2_OUT] = imx_clk_gate_exclusive("lvds2_out", "lvds2_sel", base + 0x160, 11, BIT(13)); 227 232 clks[IMX6SX_CLK_LVDS1_IN] = imx_clk_gate_exclusive("lvds1_in", "anaclk1", base + 0x160, 12, BIT(10)); 233 + clks[IMX6SX_CLK_LVDS2_IN] = imx_clk_gate_exclusive("lvds2_in", "anaclk2", base + 0x160, 13, BIT(11)); 228 234 229 235 clks[IMX6SX_CLK_ENET_REF] = clk_register_divider_table(NULL, "enet_ref", "pll6_enet", 0, 230 236 base + 0xe0, 0, 2, 0, clk_enet_ref_table, ··· 268 270 269 271 /* name reg shift width parent_names num_parents */ 270 272 clks[IMX6SX_CLK_LVDS1_SEL] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels)); 273 + clks[IMX6SX_CLK_LVDS2_SEL] = imx_clk_mux("lvds2_sel", base + 0x160, 5, 5, lvds_sels, ARRAY_SIZE(lvds_sels)); 271 274 272 275 np = ccm_node; 273 276 base = of_iomap(np, 0);
+19 -1
drivers/clk/imx/clk-imx6ul.c
··· 40 40 static const char *axi_sels[] = {"periph", "axi_alt_sel", }; 41 41 static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", }; 42 42 static const char *periph2_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll4_audio_div", }; 43 - static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", }; 43 + static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "pll2_bypass_src", }; 44 44 static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "osc", }; 45 45 static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; 46 46 static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; ··· 68 68 static const char *epdc_pre_sels[] = { "pll2_bus", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd2_508m", }; 69 69 static const char *esai_sels[] = { "pll4_audio_div", "pll3_pfd2_508m", "pll5_video_div", "pll3_usb_otg", }; 70 70 static const char *epdc_sels[] = { "epdc_podf", "ipp_di0", "ipp_di1", "ldb_di0", "ldb_di1", }; 71 + static const char *cko1_sels[] = { "dummy", "dummy", "dummy", "dummy", "dummy", "axi", "enfc", "dummy", "dummy", 72 + "dummy", "lcdif_pix", "ahb", "ipg", "ipg_per", "ckil", "pll4_audio_div", }; 73 + static const char *cko2_sels[] = { "dummy", "dummy", "dummy", "usdhc1", "dummy", "dummy", "ecspi_root", "dummy", 74 + "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "osc", "dummy", 75 + "dummy", "usdhc2", "sai1", "sai2", "sai3", "dummy", "dummy", "can_root", 76 + "dummy", "dummy", "dummy", "dummy", "uart_serial", "spdif", "dummy", "dummy", }; 77 + static const char *cko_sels[] = { "cko1", "cko2", }; 71 78 72 79 static struct clk *clks[IMX6UL_CLK_END]; 73 80 static struct clk_onecell_data clk_data; ··· 280 273 clks[IMX6UL_CLK_LDB_DI0_DIV_SEL] = imx_clk_mux("ldb_di0", base + 0x20, 10, 1, ldb_di0_div_sels, ARRAY_SIZE(ldb_di0_div_sels)); 281 274 clks[IMX6UL_CLK_LDB_DI1_DIV_SEL] = imx_clk_mux("ldb_di1", base + 0x20, 11, 1, ldb_di1_div_sels, ARRAY_SIZE(ldb_di1_div_sels)); 282 275 276 + clks[IMX6UL_CLK_CKO1_SEL] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels)); 277 + clks[IMX6UL_CLK_CKO2_SEL] = imx_clk_mux("cko2_sel", base + 0x60, 16, 5, cko2_sels, ARRAY_SIZE(cko2_sels)); 278 + clks[IMX6UL_CLK_CKO] = imx_clk_mux("cko", base + 0x60, 8, 1, cko_sels, ARRAY_SIZE(cko_sels)); 279 + 283 280 clks[IMX6UL_CLK_LDB_DI0_DIV_3_5] = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7); 284 281 clks[IMX6UL_CLK_LDB_DI0_DIV_7] = imx_clk_fixed_factor("ldb_di0_div_7", "ldb_di0_sel", 1, 7); 285 282 clks[IMX6UL_CLK_LDB_DI1_DIV_3_5] = imx_clk_fixed_factor("ldb_di1_div_3_5", "qspi1_sel", 2, 7); ··· 326 315 clks[IMX6UL_CLK_ECSPI_PODF] = imx_clk_divider("ecspi_podf", "ecspi_sel", base + 0x38, 19, 6); 327 316 clks[IMX6UL_CLK_LCDIF_PRED] = imx_clk_divider("lcdif_pred", "lcdif_pre_sel", base + 0x38, 12, 3); 328 317 clks[IMX6UL_CLK_CSI_PODF] = imx_clk_divider("csi_podf", "csi_sel", base + 0x3c, 11, 3); 318 + 319 + clks[IMX6UL_CLK_CKO1_PODF] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3); 320 + clks[IMX6UL_CLK_CKO2_PODF] = imx_clk_divider("cko2_podf", "cko2_sel", base + 0x60, 21, 3); 329 321 330 322 clks[IMX6UL_CLK_ARM] = imx_clk_busy_divider("arm", "pll1_sw", base + 0x10, 0, 3, base + 0x48, 16); 331 323 clks[IMX6UL_CLK_MMDC_PODF] = imx_clk_busy_divider("mmdc_podf", "periph2", base + 0x14, 3, 3, base + 0x48, 2); ··· 458 444 clks[IMX6UL_CLK_PWM5] = imx_clk_gate2("pwm5", "perclk", base + 0x80, 26); 459 445 clks[IMX6UL_CLK_PWM6] = imx_clk_gate2("pwm6", "perclk", base + 0x80, 28); 460 446 clks[IMX6UL_CLK_PWM7] = imx_clk_gate2("pwm7", "perclk", base + 0x80, 30); 447 + 448 + /* CCOSR */ 449 + clks[IMX6UL_CLK_CKO1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7); 450 + clks[IMX6UL_CLK_CKO2] = imx_clk_gate("cko2", "cko2_podf", base + 0x60, 24); 461 451 462 452 /* mask handshake of mmdc */ 463 453 writel_relaxed(BM_CCM_CCDR_MMDC_CH0_MASK, base + CCDR);
+10 -7
drivers/clk/imx/clk-imx7d.c
··· 26 26 static u32 share_count_sai2; 27 27 static u32 share_count_sai3; 28 28 static u32 share_count_nand; 29 + static u32 share_count_enet1; 30 + static u32 share_count_enet2; 29 31 30 32 static const struct clk_div_table test_div_table[] = { 31 33 { .val = 3, .div = 1, }, ··· 731 729 clks[IMX7D_LCDIF_PIXEL_ROOT_DIV] = imx_clk_divider2("lcdif_pixel_post_div", "lcdif_pixel_pre_div", base + 0xa300, 0, 6); 732 730 clks[IMX7D_MIPI_DSI_ROOT_DIV] = imx_clk_divider2("mipi_dsi_post_div", "mipi_dsi_pre_div", base + 0xa380, 0, 6); 733 731 clks[IMX7D_MIPI_CSI_ROOT_DIV] = imx_clk_divider2("mipi_csi_post_div", "mipi_csi_pre_div", base + 0xa400, 0, 6); 734 - clks[IMX7D_MIPI_DPHY_ROOT_DIV] = imx_clk_divider2("mipi_dphy_post_div", "mipi_csi_dphy_div", base + 0xa480, 0, 6); 732 + clks[IMX7D_MIPI_DPHY_ROOT_DIV] = imx_clk_divider2("mipi_dphy_post_div", "mipi_dphy_pre_div", base + 0xa480, 0, 6); 735 733 clks[IMX7D_SAI1_ROOT_DIV] = imx_clk_divider2("sai1_post_div", "sai1_pre_div", base + 0xa500, 0, 6); 736 734 clks[IMX7D_SAI2_ROOT_DIV] = imx_clk_divider2("sai2_post_div", "sai2_pre_div", base + 0xa580, 0, 6); 737 735 clks[IMX7D_SAI3_ROOT_DIV] = imx_clk_divider2("sai3_post_div", "sai3_pre_div", base + 0xa600, 0, 6); ··· 740 738 clks[IMX7D_ENET1_TIME_ROOT_DIV] = imx_clk_divider2("enet1_time_post_div", "enet1_time_pre_div", base + 0xa780, 0, 6); 741 739 clks[IMX7D_ENET2_REF_ROOT_DIV] = imx_clk_divider2("enet2_ref_post_div", "enet2_ref_pre_div", base + 0xa800, 0, 6); 742 740 clks[IMX7D_ENET2_TIME_ROOT_DIV] = imx_clk_divider2("enet2_time_post_div", "enet2_time_pre_div", base + 0xa880, 0, 6); 743 - clks[IMX7D_ENET_PHY_REF_ROOT_DIV] = imx_clk_divider2("enet_phy_ref_post_div", "enet_phy_ref_pre_div", base + 0xa900, 0, 6); 741 + clks[IMX7D_ENET_PHY_REF_ROOT_CLK] = imx_clk_divider2("enet_phy_ref_root_clk", "enet_phy_ref_pre_div", base + 0xa900, 0, 6); 744 742 clks[IMX7D_EIM_ROOT_DIV] = imx_clk_divider2("eim_post_div", "eim_pre_div", base + 0xa980, 0, 6); 745 743 clks[IMX7D_NAND_ROOT_CLK] = imx_clk_divider2("nand_root_clk", "nand_pre_div", base + 0xaa00, 0, 6); 746 744 clks[IMX7D_QSPI_ROOT_DIV] = imx_clk_divider2("qspi_post_div", "qspi_pre_div", base + 0xaa80, 0, 6); ··· 807 805 clks[IMX7D_MIPI_DSI_ROOT_CLK] = imx_clk_gate4("mipi_dsi_root_clk", "mipi_dsi_post_div", base + 0x4650, 0); 808 806 clks[IMX7D_MIPI_CSI_ROOT_CLK] = imx_clk_gate4("mipi_csi_root_clk", "mipi_csi_post_div", base + 0x4640, 0); 809 807 clks[IMX7D_MIPI_DPHY_ROOT_CLK] = imx_clk_gate4("mipi_dphy_root_clk", "mipi_dphy_post_div", base + 0x4660, 0); 808 + clks[IMX7D_ENET1_IPG_ROOT_CLK] = imx_clk_gate2_shared2("enet1_ipg_root_clk", "enet_axi_post_div", base + 0x4700, 0, &share_count_enet1); 809 + clks[IMX7D_ENET1_TIME_ROOT_CLK] = imx_clk_gate2_shared2("enet1_time_root_clk", "enet1_time_post_div", base + 0x4700, 0, &share_count_enet1); 810 + clks[IMX7D_ENET2_IPG_ROOT_CLK] = imx_clk_gate2_shared2("enet2_ipg_root_clk", "enet_axi_post_div", base + 0x4710, 0, &share_count_enet2); 811 + clks[IMX7D_ENET2_TIME_ROOT_CLK] = imx_clk_gate2_shared2("enet2_time_root_clk", "enet2_time_post_div", base + 0x4710, 0, &share_count_enet2); 810 812 clks[IMX7D_SAI1_ROOT_CLK] = imx_clk_gate2_shared2("sai1_root_clk", "sai1_post_div", base + 0x48c0, 0, &share_count_sai1); 811 813 clks[IMX7D_SAI1_IPG_CLK] = imx_clk_gate2_shared2("sai1_ipg_clk", "ipg_root_clk", base + 0x48c0, 0, &share_count_sai1); 812 814 clks[IMX7D_SAI2_ROOT_CLK] = imx_clk_gate2_shared2("sai2_root_clk", "sai2_post_div", base + 0x48d0, 0, &share_count_sai2); ··· 818 812 clks[IMX7D_SAI3_ROOT_CLK] = imx_clk_gate2_shared2("sai3_root_clk", "sai3_post_div", base + 0x48e0, 0, &share_count_sai3); 819 813 clks[IMX7D_SAI3_IPG_CLK] = imx_clk_gate2_shared2("sai3_ipg_clk", "ipg_root_clk", base + 0x48e0, 0, &share_count_sai3); 820 814 clks[IMX7D_SPDIF_ROOT_CLK] = imx_clk_gate4("spdif_root_clk", "spdif_post_div", base + 0x44d0, 0); 821 - clks[IMX7D_ENET1_REF_ROOT_CLK] = imx_clk_gate4("enet1_ref_root_clk", "enet1_ref_post_div", base + 0x44e0, 0); 822 - clks[IMX7D_ENET1_TIME_ROOT_CLK] = imx_clk_gate4("enet1_time_root_clk", "enet1_time_post_div", base + 0x44f0, 0); 823 - clks[IMX7D_ENET2_REF_ROOT_CLK] = imx_clk_gate4("enet2_ref_root_clk", "enet2_ref_post_div", base + 0x4500, 0); 824 - clks[IMX7D_ENET2_TIME_ROOT_CLK] = imx_clk_gate4("enet2_time_root_clk", "enet2_time_post_div", base + 0x4510, 0); 825 - clks[IMX7D_ENET_PHY_REF_ROOT_CLK] = imx_clk_gate4("enet_phy_ref_root_clk", "enet_phy_ref_post_div", base + 0x4520, 0); 826 815 clks[IMX7D_EIM_ROOT_CLK] = imx_clk_gate4("eim_root_clk", "eim_post_div", base + 0x4160, 0); 827 816 clks[IMX7D_NAND_RAWNAND_CLK] = imx_clk_gate2_shared2("nand_rawnand_clk", "nand_root_clk", base + 0x4140, 0, &share_count_nand); 828 817 clks[IMX7D_NAND_USDHC_BUS_RAWNAND_CLK] = imx_clk_gate2_shared2("nand_usdhc_rawnand_clk", "nand_usdhc_root_clk", base + 0x4140, 0, &share_count_nand); ··· 891 890 clk_set_parent(clks[IMX7D_PLL_ENET_MAIN_BYPASS], clks[IMX7D_PLL_ENET_MAIN]); 892 891 clk_set_parent(clks[IMX7D_PLL_AUDIO_MAIN_BYPASS], clks[IMX7D_PLL_AUDIO_MAIN]); 893 892 clk_set_parent(clks[IMX7D_PLL_VIDEO_MAIN_BYPASS], clks[IMX7D_PLL_VIDEO_MAIN]); 893 + 894 + clk_set_parent(clks[IMX7D_MIPI_CSI_ROOT_SRC], clks[IMX7D_PLL_SYS_PFD3_CLK]); 894 895 895 896 /* use old gpt clk setting, gpt1 root clk must be twice as gpt counter freq */ 896 897 clk_set_parent(clks[IMX7D_GPT1_ROOT_SRC], clks[IMX7D_OSC_24M_CLK]);
+6 -2
drivers/clk/ingenic/cgu.c
··· 43 43 ingenic_cgu_gate_get(struct ingenic_cgu *cgu, 44 44 const struct ingenic_cgu_gate_info *info) 45 45 { 46 - return readl(cgu->base + info->reg) & BIT(info->bit); 46 + return !!(readl(cgu->base + info->reg) & BIT(info->bit)) 47 + ^ info->clear_to_gate; 47 48 } 48 49 49 50 /** ··· 63 62 { 64 63 u32 clkgr = readl(cgu->base + info->reg); 65 64 66 - if (val) 65 + if (val ^ info->clear_to_gate) 67 66 clkgr |= BIT(info->bit); 68 67 else 69 68 clkgr &= ~BIT(info->bit); ··· 512 511 spin_lock_irqsave(&cgu->lock, flags); 513 512 ingenic_cgu_gate_set(cgu, &clk_info->gate, false); 514 513 spin_unlock_irqrestore(&cgu->lock, flags); 514 + 515 + if (clk_info->gate.delay_us) 516 + udelay(clk_info->gate.delay_us); 515 517 } 516 518 517 519 return 0;
+4
drivers/clk/ingenic/cgu.h
··· 111 111 * struct ingenic_cgu_gate_info - information about a clock gate 112 112 * @reg: offset of the gate control register within the CGU 113 113 * @bit: offset of the bit in the register that controls the gate 114 + * @clear_to_gate: if set, the clock is gated when the bit is cleared 115 + * @delay_us: delay in microseconds after which the clock is considered stable 114 116 */ 115 117 struct ingenic_cgu_gate_info { 116 118 unsigned reg; 117 119 u8 bit; 120 + bool clear_to_gate; 121 + u16 delay_us; 118 122 }; 119 123 120 124 /**
+9 -40
drivers/clk/ingenic/jz4770-cgu.c
··· 42 42 43 43 /* bits within the OPCR register */ 44 44 #define OPCR_SPENDH BIT(5) /* UHC PHY suspend */ 45 - #define OPCR_SPENDN BIT(7) /* OTG PHY suspend */ 46 45 47 46 /* bits within the USBPCR1 register */ 48 47 #define USBPCR1_UHC_POWER BIT(5) /* UHC PHY power down */ ··· 80 81 .enable = jz4770_uhc_phy_enable, 81 82 .disable = jz4770_uhc_phy_disable, 82 83 .is_enabled = jz4770_uhc_phy_is_enabled, 83 - }; 84 - 85 - static int jz4770_otg_phy_enable(struct clk_hw *hw) 86 - { 87 - void __iomem *reg_opcr = cgu->base + CGU_REG_OPCR; 88 - 89 - writel(readl(reg_opcr) | OPCR_SPENDN, reg_opcr); 90 - 91 - /* Wait for the clock to be stable */ 92 - udelay(50); 93 - return 0; 94 - } 95 - 96 - static void jz4770_otg_phy_disable(struct clk_hw *hw) 97 - { 98 - void __iomem *reg_opcr = cgu->base + CGU_REG_OPCR; 99 - 100 - writel(readl(reg_opcr) & ~OPCR_SPENDN, reg_opcr); 101 - } 102 - 103 - static int jz4770_otg_phy_is_enabled(struct clk_hw *hw) 104 - { 105 - void __iomem *reg_opcr = cgu->base + CGU_REG_OPCR; 106 - 107 - return !!(readl(reg_opcr) & OPCR_SPENDN); 108 - } 109 - 110 - static const struct clk_ops jz4770_otg_phy_ops = { 111 - .enable = jz4770_otg_phy_enable, 112 - .disable = jz4770_otg_phy_disable, 113 - .is_enabled = jz4770_otg_phy_is_enabled, 114 84 }; 115 85 116 86 static const s8 pll_od_encoding[8] = { ··· 154 186 "h1clk", CGU_CLK_DIV | CGU_CLK_GATE, 155 187 .parents = { JZ4770_CLK_PLL0, }, 156 188 .div = { CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1 }, 157 - .gate = { CGU_REG_LCR, 30 }, 189 + .gate = { CGU_REG_CLKGR1, 7 }, 158 190 }, 159 191 [JZ4770_CLK_H2CLK] = { 160 192 "h2clk", CGU_CLK_DIV, ··· 162 194 .div = { CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1 }, 163 195 }, 164 196 [JZ4770_CLK_C1CLK] = { 165 - "c1clk", CGU_CLK_DIV, 197 + "c1clk", CGU_CLK_DIV | CGU_CLK_GATE, 166 198 .parents = { JZ4770_CLK_PLL0, }, 167 199 .div = { CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1 }, 200 + .gate = { CGU_REG_OPCR, 31, true }, // disable CCLK stop on idle 168 201 }, 169 202 [JZ4770_CLK_PCLK] = { 170 203 "pclk", CGU_CLK_DIV, ··· 362 393 [JZ4770_CLK_VPU] = { 363 394 "vpu", CGU_CLK_GATE, 364 395 .parents = { JZ4770_CLK_H1CLK, }, 365 - .gate = { CGU_REG_CLKGR1, 7 }, 396 + .gate = { CGU_REG_LCR, 30, false, 150 }, 366 397 }, 367 398 [JZ4770_CLK_MMC0] = { 368 399 "mmc0", CGU_CLK_GATE, ··· 379 410 .parents = { JZ4770_CLK_MMC2_MUX, }, 380 411 .gate = { CGU_REG_CLKGR0, 12 }, 381 412 }, 413 + [JZ4770_CLK_OTG_PHY] = { 414 + "usb_phy", CGU_CLK_GATE, 415 + .parents = { JZ4770_CLK_OTG }, 416 + .gate = { CGU_REG_OPCR, 7, true, 50 }, 417 + }, 382 418 383 419 /* Custom clocks */ 384 420 ··· 391 417 "uhc_phy", CGU_CLK_CUSTOM, 392 418 .parents = { JZ4770_CLK_UHC, -1, -1, -1 }, 393 419 .custom = { &jz4770_uhc_phy_ops }, 394 - }, 395 - [JZ4770_CLK_OTG_PHY] = { 396 - "usb_phy", CGU_CLK_CUSTOM, 397 - .parents = { JZ4770_CLK_OTG, -1, -1, -1 }, 398 - .custom = { &jz4770_otg_phy_ops }, 399 420 }, 400 421 401 422 [JZ4770_CLK_EXT512] = {
+6
drivers/clk/mediatek/Kconfig
··· 60 60 ---help--- 61 61 This driver supports Mediatek MT2701 audsys clocks. 62 62 63 + config COMMON_CLK_MT2701_G3DSYS 64 + bool "Clock driver for MediaTek MT2701 g3dsys" 65 + depends on COMMON_CLK_MT2701 66 + ---help--- 67 + This driver supports MediaTek MT2701 g3dsys clocks. 68 + 63 69 config COMMON_CLK_MT2712 64 70 bool "Clock driver for MediaTek MT2712" 65 71 depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
+1
drivers/clk/mediatek/Makefile
··· 9 9 obj-$(CONFIG_COMMON_CLK_MT2701_AUDSYS) += clk-mt2701-aud.o 10 10 obj-$(CONFIG_COMMON_CLK_MT2701_BDPSYS) += clk-mt2701-bdp.o 11 11 obj-$(CONFIG_COMMON_CLK_MT2701_ETHSYS) += clk-mt2701-eth.o 12 + obj-$(CONFIG_COMMON_CLK_MT2701_G3DSYS) += clk-mt2701-g3d.o 12 13 obj-$(CONFIG_COMMON_CLK_MT2701_HIFSYS) += clk-mt2701-hif.o 13 14 obj-$(CONFIG_COMMON_CLK_MT2701_IMGSYS) += clk-mt2701-img.o 14 15 obj-$(CONFIG_COMMON_CLK_MT2701_MMSYS) += clk-mt2701-mm.o
+95
drivers/clk/mediatek/clk-mt2701-g3d.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2018 MediaTek Inc. 4 + * Author: Sean Wang <sean.wang@mediatek.com> 5 + * 6 + */ 7 + 8 + #include <linux/clk-provider.h> 9 + #include <linux/of.h> 10 + #include <linux/of_address.h> 11 + #include <linux/of_device.h> 12 + #include <linux/platform_device.h> 13 + 14 + #include "clk-mtk.h" 15 + #include "clk-gate.h" 16 + 17 + #include <dt-bindings/clock/mt2701-clk.h> 18 + 19 + #define GATE_G3D(_id, _name, _parent, _shift) { \ 20 + .id = _id, \ 21 + .name = _name, \ 22 + .parent_name = _parent, \ 23 + .regs = &g3d_cg_regs, \ 24 + .shift = _shift, \ 25 + .ops = &mtk_clk_gate_ops_setclr, \ 26 + } 27 + 28 + static const struct mtk_gate_regs g3d_cg_regs = { 29 + .sta_ofs = 0x0, 30 + .set_ofs = 0x4, 31 + .clr_ofs = 0x8, 32 + }; 33 + 34 + static const struct mtk_gate g3d_clks[] = { 35 + GATE_G3D(CLK_G3DSYS_CORE, "g3d_core", "mfg_sel", 0), 36 + }; 37 + 38 + static int clk_mt2701_g3dsys_init(struct platform_device *pdev) 39 + { 40 + struct clk_onecell_data *clk_data; 41 + struct device_node *node = pdev->dev.of_node; 42 + int r; 43 + 44 + clk_data = mtk_alloc_clk_data(CLK_G3DSYS_NR); 45 + 46 + mtk_clk_register_gates(node, g3d_clks, ARRAY_SIZE(g3d_clks), 47 + clk_data); 48 + 49 + r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); 50 + if (r) 51 + dev_err(&pdev->dev, 52 + "could not register clock provider: %s: %d\n", 53 + pdev->name, r); 54 + 55 + mtk_register_reset_controller(node, 1, 0xc); 56 + 57 + return r; 58 + } 59 + 60 + static const struct of_device_id of_match_clk_mt2701_g3d[] = { 61 + { 62 + .compatible = "mediatek,mt2701-g3dsys", 63 + .data = clk_mt2701_g3dsys_init, 64 + }, { 65 + /* sentinel */ 66 + } 67 + }; 68 + 69 + static int clk_mt2701_g3d_probe(struct platform_device *pdev) 70 + { 71 + int (*clk_init)(struct platform_device *); 72 + int r; 73 + 74 + clk_init = of_device_get_match_data(&pdev->dev); 75 + if (!clk_init) 76 + return -EINVAL; 77 + 78 + r = clk_init(pdev); 79 + if (r) 80 + dev_err(&pdev->dev, 81 + "could not register clock provider: %s: %d\n", 82 + pdev->name, r); 83 + 84 + return r; 85 + } 86 + 87 + static struct platform_driver clk_mt2701_g3d_drv = { 88 + .probe = clk_mt2701_g3d_probe, 89 + .driver = { 90 + .name = "clk-mt2701-g3d", 91 + .of_match_table = of_match_clk_mt2701_g3d, 92 + }, 93 + }; 94 + 95 + builtin_platform_driver(clk_mt2701_g3d_drv);
+6 -2
drivers/clk/mediatek/clk-mt2701.c
··· 46 46 340 * MHZ), 47 47 FIXED_CLK(CLK_TOP_HDMI_0_PLL340M, "hdmi_0_pll340m", "clk26m", 48 48 340 * MHZ), 49 - FIXED_CLK(CLK_TOP_HDMITX_CLKDIG_CTS, "hdmitx_dig_cts", "clk26m", 50 - 300 * MHZ), 51 49 FIXED_CLK(CLK_TOP_HADDS2_FB, "hadds2_fbclk", "clk26m", 52 50 27 * MHZ), 53 51 FIXED_CLK(CLK_TOP_WBG_DIG_416M, "wbg_dig_ck_416m", "clk26m", ··· 975 977 21, 0x2d0, 4, 0x0, 0x2d4, 0), 976 978 }; 977 979 980 + static const struct mtk_fixed_factor apmixed_fixed_divs[] = { 981 + FACTOR(CLK_APMIXED_HDMI_REF, "hdmi_ref", "tvdpll", 1, 1), 982 + }; 983 + 978 984 static int mtk_apmixedsys_init(struct platform_device *pdev) 979 985 { 980 986 struct clk_onecell_data *clk_data; ··· 989 987 return -ENOMEM; 990 988 991 989 mtk_clk_register_plls(node, apmixed_plls, ARRAY_SIZE(apmixed_plls), 990 + clk_data); 991 + mtk_clk_register_factors(apmixed_fixed_divs, ARRAY_SIZE(apmixed_fixed_divs), 992 992 clk_data); 993 993 994 994 return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+8
drivers/clk/meson/Kconfig
··· 3 3 depends on OF 4 4 depends on ARCH_MESON || COMPILE_TEST 5 5 6 + config COMMON_CLK_MESON_AO 7 + bool 8 + depends on OF 9 + depends on ARCH_MESON || COMPILE_TEST 10 + select COMMON_CLK_REGMAP_MESON 11 + 6 12 config COMMON_CLK_REGMAP_MESON 7 13 bool 8 14 select REGMAP ··· 27 21 bool 28 22 depends on COMMON_CLK_AMLOGIC 29 23 select RESET_CONTROLLER 24 + select COMMON_CLK_MESON_AO 30 25 select COMMON_CLK_REGMAP_MESON 31 26 select MFD_SYSCON 32 27 help ··· 38 31 bool 39 32 depends on COMMON_CLK_AMLOGIC 40 33 select RESET_CONTROLLER 34 + select COMMON_CLK_MESON_AO 41 35 select COMMON_CLK_REGMAP_MESON 42 36 select MFD_SYSCON 43 37 help
+2 -1
drivers/clk/meson/Makefile
··· 3 3 # 4 4 5 5 obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-mpll.o clk-audio-divider.o 6 + obj-$(CONFIG_COMMON_CLK_MESON_AO) += meson-aoclk.o 6 7 obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o 7 8 obj-$(CONFIG_COMMON_CLK_GXBB) += gxbb.o gxbb-aoclk.o gxbb-aoclk-32k.o 8 - obj-$(CONFIG_COMMON_CLK_AXG) += axg.o 9 + obj-$(CONFIG_COMMON_CLK_AXG) += axg.o axg-aoclk.o 9 10 obj-$(CONFIG_COMMON_CLK_REGMAP_MESON) += clk-regmap.o
+164
drivers/clk/meson/axg-aoclk.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Amlogic Meson-AXG Clock Controller Driver 4 + * 5 + * Copyright (c) 2016 Baylibre SAS. 6 + * Author: Michael Turquette <mturquette@baylibre.com> 7 + * 8 + * Copyright (c) 2018 Amlogic, inc. 9 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 10 + */ 11 + #include <linux/clk-provider.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/reset-controller.h> 14 + #include <linux/mfd/syscon.h> 15 + #include "clk-regmap.h" 16 + #include "meson-aoclk.h" 17 + #include "axg-aoclk.h" 18 + 19 + #define AXG_AO_GATE(_name, _bit) \ 20 + static struct clk_regmap axg_aoclk_##_name = { \ 21 + .data = &(struct clk_regmap_gate_data) { \ 22 + .offset = (AO_RTI_GEN_CNTL_REG0), \ 23 + .bit_idx = (_bit), \ 24 + }, \ 25 + .hw.init = &(struct clk_init_data) { \ 26 + .name = "axg_ao_" #_name, \ 27 + .ops = &clk_regmap_gate_ops, \ 28 + .parent_names = (const char *[]){ "clk81" }, \ 29 + .num_parents = 1, \ 30 + .flags = CLK_IGNORE_UNUSED, \ 31 + }, \ 32 + } 33 + 34 + AXG_AO_GATE(remote, 0); 35 + AXG_AO_GATE(i2c_master, 1); 36 + AXG_AO_GATE(i2c_slave, 2); 37 + AXG_AO_GATE(uart1, 3); 38 + AXG_AO_GATE(uart2, 5); 39 + AXG_AO_GATE(ir_blaster, 6); 40 + AXG_AO_GATE(saradc, 7); 41 + 42 + static struct clk_regmap axg_aoclk_clk81 = { 43 + .data = &(struct clk_regmap_mux_data) { 44 + .offset = AO_RTI_PWR_CNTL_REG0, 45 + .mask = 0x1, 46 + .shift = 8, 47 + }, 48 + .hw.init = &(struct clk_init_data){ 49 + .name = "axg_ao_clk81", 50 + .ops = &clk_regmap_mux_ro_ops, 51 + .parent_names = (const char *[]){ "clk81", "ao_alt_xtal"}, 52 + .num_parents = 2, 53 + }, 54 + }; 55 + 56 + static struct clk_regmap axg_aoclk_saradc_mux = { 57 + .data = &(struct clk_regmap_mux_data) { 58 + .offset = AO_SAR_CLK, 59 + .mask = 0x3, 60 + .shift = 9, 61 + }, 62 + .hw.init = &(struct clk_init_data){ 63 + .name = "axg_ao_saradc_mux", 64 + .ops = &clk_regmap_mux_ops, 65 + .parent_names = (const char *[]){ "xtal", "axg_ao_clk81" }, 66 + .num_parents = 2, 67 + }, 68 + }; 69 + 70 + static struct clk_regmap axg_aoclk_saradc_div = { 71 + .data = &(struct clk_regmap_div_data) { 72 + .offset = AO_SAR_CLK, 73 + .shift = 0, 74 + .width = 8, 75 + }, 76 + .hw.init = &(struct clk_init_data){ 77 + .name = "axg_ao_saradc_div", 78 + .ops = &clk_regmap_divider_ops, 79 + .parent_names = (const char *[]){ "axg_ao_saradc_mux" }, 80 + .num_parents = 1, 81 + .flags = CLK_SET_RATE_PARENT, 82 + }, 83 + }; 84 + 85 + static struct clk_regmap axg_aoclk_saradc_gate = { 86 + .data = &(struct clk_regmap_gate_data) { 87 + .offset = AO_SAR_CLK, 88 + .bit_idx = 8, 89 + }, 90 + .hw.init = &(struct clk_init_data){ 91 + .name = "axg_ao_saradc_gate", 92 + .ops = &clk_regmap_gate_ops, 93 + .parent_names = (const char *[]){ "axg_ao_saradc_div" }, 94 + .num_parents = 1, 95 + .flags = CLK_SET_RATE_PARENT, 96 + }, 97 + }; 98 + 99 + static const unsigned int axg_aoclk_reset[] = { 100 + [RESET_AO_REMOTE] = 16, 101 + [RESET_AO_I2C_MASTER] = 18, 102 + [RESET_AO_I2C_SLAVE] = 19, 103 + [RESET_AO_UART1] = 17, 104 + [RESET_AO_UART2] = 22, 105 + [RESET_AO_IR_BLASTER] = 23, 106 + }; 107 + 108 + static struct clk_regmap *axg_aoclk_regmap[] = { 109 + [CLKID_AO_REMOTE] = &axg_aoclk_remote, 110 + [CLKID_AO_I2C_MASTER] = &axg_aoclk_i2c_master, 111 + [CLKID_AO_I2C_SLAVE] = &axg_aoclk_i2c_slave, 112 + [CLKID_AO_UART1] = &axg_aoclk_uart1, 113 + [CLKID_AO_UART2] = &axg_aoclk_uart2, 114 + [CLKID_AO_IR_BLASTER] = &axg_aoclk_ir_blaster, 115 + [CLKID_AO_SAR_ADC] = &axg_aoclk_saradc, 116 + [CLKID_AO_CLK81] = &axg_aoclk_clk81, 117 + [CLKID_AO_SAR_ADC_SEL] = &axg_aoclk_saradc_mux, 118 + [CLKID_AO_SAR_ADC_DIV] = &axg_aoclk_saradc_div, 119 + [CLKID_AO_SAR_ADC_CLK] = &axg_aoclk_saradc_gate, 120 + }; 121 + 122 + static const struct clk_hw_onecell_data axg_aoclk_onecell_data = { 123 + .hws = { 124 + [CLKID_AO_REMOTE] = &axg_aoclk_remote.hw, 125 + [CLKID_AO_I2C_MASTER] = &axg_aoclk_i2c_master.hw, 126 + [CLKID_AO_I2C_SLAVE] = &axg_aoclk_i2c_slave.hw, 127 + [CLKID_AO_UART1] = &axg_aoclk_uart1.hw, 128 + [CLKID_AO_UART2] = &axg_aoclk_uart2.hw, 129 + [CLKID_AO_IR_BLASTER] = &axg_aoclk_ir_blaster.hw, 130 + [CLKID_AO_SAR_ADC] = &axg_aoclk_saradc.hw, 131 + [CLKID_AO_CLK81] = &axg_aoclk_clk81.hw, 132 + [CLKID_AO_SAR_ADC_SEL] = &axg_aoclk_saradc_mux.hw, 133 + [CLKID_AO_SAR_ADC_DIV] = &axg_aoclk_saradc_div.hw, 134 + [CLKID_AO_SAR_ADC_CLK] = &axg_aoclk_saradc_gate.hw, 135 + }, 136 + .num = NR_CLKS, 137 + }; 138 + 139 + static const struct meson_aoclk_data axg_aoclkc_data = { 140 + .reset_reg = AO_RTI_GEN_CNTL_REG0, 141 + .num_reset = ARRAY_SIZE(axg_aoclk_reset), 142 + .reset = axg_aoclk_reset, 143 + .num_clks = ARRAY_SIZE(axg_aoclk_regmap), 144 + .clks = axg_aoclk_regmap, 145 + .hw_data = &axg_aoclk_onecell_data, 146 + }; 147 + 148 + static const struct of_device_id axg_aoclkc_match_table[] = { 149 + { 150 + .compatible = "amlogic,meson-axg-aoclkc", 151 + .data = &axg_aoclkc_data, 152 + }, 153 + { } 154 + }; 155 + 156 + static struct platform_driver axg_aoclkc_driver = { 157 + .probe = meson_aoclkc_probe, 158 + .driver = { 159 + .name = "axg-aoclkc", 160 + .of_match_table = axg_aoclkc_match_table, 161 + }, 162 + }; 163 + 164 + builtin_platform_driver(axg_aoclkc_driver);
+29
drivers/clk/meson/axg-aoclk.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ 2 + /* 3 + * Copyright (c) 2017 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + */ 9 + 10 + #ifndef __AXG_AOCLKC_H 11 + #define __AXG_AOCLKC_H 12 + 13 + #define NR_CLKS 11 14 + /* AO Configuration Clock registers offsets 15 + * Register offsets from the data sheet must be multiplied by 4. 16 + */ 17 + #define AO_RTI_PWR_CNTL_REG1 0x0C 18 + #define AO_RTI_PWR_CNTL_REG0 0x10 19 + #define AO_RTI_GEN_CNTL_REG0 0x40 20 + #define AO_OSCIN_CNTL 0x58 21 + #define AO_CRT_CLK_CNTL1 0x68 22 + #define AO_SAR_CLK 0x90 23 + #define AO_RTC_ALT_CLK_CNTL0 0x94 24 + #define AO_RTC_ALT_CLK_CNTL1 0x98 25 + 26 + #include <dt-bindings/clock/axg-aoclkc.h> 27 + #include <dt-bindings/reset/axg-aoclkc.h> 28 + 29 + #endif /* __AXG_AOCLKC_H */
+4
drivers/clk/meson/axg.c
··· 461 461 .width = 1, 462 462 }, 463 463 .lock = &meson_clk_lock, 464 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 464 465 }, 465 466 .hw.init = &(struct clk_init_data){ 466 467 .name = "mpll0_div", ··· 508 507 .width = 1, 509 508 }, 510 509 .lock = &meson_clk_lock, 510 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 511 511 }, 512 512 .hw.init = &(struct clk_init_data){ 513 513 .name = "mpll1_div", ··· 555 553 .width = 1, 556 554 }, 557 555 .lock = &meson_clk_lock, 556 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 558 557 }, 559 558 .hw.init = &(struct clk_init_data){ 560 559 .name = "mpll2_div", ··· 602 599 .width = 1, 603 600 }, 604 601 .lock = &meson_clk_lock, 602 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 605 603 }, 606 604 .hw.init = &(struct clk_init_data){ 607 605 .name = "mpll3_div",
+1 -12
drivers/clk/meson/clk-audio-divider.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2017 AmLogic, Inc. 3 4 * Author: Jerome Brunet <jbrunet@baylibre.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms and conditions of the GNU General Public License, 7 - * version 2, as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program. If not, see <http://www.gnu.org/licenses/>. 16 5 */ 17 6 18 7 /*
+20 -56
drivers/clk/meson/clk-mpll.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) 1 2 /* 2 - * This file is provided under a dual BSD/GPLv2 license. When using or 3 - * redistributing this file, you may do so under either license. 4 - * 5 - * GPL LICENSE SUMMARY 6 - * 7 3 * Copyright (c) 2016 AmLogic, Inc. 8 4 * Author: Michael Turquette <mturquette@baylibre.com> 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of version 2 of the GNU General Public License as 12 - * published by the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but 15 - * WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 - * General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, write to the Free Software 21 - * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 22 - * The full GNU General Public License is included in this distribution 23 - * in the file called COPYING 24 - * 25 - * BSD LICENSE 26 - * 27 - * Copyright (c) 2016 AmLogic, Inc. 28 - * Author: Michael Turquette <mturquette@baylibre.com> 29 - * 30 - * Redistribution and use in source and binary forms, with or without 31 - * modification, are permitted provided that the following conditions 32 - * are met: 33 - * 34 - * * Redistributions of source code must retain the above copyright 35 - * notice, this list of conditions and the following disclaimer. 36 - * * Redistributions in binary form must reproduce the above copyright 37 - * notice, this list of conditions and the following disclaimer in 38 - * the documentation and/or other materials provided with the 39 - * distribution. 40 - * * Neither the name of Intel Corporation nor the names of its 41 - * contributors may be used to endorse or promote products derived 42 - * from this software without specific prior written permission. 43 - * 44 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 45 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 46 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 47 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 48 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 49 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 50 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 54 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 5 */ 56 6 57 7 /* ··· 39 89 static void params_from_rate(unsigned long requested_rate, 40 90 unsigned long parent_rate, 41 91 unsigned int *sdm, 42 - unsigned int *n2) 92 + unsigned int *n2, 93 + u8 flags) 43 94 { 44 95 uint64_t div = parent_rate; 45 - unsigned long rem = do_div(div, requested_rate); 96 + uint64_t frac = do_div(div, requested_rate); 97 + 98 + frac *= SDM_DEN; 99 + 100 + if (flags & CLK_MESON_MPLL_ROUND_CLOSEST) 101 + *sdm = DIV_ROUND_CLOSEST_ULL(frac, requested_rate); 102 + else 103 + *sdm = DIV_ROUND_UP_ULL(frac, requested_rate); 104 + 105 + if (*sdm == SDM_DEN) { 106 + *sdm = 0; 107 + div += 1; 108 + } 46 109 47 110 if (div < N2_MIN) { 48 111 *n2 = N2_MIN; ··· 65 102 *sdm = SDM_DEN - 1; 66 103 } else { 67 104 *n2 = div; 68 - *sdm = DIV_ROUND_UP_ULL((u64)rem * SDM_DEN, requested_rate); 69 105 } 70 106 } 71 107 ··· 87 125 unsigned long rate, 88 126 unsigned long *parent_rate) 89 127 { 128 + struct clk_regmap *clk = to_clk_regmap(hw); 129 + struct meson_clk_mpll_data *mpll = meson_clk_mpll_data(clk); 90 130 unsigned int sdm, n2; 91 131 92 - params_from_rate(rate, *parent_rate, &sdm, &n2); 132 + params_from_rate(rate, *parent_rate, &sdm, &n2, mpll->flags); 93 133 return rate_from_params(*parent_rate, sdm, n2); 94 134 } 95 135 ··· 104 140 unsigned int sdm, n2; 105 141 unsigned long flags = 0; 106 142 107 - params_from_rate(rate, parent_rate, &sdm, &n2); 143 + params_from_rate(rate, parent_rate, &sdm, &n2, mpll->flags); 108 144 109 145 if (mpll->lock) 110 146 spin_lock_irqsave(mpll->lock, flags);
+1 -12
drivers/clk/meson/clk-pll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2015 Endless Mobile, Inc. 3 4 * Author: Carlo Caione <carlo@endlessm.com> 4 5 * 5 6 * Copyright (c) 2018 Baylibre, SAS. 6 7 * Author: Jerome Brunet <jbrunet@baylibre.com> 7 - * 8 - * This program is free software; you can redistribute it and/or modify it 9 - * under the terms and conditions of the GNU General Public License, 10 - * version 2, as published by the Free Software Foundation. 11 - * 12 - * This program is distributed in the hope it will be useful, but WITHOUT 13 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 - * more details. 16 - * 17 - * You should have received a copy of the GNU General Public License along with 18 - * this program. If not, see <http://www.gnu.org/licenses/>. 19 8 */ 20 9 21 10 /*
+4 -2
drivers/clk/meson/clk-regmap.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (c) 2018 BayLibre, SAS. 3 - // Author: Jerome Brunet <jbrunet@baylibre.com> 2 + /* 3 + * Copyright (c) 2018 BayLibre, SAS. 4 + * Author: Jerome Brunet <jbrunet@baylibre.com> 5 + */ 4 6 5 7 #include "clk-regmap.h" 6 8
+5 -3
drivers/clk/meson/clk-regmap.h
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (c) 2018 BayLibre, SAS. 3 - // Author: Jerome Brunet <jbrunet@baylibre.com> 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2018 BayLibre, SAS. 4 + * Author: Jerome Brunet <jbrunet@baylibre.com> 5 + */ 4 6 5 7 #ifndef __CLK_REGMAP_H 6 8 #define __CLK_REGMAP_H
+4 -12
drivers/clk/meson/clkc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2015 Endless Mobile, Inc. 3 4 * Author: Carlo Caione <carlo@endlessm.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms and conditions of the GNU General Public License, 7 - * version 2, as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program. If not, see <http://www.gnu.org/licenses/>. 16 5 */ 17 6 18 7 #ifndef __CLKC_H ··· 86 97 struct parm ssen; 87 98 struct parm misc; 88 99 spinlock_t *lock; 100 + u8 flags; 89 101 }; 102 + 103 + #define CLK_MESON_MPLL_ROUND_CLOSEST BIT(0) 90 104 91 105 struct meson_clk_audio_div_data { 92 106 struct parm div;
+1 -2
drivers/clk/meson/gxbb-aoclk-32k.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 1 2 /* 2 3 * Copyright (c) 2017 BayLibre, SAS. 3 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 4 - * 5 - * SPDX-License-Identifier: GPL-2.0+ 6 5 */ 7 6 8 7 #include <linux/clk-provider.h>
+34 -113
drivers/clk/meson/gxbb-aoclk.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) 1 2 /* 2 - * This file is provided under a dual BSD/GPLv2 license. When using or 3 - * redistributing this file, you may do so under either license. 4 - * 5 - * GPL LICENSE SUMMARY 6 - * 7 3 * Copyright (c) 2016 BayLibre, SAS. 8 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of version 2 of the GNU General Public License as 12 - * published by the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but 15 - * WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 - * General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, see <http://www.gnu.org/licenses/>. 21 - * The full GNU General Public License is included in this distribution 22 - * in the file called COPYING. 23 - * 24 - * BSD LICENSE 25 - * 26 - * Copyright (c) 2016 BayLibre, SAS. 27 - * Author: Neil Armstrong <narmstrong@baylibre.com> 28 - * 29 - * Redistribution and use in source and binary forms, with or without 30 - * modification, are permitted provided that the following conditions 31 - * are met: 32 - * 33 - * * Redistributions of source code must retain the above copyright 34 - * notice, this list of conditions and the following disclaimer. 35 - * * Redistributions in binary form must reproduce the above copyright 36 - * notice, this list of conditions and the following disclaimer in 37 - * the documentation and/or other materials provided with the 38 - * distribution. 39 - * * Neither the name of Intel Corporation nor the names of its 40 - * contributors may be used to endorse or promote products derived 41 - * from this software without specific prior written permission. 42 - * 43 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 44 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 45 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 46 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 47 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 48 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 49 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 50 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 51 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 52 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 53 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 5 */ 55 - #include <linux/clk-provider.h> 56 - #include <linux/of_address.h> 57 6 #include <linux/platform_device.h> 58 - #include <linux/reset-controller.h> 59 7 #include <linux/mfd/syscon.h> 60 - #include <linux/regmap.h> 61 - #include <linux/init.h> 62 - #include <linux/delay.h> 63 - #include <dt-bindings/clock/gxbb-aoclkc.h> 64 - #include <dt-bindings/reset/gxbb-aoclkc.h> 65 8 #include "clk-regmap.h" 9 + #include "meson-aoclk.h" 66 10 #include "gxbb-aoclk.h" 67 - 68 - struct gxbb_aoclk_reset_controller { 69 - struct reset_controller_dev reset; 70 - unsigned int *data; 71 - struct regmap *regmap; 72 - }; 73 - 74 - static int gxbb_aoclk_do_reset(struct reset_controller_dev *rcdev, 75 - unsigned long id) 76 - { 77 - struct gxbb_aoclk_reset_controller *reset = 78 - container_of(rcdev, struct gxbb_aoclk_reset_controller, reset); 79 - 80 - return regmap_write(reset->regmap, AO_RTI_GEN_CNTL_REG0, 81 - BIT(reset->data[id])); 82 - } 83 - 84 - static const struct reset_control_ops gxbb_aoclk_reset_ops = { 85 - .reset = gxbb_aoclk_do_reset, 86 - }; 87 11 88 12 #define GXBB_AO_GATE(_name, _bit) \ 89 13 static struct clk_regmap _name##_ao = { \ ··· 20 96 .ops = &clk_regmap_gate_ops, \ 21 97 .parent_names = (const char *[]){ "clk81" }, \ 22 98 .num_parents = 1, \ 23 - .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED), \ 99 + .flags = CLK_IGNORE_UNUSED, \ 24 100 }, \ 25 101 } 26 102 ··· 41 117 }, 42 118 }; 43 119 44 - static unsigned int gxbb_aoclk_reset[] = { 120 + static const unsigned int gxbb_aoclk_reset[] = { 45 121 [RESET_AO_REMOTE] = 16, 46 122 [RESET_AO_I2C_MASTER] = 18, 47 123 [RESET_AO_I2C_SLAVE] = 19, ··· 59 135 [CLKID_AO_IR_BLASTER] = &ir_blaster_ao, 60 136 }; 61 137 62 - static struct clk_hw_onecell_data gxbb_aoclk_onecell_data = { 138 + static const struct clk_hw_onecell_data gxbb_aoclk_onecell_data = { 63 139 .hws = { 64 140 [CLKID_AO_REMOTE] = &remote_ao.hw, 65 141 [CLKID_AO_I2C_MASTER] = &i2c_master_ao.hw, ··· 69 145 [CLKID_AO_IR_BLASTER] = &ir_blaster_ao.hw, 70 146 [CLKID_AO_CEC_32K] = &cec_32k_ao.hw, 71 147 }, 72 - .num = 7, 148 + .num = NR_CLKS, 73 149 }; 74 150 75 - static int gxbb_aoclkc_probe(struct platform_device *pdev) 151 + static int gxbb_register_cec_ao_32k(struct platform_device *pdev) 76 152 { 77 - struct gxbb_aoclk_reset_controller *rstc; 78 153 struct device *dev = &pdev->dev; 79 154 struct regmap *regmap; 80 - int ret, clkid; 81 - 82 - rstc = devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL); 83 - if (!rstc) 84 - return -ENOMEM; 155 + int ret; 85 156 86 157 regmap = syscon_node_to_regmap(of_get_parent(dev->of_node)); 87 158 if (IS_ERR(regmap)) { 88 159 dev_err(dev, "failed to get regmap\n"); 89 - return -ENODEV; 90 - } 91 - 92 - /* Reset Controller */ 93 - rstc->regmap = regmap; 94 - rstc->data = gxbb_aoclk_reset; 95 - rstc->reset.ops = &gxbb_aoclk_reset_ops; 96 - rstc->reset.nr_resets = ARRAY_SIZE(gxbb_aoclk_reset); 97 - rstc->reset.of_node = dev->of_node; 98 - ret = devm_reset_controller_register(dev, &rstc->reset); 99 - 100 - /* 101 - * Populate regmap and register all clks 102 - */ 103 - for (clkid = 0; clkid < ARRAY_SIZE(gxbb_aoclk_gate); clkid++) { 104 - gxbb_aoclk_gate[clkid]->map = regmap; 105 - 106 - ret = devm_clk_hw_register(dev, 107 - gxbb_aoclk_onecell_data.hws[clkid]); 108 - if (ret) 109 - return ret; 160 + return PTR_ERR(regmap); 110 161 } 111 162 112 163 /* Specific clocks */ 113 164 cec_32k_ao.regmap = regmap; 114 165 ret = devm_clk_hw_register(dev, &cec_32k_ao.hw); 166 + if (ret) { 167 + dev_err(&pdev->dev, "clk cec_32k_ao register failed.\n"); 168 + return ret; 169 + } 170 + 171 + return 0; 172 + } 173 + 174 + static const struct meson_aoclk_data gxbb_aoclkc_data = { 175 + .reset_reg = AO_RTI_GEN_CNTL_REG0, 176 + .num_reset = ARRAY_SIZE(gxbb_aoclk_reset), 177 + .reset = gxbb_aoclk_reset, 178 + .num_clks = ARRAY_SIZE(gxbb_aoclk_gate), 179 + .clks = gxbb_aoclk_gate, 180 + .hw_data = &gxbb_aoclk_onecell_data, 181 + }; 182 + 183 + static int gxbb_aoclkc_probe(struct platform_device *pdev) 184 + { 185 + int ret = gxbb_register_cec_ao_32k(pdev); 115 186 if (ret) 116 187 return ret; 117 188 118 - return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get, 119 - &gxbb_aoclk_onecell_data); 189 + return meson_aoclkc_probe(pdev); 120 190 } 121 191 122 192 static const struct of_device_id gxbb_aoclkc_match_table[] = { 123 - { .compatible = "amlogic,meson-gx-aoclkc" }, 193 + { 194 + .compatible = "amlogic,meson-gx-aoclkc", 195 + .data = &gxbb_aoclkc_data, 196 + }, 124 197 { } 125 198 }; 126 199
+6 -2
drivers/clk/meson/gxbb-aoclk.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 1 2 /* 2 3 * Copyright (c) 2017 BayLibre, SAS 3 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 4 - * 5 - * SPDX-License-Identifier: GPL-2.0+ 6 5 */ 7 6 8 7 #ifndef __GXBB_AOCLKC_H 9 8 #define __GXBB_AOCLKC_H 9 + 10 + #define NR_CLKS 7 10 11 11 12 /* AO Configuration Clock registers offsets */ 12 13 #define AO_RTI_PWR_CNTL_REG1 0x0c ··· 26 25 #define to_aoclk_cec_32k(_hw) container_of(_hw, struct aoclk_cec_32k, hw) 27 26 28 27 extern const struct clk_ops meson_aoclk_cec_32k_ops; 28 + 29 + #include <dt-bindings/clock/gxbb-aoclkc.h> 30 + #include <dt-bindings/reset/gxbb-aoclkc.h> 29 31 30 32 #endif /* __GXBB_AOCLKC_H */
+115 -14
drivers/clk/meson/gxbb.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 - * AmLogic S905 / GXBB Clock Controller Driver 3 - * 4 3 * Copyright (c) 2016 AmLogic, Inc. 5 4 * Michael Turquette <mturquette@baylibre.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 5 */ 19 6 20 7 #include <linux/clk.h> ··· 1530 1543 }, 1531 1544 }; 1532 1545 1546 + /* VDEC clocks */ 1547 + 1548 + static const char * const gxbb_vdec_parent_names[] = { 1549 + "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7" 1550 + }; 1551 + 1552 + static struct clk_regmap gxbb_vdec_1_sel = { 1553 + .data = &(struct clk_regmap_mux_data){ 1554 + .offset = HHI_VDEC_CLK_CNTL, 1555 + .mask = 0x3, 1556 + .shift = 9, 1557 + .flags = CLK_MUX_ROUND_CLOSEST, 1558 + }, 1559 + .hw.init = &(struct clk_init_data){ 1560 + .name = "vdec_1_sel", 1561 + .ops = &clk_regmap_mux_ops, 1562 + .parent_names = gxbb_vdec_parent_names, 1563 + .num_parents = ARRAY_SIZE(gxbb_vdec_parent_names), 1564 + .flags = CLK_SET_RATE_PARENT, 1565 + }, 1566 + }; 1567 + 1568 + static struct clk_regmap gxbb_vdec_1_div = { 1569 + .data = &(struct clk_regmap_div_data){ 1570 + .offset = HHI_VDEC_CLK_CNTL, 1571 + .shift = 0, 1572 + .width = 7, 1573 + }, 1574 + .hw.init = &(struct clk_init_data){ 1575 + .name = "vdec_1_div", 1576 + .ops = &clk_regmap_divider_ops, 1577 + .parent_names = (const char *[]){ "vdec_1_sel" }, 1578 + .num_parents = 1, 1579 + .flags = CLK_SET_RATE_PARENT, 1580 + }, 1581 + }; 1582 + 1583 + static struct clk_regmap gxbb_vdec_1 = { 1584 + .data = &(struct clk_regmap_gate_data){ 1585 + .offset = HHI_VDEC_CLK_CNTL, 1586 + .bit_idx = 8, 1587 + }, 1588 + .hw.init = &(struct clk_init_data) { 1589 + .name = "vdec_1", 1590 + .ops = &clk_regmap_gate_ops, 1591 + .parent_names = (const char *[]){ "vdec_1_div" }, 1592 + .num_parents = 1, 1593 + .flags = CLK_SET_RATE_PARENT, 1594 + }, 1595 + }; 1596 + 1597 + static struct clk_regmap gxbb_vdec_hevc_sel = { 1598 + .data = &(struct clk_regmap_mux_data){ 1599 + .offset = HHI_VDEC2_CLK_CNTL, 1600 + .mask = 0x3, 1601 + .shift = 25, 1602 + .flags = CLK_MUX_ROUND_CLOSEST, 1603 + }, 1604 + .hw.init = &(struct clk_init_data){ 1605 + .name = "vdec_hevc_sel", 1606 + .ops = &clk_regmap_mux_ops, 1607 + .parent_names = gxbb_vdec_parent_names, 1608 + .num_parents = ARRAY_SIZE(gxbb_vdec_parent_names), 1609 + .flags = CLK_SET_RATE_PARENT, 1610 + }, 1611 + }; 1612 + 1613 + static struct clk_regmap gxbb_vdec_hevc_div = { 1614 + .data = &(struct clk_regmap_div_data){ 1615 + .offset = HHI_VDEC2_CLK_CNTL, 1616 + .shift = 16, 1617 + .width = 7, 1618 + }, 1619 + .hw.init = &(struct clk_init_data){ 1620 + .name = "vdec_hevc_div", 1621 + .ops = &clk_regmap_divider_ops, 1622 + .parent_names = (const char *[]){ "vdec_hevc_sel" }, 1623 + .num_parents = 1, 1624 + .flags = CLK_SET_RATE_PARENT, 1625 + }, 1626 + }; 1627 + 1628 + static struct clk_regmap gxbb_vdec_hevc = { 1629 + .data = &(struct clk_regmap_gate_data){ 1630 + .offset = HHI_VDEC2_CLK_CNTL, 1631 + .bit_idx = 24, 1632 + }, 1633 + .hw.init = &(struct clk_init_data) { 1634 + .name = "vdec_hevc", 1635 + .ops = &clk_regmap_gate_ops, 1636 + .parent_names = (const char *[]){ "vdec_hevc_div" }, 1637 + .num_parents = 1, 1638 + .flags = CLK_SET_RATE_PARENT, 1639 + }, 1640 + }; 1641 + 1533 1642 /* Everything Else (EE) domain gates */ 1534 1643 static MESON_GATE(gxbb_ddr, HHI_GCLK_MPEG0, 0); 1535 1644 static MESON_GATE(gxbb_dos, HHI_GCLK_MPEG0, 1); ··· 1869 1786 [CLKID_FCLK_DIV4_DIV] = &gxbb_fclk_div4_div.hw, 1870 1787 [CLKID_FCLK_DIV5_DIV] = &gxbb_fclk_div5_div.hw, 1871 1788 [CLKID_FCLK_DIV7_DIV] = &gxbb_fclk_div7_div.hw, 1789 + [CLKID_VDEC_1_SEL] = &gxbb_vdec_1_sel.hw, 1790 + [CLKID_VDEC_1_DIV] = &gxbb_vdec_1_div.hw, 1791 + [CLKID_VDEC_1] = &gxbb_vdec_1.hw, 1792 + [CLKID_VDEC_HEVC_SEL] = &gxbb_vdec_hevc_sel.hw, 1793 + [CLKID_VDEC_HEVC_DIV] = &gxbb_vdec_hevc_div.hw, 1794 + [CLKID_VDEC_HEVC] = &gxbb_vdec_hevc.hw, 1872 1795 [NR_CLKS] = NULL, 1873 1796 }, 1874 1797 .num = NR_CLKS, ··· 2031 1942 [CLKID_FCLK_DIV4_DIV] = &gxbb_fclk_div4_div.hw, 2032 1943 [CLKID_FCLK_DIV5_DIV] = &gxbb_fclk_div5_div.hw, 2033 1944 [CLKID_FCLK_DIV7_DIV] = &gxbb_fclk_div7_div.hw, 1945 + [CLKID_VDEC_1_SEL] = &gxbb_vdec_1_sel.hw, 1946 + [CLKID_VDEC_1_DIV] = &gxbb_vdec_1_div.hw, 1947 + [CLKID_VDEC_1] = &gxbb_vdec_1.hw, 1948 + [CLKID_VDEC_HEVC_SEL] = &gxbb_vdec_hevc_sel.hw, 1949 + [CLKID_VDEC_HEVC_DIV] = &gxbb_vdec_hevc_div.hw, 1950 + [CLKID_VDEC_HEVC] = &gxbb_vdec_hevc.hw, 2034 1951 [NR_CLKS] = NULL, 2035 1952 }, 2036 1953 .num = NR_CLKS, ··· 2195 2100 &gxbb_fclk_div4, 2196 2101 &gxbb_fclk_div5, 2197 2102 &gxbb_fclk_div7, 2103 + &gxbb_vdec_1_sel, 2104 + &gxbb_vdec_1_div, 2105 + &gxbb_vdec_1, 2106 + &gxbb_vdec_hevc_sel, 2107 + &gxbb_vdec_hevc_div, 2108 + &gxbb_vdec_hevc, 2198 2109 }; 2199 2110 2200 2111 struct clkc_data {
+6 -52
drivers/clk/meson/gxbb.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 1 2 /* 2 - * This file is provided under a dual BSD/GPLv2 license. When using or 3 - * redistributing this file, you may do so under either license. 4 - * 5 - * GPL LICENSE SUMMARY 6 - * 7 3 * Copyright (c) 2016 AmLogic, Inc. 8 4 * Author: Michael Turquette <mturquette@baylibre.com> 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of version 2 of the GNU General Public License as 12 - * published by the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but 15 - * WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 - * General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, write to the Free Software 21 - * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 22 - * The full GNU General Public License is included in this distribution 23 - * in the file called COPYING 24 - * 25 - * BSD LICENSE 26 - * 27 - * Copyright (c) 2016 BayLibre, Inc. 28 - * Author: Michael Turquette <mturquette@baylibre.com> 29 - * 30 - * Redistribution and use in source and binary forms, with or without 31 - * modification, are permitted provided that the following conditions 32 - * are met: 33 - * 34 - * * Redistributions of source code must retain the above copyright 35 - * notice, this list of conditions and the following disclaimer. 36 - * * Redistributions in binary form must reproduce the above copyright 37 - * notice, this list of conditions and the following disclaimer in 38 - * the documentation and/or other materials provided with the 39 - * distribution. 40 - * * Neither the name of Intel Corporation nor the names of its 41 - * contributors may be used to endorse or promote products derived 42 - * from this software without specific prior written permission. 43 - * 44 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 45 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 46 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 47 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 48 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 49 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 50 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 54 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 5 */ 56 6 57 7 #ifndef __GXBB_H ··· 154 204 #define CLKID_FCLK_DIV4_DIV 148 155 205 #define CLKID_FCLK_DIV5_DIV 149 156 206 #define CLKID_FCLK_DIV7_DIV 150 207 + #define CLKID_VDEC_1_SEL 151 208 + #define CLKID_VDEC_1_DIV 152 209 + #define CLKID_VDEC_HEVC_SEL 154 210 + #define CLKID_VDEC_HEVC_DIV 155 157 211 158 - #define NR_CLKS 151 212 + #define NR_CLKS 157 159 213 160 214 /* include the CLKIDs that have been made part of the DT binding */ 161 215 #include <dt-bindings/clock/gxbb-clkc.h>
+81
drivers/clk/meson/meson-aoclk.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Amlogic Meson-AXG Clock Controller Driver 4 + * 5 + * Copyright (c) 2016 BayLibre, SAS. 6 + * Author: Neil Armstrong <narmstrong@baylibre.com> 7 + * 8 + * Copyright (c) 2018 Amlogic, inc. 9 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 10 + * Author: Yixun Lan <yixun.lan@amlogic.com> 11 + */ 12 + 13 + #include <linux/platform_device.h> 14 + #include <linux/reset-controller.h> 15 + #include <linux/mfd/syscon.h> 16 + #include <linux/of_device.h> 17 + #include "clk-regmap.h" 18 + #include "meson-aoclk.h" 19 + 20 + static int meson_aoclk_do_reset(struct reset_controller_dev *rcdev, 21 + unsigned long id) 22 + { 23 + struct meson_aoclk_reset_controller *rstc = 24 + container_of(rcdev, struct meson_aoclk_reset_controller, reset); 25 + 26 + return regmap_write(rstc->regmap, rstc->data->reset_reg, 27 + BIT(rstc->data->reset[id])); 28 + } 29 + 30 + static const struct reset_control_ops meson_aoclk_reset_ops = { 31 + .reset = meson_aoclk_do_reset, 32 + }; 33 + 34 + int meson_aoclkc_probe(struct platform_device *pdev) 35 + { 36 + struct meson_aoclk_reset_controller *rstc; 37 + struct meson_aoclk_data *data; 38 + struct device *dev = &pdev->dev; 39 + struct regmap *regmap; 40 + int ret, clkid; 41 + 42 + data = (struct meson_aoclk_data *) of_device_get_match_data(dev); 43 + if (!data) 44 + return -ENODEV; 45 + 46 + rstc = devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL); 47 + if (!rstc) 48 + return -ENOMEM; 49 + 50 + regmap = syscon_node_to_regmap(of_get_parent(dev->of_node)); 51 + if (IS_ERR(regmap)) { 52 + dev_err(dev, "failed to get regmap\n"); 53 + return PTR_ERR(regmap); 54 + } 55 + 56 + /* Reset Controller */ 57 + rstc->data = data; 58 + rstc->regmap = regmap; 59 + rstc->reset.ops = &meson_aoclk_reset_ops; 60 + rstc->reset.nr_resets = data->num_reset, 61 + rstc->reset.of_node = dev->of_node; 62 + ret = devm_reset_controller_register(dev, &rstc->reset); 63 + if (ret) { 64 + dev_err(dev, "failed to register reset controller\n"); 65 + return ret; 66 + } 67 + 68 + /* 69 + * Populate regmap and register all clks 70 + */ 71 + for (clkid = 0; clkid < data->num_clks; clkid++) { 72 + data->clks[clkid]->map = regmap; 73 + 74 + ret = devm_clk_hw_register(dev, data->hw_data->hws[clkid]); 75 + if (ret) 76 + return ret; 77 + } 78 + 79 + return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, 80 + (void *) data->hw_data); 81 + }
+34
drivers/clk/meson/meson-aoclk.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ 2 + /* 3 + * Copyright (c) 2017 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + * Author: Yixun Lan <yixun.lan@amlogic.com> 9 + */ 10 + 11 + #ifndef __MESON_AOCLK_H__ 12 + #define __MESON_AOCLK_H__ 13 + 14 + #include <linux/platform_device.h> 15 + #include <linux/reset-controller.h> 16 + #include "clk-regmap.h" 17 + 18 + struct meson_aoclk_data { 19 + const unsigned int reset_reg; 20 + const int num_reset; 21 + const unsigned int *reset; 22 + int num_clks; 23 + struct clk_regmap **clks; 24 + const struct clk_hw_onecell_data *hw_data; 25 + }; 26 + 27 + struct meson_aoclk_reset_controller { 28 + struct reset_controller_dev reset; 29 + const struct meson_aoclk_data *data; 30 + struct regmap *regmap; 31 + }; 32 + 33 + int meson_aoclkc_probe(struct platform_device *pdev); 34 + #endif
+62 -15
drivers/clk/meson/meson8b.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 - * AmLogic S802 (Meson8) / S805 (Meson8b) / S812 (Meson8m2) Clock Controller 3 - * Driver 4 - * 5 3 * Copyright (c) 2015 Endless Mobile, Inc. 6 4 * Author: Carlo Caione <carlo@endlessm.com> 7 5 * 8 6 * Copyright (c) 2016 BayLibre, Inc. 9 7 * Michael Turquette <mturquette@baylibre.com> 10 - * 11 - * This program is free software; you can redistribute it and/or modify it 12 - * under the terms and conditions of the GNU General Public License, 13 - * version 2, as published by the Free Software Foundation. 14 - * 15 - * This program is distributed in the hope it will be useful, but WITHOUT 16 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 18 - * more details. 19 - * 20 - * You should have received a copy of the GNU General Public License along with 21 - * this program. If not, see <http://www.gnu.org/licenses/>. 22 8 */ 23 9 24 10 #include <linux/clk.h> ··· 232 246 .ops = &clk_regmap_gate_ops, 233 247 .parent_names = (const char *[]){ "fclk_div2_div" }, 234 248 .num_parents = 1, 249 + /* 250 + * FIXME: Ethernet with a RGMII PHYs is not working if 251 + * fclk_div2 is disabled. it is currently unclear why this 252 + * is. keep it enabled until the Ethernet driver knows how 253 + * to manage this clock. 254 + */ 255 + .flags = CLK_IS_CRITICAL, 235 256 }, 236 257 }; 237 258 ··· 633 640 }, 634 641 }; 635 642 643 + static struct clk_regmap meson8b_nand_clk_sel = { 644 + .data = &(struct clk_regmap_mux_data){ 645 + .offset = HHI_NAND_CLK_CNTL, 646 + .mask = 0x7, 647 + .shift = 9, 648 + .flags = CLK_MUX_ROUND_CLOSEST, 649 + }, 650 + .hw.init = &(struct clk_init_data){ 651 + .name = "nand_clk_sel", 652 + .ops = &clk_regmap_mux_ops, 653 + /* FIXME all other parents are unknown: */ 654 + .parent_names = (const char *[]){ "fclk_div4", "fclk_div3", 655 + "fclk_div5", "fclk_div7", "xtal" }, 656 + .num_parents = 5, 657 + .flags = CLK_SET_RATE_PARENT, 658 + }, 659 + }; 660 + 661 + static struct clk_regmap meson8b_nand_clk_div = { 662 + .data = &(struct clk_regmap_div_data){ 663 + .offset = HHI_NAND_CLK_CNTL, 664 + .shift = 0, 665 + .width = 7, 666 + .flags = CLK_DIVIDER_ROUND_CLOSEST, 667 + }, 668 + .hw.init = &(struct clk_init_data){ 669 + .name = "nand_clk_div", 670 + .ops = &clk_regmap_divider_ops, 671 + .parent_names = (const char *[]){ "nand_clk_sel" }, 672 + .num_parents = 1, 673 + .flags = CLK_SET_RATE_PARENT, 674 + }, 675 + }; 676 + 677 + static struct clk_regmap meson8b_nand_clk_gate = { 678 + .data = &(struct clk_regmap_gate_data){ 679 + .offset = HHI_NAND_CLK_CNTL, 680 + .bit_idx = 8, 681 + }, 682 + .hw.init = &(struct clk_init_data){ 683 + .name = "nand_clk_gate", 684 + .ops = &clk_regmap_gate_ops, 685 + .parent_names = (const char *[]){ "nand_clk_div" }, 686 + .num_parents = 1, 687 + .flags = CLK_SET_RATE_PARENT, 688 + }, 689 + }; 690 + 636 691 /* Everything Else (EE) domain gates */ 637 692 638 693 static MESON_GATE(meson8b_ddr, HHI_GCLK_MPEG0, 0); ··· 876 835 [CLKID_FCLK_DIV4_DIV] = &meson8b_fclk_div4_div.hw, 877 836 [CLKID_FCLK_DIV5_DIV] = &meson8b_fclk_div5_div.hw, 878 837 [CLKID_FCLK_DIV7_DIV] = &meson8b_fclk_div7_div.hw, 838 + [CLKID_NAND_SEL] = &meson8b_nand_clk_sel.hw, 839 + [CLKID_NAND_DIV] = &meson8b_nand_clk_div.hw, 840 + [CLKID_NAND_CLK] = &meson8b_nand_clk_gate.hw, 879 841 [CLK_NR_CLKS] = NULL, 880 842 }, 881 843 .num = CLK_NR_CLKS, ··· 984 940 &meson8b_fclk_div4, 985 941 &meson8b_fclk_div5, 986 942 &meson8b_fclk_div7, 943 + &meson8b_nand_clk_sel, 944 + &meson8b_nand_clk_div, 945 + &meson8b_nand_clk_gate, 987 946 }; 988 947 989 948 static const struct meson8b_clk_reset_line {
+5 -13
drivers/clk/meson/meson8b.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2015 Endless Mobile, Inc. 3 4 * Author: Carlo Caione <carlo@endlessm.com> 4 5 * 5 6 * Copyright (c) 2016 BayLibre, Inc. 6 7 * Michael Turquette <mturquette@baylibre.com> 7 - * 8 - * This program is free software; you can redistribute it and/or modify it 9 - * under the terms and conditions of the GNU General Public License, 10 - * version 2, as published by the Free Software Foundation. 11 - * 12 - * This program is distributed in the hope it will be useful, but WITHOUT 13 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 - * more details. 16 - * 17 - * You should have received a copy of the GNU General Public License along with 18 - * this program. If not, see <http://www.gnu.org/licenses/>. 19 8 */ 20 9 21 10 #ifndef __MESON8B_H ··· 29 40 #define HHI_VID_CLK_CNTL 0x17c /* 0x5f offset in data sheet */ 30 41 #define HHI_VID_DIVIDER_CNTL 0x198 /* 0x66 offset in data sheet */ 31 42 #define HHI_SYS_CPU_CLK_CNTL0 0x19c /* 0x67 offset in data sheet */ 43 + #define HHI_NAND_CLK_CNTL 0x25c /* 0x97 offset in data sheet */ 32 44 #define HHI_MPLL_CNTL 0x280 /* 0xa0 offset in data sheet */ 33 45 #define HHI_SYS_PLL_CNTL 0x300 /* 0xc0 offset in data sheet */ 34 46 #define HHI_VID_PLL_CNTL 0x320 /* 0xc8 offset in data sheet */ ··· 73 83 #define CLKID_FCLK_DIV4_DIV 107 74 84 #define CLKID_FCLK_DIV5_DIV 108 75 85 #define CLKID_FCLK_DIV7_DIV 109 86 + #define CLKID_NAND_SEL 110 87 + #define CLKID_NAND_DIV 111 76 88 77 - #define CLK_NR_CLKS 110 89 + #define CLK_NR_CLKS 113 78 90 79 91 /* 80 92 * include the CLKID and RESETID that have
+1 -1
drivers/clk/mvebu/clk-corediv.c
··· 72 72 }; 73 73 74 74 static const struct clk_corediv_desc mv98dx3236_corediv_desc[] = { 75 - { .mask = 0x0f, .offset = 6, .fieldbit = 26 }, /* NAND clock */ 75 + { .mask = 0x0f, .offset = 6, .fieldbit = 27 }, /* NAND clock */ 76 76 }; 77 77 78 78 #define to_corediv_clk(p) container_of(p, struct clk_corediv, hw)
+27
drivers/clk/qcom/Kconfig
··· 218 218 Say Y if you want to support multimedia devices such as display, 219 219 graphics, video encode/decode, camera, etc. 220 220 221 + config MSM_GCC_8998 222 + tristate "MSM8998 Global Clock Controller" 223 + depends on COMMON_CLK_QCOM 224 + help 225 + Support for the global clock controller on msm8998 devices. 226 + Say Y if you want to use peripheral devices such as UART, SPI, 227 + i2c, USB, UFS, SD/eMMC, PCIe, etc. 228 + 229 + config SDM_GCC_845 230 + tristate "SDM845 Global Clock Controller" 231 + select QCOM_GDSC 232 + depends on COMMON_CLK_QCOM 233 + help 234 + Support for the global clock controller on SDM845 devices. 235 + Say Y if you want to use peripheral devices such as UART, SPI, 236 + i2C, USB, UFS, SDDC, PCIe, etc. 237 + 238 + config SDM_VIDEOCC_845 239 + tristate "SDM845 Video Clock Controller" 240 + depends on COMMON_CLK_QCOM 241 + select SDM_GCC_845 242 + select QCOM_GDSC 243 + help 244 + Support for the video clock controller on SDM845 devices. 245 + Say Y if you want to support video devices and functionality such as 246 + video encode and decode. 247 + 221 248 config SPMI_PMIC_CLKDIV 222 249 tristate "SPMI PMIC clkdiv Support" 223 250 depends on (COMMON_CLK_QCOM && SPMI) || COMPILE_TEST
+3
drivers/clk/qcom/Makefile
··· 30 30 obj-$(CONFIG_MSM_GCC_8994) += gcc-msm8994.o 31 31 obj-$(CONFIG_MSM_GCC_8996) += gcc-msm8996.o 32 32 obj-$(CONFIG_MSM_LCC_8960) += lcc-msm8960.o 33 + obj-$(CONFIG_MSM_GCC_8998) += gcc-msm8998.o 33 34 obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o 34 35 obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o 35 36 obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o ··· 38 37 obj-$(CONFIG_QCOM_CLK_APCS_MSM8916) += apcs-msm8916.o 39 38 obj-$(CONFIG_QCOM_CLK_RPM) += clk-rpm.o 40 39 obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o 40 + obj-$(CONFIG_SDM_GCC_845) += gcc-sdm845.o 41 + obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o 41 42 obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o
+295 -7
drivers/clk/qcom/clk-alpha-pll.c
··· 1 1 /* 2 - * Copyright (c) 2015, The Linux Foundation. All rights reserved. 2 + * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. 3 3 * 4 4 * This software is licensed under the terms of the GNU General Public 5 5 * License version 2, as published by the Free Software Foundation, and ··· 58 58 #define PLL_TEST_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL]) 59 59 #define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U]) 60 60 #define PLL_STATUS(p) ((p)->offset + (p)->regs[PLL_OFF_STATUS]) 61 + #define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE]) 62 + #define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC]) 61 63 62 64 const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { 63 65 [CLK_ALPHA_PLL_TYPE_DEFAULT] = { ··· 92 90 [PLL_OFF_TEST_CTL] = 0x1c, 93 91 [PLL_OFF_STATUS] = 0x24, 94 92 }, 93 + [CLK_ALPHA_PLL_TYPE_FABIA] = { 94 + [PLL_OFF_L_VAL] = 0x04, 95 + [PLL_OFF_USER_CTL] = 0x0c, 96 + [PLL_OFF_USER_CTL_U] = 0x10, 97 + [PLL_OFF_CONFIG_CTL] = 0x14, 98 + [PLL_OFF_CONFIG_CTL_U] = 0x18, 99 + [PLL_OFF_TEST_CTL] = 0x1c, 100 + [PLL_OFF_TEST_CTL_U] = 0x20, 101 + [PLL_OFF_STATUS] = 0x24, 102 + [PLL_OFF_OPMODE] = 0x2c, 103 + [PLL_OFF_FRAC] = 0x38, 104 + }, 95 105 }; 96 106 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); 97 107 ··· 121 107 #define PLL_HUAYRA_N_SHIFT 0 122 108 #define PLL_HUAYRA_N_MASK 0xff 123 109 #define PLL_HUAYRA_ALPHA_WIDTH 16 110 + 111 + #define FABIA_OPMODE_STANDBY 0x0 112 + #define FABIA_OPMODE_RUN 0x1 113 + 114 + #define FABIA_PLL_OUT_MASK 0x7 115 + #define FABIA_PLL_RATE_MARGIN 500 124 116 125 117 #define pll_alpha_width(p) \ 126 118 ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ··· 461 441 return alpha_pll_calc_rate(prate, l, a, alpha_width); 462 442 } 463 443 464 - static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll, 465 - int (*is_enabled)(struct clk_hw *)) 444 + 445 + static int __clk_alpha_pll_update_latch(struct clk_alpha_pll *pll) 466 446 { 467 447 int ret; 468 448 u32 mode; 469 - 470 - if (!is_enabled(&pll->clkr.hw) || 471 - !(pll->flags & SUPPORTS_DYNAMIC_UPDATE)) 472 - return 0; 473 449 474 450 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &mode); 475 451 ··· 503 487 udelay(10); 504 488 505 489 return 0; 490 + } 491 + 492 + static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll, 493 + int (*is_enabled)(struct clk_hw *)) 494 + { 495 + if (!is_enabled(&pll->clkr.hw) || 496 + !(pll->flags & SUPPORTS_DYNAMIC_UPDATE)) 497 + return 0; 498 + 499 + return __clk_alpha_pll_update_latch(pll); 506 500 } 507 501 508 502 static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate, ··· 858 832 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate, 859 833 }; 860 834 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ro_ops); 835 + 836 + void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 837 + const struct alpha_pll_config *config) 838 + { 839 + u32 val, mask; 840 + 841 + if (config->l) 842 + regmap_write(regmap, PLL_L_VAL(pll), config->l); 843 + 844 + if (config->alpha) 845 + regmap_write(regmap, PLL_FRAC(pll), config->alpha); 846 + 847 + if (config->config_ctl_val) 848 + regmap_write(regmap, PLL_CONFIG_CTL(pll), 849 + config->config_ctl_val); 850 + 851 + if (config->post_div_mask) { 852 + mask = config->post_div_mask; 853 + val = config->post_div_val; 854 + regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val); 855 + } 856 + 857 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS, 858 + PLL_UPDATE_BYPASS); 859 + 860 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 861 + } 862 + EXPORT_SYMBOL_GPL(clk_fabia_pll_configure); 863 + 864 + static int alpha_pll_fabia_enable(struct clk_hw *hw) 865 + { 866 + int ret; 867 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 868 + u32 val, opmode_val; 869 + struct regmap *regmap = pll->clkr.regmap; 870 + 871 + ret = regmap_read(regmap, PLL_MODE(pll), &val); 872 + if (ret) 873 + return ret; 874 + 875 + /* If in FSM mode, just vote for it */ 876 + if (val & PLL_VOTE_FSM_ENA) { 877 + ret = clk_enable_regmap(hw); 878 + if (ret) 879 + return ret; 880 + return wait_for_pll_enable_active(pll); 881 + } 882 + 883 + ret = regmap_read(regmap, PLL_OPMODE(pll), &opmode_val); 884 + if (ret) 885 + return ret; 886 + 887 + /* Skip If PLL is already running */ 888 + if ((opmode_val & FABIA_OPMODE_RUN) && (val & PLL_OUTCTRL)) 889 + return 0; 890 + 891 + ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 892 + if (ret) 893 + return ret; 894 + 895 + ret = regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_STANDBY); 896 + if (ret) 897 + return ret; 898 + 899 + ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, 900 + PLL_RESET_N); 901 + if (ret) 902 + return ret; 903 + 904 + ret = regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_RUN); 905 + if (ret) 906 + return ret; 907 + 908 + ret = wait_for_pll_enable_lock(pll); 909 + if (ret) 910 + return ret; 911 + 912 + ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 913 + FABIA_PLL_OUT_MASK, FABIA_PLL_OUT_MASK); 914 + if (ret) 915 + return ret; 916 + 917 + return regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 918 + PLL_OUTCTRL); 919 + } 920 + 921 + static void alpha_pll_fabia_disable(struct clk_hw *hw) 922 + { 923 + int ret; 924 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 925 + u32 val; 926 + struct regmap *regmap = pll->clkr.regmap; 927 + 928 + ret = regmap_read(regmap, PLL_MODE(pll), &val); 929 + if (ret) 930 + return; 931 + 932 + /* If in FSM mode, just unvote it */ 933 + if (val & PLL_FSM_ENA) { 934 + clk_disable_regmap(hw); 935 + return; 936 + } 937 + 938 + ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 939 + if (ret) 940 + return; 941 + 942 + /* Disable main outputs */ 943 + ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), FABIA_PLL_OUT_MASK, 944 + 0); 945 + if (ret) 946 + return; 947 + 948 + /* Place the PLL in STANDBY */ 949 + regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_STANDBY); 950 + } 951 + 952 + static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw, 953 + unsigned long parent_rate) 954 + { 955 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 956 + u32 l, frac, alpha_width = pll_alpha_width(pll); 957 + 958 + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 959 + regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac); 960 + 961 + return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); 962 + } 963 + 964 + static int alpha_pll_fabia_set_rate(struct clk_hw *hw, unsigned long rate, 965 + unsigned long prate) 966 + { 967 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 968 + u32 val, l, alpha_width = pll_alpha_width(pll); 969 + u64 a; 970 + unsigned long rrate; 971 + int ret = 0; 972 + 973 + ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 974 + if (ret) 975 + return ret; 976 + 977 + rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 978 + 979 + /* 980 + * Due to limited number of bits for fractional rate programming, the 981 + * rounded up rate could be marginally higher than the requested rate. 982 + */ 983 + if (rrate > (rate + FABIA_PLL_RATE_MARGIN) || rrate < rate) { 984 + pr_err("Call set rate on the PLL with rounded rates!\n"); 985 + return -EINVAL; 986 + } 987 + 988 + regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 989 + regmap_write(pll->clkr.regmap, PLL_FRAC(pll), a); 990 + 991 + return __clk_alpha_pll_update_latch(pll); 992 + } 993 + 994 + const struct clk_ops clk_alpha_pll_fabia_ops = { 995 + .enable = alpha_pll_fabia_enable, 996 + .disable = alpha_pll_fabia_disable, 997 + .is_enabled = clk_alpha_pll_is_enabled, 998 + .set_rate = alpha_pll_fabia_set_rate, 999 + .recalc_rate = alpha_pll_fabia_recalc_rate, 1000 + .round_rate = clk_alpha_pll_round_rate, 1001 + }; 1002 + EXPORT_SYMBOL_GPL(clk_alpha_pll_fabia_ops); 1003 + 1004 + const struct clk_ops clk_alpha_pll_fixed_fabia_ops = { 1005 + .enable = alpha_pll_fabia_enable, 1006 + .disable = alpha_pll_fabia_disable, 1007 + .is_enabled = clk_alpha_pll_is_enabled, 1008 + .recalc_rate = alpha_pll_fabia_recalc_rate, 1009 + .round_rate = clk_alpha_pll_round_rate, 1010 + }; 1011 + EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_fabia_ops); 1012 + 1013 + static unsigned long clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw *hw, 1014 + unsigned long parent_rate) 1015 + { 1016 + struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1017 + u32 i, div = 1, val; 1018 + int ret; 1019 + 1020 + if (!pll->post_div_table) { 1021 + pr_err("Missing the post_div_table for the PLL\n"); 1022 + return -EINVAL; 1023 + } 1024 + 1025 + ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val); 1026 + if (ret) 1027 + return ret; 1028 + 1029 + val >>= pll->post_div_shift; 1030 + val &= BIT(pll->width) - 1; 1031 + 1032 + for (i = 0; i < pll->num_post_div; i++) { 1033 + if (pll->post_div_table[i].val == val) { 1034 + div = pll->post_div_table[i].div; 1035 + break; 1036 + } 1037 + } 1038 + 1039 + return (parent_rate / div); 1040 + } 1041 + 1042 + static long clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw *hw, 1043 + unsigned long rate, unsigned long *prate) 1044 + { 1045 + struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1046 + 1047 + if (!pll->post_div_table) { 1048 + pr_err("Missing the post_div_table for the PLL\n"); 1049 + return -EINVAL; 1050 + } 1051 + 1052 + return divider_round_rate(hw, rate, prate, pll->post_div_table, 1053 + pll->width, CLK_DIVIDER_ROUND_CLOSEST); 1054 + } 1055 + 1056 + static int clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw *hw, 1057 + unsigned long rate, unsigned long parent_rate) 1058 + { 1059 + struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1060 + int i, val = 0, div, ret; 1061 + 1062 + /* 1063 + * If the PLL is in FSM mode, then treat set_rate callback as a 1064 + * no-operation. 1065 + */ 1066 + ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 1067 + if (ret) 1068 + return ret; 1069 + 1070 + if (val & PLL_VOTE_FSM_ENA) 1071 + return 0; 1072 + 1073 + if (!pll->post_div_table) { 1074 + pr_err("Missing the post_div_table for the PLL\n"); 1075 + return -EINVAL; 1076 + } 1077 + 1078 + div = DIV_ROUND_UP_ULL((u64)parent_rate, rate); 1079 + for (i = 0; i < pll->num_post_div; i++) { 1080 + if (pll->post_div_table[i].div == div) { 1081 + val = pll->post_div_table[i].val; 1082 + break; 1083 + } 1084 + } 1085 + 1086 + return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 1087 + (BIT(pll->width) - 1) << pll->post_div_shift, 1088 + val << pll->post_div_shift); 1089 + } 1090 + 1091 + const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { 1092 + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, 1093 + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, 1094 + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, 1095 + }; 1096 + EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops);
+17 -1
drivers/clk/qcom/clk-alpha-pll.h
··· 1 1 /* 2 - * Copyright (c) 2015, The Linux Foundation. All rights reserved. 2 + * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. 3 3 * 4 4 * This software is licensed under the terms of the GNU General Public 5 5 * License version 2, as published by the Free Software Foundation, and ··· 22 22 CLK_ALPHA_PLL_TYPE_DEFAULT, 23 23 CLK_ALPHA_PLL_TYPE_HUAYRA, 24 24 CLK_ALPHA_PLL_TYPE_BRAMMO, 25 + CLK_ALPHA_PLL_TYPE_FABIA, 25 26 CLK_ALPHA_PLL_TYPE_MAX, 26 27 }; 27 28 ··· 37 36 PLL_OFF_TEST_CTL, 38 37 PLL_OFF_TEST_CTL_U, 39 38 PLL_OFF_STATUS, 39 + PLL_OFF_OPMODE, 40 + PLL_OFF_FRAC, 40 41 PLL_OFF_MAX_REGS 41 42 }; 42 43 ··· 76 73 * @offset: base address of registers 77 74 * @regs: alpha pll register map (see @clk_alpha_pll_regs) 78 75 * @width: width of post-divider 76 + * @post_div_shift: shift to differentiate between odd & even post-divider 77 + * @post_div_table: table with PLL odd and even post-divider settings 78 + * @num_post_div: Number of PLL post-divider settings 79 + * 79 80 * @clkr: regmap clock handle 80 81 */ 81 82 struct clk_alpha_pll_postdiv { ··· 88 81 const u8 *regs; 89 82 90 83 struct clk_regmap clkr; 84 + int post_div_shift; 85 + const struct clk_div_table *post_div_table; 86 + size_t num_post_div; 91 87 }; 92 88 93 89 struct alpha_pll_config { ··· 119 109 extern const struct clk_ops clk_alpha_pll_huayra_ops; 120 110 extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; 121 111 112 + extern const struct clk_ops clk_alpha_pll_fabia_ops; 113 + extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; 114 + extern const struct clk_ops clk_alpha_pll_postdiv_fabia_ops; 115 + 122 116 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 123 117 const struct alpha_pll_config *config); 118 + void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 119 + const struct alpha_pll_config *config); 124 120 125 121 #endif
+5 -2
drivers/clk/qcom/clk-branch.c
··· 77 77 bool voted = br->halt_check & BRANCH_VOTED; 78 78 const char *name = clk_hw_get_name(&br->clkr.hw); 79 79 80 - /* Skip checking halt bit if the clock is in hardware gated mode */ 81 - if (clk_branch_in_hwcg_mode(br)) 80 + /* 81 + * Skip checking halt bit if we're explicitly ignoring the bit or the 82 + * clock is in hardware gated mode 83 + */ 84 + if (br->halt_check == BRANCH_HALT_SKIP || clk_branch_in_hwcg_mode(br)) 82 85 return 0; 83 86 84 87 if (br->halt_check == BRANCH_HALT_DELAY || (!enabling && voted)) {
+1
drivers/clk/qcom/clk-branch.h
··· 42 42 #define BRANCH_HALT_ENABLE 1 /* pol: 0 = halt */ 43 43 #define BRANCH_HALT_ENABLE_VOTED (BRANCH_HALT_ENABLE | BRANCH_VOTED) 44 44 #define BRANCH_HALT_DELAY 2 /* No bit to check; just delay */ 45 + #define BRANCH_HALT_SKIP 3 /* Don't check halt bit */ 45 46 46 47 struct clk_regmap clkr; 47 48 };
+5 -12
drivers/clk/qcom/clk-rcg.h
··· 1 - /* 2 - * Copyright (c) 2013, The Linux Foundation. All rights reserved. 3 - * 4 - * This software is licensed under the terms of the GNU General Public 5 - * License version 2, as published by the Free Software Foundation, and 6 - * may be copied, distributed, and modified under those terms. 7 - * 8 - * This program is distributed in the hope that it will be useful, 9 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 - * GNU General Public License for more details. 12 - */ 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* Copyright (c) 2013, 2018, The Linux Foundation. All rights reserved. */ 13 3 14 4 #ifndef __QCOM_CLK_RCG_H__ 15 5 #define __QCOM_CLK_RCG_H__ ··· 134 144 * @cmd_rcgr: corresponds to *_CMD_RCGR 135 145 * @mnd_width: number of bits in m/n/d values 136 146 * @hid_width: number of bits in half integer divider 147 + * @safe_src_index: safe src index value 137 148 * @parent_map: map from software's parent index to hardware's src_sel field 138 149 * @freq_tbl: frequency table 139 150 * @clkr: regmap clock handle ··· 144 153 u32 cmd_rcgr; 145 154 u8 mnd_width; 146 155 u8 hid_width; 156 + u8 safe_src_index; 147 157 const struct parent_map *parent_map; 148 158 const struct freq_tbl *freq_tbl; 149 159 struct clk_regmap clkr; ··· 159 167 extern const struct clk_ops clk_byte2_ops; 160 168 extern const struct clk_ops clk_pixel_ops; 161 169 extern const struct clk_ops clk_gfx3d_ops; 170 + extern const struct clk_ops clk_rcg2_shared_ops; 162 171 163 172 #endif
+154 -14
drivers/clk/qcom/clk-rcg2.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 - * Copyright (c) 2013, The Linux Foundation. All rights reserved. 3 - * 4 - * This software is licensed under the terms of the GNU General Public 5 - * License version 2, as published by the Free Software Foundation, and 6 - * may be copied, distributed, and modified under those terms. 7 - * 8 - * This program is distributed in the hope that it will be useful, 9 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 - * GNU General Public License for more details. 3 + * Copyright (c) 2013, 2018, The Linux Foundation. All rights reserved. 12 4 */ 13 5 14 6 #include <linux/kernel.h> ··· 34 42 #define CFG_MODE_SHIFT 12 35 43 #define CFG_MODE_MASK (0x3 << CFG_MODE_SHIFT) 36 44 #define CFG_MODE_DUAL_EDGE (0x2 << CFG_MODE_SHIFT) 45 + #define CFG_HW_CLK_CTRL_MASK BIT(20) 37 46 38 47 #define M_REG 0x8 39 48 #define N_REG 0xc ··· 204 211 clk_flags = clk_hw_get_flags(hw); 205 212 p = clk_hw_get_parent_by_index(hw, index); 206 213 if (clk_flags & CLK_SET_RATE_PARENT) { 214 + rate = f->freq; 207 215 if (f->pre_div) { 208 216 rate /= 2; 209 217 rate *= f->pre_div + 1; ··· 242 248 return _freq_tbl_determine_rate(hw, rcg->freq_tbl, req, FLOOR); 243 249 } 244 250 245 - static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) 251 + static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) 246 252 { 247 253 u32 cfg, mask; 248 254 struct clk_hw *hw = &rcg->clkr.hw; ··· 270 276 } 271 277 272 278 mask = BIT(rcg->hid_width) - 1; 273 - mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK; 279 + mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK | CFG_HW_CLK_CTRL_MASK; 274 280 cfg = f->pre_div << CFG_SRC_DIV_SHIFT; 275 281 cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; 276 282 if (rcg->mnd_width && f->n && (f->m != f->n)) 277 283 cfg |= CFG_MODE_DUAL_EDGE; 278 - ret = regmap_update_bits(rcg->clkr.regmap, 279 - rcg->cmd_rcgr + CFG_REG, mask, cfg); 284 + 285 + return regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, 286 + mask, cfg); 287 + } 288 + 289 + static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) 290 + { 291 + int ret; 292 + 293 + ret = __clk_rcg2_configure(rcg, f); 280 294 if (ret) 281 295 return ret; 282 296 ··· 791 789 .determine_rate = clk_gfx3d_determine_rate, 792 790 }; 793 791 EXPORT_SYMBOL_GPL(clk_gfx3d_ops); 792 + 793 + static int clk_rcg2_set_force_enable(struct clk_hw *hw) 794 + { 795 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 796 + const char *name = clk_hw_get_name(hw); 797 + int ret, count; 798 + 799 + ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, 800 + CMD_ROOT_EN, CMD_ROOT_EN); 801 + if (ret) 802 + return ret; 803 + 804 + /* wait for RCG to turn ON */ 805 + for (count = 500; count > 0; count--) { 806 + if (clk_rcg2_is_enabled(hw)) 807 + return 0; 808 + 809 + udelay(1); 810 + } 811 + 812 + pr_err("%s: RCG did not turn on\n", name); 813 + return -ETIMEDOUT; 814 + } 815 + 816 + static int clk_rcg2_clear_force_enable(struct clk_hw *hw) 817 + { 818 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 819 + 820 + return regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, 821 + CMD_ROOT_EN, 0); 822 + } 823 + 824 + static int 825 + clk_rcg2_shared_force_enable_clear(struct clk_hw *hw, const struct freq_tbl *f) 826 + { 827 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 828 + int ret; 829 + 830 + ret = clk_rcg2_set_force_enable(hw); 831 + if (ret) 832 + return ret; 833 + 834 + ret = clk_rcg2_configure(rcg, f); 835 + if (ret) 836 + return ret; 837 + 838 + return clk_rcg2_clear_force_enable(hw); 839 + } 840 + 841 + static int clk_rcg2_shared_set_rate(struct clk_hw *hw, unsigned long rate, 842 + unsigned long parent_rate) 843 + { 844 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 845 + const struct freq_tbl *f; 846 + 847 + f = qcom_find_freq(rcg->freq_tbl, rate); 848 + if (!f) 849 + return -EINVAL; 850 + 851 + /* 852 + * In case clock is disabled, update the CFG, M, N and D registers 853 + * and don't hit the update bit of CMD register. 854 + */ 855 + if (!__clk_is_enabled(hw->clk)) 856 + return __clk_rcg2_configure(rcg, f); 857 + 858 + return clk_rcg2_shared_force_enable_clear(hw, f); 859 + } 860 + 861 + static int clk_rcg2_shared_set_rate_and_parent(struct clk_hw *hw, 862 + unsigned long rate, unsigned long parent_rate, u8 index) 863 + { 864 + return clk_rcg2_shared_set_rate(hw, rate, parent_rate); 865 + } 866 + 867 + static int clk_rcg2_shared_enable(struct clk_hw *hw) 868 + { 869 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 870 + int ret; 871 + 872 + /* 873 + * Set the update bit because required configuration has already 874 + * been written in clk_rcg2_shared_set_rate() 875 + */ 876 + ret = clk_rcg2_set_force_enable(hw); 877 + if (ret) 878 + return ret; 879 + 880 + ret = update_config(rcg); 881 + if (ret) 882 + return ret; 883 + 884 + return clk_rcg2_clear_force_enable(hw); 885 + } 886 + 887 + static void clk_rcg2_shared_disable(struct clk_hw *hw) 888 + { 889 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 890 + u32 cfg; 891 + 892 + /* 893 + * Store current configuration as switching to safe source would clear 894 + * the SRC and DIV of CFG register 895 + */ 896 + regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg); 897 + 898 + /* 899 + * Park the RCG at a safe configuration - sourced off of safe source. 900 + * Force enable and disable the RCG while configuring it to safeguard 901 + * against any update signal coming from the downstream clock. 902 + * The current parent is still prepared and enabled at this point, and 903 + * the safe source is always on while application processor subsystem 904 + * is online. Therefore, the RCG can safely switch its parent. 905 + */ 906 + clk_rcg2_set_force_enable(hw); 907 + 908 + regmap_write(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, 909 + rcg->safe_src_index << CFG_SRC_SEL_SHIFT); 910 + 911 + update_config(rcg); 912 + 913 + clk_rcg2_clear_force_enable(hw); 914 + 915 + /* Write back the stored configuration corresponding to current rate */ 916 + regmap_write(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, cfg); 917 + } 918 + 919 + const struct clk_ops clk_rcg2_shared_ops = { 920 + .enable = clk_rcg2_shared_enable, 921 + .disable = clk_rcg2_shared_disable, 922 + .get_parent = clk_rcg2_get_parent, 923 + .set_parent = clk_rcg2_set_parent, 924 + .recalc_rate = clk_rcg2_recalc_rate, 925 + .determine_rate = clk_rcg2_determine_rate, 926 + .set_rate = clk_rcg2_shared_set_rate, 927 + .set_rate_and_parent = clk_rcg2_shared_set_rate_and_parent, 928 + }; 929 + EXPORT_SYMBOL_GPL(clk_rcg2_shared_ops);
+16 -16
drivers/clk/qcom/common.c
··· 228 228 if (!cc) 229 229 return -ENOMEM; 230 230 231 - cc->rclks = rclks; 232 - cc->num_rclks = num_clks; 233 - 234 - for (i = 0; i < num_clks; i++) { 235 - if (!rclks[i]) 236 - continue; 237 - 238 - ret = devm_clk_register_regmap(dev, rclks[i]); 239 - if (ret) 240 - return ret; 241 - } 242 - 243 - ret = devm_of_clk_add_hw_provider(dev, qcom_cc_clk_hw_get, cc); 244 - if (ret) 245 - return ret; 246 - 247 231 reset = &cc->reset; 248 232 reset->rcdev.of_node = dev->of_node; 249 233 reset->rcdev.ops = &qcom_reset_ops; ··· 255 271 if (ret) 256 272 return ret; 257 273 } 274 + 275 + cc->rclks = rclks; 276 + cc->num_rclks = num_clks; 277 + 278 + for (i = 0; i < num_clks; i++) { 279 + if (!rclks[i]) 280 + continue; 281 + 282 + ret = devm_clk_register_regmap(dev, rclks[i]); 283 + if (ret) 284 + return ret; 285 + } 286 + 287 + ret = devm_of_clk_add_hw_provider(dev, qcom_cc_clk_hw_get, cc); 288 + if (ret) 289 + return ret; 258 290 259 291 return 0; 260 292 }
+7 -1
drivers/clk/qcom/gcc-msm8996.c
··· 1418 1418 1419 1419 static struct clk_branch gcc_usb3_phy_pipe_clk = { 1420 1420 .halt_reg = 0x50004, 1421 + .halt_check = BRANCH_HALT_SKIP, 1421 1422 .clkr = { 1422 1423 .enable_reg = 0x50004, 1423 1424 .enable_mask = BIT(0), ··· 2473 2472 2474 2473 static struct clk_branch gcc_pcie_0_pipe_clk = { 2475 2474 .halt_reg = 0x6b018, 2475 + .halt_check = BRANCH_HALT_SKIP, 2476 2476 .clkr = { 2477 2477 .enable_reg = 0x6b018, 2478 2478 .enable_mask = BIT(0), ··· 2549 2547 2550 2548 static struct clk_branch gcc_pcie_1_pipe_clk = { 2551 2549 .halt_reg = 0x6d018, 2550 + .halt_check = BRANCH_HALT_SKIP, 2552 2551 .clkr = { 2553 2552 .enable_reg = 0x6d018, 2554 2553 .enable_mask = BIT(0), ··· 2625 2622 2626 2623 static struct clk_branch gcc_pcie_2_pipe_clk = { 2627 2624 .halt_reg = 0x6e018, 2625 + .halt_check = BRANCH_HALT_SKIP, 2628 2626 .clkr = { 2629 2627 .enable_reg = 0x6e018, 2630 2628 .enable_mask = BIT(0), ··· 2796 2792 2797 2793 static struct clk_branch gcc_ufs_rx_symbol_0_clk = { 2798 2794 .halt_reg = 0x7501c, 2795 + .halt_check = BRANCH_HALT_SKIP, 2799 2796 .clkr = { 2800 2797 .enable_reg = 0x7501c, 2801 2798 .enable_mask = BIT(0), ··· 2812 2807 2813 2808 static struct clk_branch gcc_ufs_rx_symbol_1_clk = { 2814 2809 .halt_reg = 0x75020, 2810 + .halt_check = BRANCH_HALT_SKIP, 2815 2811 .clkr = { 2816 2812 .enable_reg = 0x75020, 2817 2813 .enable_mask = BIT(0), ··· 3111 3105 .name = "aggre0_noc", 3112 3106 }, 3113 3107 .pwrsts = PWRSTS_OFF_ON, 3114 - .flags = VOTABLE, 3108 + .flags = VOTABLE | ALWAYS_ON, 3115 3109 }; 3116 3110 3117 3111 static struct gdsc hlos1_vote_aggre0_noc_gdsc = {
+2834
drivers/clk/qcom/gcc-msm8998.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2016, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/kernel.h> 7 + #include <linux/bitops.h> 8 + #include <linux/err.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/module.h> 11 + #include <linux/of.h> 12 + #include <linux/of_device.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/regmap.h> 15 + #include <linux/reset-controller.h> 16 + 17 + #include <dt-bindings/clock/qcom,gcc-msm8998.h> 18 + 19 + #include "common.h" 20 + #include "clk-regmap.h" 21 + #include "clk-alpha-pll.h" 22 + #include "clk-pll.h" 23 + #include "clk-rcg.h" 24 + #include "clk-branch.h" 25 + #include "reset.h" 26 + #include "gdsc.h" 27 + 28 + #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) } 29 + 30 + enum { 31 + P_AUD_REF_CLK, 32 + P_CORE_BI_PLL_TEST_SE, 33 + P_GPLL0_OUT_MAIN, 34 + P_GPLL4_OUT_MAIN, 35 + P_PLL0_EARLY_DIV_CLK_SRC, 36 + P_SLEEP_CLK, 37 + P_XO, 38 + }; 39 + 40 + static const struct parent_map gcc_parent_map_0[] = { 41 + { P_XO, 0 }, 42 + { P_GPLL0_OUT_MAIN, 1 }, 43 + { P_PLL0_EARLY_DIV_CLK_SRC, 6 }, 44 + { P_CORE_BI_PLL_TEST_SE, 7 }, 45 + }; 46 + 47 + static const char * const gcc_parent_names_0[] = { 48 + "xo", 49 + "gpll0_out_main", 50 + "gpll0_out_main", 51 + "core_bi_pll_test_se", 52 + }; 53 + 54 + static const struct parent_map gcc_parent_map_1[] = { 55 + { P_XO, 0 }, 56 + { P_GPLL0_OUT_MAIN, 1 }, 57 + { P_CORE_BI_PLL_TEST_SE, 7 }, 58 + }; 59 + 60 + static const char * const gcc_parent_names_1[] = { 61 + "xo", 62 + "gpll0_out_main", 63 + "core_bi_pll_test_se", 64 + }; 65 + 66 + static const struct parent_map gcc_parent_map_2[] = { 67 + { P_XO, 0 }, 68 + { P_GPLL0_OUT_MAIN, 1 }, 69 + { P_SLEEP_CLK, 5 }, 70 + { P_PLL0_EARLY_DIV_CLK_SRC, 6 }, 71 + { P_CORE_BI_PLL_TEST_SE, 7 }, 72 + }; 73 + 74 + static const char * const gcc_parent_names_2[] = { 75 + "xo", 76 + "gpll0_out_main", 77 + "core_pi_sleep_clk", 78 + "gpll0_out_main", 79 + "core_bi_pll_test_se", 80 + }; 81 + 82 + static const struct parent_map gcc_parent_map_3[] = { 83 + { P_XO, 0 }, 84 + { P_SLEEP_CLK, 5 }, 85 + { P_CORE_BI_PLL_TEST_SE, 7 }, 86 + }; 87 + 88 + static const char * const gcc_parent_names_3[] = { 89 + "xo", 90 + "core_pi_sleep_clk", 91 + "core_bi_pll_test_se", 92 + }; 93 + 94 + static const struct parent_map gcc_parent_map_4[] = { 95 + { P_XO, 0 }, 96 + { P_GPLL0_OUT_MAIN, 1 }, 97 + { P_GPLL4_OUT_MAIN, 5 }, 98 + { P_CORE_BI_PLL_TEST_SE, 7 }, 99 + }; 100 + 101 + static const char * const gcc_parent_names_4[] = { 102 + "xo", 103 + "gpll0_out_main", 104 + "gpll4_out_main", 105 + "core_bi_pll_test_se", 106 + }; 107 + 108 + static const struct parent_map gcc_parent_map_5[] = { 109 + { P_XO, 0 }, 110 + { P_GPLL0_OUT_MAIN, 1 }, 111 + { P_AUD_REF_CLK, 2 }, 112 + { P_CORE_BI_PLL_TEST_SE, 7 }, 113 + }; 114 + 115 + static const char * const gcc_parent_names_5[] = { 116 + "xo", 117 + "gpll0_out_main", 118 + "aud_ref_clk", 119 + "core_bi_pll_test_se", 120 + }; 121 + 122 + static struct pll_vco fabia_vco[] = { 123 + { 250000000, 2000000000, 0 }, 124 + { 125000000, 1000000000, 1 }, 125 + }; 126 + 127 + static struct clk_alpha_pll gpll0 = { 128 + .offset = 0x0, 129 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 130 + .vco_table = fabia_vco, 131 + .num_vco = ARRAY_SIZE(fabia_vco), 132 + .clkr = { 133 + .enable_reg = 0x52000, 134 + .enable_mask = BIT(0), 135 + .hw.init = &(struct clk_init_data){ 136 + .name = "gpll0", 137 + .parent_names = (const char *[]){ "xo" }, 138 + .num_parents = 1, 139 + .ops = &clk_alpha_pll_ops, 140 + } 141 + }, 142 + }; 143 + 144 + static struct clk_alpha_pll_postdiv gpll0_out_even = { 145 + .offset = 0x0, 146 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 147 + .clkr.hw.init = &(struct clk_init_data){ 148 + .name = "gpll0_out_even", 149 + .parent_names = (const char *[]){ "gpll0" }, 150 + .num_parents = 1, 151 + .ops = &clk_alpha_pll_postdiv_ops, 152 + }, 153 + }; 154 + 155 + static struct clk_alpha_pll_postdiv gpll0_out_main = { 156 + .offset = 0x0, 157 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 158 + .clkr.hw.init = &(struct clk_init_data){ 159 + .name = "gpll0_out_main", 160 + .parent_names = (const char *[]){ "gpll0" }, 161 + .num_parents = 1, 162 + .ops = &clk_alpha_pll_postdiv_ops, 163 + }, 164 + }; 165 + 166 + static struct clk_alpha_pll_postdiv gpll0_out_odd = { 167 + .offset = 0x0, 168 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 169 + .clkr.hw.init = &(struct clk_init_data){ 170 + .name = "gpll0_out_odd", 171 + .parent_names = (const char *[]){ "gpll0" }, 172 + .num_parents = 1, 173 + .ops = &clk_alpha_pll_postdiv_ops, 174 + }, 175 + }; 176 + 177 + static struct clk_alpha_pll_postdiv gpll0_out_test = { 178 + .offset = 0x0, 179 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 180 + .clkr.hw.init = &(struct clk_init_data){ 181 + .name = "gpll0_out_test", 182 + .parent_names = (const char *[]){ "gpll0" }, 183 + .num_parents = 1, 184 + .ops = &clk_alpha_pll_postdiv_ops, 185 + }, 186 + }; 187 + 188 + static struct clk_alpha_pll gpll1 = { 189 + .offset = 0x1000, 190 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 191 + .vco_table = fabia_vco, 192 + .num_vco = ARRAY_SIZE(fabia_vco), 193 + .clkr = { 194 + .enable_reg = 0x52000, 195 + .enable_mask = BIT(1), 196 + .hw.init = &(struct clk_init_data){ 197 + .name = "gpll1", 198 + .parent_names = (const char *[]){ "xo" }, 199 + .num_parents = 1, 200 + .ops = &clk_alpha_pll_ops, 201 + } 202 + }, 203 + }; 204 + 205 + static struct clk_alpha_pll_postdiv gpll1_out_even = { 206 + .offset = 0x1000, 207 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 208 + .clkr.hw.init = &(struct clk_init_data){ 209 + .name = "gpll1_out_even", 210 + .parent_names = (const char *[]){ "gpll1" }, 211 + .num_parents = 1, 212 + .ops = &clk_alpha_pll_postdiv_ops, 213 + }, 214 + }; 215 + 216 + static struct clk_alpha_pll_postdiv gpll1_out_main = { 217 + .offset = 0x1000, 218 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 219 + .clkr.hw.init = &(struct clk_init_data){ 220 + .name = "gpll1_out_main", 221 + .parent_names = (const char *[]){ "gpll1" }, 222 + .num_parents = 1, 223 + .ops = &clk_alpha_pll_postdiv_ops, 224 + }, 225 + }; 226 + 227 + static struct clk_alpha_pll_postdiv gpll1_out_odd = { 228 + .offset = 0x1000, 229 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 230 + .clkr.hw.init = &(struct clk_init_data){ 231 + .name = "gpll1_out_odd", 232 + .parent_names = (const char *[]){ "gpll1" }, 233 + .num_parents = 1, 234 + .ops = &clk_alpha_pll_postdiv_ops, 235 + }, 236 + }; 237 + 238 + static struct clk_alpha_pll_postdiv gpll1_out_test = { 239 + .offset = 0x1000, 240 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 241 + .clkr.hw.init = &(struct clk_init_data){ 242 + .name = "gpll1_out_test", 243 + .parent_names = (const char *[]){ "gpll1" }, 244 + .num_parents = 1, 245 + .ops = &clk_alpha_pll_postdiv_ops, 246 + }, 247 + }; 248 + 249 + static struct clk_alpha_pll gpll2 = { 250 + .offset = 0x2000, 251 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 252 + .vco_table = fabia_vco, 253 + .num_vco = ARRAY_SIZE(fabia_vco), 254 + .clkr = { 255 + .enable_reg = 0x52000, 256 + .enable_mask = BIT(2), 257 + .hw.init = &(struct clk_init_data){ 258 + .name = "gpll2", 259 + .parent_names = (const char *[]){ "xo" }, 260 + .num_parents = 1, 261 + .ops = &clk_alpha_pll_ops, 262 + } 263 + }, 264 + }; 265 + 266 + static struct clk_alpha_pll_postdiv gpll2_out_even = { 267 + .offset = 0x2000, 268 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 269 + .clkr.hw.init = &(struct clk_init_data){ 270 + .name = "gpll2_out_even", 271 + .parent_names = (const char *[]){ "gpll2" }, 272 + .num_parents = 1, 273 + .ops = &clk_alpha_pll_postdiv_ops, 274 + }, 275 + }; 276 + 277 + static struct clk_alpha_pll_postdiv gpll2_out_main = { 278 + .offset = 0x2000, 279 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 280 + .clkr.hw.init = &(struct clk_init_data){ 281 + .name = "gpll2_out_main", 282 + .parent_names = (const char *[]){ "gpll2" }, 283 + .num_parents = 1, 284 + .ops = &clk_alpha_pll_postdiv_ops, 285 + }, 286 + }; 287 + 288 + static struct clk_alpha_pll_postdiv gpll2_out_odd = { 289 + .offset = 0x2000, 290 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 291 + .clkr.hw.init = &(struct clk_init_data){ 292 + .name = "gpll2_out_odd", 293 + .parent_names = (const char *[]){ "gpll2" }, 294 + .num_parents = 1, 295 + .ops = &clk_alpha_pll_postdiv_ops, 296 + }, 297 + }; 298 + 299 + static struct clk_alpha_pll_postdiv gpll2_out_test = { 300 + .offset = 0x2000, 301 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 302 + .clkr.hw.init = &(struct clk_init_data){ 303 + .name = "gpll2_out_test", 304 + .parent_names = (const char *[]){ "gpll2" }, 305 + .num_parents = 1, 306 + .ops = &clk_alpha_pll_postdiv_ops, 307 + }, 308 + }; 309 + 310 + static struct clk_alpha_pll gpll3 = { 311 + .offset = 0x3000, 312 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 313 + .vco_table = fabia_vco, 314 + .num_vco = ARRAY_SIZE(fabia_vco), 315 + .clkr = { 316 + .enable_reg = 0x52000, 317 + .enable_mask = BIT(3), 318 + .hw.init = &(struct clk_init_data){ 319 + .name = "gpll3", 320 + .parent_names = (const char *[]){ "xo" }, 321 + .num_parents = 1, 322 + .ops = &clk_alpha_pll_ops, 323 + } 324 + }, 325 + }; 326 + 327 + static struct clk_alpha_pll_postdiv gpll3_out_even = { 328 + .offset = 0x3000, 329 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 330 + .clkr.hw.init = &(struct clk_init_data){ 331 + .name = "gpll3_out_even", 332 + .parent_names = (const char *[]){ "gpll3" }, 333 + .num_parents = 1, 334 + .ops = &clk_alpha_pll_postdiv_ops, 335 + }, 336 + }; 337 + 338 + static struct clk_alpha_pll_postdiv gpll3_out_main = { 339 + .offset = 0x3000, 340 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 341 + .clkr.hw.init = &(struct clk_init_data){ 342 + .name = "gpll3_out_main", 343 + .parent_names = (const char *[]){ "gpll3" }, 344 + .num_parents = 1, 345 + .ops = &clk_alpha_pll_postdiv_ops, 346 + }, 347 + }; 348 + 349 + static struct clk_alpha_pll_postdiv gpll3_out_odd = { 350 + .offset = 0x3000, 351 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 352 + .clkr.hw.init = &(struct clk_init_data){ 353 + .name = "gpll3_out_odd", 354 + .parent_names = (const char *[]){ "gpll3" }, 355 + .num_parents = 1, 356 + .ops = &clk_alpha_pll_postdiv_ops, 357 + }, 358 + }; 359 + 360 + static struct clk_alpha_pll_postdiv gpll3_out_test = { 361 + .offset = 0x3000, 362 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 363 + .clkr.hw.init = &(struct clk_init_data){ 364 + .name = "gpll3_out_test", 365 + .parent_names = (const char *[]){ "gpll3" }, 366 + .num_parents = 1, 367 + .ops = &clk_alpha_pll_postdiv_ops, 368 + }, 369 + }; 370 + 371 + static struct clk_alpha_pll gpll4 = { 372 + .offset = 0x77000, 373 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 374 + .vco_table = fabia_vco, 375 + .num_vco = ARRAY_SIZE(fabia_vco), 376 + .clkr = { 377 + .enable_reg = 0x52000, 378 + .enable_mask = BIT(4), 379 + .hw.init = &(struct clk_init_data){ 380 + .name = "gpll4", 381 + .parent_names = (const char *[]){ "xo" }, 382 + .num_parents = 1, 383 + .ops = &clk_alpha_pll_ops, 384 + } 385 + }, 386 + }; 387 + 388 + static struct clk_alpha_pll_postdiv gpll4_out_even = { 389 + .offset = 0x77000, 390 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 391 + .clkr.hw.init = &(struct clk_init_data){ 392 + .name = "gpll4_out_even", 393 + .parent_names = (const char *[]){ "gpll4" }, 394 + .num_parents = 1, 395 + .ops = &clk_alpha_pll_postdiv_ops, 396 + }, 397 + }; 398 + 399 + static struct clk_alpha_pll_postdiv gpll4_out_main = { 400 + .offset = 0x77000, 401 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 402 + .clkr.hw.init = &(struct clk_init_data){ 403 + .name = "gpll4_out_main", 404 + .parent_names = (const char *[]){ "gpll4" }, 405 + .num_parents = 1, 406 + .ops = &clk_alpha_pll_postdiv_ops, 407 + }, 408 + }; 409 + 410 + static struct clk_alpha_pll_postdiv gpll4_out_odd = { 411 + .offset = 0x77000, 412 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 413 + .clkr.hw.init = &(struct clk_init_data){ 414 + .name = "gpll4_out_odd", 415 + .parent_names = (const char *[]){ "gpll4" }, 416 + .num_parents = 1, 417 + .ops = &clk_alpha_pll_postdiv_ops, 418 + }, 419 + }; 420 + 421 + static struct clk_alpha_pll_postdiv gpll4_out_test = { 422 + .offset = 0x77000, 423 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 424 + .clkr.hw.init = &(struct clk_init_data){ 425 + .name = "gpll4_out_test", 426 + .parent_names = (const char *[]){ "gpll4" }, 427 + .num_parents = 1, 428 + .ops = &clk_alpha_pll_postdiv_ops, 429 + }, 430 + }; 431 + 432 + static const struct freq_tbl ftbl_blsp1_qup1_i2c_apps_clk_src[] = { 433 + F(19200000, P_XO, 1, 0, 0), 434 + F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 435 + { } 436 + }; 437 + 438 + static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = { 439 + .cmd_rcgr = 0x19020, 440 + .mnd_width = 0, 441 + .hid_width = 5, 442 + .parent_map = gcc_parent_map_1, 443 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 444 + .clkr.hw.init = &(struct clk_init_data){ 445 + .name = "blsp1_qup1_i2c_apps_clk_src", 446 + .parent_names = gcc_parent_names_1, 447 + .num_parents = 3, 448 + .ops = &clk_rcg2_ops, 449 + }, 450 + }; 451 + 452 + static const struct freq_tbl ftbl_blsp1_qup1_spi_apps_clk_src[] = { 453 + F(960000, P_XO, 10, 1, 2), 454 + F(4800000, P_XO, 4, 0, 0), 455 + F(9600000, P_XO, 2, 0, 0), 456 + F(15000000, P_GPLL0_OUT_MAIN, 10, 1, 4), 457 + F(19200000, P_XO, 1, 0, 0), 458 + F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2), 459 + F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 460 + { } 461 + }; 462 + 463 + static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = { 464 + .cmd_rcgr = 0x1900c, 465 + .mnd_width = 8, 466 + .hid_width = 5, 467 + .parent_map = gcc_parent_map_0, 468 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 469 + .clkr.hw.init = &(struct clk_init_data){ 470 + .name = "blsp1_qup1_spi_apps_clk_src", 471 + .parent_names = gcc_parent_names_0, 472 + .num_parents = 4, 473 + .ops = &clk_rcg2_ops, 474 + }, 475 + }; 476 + 477 + static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = { 478 + .cmd_rcgr = 0x1b020, 479 + .mnd_width = 0, 480 + .hid_width = 5, 481 + .parent_map = gcc_parent_map_1, 482 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 483 + .clkr.hw.init = &(struct clk_init_data){ 484 + .name = "blsp1_qup2_i2c_apps_clk_src", 485 + .parent_names = gcc_parent_names_1, 486 + .num_parents = 3, 487 + .ops = &clk_rcg2_ops, 488 + }, 489 + }; 490 + 491 + static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = { 492 + .cmd_rcgr = 0x1b00c, 493 + .mnd_width = 8, 494 + .hid_width = 5, 495 + .parent_map = gcc_parent_map_0, 496 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 497 + .clkr.hw.init = &(struct clk_init_data){ 498 + .name = "blsp1_qup2_spi_apps_clk_src", 499 + .parent_names = gcc_parent_names_0, 500 + .num_parents = 4, 501 + .ops = &clk_rcg2_ops, 502 + }, 503 + }; 504 + 505 + static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = { 506 + .cmd_rcgr = 0x1d020, 507 + .mnd_width = 0, 508 + .hid_width = 5, 509 + .parent_map = gcc_parent_map_1, 510 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 511 + .clkr.hw.init = &(struct clk_init_data){ 512 + .name = "blsp1_qup3_i2c_apps_clk_src", 513 + .parent_names = gcc_parent_names_1, 514 + .num_parents = 3, 515 + .ops = &clk_rcg2_ops, 516 + }, 517 + }; 518 + 519 + static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = { 520 + .cmd_rcgr = 0x1d00c, 521 + .mnd_width = 8, 522 + .hid_width = 5, 523 + .parent_map = gcc_parent_map_0, 524 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 525 + .clkr.hw.init = &(struct clk_init_data){ 526 + .name = "blsp1_qup3_spi_apps_clk_src", 527 + .parent_names = gcc_parent_names_0, 528 + .num_parents = 4, 529 + .ops = &clk_rcg2_ops, 530 + }, 531 + }; 532 + 533 + static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = { 534 + .cmd_rcgr = 0x1f020, 535 + .mnd_width = 0, 536 + .hid_width = 5, 537 + .parent_map = gcc_parent_map_1, 538 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 539 + .clkr.hw.init = &(struct clk_init_data){ 540 + .name = "blsp1_qup4_i2c_apps_clk_src", 541 + .parent_names = gcc_parent_names_1, 542 + .num_parents = 3, 543 + .ops = &clk_rcg2_ops, 544 + }, 545 + }; 546 + 547 + static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = { 548 + .cmd_rcgr = 0x1f00c, 549 + .mnd_width = 8, 550 + .hid_width = 5, 551 + .parent_map = gcc_parent_map_0, 552 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 553 + .clkr.hw.init = &(struct clk_init_data){ 554 + .name = "blsp1_qup4_spi_apps_clk_src", 555 + .parent_names = gcc_parent_names_0, 556 + .num_parents = 4, 557 + .ops = &clk_rcg2_ops, 558 + }, 559 + }; 560 + 561 + static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = { 562 + .cmd_rcgr = 0x21020, 563 + .mnd_width = 0, 564 + .hid_width = 5, 565 + .parent_map = gcc_parent_map_1, 566 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 567 + .clkr.hw.init = &(struct clk_init_data){ 568 + .name = "blsp1_qup5_i2c_apps_clk_src", 569 + .parent_names = gcc_parent_names_1, 570 + .num_parents = 3, 571 + .ops = &clk_rcg2_ops, 572 + }, 573 + }; 574 + 575 + static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = { 576 + .cmd_rcgr = 0x2100c, 577 + .mnd_width = 8, 578 + .hid_width = 5, 579 + .parent_map = gcc_parent_map_0, 580 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 581 + .clkr.hw.init = &(struct clk_init_data){ 582 + .name = "blsp1_qup5_spi_apps_clk_src", 583 + .parent_names = gcc_parent_names_0, 584 + .num_parents = 4, 585 + .ops = &clk_rcg2_ops, 586 + }, 587 + }; 588 + 589 + static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = { 590 + .cmd_rcgr = 0x23020, 591 + .mnd_width = 0, 592 + .hid_width = 5, 593 + .parent_map = gcc_parent_map_1, 594 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 595 + .clkr.hw.init = &(struct clk_init_data){ 596 + .name = "blsp1_qup6_i2c_apps_clk_src", 597 + .parent_names = gcc_parent_names_1, 598 + .num_parents = 3, 599 + .ops = &clk_rcg2_ops, 600 + }, 601 + }; 602 + 603 + static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = { 604 + .cmd_rcgr = 0x2300c, 605 + .mnd_width = 8, 606 + .hid_width = 5, 607 + .parent_map = gcc_parent_map_0, 608 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 609 + .clkr.hw.init = &(struct clk_init_data){ 610 + .name = "blsp1_qup6_spi_apps_clk_src", 611 + .parent_names = gcc_parent_names_0, 612 + .num_parents = 4, 613 + .ops = &clk_rcg2_ops, 614 + }, 615 + }; 616 + 617 + static const struct freq_tbl ftbl_blsp1_uart1_apps_clk_src[] = { 618 + F(3686400, P_GPLL0_OUT_MAIN, 1, 96, 15625), 619 + F(7372800, P_GPLL0_OUT_MAIN, 1, 192, 15625), 620 + F(14745600, P_GPLL0_OUT_MAIN, 1, 384, 15625), 621 + F(16000000, P_GPLL0_OUT_MAIN, 5, 2, 15), 622 + F(19200000, P_XO, 1, 0, 0), 623 + F(24000000, P_GPLL0_OUT_MAIN, 5, 1, 5), 624 + F(32000000, P_GPLL0_OUT_MAIN, 1, 4, 75), 625 + F(40000000, P_GPLL0_OUT_MAIN, 15, 0, 0), 626 + F(46400000, P_GPLL0_OUT_MAIN, 1, 29, 375), 627 + F(48000000, P_GPLL0_OUT_MAIN, 12.5, 0, 0), 628 + F(51200000, P_GPLL0_OUT_MAIN, 1, 32, 375), 629 + F(56000000, P_GPLL0_OUT_MAIN, 1, 7, 75), 630 + F(58982400, P_GPLL0_OUT_MAIN, 1, 1536, 15625), 631 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 632 + F(63157895, P_GPLL0_OUT_MAIN, 9.5, 0, 0), 633 + { } 634 + }; 635 + 636 + static struct clk_rcg2 blsp1_uart1_apps_clk_src = { 637 + .cmd_rcgr = 0x1a00c, 638 + .mnd_width = 16, 639 + .hid_width = 5, 640 + .parent_map = gcc_parent_map_0, 641 + .freq_tbl = ftbl_blsp1_uart1_apps_clk_src, 642 + .clkr.hw.init = &(struct clk_init_data){ 643 + .name = "blsp1_uart1_apps_clk_src", 644 + .parent_names = gcc_parent_names_0, 645 + .num_parents = 4, 646 + .ops = &clk_rcg2_ops, 647 + }, 648 + }; 649 + 650 + static struct clk_rcg2 blsp1_uart2_apps_clk_src = { 651 + .cmd_rcgr = 0x1c00c, 652 + .mnd_width = 16, 653 + .hid_width = 5, 654 + .parent_map = gcc_parent_map_0, 655 + .freq_tbl = ftbl_blsp1_uart1_apps_clk_src, 656 + .clkr.hw.init = &(struct clk_init_data){ 657 + .name = "blsp1_uart2_apps_clk_src", 658 + .parent_names = gcc_parent_names_0, 659 + .num_parents = 4, 660 + .ops = &clk_rcg2_ops, 661 + }, 662 + }; 663 + 664 + static struct clk_rcg2 blsp1_uart3_apps_clk_src = { 665 + .cmd_rcgr = 0x1e00c, 666 + .mnd_width = 16, 667 + .hid_width = 5, 668 + .parent_map = gcc_parent_map_0, 669 + .freq_tbl = ftbl_blsp1_uart1_apps_clk_src, 670 + .clkr.hw.init = &(struct clk_init_data){ 671 + .name = "blsp1_uart3_apps_clk_src", 672 + .parent_names = gcc_parent_names_0, 673 + .num_parents = 4, 674 + .ops = &clk_rcg2_ops, 675 + }, 676 + }; 677 + 678 + static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = { 679 + .cmd_rcgr = 0x26020, 680 + .mnd_width = 0, 681 + .hid_width = 5, 682 + .parent_map = gcc_parent_map_1, 683 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 684 + .clkr.hw.init = &(struct clk_init_data){ 685 + .name = "blsp2_qup1_i2c_apps_clk_src", 686 + .parent_names = gcc_parent_names_1, 687 + .num_parents = 3, 688 + .ops = &clk_rcg2_ops, 689 + }, 690 + }; 691 + 692 + static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = { 693 + .cmd_rcgr = 0x2600c, 694 + .mnd_width = 8, 695 + .hid_width = 5, 696 + .parent_map = gcc_parent_map_0, 697 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 698 + .clkr.hw.init = &(struct clk_init_data){ 699 + .name = "blsp2_qup1_spi_apps_clk_src", 700 + .parent_names = gcc_parent_names_0, 701 + .num_parents = 4, 702 + .ops = &clk_rcg2_ops, 703 + }, 704 + }; 705 + 706 + static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = { 707 + .cmd_rcgr = 0x28020, 708 + .mnd_width = 0, 709 + .hid_width = 5, 710 + .parent_map = gcc_parent_map_1, 711 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 712 + .clkr.hw.init = &(struct clk_init_data){ 713 + .name = "blsp2_qup2_i2c_apps_clk_src", 714 + .parent_names = gcc_parent_names_1, 715 + .num_parents = 3, 716 + .ops = &clk_rcg2_ops, 717 + }, 718 + }; 719 + 720 + static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = { 721 + .cmd_rcgr = 0x2800c, 722 + .mnd_width = 8, 723 + .hid_width = 5, 724 + .parent_map = gcc_parent_map_0, 725 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 726 + .clkr.hw.init = &(struct clk_init_data){ 727 + .name = "blsp2_qup2_spi_apps_clk_src", 728 + .parent_names = gcc_parent_names_0, 729 + .num_parents = 4, 730 + .ops = &clk_rcg2_ops, 731 + }, 732 + }; 733 + 734 + static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = { 735 + .cmd_rcgr = 0x2a020, 736 + .mnd_width = 0, 737 + .hid_width = 5, 738 + .parent_map = gcc_parent_map_1, 739 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 740 + .clkr.hw.init = &(struct clk_init_data){ 741 + .name = "blsp2_qup3_i2c_apps_clk_src", 742 + .parent_names = gcc_parent_names_1, 743 + .num_parents = 3, 744 + .ops = &clk_rcg2_ops, 745 + }, 746 + }; 747 + 748 + static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = { 749 + .cmd_rcgr = 0x2a00c, 750 + .mnd_width = 8, 751 + .hid_width = 5, 752 + .parent_map = gcc_parent_map_0, 753 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 754 + .clkr.hw.init = &(struct clk_init_data){ 755 + .name = "blsp2_qup3_spi_apps_clk_src", 756 + .parent_names = gcc_parent_names_0, 757 + .num_parents = 4, 758 + .ops = &clk_rcg2_ops, 759 + }, 760 + }; 761 + 762 + static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = { 763 + .cmd_rcgr = 0x2c020, 764 + .mnd_width = 0, 765 + .hid_width = 5, 766 + .parent_map = gcc_parent_map_1, 767 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 768 + .clkr.hw.init = &(struct clk_init_data){ 769 + .name = "blsp2_qup4_i2c_apps_clk_src", 770 + .parent_names = gcc_parent_names_1, 771 + .num_parents = 3, 772 + .ops = &clk_rcg2_ops, 773 + }, 774 + }; 775 + 776 + static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = { 777 + .cmd_rcgr = 0x2c00c, 778 + .mnd_width = 8, 779 + .hid_width = 5, 780 + .parent_map = gcc_parent_map_0, 781 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 782 + .clkr.hw.init = &(struct clk_init_data){ 783 + .name = "blsp2_qup4_spi_apps_clk_src", 784 + .parent_names = gcc_parent_names_0, 785 + .num_parents = 4, 786 + .ops = &clk_rcg2_ops, 787 + }, 788 + }; 789 + 790 + static struct clk_rcg2 blsp2_qup5_i2c_apps_clk_src = { 791 + .cmd_rcgr = 0x2e020, 792 + .mnd_width = 0, 793 + .hid_width = 5, 794 + .parent_map = gcc_parent_map_1, 795 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 796 + .clkr.hw.init = &(struct clk_init_data){ 797 + .name = "blsp2_qup5_i2c_apps_clk_src", 798 + .parent_names = gcc_parent_names_1, 799 + .num_parents = 3, 800 + .ops = &clk_rcg2_ops, 801 + }, 802 + }; 803 + 804 + static struct clk_rcg2 blsp2_qup5_spi_apps_clk_src = { 805 + .cmd_rcgr = 0x2e00c, 806 + .mnd_width = 8, 807 + .hid_width = 5, 808 + .parent_map = gcc_parent_map_0, 809 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 810 + .clkr.hw.init = &(struct clk_init_data){ 811 + .name = "blsp2_qup5_spi_apps_clk_src", 812 + .parent_names = gcc_parent_names_0, 813 + .num_parents = 4, 814 + .ops = &clk_rcg2_ops, 815 + }, 816 + }; 817 + 818 + static struct clk_rcg2 blsp2_qup6_i2c_apps_clk_src = { 819 + .cmd_rcgr = 0x30020, 820 + .mnd_width = 0, 821 + .hid_width = 5, 822 + .parent_map = gcc_parent_map_1, 823 + .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src, 824 + .clkr.hw.init = &(struct clk_init_data){ 825 + .name = "blsp2_qup6_i2c_apps_clk_src", 826 + .parent_names = gcc_parent_names_1, 827 + .num_parents = 3, 828 + .ops = &clk_rcg2_ops, 829 + }, 830 + }; 831 + 832 + static struct clk_rcg2 blsp2_qup6_spi_apps_clk_src = { 833 + .cmd_rcgr = 0x3000c, 834 + .mnd_width = 8, 835 + .hid_width = 5, 836 + .parent_map = gcc_parent_map_0, 837 + .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src, 838 + .clkr.hw.init = &(struct clk_init_data){ 839 + .name = "blsp2_qup6_spi_apps_clk_src", 840 + .parent_names = gcc_parent_names_0, 841 + .num_parents = 4, 842 + .ops = &clk_rcg2_ops, 843 + }, 844 + }; 845 + 846 + static struct clk_rcg2 blsp2_uart1_apps_clk_src = { 847 + .cmd_rcgr = 0x2700c, 848 + .mnd_width = 16, 849 + .hid_width = 5, 850 + .parent_map = gcc_parent_map_0, 851 + .freq_tbl = ftbl_blsp1_uart1_apps_clk_src, 852 + .clkr.hw.init = &(struct clk_init_data){ 853 + .name = "blsp2_uart1_apps_clk_src", 854 + .parent_names = gcc_parent_names_0, 855 + .num_parents = 4, 856 + .ops = &clk_rcg2_ops, 857 + }, 858 + }; 859 + 860 + static struct clk_rcg2 blsp2_uart2_apps_clk_src = { 861 + .cmd_rcgr = 0x2900c, 862 + .mnd_width = 16, 863 + .hid_width = 5, 864 + .parent_map = gcc_parent_map_0, 865 + .freq_tbl = ftbl_blsp1_uart1_apps_clk_src, 866 + .clkr.hw.init = &(struct clk_init_data){ 867 + .name = "blsp2_uart2_apps_clk_src", 868 + .parent_names = gcc_parent_names_0, 869 + .num_parents = 4, 870 + .ops = &clk_rcg2_ops, 871 + }, 872 + }; 873 + 874 + static struct clk_rcg2 blsp2_uart3_apps_clk_src = { 875 + .cmd_rcgr = 0x2b00c, 876 + .mnd_width = 16, 877 + .hid_width = 5, 878 + .parent_map = gcc_parent_map_0, 879 + .freq_tbl = ftbl_blsp1_uart1_apps_clk_src, 880 + .clkr.hw.init = &(struct clk_init_data){ 881 + .name = "blsp2_uart3_apps_clk_src", 882 + .parent_names = gcc_parent_names_0, 883 + .num_parents = 4, 884 + .ops = &clk_rcg2_ops, 885 + }, 886 + }; 887 + 888 + static const struct freq_tbl ftbl_gp1_clk_src[] = { 889 + F(19200000, P_XO, 1, 0, 0), 890 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 891 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 892 + { } 893 + }; 894 + 895 + static struct clk_rcg2 gp1_clk_src = { 896 + .cmd_rcgr = 0x64004, 897 + .mnd_width = 8, 898 + .hid_width = 5, 899 + .parent_map = gcc_parent_map_2, 900 + .freq_tbl = ftbl_gp1_clk_src, 901 + .clkr.hw.init = &(struct clk_init_data){ 902 + .name = "gp1_clk_src", 903 + .parent_names = gcc_parent_names_2, 904 + .num_parents = 5, 905 + .ops = &clk_rcg2_ops, 906 + }, 907 + }; 908 + 909 + static struct clk_rcg2 gp2_clk_src = { 910 + .cmd_rcgr = 0x65004, 911 + .mnd_width = 8, 912 + .hid_width = 5, 913 + .parent_map = gcc_parent_map_2, 914 + .freq_tbl = ftbl_gp1_clk_src, 915 + .clkr.hw.init = &(struct clk_init_data){ 916 + .name = "gp2_clk_src", 917 + .parent_names = gcc_parent_names_2, 918 + .num_parents = 5, 919 + .ops = &clk_rcg2_ops, 920 + }, 921 + }; 922 + 923 + static struct clk_rcg2 gp3_clk_src = { 924 + .cmd_rcgr = 0x66004, 925 + .mnd_width = 8, 926 + .hid_width = 5, 927 + .parent_map = gcc_parent_map_2, 928 + .freq_tbl = ftbl_gp1_clk_src, 929 + .clkr.hw.init = &(struct clk_init_data){ 930 + .name = "gp3_clk_src", 931 + .parent_names = gcc_parent_names_2, 932 + .num_parents = 5, 933 + .ops = &clk_rcg2_ops, 934 + }, 935 + }; 936 + 937 + static const struct freq_tbl ftbl_hmss_ahb_clk_src[] = { 938 + F(19200000, P_XO, 1, 0, 0), 939 + F(37500000, P_GPLL0_OUT_MAIN, 16, 0, 0), 940 + F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0), 941 + { } 942 + }; 943 + 944 + static struct clk_rcg2 hmss_ahb_clk_src = { 945 + .cmd_rcgr = 0x48014, 946 + .mnd_width = 0, 947 + .hid_width = 5, 948 + .parent_map = gcc_parent_map_1, 949 + .freq_tbl = ftbl_hmss_ahb_clk_src, 950 + .clkr.hw.init = &(struct clk_init_data){ 951 + .name = "hmss_ahb_clk_src", 952 + .parent_names = gcc_parent_names_1, 953 + .num_parents = 3, 954 + .ops = &clk_rcg2_ops, 955 + }, 956 + }; 957 + 958 + static const struct freq_tbl ftbl_hmss_rbcpr_clk_src[] = { 959 + F(19200000, P_XO, 1, 0, 0), 960 + { } 961 + }; 962 + 963 + static struct clk_rcg2 hmss_rbcpr_clk_src = { 964 + .cmd_rcgr = 0x48044, 965 + .mnd_width = 0, 966 + .hid_width = 5, 967 + .parent_map = gcc_parent_map_1, 968 + .freq_tbl = ftbl_hmss_rbcpr_clk_src, 969 + .clkr.hw.init = &(struct clk_init_data){ 970 + .name = "hmss_rbcpr_clk_src", 971 + .parent_names = gcc_parent_names_1, 972 + .num_parents = 3, 973 + .ops = &clk_rcg2_ops, 974 + }, 975 + }; 976 + 977 + static const struct freq_tbl ftbl_pcie_aux_clk_src[] = { 978 + F(1010526, P_XO, 1, 1, 19), 979 + { } 980 + }; 981 + 982 + static struct clk_rcg2 pcie_aux_clk_src = { 983 + .cmd_rcgr = 0x6c000, 984 + .mnd_width = 16, 985 + .hid_width = 5, 986 + .parent_map = gcc_parent_map_3, 987 + .freq_tbl = ftbl_pcie_aux_clk_src, 988 + .clkr.hw.init = &(struct clk_init_data){ 989 + .name = "pcie_aux_clk_src", 990 + .parent_names = gcc_parent_names_3, 991 + .num_parents = 3, 992 + .ops = &clk_rcg2_ops, 993 + }, 994 + }; 995 + 996 + static const struct freq_tbl ftbl_pdm2_clk_src[] = { 997 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 998 + { } 999 + }; 1000 + 1001 + static struct clk_rcg2 pdm2_clk_src = { 1002 + .cmd_rcgr = 0x33010, 1003 + .mnd_width = 0, 1004 + .hid_width = 5, 1005 + .parent_map = gcc_parent_map_1, 1006 + .freq_tbl = ftbl_pdm2_clk_src, 1007 + .clkr.hw.init = &(struct clk_init_data){ 1008 + .name = "pdm2_clk_src", 1009 + .parent_names = gcc_parent_names_1, 1010 + .num_parents = 3, 1011 + .ops = &clk_rcg2_ops, 1012 + }, 1013 + }; 1014 + 1015 + static const struct freq_tbl ftbl_sdcc2_apps_clk_src[] = { 1016 + F(144000, P_XO, 16, 3, 25), 1017 + F(400000, P_XO, 12, 1, 4), 1018 + F(20000000, P_GPLL0_OUT_MAIN, 15, 1, 2), 1019 + F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2), 1020 + F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 1021 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 1022 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 1023 + { } 1024 + }; 1025 + 1026 + static struct clk_rcg2 sdcc2_apps_clk_src = { 1027 + .cmd_rcgr = 0x14010, 1028 + .mnd_width = 8, 1029 + .hid_width = 5, 1030 + .parent_map = gcc_parent_map_4, 1031 + .freq_tbl = ftbl_sdcc2_apps_clk_src, 1032 + .clkr.hw.init = &(struct clk_init_data){ 1033 + .name = "sdcc2_apps_clk_src", 1034 + .parent_names = gcc_parent_names_4, 1035 + .num_parents = 4, 1036 + .ops = &clk_rcg2_ops, 1037 + }, 1038 + }; 1039 + 1040 + static const struct freq_tbl ftbl_sdcc4_apps_clk_src[] = { 1041 + F(144000, P_XO, 16, 3, 25), 1042 + F(400000, P_XO, 12, 1, 4), 1043 + F(20000000, P_GPLL0_OUT_MAIN, 15, 1, 2), 1044 + F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2), 1045 + F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 1046 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 1047 + { } 1048 + }; 1049 + 1050 + static struct clk_rcg2 sdcc4_apps_clk_src = { 1051 + .cmd_rcgr = 0x16010, 1052 + .mnd_width = 8, 1053 + .hid_width = 5, 1054 + .parent_map = gcc_parent_map_1, 1055 + .freq_tbl = ftbl_sdcc4_apps_clk_src, 1056 + .clkr.hw.init = &(struct clk_init_data){ 1057 + .name = "sdcc4_apps_clk_src", 1058 + .parent_names = gcc_parent_names_1, 1059 + .num_parents = 3, 1060 + .ops = &clk_rcg2_ops, 1061 + }, 1062 + }; 1063 + 1064 + static const struct freq_tbl ftbl_tsif_ref_clk_src[] = { 1065 + F(105495, P_XO, 1, 1, 182), 1066 + { } 1067 + }; 1068 + 1069 + static struct clk_rcg2 tsif_ref_clk_src = { 1070 + .cmd_rcgr = 0x36010, 1071 + .mnd_width = 8, 1072 + .hid_width = 5, 1073 + .parent_map = gcc_parent_map_5, 1074 + .freq_tbl = ftbl_tsif_ref_clk_src, 1075 + .clkr.hw.init = &(struct clk_init_data){ 1076 + .name = "tsif_ref_clk_src", 1077 + .parent_names = gcc_parent_names_5, 1078 + .num_parents = 4, 1079 + .ops = &clk_rcg2_ops, 1080 + }, 1081 + }; 1082 + 1083 + static const struct freq_tbl ftbl_ufs_axi_clk_src[] = { 1084 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 1085 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 1086 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 1087 + { } 1088 + }; 1089 + 1090 + static struct clk_rcg2 ufs_axi_clk_src = { 1091 + .cmd_rcgr = 0x75018, 1092 + .mnd_width = 8, 1093 + .hid_width = 5, 1094 + .parent_map = gcc_parent_map_0, 1095 + .freq_tbl = ftbl_ufs_axi_clk_src, 1096 + .clkr.hw.init = &(struct clk_init_data){ 1097 + .name = "ufs_axi_clk_src", 1098 + .parent_names = gcc_parent_names_0, 1099 + .num_parents = 4, 1100 + .ops = &clk_rcg2_ops, 1101 + }, 1102 + }; 1103 + 1104 + static const struct freq_tbl ftbl_usb30_master_clk_src[] = { 1105 + F(19200000, P_XO, 1, 0, 0), 1106 + F(120000000, P_GPLL0_OUT_MAIN, 5, 0, 0), 1107 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 1108 + { } 1109 + }; 1110 + 1111 + static struct clk_rcg2 usb30_master_clk_src = { 1112 + .cmd_rcgr = 0xf014, 1113 + .mnd_width = 8, 1114 + .hid_width = 5, 1115 + .parent_map = gcc_parent_map_0, 1116 + .freq_tbl = ftbl_usb30_master_clk_src, 1117 + .clkr.hw.init = &(struct clk_init_data){ 1118 + .name = "usb30_master_clk_src", 1119 + .parent_names = gcc_parent_names_0, 1120 + .num_parents = 4, 1121 + .ops = &clk_rcg2_ops, 1122 + }, 1123 + }; 1124 + 1125 + static struct clk_rcg2 usb30_mock_utmi_clk_src = { 1126 + .cmd_rcgr = 0xf028, 1127 + .mnd_width = 0, 1128 + .hid_width = 5, 1129 + .parent_map = gcc_parent_map_0, 1130 + .freq_tbl = ftbl_hmss_rbcpr_clk_src, 1131 + .clkr.hw.init = &(struct clk_init_data){ 1132 + .name = "usb30_mock_utmi_clk_src", 1133 + .parent_names = gcc_parent_names_0, 1134 + .num_parents = 4, 1135 + .ops = &clk_rcg2_ops, 1136 + }, 1137 + }; 1138 + 1139 + static const struct freq_tbl ftbl_usb3_phy_aux_clk_src[] = { 1140 + F(1200000, P_XO, 16, 0, 0), 1141 + { } 1142 + }; 1143 + 1144 + static struct clk_rcg2 usb3_phy_aux_clk_src = { 1145 + .cmd_rcgr = 0x5000c, 1146 + .mnd_width = 0, 1147 + .hid_width = 5, 1148 + .parent_map = gcc_parent_map_3, 1149 + .freq_tbl = ftbl_usb3_phy_aux_clk_src, 1150 + .clkr.hw.init = &(struct clk_init_data){ 1151 + .name = "usb3_phy_aux_clk_src", 1152 + .parent_names = gcc_parent_names_3, 1153 + .num_parents = 3, 1154 + .ops = &clk_rcg2_ops, 1155 + }, 1156 + }; 1157 + 1158 + static struct clk_branch gcc_aggre1_noc_xo_clk = { 1159 + .halt_reg = 0x8202c, 1160 + .halt_check = BRANCH_HALT, 1161 + .clkr = { 1162 + .enable_reg = 0x8202c, 1163 + .enable_mask = BIT(0), 1164 + .hw.init = &(struct clk_init_data){ 1165 + .name = "gcc_aggre1_noc_xo_clk", 1166 + .ops = &clk_branch2_ops, 1167 + }, 1168 + }, 1169 + }; 1170 + 1171 + static struct clk_branch gcc_aggre1_ufs_axi_clk = { 1172 + .halt_reg = 0x82028, 1173 + .halt_check = BRANCH_HALT, 1174 + .clkr = { 1175 + .enable_reg = 0x82028, 1176 + .enable_mask = BIT(0), 1177 + .hw.init = &(struct clk_init_data){ 1178 + .name = "gcc_aggre1_ufs_axi_clk", 1179 + .parent_names = (const char *[]){ 1180 + "ufs_axi_clk_src", 1181 + }, 1182 + .num_parents = 1, 1183 + .ops = &clk_branch2_ops, 1184 + }, 1185 + }, 1186 + }; 1187 + 1188 + static struct clk_branch gcc_aggre1_usb3_axi_clk = { 1189 + .halt_reg = 0x82024, 1190 + .halt_check = BRANCH_HALT, 1191 + .clkr = { 1192 + .enable_reg = 0x82024, 1193 + .enable_mask = BIT(0), 1194 + .hw.init = &(struct clk_init_data){ 1195 + .name = "gcc_aggre1_usb3_axi_clk", 1196 + .parent_names = (const char *[]){ 1197 + "usb30_master_clk_src", 1198 + }, 1199 + .num_parents = 1, 1200 + .ops = &clk_branch2_ops, 1201 + }, 1202 + }, 1203 + }; 1204 + 1205 + static struct clk_branch gcc_apss_qdss_tsctr_div2_clk = { 1206 + .halt_reg = 0x48090, 1207 + .halt_check = BRANCH_HALT, 1208 + .clkr = { 1209 + .enable_reg = 0x48090, 1210 + .enable_mask = BIT(0), 1211 + .hw.init = &(struct clk_init_data){ 1212 + .name = "gcc_apss_qdss_tsctr_div2_clk", 1213 + .ops = &clk_branch2_ops, 1214 + }, 1215 + }, 1216 + }; 1217 + 1218 + static struct clk_branch gcc_apss_qdss_tsctr_div8_clk = { 1219 + .halt_reg = 0x48094, 1220 + .halt_check = BRANCH_HALT, 1221 + .clkr = { 1222 + .enable_reg = 0x48094, 1223 + .enable_mask = BIT(0), 1224 + .hw.init = &(struct clk_init_data){ 1225 + .name = "gcc_apss_qdss_tsctr_div8_clk", 1226 + .ops = &clk_branch2_ops, 1227 + }, 1228 + }, 1229 + }; 1230 + 1231 + static struct clk_branch gcc_bimc_hmss_axi_clk = { 1232 + .halt_reg = 0x48004, 1233 + .halt_check = BRANCH_HALT_VOTED, 1234 + .clkr = { 1235 + .enable_reg = 0x52004, 1236 + .enable_mask = BIT(22), 1237 + .hw.init = &(struct clk_init_data){ 1238 + .name = "gcc_bimc_hmss_axi_clk", 1239 + .ops = &clk_branch2_ops, 1240 + }, 1241 + }, 1242 + }; 1243 + 1244 + static struct clk_branch gcc_bimc_mss_q6_axi_clk = { 1245 + .halt_reg = 0x4401c, 1246 + .halt_check = BRANCH_HALT, 1247 + .clkr = { 1248 + .enable_reg = 0x4401c, 1249 + .enable_mask = BIT(0), 1250 + .hw.init = &(struct clk_init_data){ 1251 + .name = "gcc_bimc_mss_q6_axi_clk", 1252 + .ops = &clk_branch2_ops, 1253 + }, 1254 + }, 1255 + }; 1256 + 1257 + static struct clk_branch gcc_blsp1_ahb_clk = { 1258 + .halt_reg = 0x17004, 1259 + .halt_check = BRANCH_HALT_VOTED, 1260 + .clkr = { 1261 + .enable_reg = 0x52004, 1262 + .enable_mask = BIT(17), 1263 + .hw.init = &(struct clk_init_data){ 1264 + .name = "gcc_blsp1_ahb_clk", 1265 + .ops = &clk_branch2_ops, 1266 + }, 1267 + }, 1268 + }; 1269 + 1270 + static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = { 1271 + .halt_reg = 0x19008, 1272 + .halt_check = BRANCH_HALT, 1273 + .clkr = { 1274 + .enable_reg = 0x19008, 1275 + .enable_mask = BIT(0), 1276 + .hw.init = &(struct clk_init_data){ 1277 + .name = "gcc_blsp1_qup1_i2c_apps_clk", 1278 + .parent_names = (const char *[]){ 1279 + "blsp1_qup1_i2c_apps_clk_src", 1280 + }, 1281 + .num_parents = 1, 1282 + .ops = &clk_branch2_ops, 1283 + }, 1284 + }, 1285 + }; 1286 + 1287 + static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = { 1288 + .halt_reg = 0x19004, 1289 + .halt_check = BRANCH_HALT, 1290 + .clkr = { 1291 + .enable_reg = 0x19004, 1292 + .enable_mask = BIT(0), 1293 + .hw.init = &(struct clk_init_data){ 1294 + .name = "gcc_blsp1_qup1_spi_apps_clk", 1295 + .parent_names = (const char *[]){ 1296 + "blsp1_qup1_spi_apps_clk_src", 1297 + }, 1298 + .num_parents = 1, 1299 + .ops = &clk_branch2_ops, 1300 + }, 1301 + }, 1302 + }; 1303 + 1304 + static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = { 1305 + .halt_reg = 0x1b008, 1306 + .halt_check = BRANCH_HALT, 1307 + .clkr = { 1308 + .enable_reg = 0x1b008, 1309 + .enable_mask = BIT(0), 1310 + .hw.init = &(struct clk_init_data){ 1311 + .name = "gcc_blsp1_qup2_i2c_apps_clk", 1312 + .parent_names = (const char *[]){ 1313 + "blsp1_qup2_i2c_apps_clk_src", 1314 + }, 1315 + .num_parents = 1, 1316 + .ops = &clk_branch2_ops, 1317 + }, 1318 + }, 1319 + }; 1320 + 1321 + static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = { 1322 + .halt_reg = 0x1b004, 1323 + .halt_check = BRANCH_HALT, 1324 + .clkr = { 1325 + .enable_reg = 0x1b004, 1326 + .enable_mask = BIT(0), 1327 + .hw.init = &(struct clk_init_data){ 1328 + .name = "gcc_blsp1_qup2_spi_apps_clk", 1329 + .parent_names = (const char *[]){ 1330 + "blsp1_qup2_spi_apps_clk_src", 1331 + }, 1332 + .num_parents = 1, 1333 + .ops = &clk_branch2_ops, 1334 + }, 1335 + }, 1336 + }; 1337 + 1338 + static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = { 1339 + .halt_reg = 0x1d008, 1340 + .halt_check = BRANCH_HALT, 1341 + .clkr = { 1342 + .enable_reg = 0x1d008, 1343 + .enable_mask = BIT(0), 1344 + .hw.init = &(struct clk_init_data){ 1345 + .name = "gcc_blsp1_qup3_i2c_apps_clk", 1346 + .parent_names = (const char *[]){ 1347 + "blsp1_qup3_i2c_apps_clk_src", 1348 + }, 1349 + .num_parents = 1, 1350 + .ops = &clk_branch2_ops, 1351 + }, 1352 + }, 1353 + }; 1354 + 1355 + static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = { 1356 + .halt_reg = 0x1d004, 1357 + .halt_check = BRANCH_HALT, 1358 + .clkr = { 1359 + .enable_reg = 0x1d004, 1360 + .enable_mask = BIT(0), 1361 + .hw.init = &(struct clk_init_data){ 1362 + .name = "gcc_blsp1_qup3_spi_apps_clk", 1363 + .parent_names = (const char *[]){ 1364 + "blsp1_qup3_spi_apps_clk_src", 1365 + }, 1366 + .num_parents = 1, 1367 + .ops = &clk_branch2_ops, 1368 + }, 1369 + }, 1370 + }; 1371 + 1372 + static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = { 1373 + .halt_reg = 0x1f008, 1374 + .halt_check = BRANCH_HALT, 1375 + .clkr = { 1376 + .enable_reg = 0x1f008, 1377 + .enable_mask = BIT(0), 1378 + .hw.init = &(struct clk_init_data){ 1379 + .name = "gcc_blsp1_qup4_i2c_apps_clk", 1380 + .parent_names = (const char *[]){ 1381 + "blsp1_qup4_i2c_apps_clk_src", 1382 + }, 1383 + .num_parents = 1, 1384 + .ops = &clk_branch2_ops, 1385 + }, 1386 + }, 1387 + }; 1388 + 1389 + static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = { 1390 + .halt_reg = 0x1f004, 1391 + .halt_check = BRANCH_HALT, 1392 + .clkr = { 1393 + .enable_reg = 0x1f004, 1394 + .enable_mask = BIT(0), 1395 + .hw.init = &(struct clk_init_data){ 1396 + .name = "gcc_blsp1_qup4_spi_apps_clk", 1397 + .parent_names = (const char *[]){ 1398 + "blsp1_qup4_spi_apps_clk_src", 1399 + }, 1400 + .num_parents = 1, 1401 + .ops = &clk_branch2_ops, 1402 + }, 1403 + }, 1404 + }; 1405 + 1406 + static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = { 1407 + .halt_reg = 0x21008, 1408 + .halt_check = BRANCH_HALT, 1409 + .clkr = { 1410 + .enable_reg = 0x21008, 1411 + .enable_mask = BIT(0), 1412 + .hw.init = &(struct clk_init_data){ 1413 + .name = "gcc_blsp1_qup5_i2c_apps_clk", 1414 + .parent_names = (const char *[]){ 1415 + "blsp1_qup5_i2c_apps_clk_src", 1416 + }, 1417 + .num_parents = 1, 1418 + .ops = &clk_branch2_ops, 1419 + }, 1420 + }, 1421 + }; 1422 + 1423 + static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = { 1424 + .halt_reg = 0x21004, 1425 + .halt_check = BRANCH_HALT, 1426 + .clkr = { 1427 + .enable_reg = 0x21004, 1428 + .enable_mask = BIT(0), 1429 + .hw.init = &(struct clk_init_data){ 1430 + .name = "gcc_blsp1_qup5_spi_apps_clk", 1431 + .parent_names = (const char *[]){ 1432 + "blsp1_qup5_spi_apps_clk_src", 1433 + }, 1434 + .num_parents = 1, 1435 + .ops = &clk_branch2_ops, 1436 + }, 1437 + }, 1438 + }; 1439 + 1440 + static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = { 1441 + .halt_reg = 0x23008, 1442 + .halt_check = BRANCH_HALT, 1443 + .clkr = { 1444 + .enable_reg = 0x23008, 1445 + .enable_mask = BIT(0), 1446 + .hw.init = &(struct clk_init_data){ 1447 + .name = "gcc_blsp1_qup6_i2c_apps_clk", 1448 + .parent_names = (const char *[]){ 1449 + "blsp1_qup6_i2c_apps_clk_src", 1450 + }, 1451 + .num_parents = 1, 1452 + .ops = &clk_branch2_ops, 1453 + }, 1454 + }, 1455 + }; 1456 + 1457 + static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = { 1458 + .halt_reg = 0x23004, 1459 + .halt_check = BRANCH_HALT, 1460 + .clkr = { 1461 + .enable_reg = 0x23004, 1462 + .enable_mask = BIT(0), 1463 + .hw.init = &(struct clk_init_data){ 1464 + .name = "gcc_blsp1_qup6_spi_apps_clk", 1465 + .parent_names = (const char *[]){ 1466 + "blsp1_qup6_spi_apps_clk_src", 1467 + }, 1468 + .num_parents = 1, 1469 + .ops = &clk_branch2_ops, 1470 + }, 1471 + }, 1472 + }; 1473 + 1474 + static struct clk_branch gcc_blsp1_sleep_clk = { 1475 + .halt_reg = 0x17008, 1476 + .halt_check = BRANCH_HALT_VOTED, 1477 + .clkr = { 1478 + .enable_reg = 0x52004, 1479 + .enable_mask = BIT(16), 1480 + .hw.init = &(struct clk_init_data){ 1481 + .name = "gcc_blsp1_sleep_clk", 1482 + .ops = &clk_branch2_ops, 1483 + }, 1484 + }, 1485 + }; 1486 + 1487 + static struct clk_branch gcc_blsp1_uart1_apps_clk = { 1488 + .halt_reg = 0x1a004, 1489 + .halt_check = BRANCH_HALT, 1490 + .clkr = { 1491 + .enable_reg = 0x1a004, 1492 + .enable_mask = BIT(0), 1493 + .hw.init = &(struct clk_init_data){ 1494 + .name = "gcc_blsp1_uart1_apps_clk", 1495 + .parent_names = (const char *[]){ 1496 + "blsp1_uart1_apps_clk_src", 1497 + }, 1498 + .num_parents = 1, 1499 + .ops = &clk_branch2_ops, 1500 + }, 1501 + }, 1502 + }; 1503 + 1504 + static struct clk_branch gcc_blsp1_uart2_apps_clk = { 1505 + .halt_reg = 0x1c004, 1506 + .halt_check = BRANCH_HALT, 1507 + .clkr = { 1508 + .enable_reg = 0x1c004, 1509 + .enable_mask = BIT(0), 1510 + .hw.init = &(struct clk_init_data){ 1511 + .name = "gcc_blsp1_uart2_apps_clk", 1512 + .parent_names = (const char *[]){ 1513 + "blsp1_uart2_apps_clk_src", 1514 + }, 1515 + .num_parents = 1, 1516 + .ops = &clk_branch2_ops, 1517 + }, 1518 + }, 1519 + }; 1520 + 1521 + static struct clk_branch gcc_blsp1_uart3_apps_clk = { 1522 + .halt_reg = 0x1e004, 1523 + .halt_check = BRANCH_HALT, 1524 + .clkr = { 1525 + .enable_reg = 0x1e004, 1526 + .enable_mask = BIT(0), 1527 + .hw.init = &(struct clk_init_data){ 1528 + .name = "gcc_blsp1_uart3_apps_clk", 1529 + .parent_names = (const char *[]){ 1530 + "blsp1_uart3_apps_clk_src", 1531 + }, 1532 + .num_parents = 1, 1533 + .ops = &clk_branch2_ops, 1534 + }, 1535 + }, 1536 + }; 1537 + 1538 + static struct clk_branch gcc_blsp2_ahb_clk = { 1539 + .halt_reg = 0x25004, 1540 + .halt_check = BRANCH_HALT_VOTED, 1541 + .clkr = { 1542 + .enable_reg = 0x52004, 1543 + .enable_mask = BIT(15), 1544 + .hw.init = &(struct clk_init_data){ 1545 + .name = "gcc_blsp2_ahb_clk", 1546 + .ops = &clk_branch2_ops, 1547 + }, 1548 + }, 1549 + }; 1550 + 1551 + static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = { 1552 + .halt_reg = 0x26008, 1553 + .halt_check = BRANCH_HALT, 1554 + .clkr = { 1555 + .enable_reg = 0x26008, 1556 + .enable_mask = BIT(0), 1557 + .hw.init = &(struct clk_init_data){ 1558 + .name = "gcc_blsp2_qup1_i2c_apps_clk", 1559 + .parent_names = (const char *[]){ 1560 + "blsp2_qup1_i2c_apps_clk_src", 1561 + }, 1562 + .num_parents = 1, 1563 + .ops = &clk_branch2_ops, 1564 + }, 1565 + }, 1566 + }; 1567 + 1568 + static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = { 1569 + .halt_reg = 0x26004, 1570 + .halt_check = BRANCH_HALT, 1571 + .clkr = { 1572 + .enable_reg = 0x26004, 1573 + .enable_mask = BIT(0), 1574 + .hw.init = &(struct clk_init_data){ 1575 + .name = "gcc_blsp2_qup1_spi_apps_clk", 1576 + .parent_names = (const char *[]){ 1577 + "blsp2_qup1_spi_apps_clk_src", 1578 + }, 1579 + .num_parents = 1, 1580 + .ops = &clk_branch2_ops, 1581 + }, 1582 + }, 1583 + }; 1584 + 1585 + static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = { 1586 + .halt_reg = 0x28008, 1587 + .halt_check = BRANCH_HALT, 1588 + .clkr = { 1589 + .enable_reg = 0x28008, 1590 + .enable_mask = BIT(0), 1591 + .hw.init = &(struct clk_init_data){ 1592 + .name = "gcc_blsp2_qup2_i2c_apps_clk", 1593 + .parent_names = (const char *[]){ 1594 + "blsp2_qup2_i2c_apps_clk_src", 1595 + }, 1596 + .num_parents = 1, 1597 + .ops = &clk_branch2_ops, 1598 + }, 1599 + }, 1600 + }; 1601 + 1602 + static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = { 1603 + .halt_reg = 0x28004, 1604 + .halt_check = BRANCH_HALT, 1605 + .clkr = { 1606 + .enable_reg = 0x28004, 1607 + .enable_mask = BIT(0), 1608 + .hw.init = &(struct clk_init_data){ 1609 + .name = "gcc_blsp2_qup2_spi_apps_clk", 1610 + .parent_names = (const char *[]){ 1611 + "blsp2_qup2_spi_apps_clk_src", 1612 + }, 1613 + .num_parents = 1, 1614 + .ops = &clk_branch2_ops, 1615 + }, 1616 + }, 1617 + }; 1618 + 1619 + static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = { 1620 + .halt_reg = 0x2a008, 1621 + .halt_check = BRANCH_HALT, 1622 + .clkr = { 1623 + .enable_reg = 0x2a008, 1624 + .enable_mask = BIT(0), 1625 + .hw.init = &(struct clk_init_data){ 1626 + .name = "gcc_blsp2_qup3_i2c_apps_clk", 1627 + .parent_names = (const char *[]){ 1628 + "blsp2_qup3_i2c_apps_clk_src", 1629 + }, 1630 + .num_parents = 1, 1631 + .ops = &clk_branch2_ops, 1632 + }, 1633 + }, 1634 + }; 1635 + 1636 + static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = { 1637 + .halt_reg = 0x2a004, 1638 + .halt_check = BRANCH_HALT, 1639 + .clkr = { 1640 + .enable_reg = 0x2a004, 1641 + .enable_mask = BIT(0), 1642 + .hw.init = &(struct clk_init_data){ 1643 + .name = "gcc_blsp2_qup3_spi_apps_clk", 1644 + .parent_names = (const char *[]){ 1645 + "blsp2_qup3_spi_apps_clk_src", 1646 + }, 1647 + .num_parents = 1, 1648 + .ops = &clk_branch2_ops, 1649 + }, 1650 + }, 1651 + }; 1652 + 1653 + static struct clk_branch gcc_blsp2_qup4_i2c_apps_clk = { 1654 + .halt_reg = 0x2c008, 1655 + .halt_check = BRANCH_HALT, 1656 + .clkr = { 1657 + .enable_reg = 0x2c008, 1658 + .enable_mask = BIT(0), 1659 + .hw.init = &(struct clk_init_data){ 1660 + .name = "gcc_blsp2_qup4_i2c_apps_clk", 1661 + .parent_names = (const char *[]){ 1662 + "blsp2_qup4_i2c_apps_clk_src", 1663 + }, 1664 + .num_parents = 1, 1665 + .ops = &clk_branch2_ops, 1666 + }, 1667 + }, 1668 + }; 1669 + 1670 + static struct clk_branch gcc_blsp2_qup4_spi_apps_clk = { 1671 + .halt_reg = 0x2c004, 1672 + .halt_check = BRANCH_HALT, 1673 + .clkr = { 1674 + .enable_reg = 0x2c004, 1675 + .enable_mask = BIT(0), 1676 + .hw.init = &(struct clk_init_data){ 1677 + .name = "gcc_blsp2_qup4_spi_apps_clk", 1678 + .parent_names = (const char *[]){ 1679 + "blsp2_qup4_spi_apps_clk_src", 1680 + }, 1681 + .num_parents = 1, 1682 + .ops = &clk_branch2_ops, 1683 + }, 1684 + }, 1685 + }; 1686 + 1687 + static struct clk_branch gcc_blsp2_qup5_i2c_apps_clk = { 1688 + .halt_reg = 0x2e008, 1689 + .halt_check = BRANCH_HALT, 1690 + .clkr = { 1691 + .enable_reg = 0x2e008, 1692 + .enable_mask = BIT(0), 1693 + .hw.init = &(struct clk_init_data){ 1694 + .name = "gcc_blsp2_qup5_i2c_apps_clk", 1695 + .parent_names = (const char *[]){ 1696 + "blsp2_qup5_i2c_apps_clk_src", 1697 + }, 1698 + .num_parents = 1, 1699 + .ops = &clk_branch2_ops, 1700 + }, 1701 + }, 1702 + }; 1703 + 1704 + static struct clk_branch gcc_blsp2_qup5_spi_apps_clk = { 1705 + .halt_reg = 0x2e004, 1706 + .halt_check = BRANCH_HALT, 1707 + .clkr = { 1708 + .enable_reg = 0x2e004, 1709 + .enable_mask = BIT(0), 1710 + .hw.init = &(struct clk_init_data){ 1711 + .name = "gcc_blsp2_qup5_spi_apps_clk", 1712 + .parent_names = (const char *[]){ 1713 + "blsp2_qup5_spi_apps_clk_src", 1714 + }, 1715 + .num_parents = 1, 1716 + .ops = &clk_branch2_ops, 1717 + }, 1718 + }, 1719 + }; 1720 + 1721 + static struct clk_branch gcc_blsp2_qup6_i2c_apps_clk = { 1722 + .halt_reg = 0x30008, 1723 + .halt_check = BRANCH_HALT, 1724 + .clkr = { 1725 + .enable_reg = 0x30008, 1726 + .enable_mask = BIT(0), 1727 + .hw.init = &(struct clk_init_data){ 1728 + .name = "gcc_blsp2_qup6_i2c_apps_clk", 1729 + .parent_names = (const char *[]){ 1730 + "blsp2_qup6_i2c_apps_clk_src", 1731 + }, 1732 + .num_parents = 1, 1733 + .ops = &clk_branch2_ops, 1734 + }, 1735 + }, 1736 + }; 1737 + 1738 + static struct clk_branch gcc_blsp2_qup6_spi_apps_clk = { 1739 + .halt_reg = 0x30004, 1740 + .halt_check = BRANCH_HALT, 1741 + .clkr = { 1742 + .enable_reg = 0x30004, 1743 + .enable_mask = BIT(0), 1744 + .hw.init = &(struct clk_init_data){ 1745 + .name = "gcc_blsp2_qup6_spi_apps_clk", 1746 + .parent_names = (const char *[]){ 1747 + "blsp2_qup6_spi_apps_clk_src", 1748 + }, 1749 + .num_parents = 1, 1750 + .ops = &clk_branch2_ops, 1751 + }, 1752 + }, 1753 + }; 1754 + 1755 + static struct clk_branch gcc_blsp2_sleep_clk = { 1756 + .halt_reg = 0x25008, 1757 + .halt_check = BRANCH_HALT_VOTED, 1758 + .clkr = { 1759 + .enable_reg = 0x52004, 1760 + .enable_mask = BIT(14), 1761 + .hw.init = &(struct clk_init_data){ 1762 + .name = "gcc_blsp2_sleep_clk", 1763 + .ops = &clk_branch2_ops, 1764 + }, 1765 + }, 1766 + }; 1767 + 1768 + static struct clk_branch gcc_blsp2_uart1_apps_clk = { 1769 + .halt_reg = 0x27004, 1770 + .halt_check = BRANCH_HALT, 1771 + .clkr = { 1772 + .enable_reg = 0x27004, 1773 + .enable_mask = BIT(0), 1774 + .hw.init = &(struct clk_init_data){ 1775 + .name = "gcc_blsp2_uart1_apps_clk", 1776 + .parent_names = (const char *[]){ 1777 + "blsp2_uart1_apps_clk_src", 1778 + }, 1779 + .num_parents = 1, 1780 + .ops = &clk_branch2_ops, 1781 + }, 1782 + }, 1783 + }; 1784 + 1785 + static struct clk_branch gcc_blsp2_uart2_apps_clk = { 1786 + .halt_reg = 0x29004, 1787 + .halt_check = BRANCH_HALT, 1788 + .clkr = { 1789 + .enable_reg = 0x29004, 1790 + .enable_mask = BIT(0), 1791 + .hw.init = &(struct clk_init_data){ 1792 + .name = "gcc_blsp2_uart2_apps_clk", 1793 + .parent_names = (const char *[]){ 1794 + "blsp2_uart2_apps_clk_src", 1795 + }, 1796 + .num_parents = 1, 1797 + .ops = &clk_branch2_ops, 1798 + }, 1799 + }, 1800 + }; 1801 + 1802 + static struct clk_branch gcc_blsp2_uart3_apps_clk = { 1803 + .halt_reg = 0x2b004, 1804 + .halt_check = BRANCH_HALT, 1805 + .clkr = { 1806 + .enable_reg = 0x2b004, 1807 + .enable_mask = BIT(0), 1808 + .hw.init = &(struct clk_init_data){ 1809 + .name = "gcc_blsp2_uart3_apps_clk", 1810 + .parent_names = (const char *[]){ 1811 + "blsp2_uart3_apps_clk_src", 1812 + }, 1813 + .num_parents = 1, 1814 + .ops = &clk_branch2_ops, 1815 + }, 1816 + }, 1817 + }; 1818 + 1819 + static struct clk_branch gcc_cfg_noc_usb3_axi_clk = { 1820 + .halt_reg = 0x5018, 1821 + .halt_check = BRANCH_HALT, 1822 + .clkr = { 1823 + .enable_reg = 0x5018, 1824 + .enable_mask = BIT(0), 1825 + .hw.init = &(struct clk_init_data){ 1826 + .name = "gcc_cfg_noc_usb3_axi_clk", 1827 + .parent_names = (const char *[]){ 1828 + "usb30_master_clk_src", 1829 + }, 1830 + .num_parents = 1, 1831 + .ops = &clk_branch2_ops, 1832 + }, 1833 + }, 1834 + }; 1835 + 1836 + static struct clk_branch gcc_gp1_clk = { 1837 + .halt_reg = 0x64000, 1838 + .halt_check = BRANCH_HALT, 1839 + .clkr = { 1840 + .enable_reg = 0x64000, 1841 + .enable_mask = BIT(0), 1842 + .hw.init = &(struct clk_init_data){ 1843 + .name = "gcc_gp1_clk", 1844 + .parent_names = (const char *[]){ 1845 + "gp1_clk_src", 1846 + }, 1847 + .num_parents = 1, 1848 + .ops = &clk_branch2_ops, 1849 + }, 1850 + }, 1851 + }; 1852 + 1853 + static struct clk_branch gcc_gp2_clk = { 1854 + .halt_reg = 0x65000, 1855 + .halt_check = BRANCH_HALT, 1856 + .clkr = { 1857 + .enable_reg = 0x65000, 1858 + .enable_mask = BIT(0), 1859 + .hw.init = &(struct clk_init_data){ 1860 + .name = "gcc_gp2_clk", 1861 + .parent_names = (const char *[]){ 1862 + "gp2_clk_src", 1863 + }, 1864 + .num_parents = 1, 1865 + .ops = &clk_branch2_ops, 1866 + }, 1867 + }, 1868 + }; 1869 + 1870 + static struct clk_branch gcc_gp3_clk = { 1871 + .halt_reg = 0x66000, 1872 + .halt_check = BRANCH_HALT, 1873 + .clkr = { 1874 + .enable_reg = 0x66000, 1875 + .enable_mask = BIT(0), 1876 + .hw.init = &(struct clk_init_data){ 1877 + .name = "gcc_gp3_clk", 1878 + .parent_names = (const char *[]){ 1879 + "gp3_clk_src", 1880 + }, 1881 + .num_parents = 1, 1882 + .ops = &clk_branch2_ops, 1883 + }, 1884 + }, 1885 + }; 1886 + 1887 + static struct clk_branch gcc_gpu_bimc_gfx_clk = { 1888 + .halt_reg = 0x71010, 1889 + .halt_check = BRANCH_HALT, 1890 + .clkr = { 1891 + .enable_reg = 0x71010, 1892 + .enable_mask = BIT(0), 1893 + .hw.init = &(struct clk_init_data){ 1894 + .name = "gcc_gpu_bimc_gfx_clk", 1895 + .ops = &clk_branch2_ops, 1896 + }, 1897 + }, 1898 + }; 1899 + 1900 + static struct clk_branch gcc_gpu_bimc_gfx_src_clk = { 1901 + .halt_reg = 0x7100c, 1902 + .halt_check = BRANCH_HALT, 1903 + .clkr = { 1904 + .enable_reg = 0x7100c, 1905 + .enable_mask = BIT(0), 1906 + .hw.init = &(struct clk_init_data){ 1907 + .name = "gcc_gpu_bimc_gfx_src_clk", 1908 + .ops = &clk_branch2_ops, 1909 + }, 1910 + }, 1911 + }; 1912 + 1913 + static struct clk_branch gcc_gpu_cfg_ahb_clk = { 1914 + .halt_reg = 0x71004, 1915 + .halt_check = BRANCH_HALT, 1916 + .clkr = { 1917 + .enable_reg = 0x71004, 1918 + .enable_mask = BIT(0), 1919 + .hw.init = &(struct clk_init_data){ 1920 + .name = "gcc_gpu_cfg_ahb_clk", 1921 + .ops = &clk_branch2_ops, 1922 + }, 1923 + }, 1924 + }; 1925 + 1926 + static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = { 1927 + .halt_reg = 0x71018, 1928 + .halt_check = BRANCH_HALT, 1929 + .clkr = { 1930 + .enable_reg = 0x71018, 1931 + .enable_mask = BIT(0), 1932 + .hw.init = &(struct clk_init_data){ 1933 + .name = "gcc_gpu_snoc_dvm_gfx_clk", 1934 + .ops = &clk_branch2_ops, 1935 + }, 1936 + }, 1937 + }; 1938 + 1939 + static struct clk_branch gcc_hmss_ahb_clk = { 1940 + .halt_reg = 0x48000, 1941 + .halt_check = BRANCH_HALT_VOTED, 1942 + .clkr = { 1943 + .enable_reg = 0x52004, 1944 + .enable_mask = BIT(21), 1945 + .hw.init = &(struct clk_init_data){ 1946 + .name = "gcc_hmss_ahb_clk", 1947 + .parent_names = (const char *[]){ 1948 + "hmss_ahb_clk_src", 1949 + }, 1950 + .num_parents = 1, 1951 + .ops = &clk_branch2_ops, 1952 + }, 1953 + }, 1954 + }; 1955 + 1956 + static struct clk_branch gcc_hmss_at_clk = { 1957 + .halt_reg = 0x48010, 1958 + .halt_check = BRANCH_HALT, 1959 + .clkr = { 1960 + .enable_reg = 0x48010, 1961 + .enable_mask = BIT(0), 1962 + .hw.init = &(struct clk_init_data){ 1963 + .name = "gcc_hmss_at_clk", 1964 + .ops = &clk_branch2_ops, 1965 + }, 1966 + }, 1967 + }; 1968 + 1969 + static struct clk_branch gcc_hmss_dvm_bus_clk = { 1970 + .halt_reg = 0x4808c, 1971 + .halt_check = BRANCH_HALT, 1972 + .clkr = { 1973 + .enable_reg = 0x4808c, 1974 + .enable_mask = BIT(0), 1975 + .hw.init = &(struct clk_init_data){ 1976 + .name = "gcc_hmss_dvm_bus_clk", 1977 + .ops = &clk_branch2_ops, 1978 + }, 1979 + }, 1980 + }; 1981 + 1982 + static struct clk_branch gcc_hmss_rbcpr_clk = { 1983 + .halt_reg = 0x48008, 1984 + .halt_check = BRANCH_HALT, 1985 + .clkr = { 1986 + .enable_reg = 0x48008, 1987 + .enable_mask = BIT(0), 1988 + .hw.init = &(struct clk_init_data){ 1989 + .name = "gcc_hmss_rbcpr_clk", 1990 + .parent_names = (const char *[]){ 1991 + "hmss_rbcpr_clk_src", 1992 + }, 1993 + .num_parents = 1, 1994 + .ops = &clk_branch2_ops, 1995 + }, 1996 + }, 1997 + }; 1998 + 1999 + static struct clk_branch gcc_hmss_trig_clk = { 2000 + .halt_reg = 0x4800c, 2001 + .halt_check = BRANCH_HALT, 2002 + .clkr = { 2003 + .enable_reg = 0x4800c, 2004 + .enable_mask = BIT(0), 2005 + .hw.init = &(struct clk_init_data){ 2006 + .name = "gcc_hmss_trig_clk", 2007 + .ops = &clk_branch2_ops, 2008 + }, 2009 + }, 2010 + }; 2011 + 2012 + static struct clk_branch gcc_lpass_at_clk = { 2013 + .halt_reg = 0x47020, 2014 + .halt_check = BRANCH_HALT, 2015 + .clkr = { 2016 + .enable_reg = 0x47020, 2017 + .enable_mask = BIT(0), 2018 + .hw.init = &(struct clk_init_data){ 2019 + .name = "gcc_lpass_at_clk", 2020 + .ops = &clk_branch2_ops, 2021 + }, 2022 + }, 2023 + }; 2024 + 2025 + static struct clk_branch gcc_lpass_trig_clk = { 2026 + .halt_reg = 0x4701c, 2027 + .halt_check = BRANCH_HALT, 2028 + .clkr = { 2029 + .enable_reg = 0x4701c, 2030 + .enable_mask = BIT(0), 2031 + .hw.init = &(struct clk_init_data){ 2032 + .name = "gcc_lpass_trig_clk", 2033 + .ops = &clk_branch2_ops, 2034 + }, 2035 + }, 2036 + }; 2037 + 2038 + static struct clk_branch gcc_mmss_noc_cfg_ahb_clk = { 2039 + .halt_reg = 0x9004, 2040 + .halt_check = BRANCH_HALT, 2041 + .clkr = { 2042 + .enable_reg = 0x9004, 2043 + .enable_mask = BIT(0), 2044 + .hw.init = &(struct clk_init_data){ 2045 + .name = "gcc_mmss_noc_cfg_ahb_clk", 2046 + .ops = &clk_branch2_ops, 2047 + }, 2048 + }, 2049 + }; 2050 + 2051 + static struct clk_branch gcc_mmss_qm_ahb_clk = { 2052 + .halt_reg = 0x9030, 2053 + .halt_check = BRANCH_HALT, 2054 + .clkr = { 2055 + .enable_reg = 0x9030, 2056 + .enable_mask = BIT(0), 2057 + .hw.init = &(struct clk_init_data){ 2058 + .name = "gcc_mmss_qm_ahb_clk", 2059 + .ops = &clk_branch2_ops, 2060 + }, 2061 + }, 2062 + }; 2063 + 2064 + static struct clk_branch gcc_mmss_qm_core_clk = { 2065 + .halt_reg = 0x900c, 2066 + .halt_check = BRANCH_HALT, 2067 + .clkr = { 2068 + .enable_reg = 0x900c, 2069 + .enable_mask = BIT(0), 2070 + .hw.init = &(struct clk_init_data){ 2071 + .name = "gcc_mmss_qm_core_clk", 2072 + .ops = &clk_branch2_ops, 2073 + }, 2074 + }, 2075 + }; 2076 + 2077 + static struct clk_branch gcc_mmss_sys_noc_axi_clk = { 2078 + .halt_reg = 0x9000, 2079 + .halt_check = BRANCH_HALT, 2080 + .clkr = { 2081 + .enable_reg = 0x9000, 2082 + .enable_mask = BIT(0), 2083 + .hw.init = &(struct clk_init_data){ 2084 + .name = "gcc_mmss_sys_noc_axi_clk", 2085 + .ops = &clk_branch2_ops, 2086 + }, 2087 + }, 2088 + }; 2089 + 2090 + static struct clk_branch gcc_mss_at_clk = { 2091 + .halt_reg = 0x8a00c, 2092 + .halt_check = BRANCH_HALT, 2093 + .clkr = { 2094 + .enable_reg = 0x8a00c, 2095 + .enable_mask = BIT(0), 2096 + .hw.init = &(struct clk_init_data){ 2097 + .name = "gcc_mss_at_clk", 2098 + .ops = &clk_branch2_ops, 2099 + }, 2100 + }, 2101 + }; 2102 + 2103 + static struct clk_branch gcc_pcie_0_aux_clk = { 2104 + .halt_reg = 0x6b014, 2105 + .halt_check = BRANCH_HALT, 2106 + .clkr = { 2107 + .enable_reg = 0x6b014, 2108 + .enable_mask = BIT(0), 2109 + .hw.init = &(struct clk_init_data){ 2110 + .name = "gcc_pcie_0_aux_clk", 2111 + .parent_names = (const char *[]){ 2112 + "pcie_aux_clk_src", 2113 + }, 2114 + .num_parents = 1, 2115 + .ops = &clk_branch2_ops, 2116 + }, 2117 + }, 2118 + }; 2119 + 2120 + static struct clk_branch gcc_pcie_0_cfg_ahb_clk = { 2121 + .halt_reg = 0x6b010, 2122 + .halt_check = BRANCH_HALT, 2123 + .clkr = { 2124 + .enable_reg = 0x6b010, 2125 + .enable_mask = BIT(0), 2126 + .hw.init = &(struct clk_init_data){ 2127 + .name = "gcc_pcie_0_cfg_ahb_clk", 2128 + .ops = &clk_branch2_ops, 2129 + }, 2130 + }, 2131 + }; 2132 + 2133 + static struct clk_branch gcc_pcie_0_mstr_axi_clk = { 2134 + .halt_reg = 0x6b00c, 2135 + .halt_check = BRANCH_HALT, 2136 + .clkr = { 2137 + .enable_reg = 0x6b00c, 2138 + .enable_mask = BIT(0), 2139 + .hw.init = &(struct clk_init_data){ 2140 + .name = "gcc_pcie_0_mstr_axi_clk", 2141 + .ops = &clk_branch2_ops, 2142 + }, 2143 + }, 2144 + }; 2145 + 2146 + static struct clk_branch gcc_pcie_0_pipe_clk = { 2147 + .halt_reg = 0x6b018, 2148 + .halt_check = BRANCH_HALT, 2149 + .clkr = { 2150 + .enable_reg = 0x6b018, 2151 + .enable_mask = BIT(0), 2152 + .hw.init = &(struct clk_init_data){ 2153 + .name = "gcc_pcie_0_pipe_clk", 2154 + .ops = &clk_branch2_ops, 2155 + }, 2156 + }, 2157 + }; 2158 + 2159 + static struct clk_branch gcc_pcie_0_slv_axi_clk = { 2160 + .halt_reg = 0x6b008, 2161 + .halt_check = BRANCH_HALT, 2162 + .clkr = { 2163 + .enable_reg = 0x6b008, 2164 + .enable_mask = BIT(0), 2165 + .hw.init = &(struct clk_init_data){ 2166 + .name = "gcc_pcie_0_slv_axi_clk", 2167 + .ops = &clk_branch2_ops, 2168 + }, 2169 + }, 2170 + }; 2171 + 2172 + static struct clk_branch gcc_pcie_phy_aux_clk = { 2173 + .halt_reg = 0x6f004, 2174 + .halt_check = BRANCH_HALT, 2175 + .clkr = { 2176 + .enable_reg = 0x6f004, 2177 + .enable_mask = BIT(0), 2178 + .hw.init = &(struct clk_init_data){ 2179 + .name = "gcc_pcie_phy_aux_clk", 2180 + .parent_names = (const char *[]){ 2181 + "pcie_aux_clk_src", 2182 + }, 2183 + .num_parents = 1, 2184 + .ops = &clk_branch2_ops, 2185 + }, 2186 + }, 2187 + }; 2188 + 2189 + static struct clk_branch gcc_pdm2_clk = { 2190 + .halt_reg = 0x3300c, 2191 + .halt_check = BRANCH_HALT, 2192 + .clkr = { 2193 + .enable_reg = 0x3300c, 2194 + .enable_mask = BIT(0), 2195 + .hw.init = &(struct clk_init_data){ 2196 + .name = "gcc_pdm2_clk", 2197 + .parent_names = (const char *[]){ 2198 + "pdm2_clk_src", 2199 + }, 2200 + .num_parents = 1, 2201 + .ops = &clk_branch2_ops, 2202 + }, 2203 + }, 2204 + }; 2205 + 2206 + static struct clk_branch gcc_pdm_ahb_clk = { 2207 + .halt_reg = 0x33004, 2208 + .halt_check = BRANCH_HALT, 2209 + .clkr = { 2210 + .enable_reg = 0x33004, 2211 + .enable_mask = BIT(0), 2212 + .hw.init = &(struct clk_init_data){ 2213 + .name = "gcc_pdm_ahb_clk", 2214 + .ops = &clk_branch2_ops, 2215 + }, 2216 + }, 2217 + }; 2218 + 2219 + static struct clk_branch gcc_pdm_xo4_clk = { 2220 + .halt_reg = 0x33008, 2221 + .halt_check = BRANCH_HALT, 2222 + .clkr = { 2223 + .enable_reg = 0x33008, 2224 + .enable_mask = BIT(0), 2225 + .hw.init = &(struct clk_init_data){ 2226 + .name = "gcc_pdm_xo4_clk", 2227 + .ops = &clk_branch2_ops, 2228 + }, 2229 + }, 2230 + }; 2231 + 2232 + static struct clk_branch gcc_prng_ahb_clk = { 2233 + .halt_reg = 0x34004, 2234 + .halt_check = BRANCH_HALT_VOTED, 2235 + .clkr = { 2236 + .enable_reg = 0x52004, 2237 + .enable_mask = BIT(13), 2238 + .hw.init = &(struct clk_init_data){ 2239 + .name = "gcc_prng_ahb_clk", 2240 + .ops = &clk_branch2_ops, 2241 + }, 2242 + }, 2243 + }; 2244 + 2245 + static struct clk_branch gcc_sdcc2_ahb_clk = { 2246 + .halt_reg = 0x14008, 2247 + .halt_check = BRANCH_HALT, 2248 + .clkr = { 2249 + .enable_reg = 0x14008, 2250 + .enable_mask = BIT(0), 2251 + .hw.init = &(struct clk_init_data){ 2252 + .name = "gcc_sdcc2_ahb_clk", 2253 + .ops = &clk_branch2_ops, 2254 + }, 2255 + }, 2256 + }; 2257 + 2258 + static struct clk_branch gcc_sdcc2_apps_clk = { 2259 + .halt_reg = 0x14004, 2260 + .halt_check = BRANCH_HALT, 2261 + .clkr = { 2262 + .enable_reg = 0x14004, 2263 + .enable_mask = BIT(0), 2264 + .hw.init = &(struct clk_init_data){ 2265 + .name = "gcc_sdcc2_apps_clk", 2266 + .parent_names = (const char *[]){ 2267 + "sdcc2_apps_clk_src", 2268 + }, 2269 + .num_parents = 1, 2270 + .ops = &clk_branch2_ops, 2271 + }, 2272 + }, 2273 + }; 2274 + 2275 + static struct clk_branch gcc_sdcc4_ahb_clk = { 2276 + .halt_reg = 0x16008, 2277 + .halt_check = BRANCH_HALT, 2278 + .clkr = { 2279 + .enable_reg = 0x16008, 2280 + .enable_mask = BIT(0), 2281 + .hw.init = &(struct clk_init_data){ 2282 + .name = "gcc_sdcc4_ahb_clk", 2283 + .ops = &clk_branch2_ops, 2284 + }, 2285 + }, 2286 + }; 2287 + 2288 + static struct clk_branch gcc_sdcc4_apps_clk = { 2289 + .halt_reg = 0x16004, 2290 + .halt_check = BRANCH_HALT, 2291 + .clkr = { 2292 + .enable_reg = 0x16004, 2293 + .enable_mask = BIT(0), 2294 + .hw.init = &(struct clk_init_data){ 2295 + .name = "gcc_sdcc4_apps_clk", 2296 + .parent_names = (const char *[]){ 2297 + "sdcc4_apps_clk_src", 2298 + }, 2299 + .num_parents = 1, 2300 + .ops = &clk_branch2_ops, 2301 + }, 2302 + }, 2303 + }; 2304 + 2305 + static struct clk_branch gcc_tsif_ahb_clk = { 2306 + .halt_reg = 0x36004, 2307 + .halt_check = BRANCH_HALT, 2308 + .clkr = { 2309 + .enable_reg = 0x36004, 2310 + .enable_mask = BIT(0), 2311 + .hw.init = &(struct clk_init_data){ 2312 + .name = "gcc_tsif_ahb_clk", 2313 + .ops = &clk_branch2_ops, 2314 + }, 2315 + }, 2316 + }; 2317 + 2318 + static struct clk_branch gcc_tsif_inactivity_timers_clk = { 2319 + .halt_reg = 0x3600c, 2320 + .halt_check = BRANCH_HALT, 2321 + .clkr = { 2322 + .enable_reg = 0x3600c, 2323 + .enable_mask = BIT(0), 2324 + .hw.init = &(struct clk_init_data){ 2325 + .name = "gcc_tsif_inactivity_timers_clk", 2326 + .ops = &clk_branch2_ops, 2327 + }, 2328 + }, 2329 + }; 2330 + 2331 + static struct clk_branch gcc_tsif_ref_clk = { 2332 + .halt_reg = 0x36008, 2333 + .halt_check = BRANCH_HALT, 2334 + .clkr = { 2335 + .enable_reg = 0x36008, 2336 + .enable_mask = BIT(0), 2337 + .hw.init = &(struct clk_init_data){ 2338 + .name = "gcc_tsif_ref_clk", 2339 + .parent_names = (const char *[]){ 2340 + "tsif_ref_clk_src", 2341 + }, 2342 + .num_parents = 1, 2343 + .ops = &clk_branch2_ops, 2344 + }, 2345 + }, 2346 + }; 2347 + 2348 + static struct clk_branch gcc_ufs_ahb_clk = { 2349 + .halt_reg = 0x7500c, 2350 + .halt_check = BRANCH_HALT, 2351 + .clkr = { 2352 + .enable_reg = 0x7500c, 2353 + .enable_mask = BIT(0), 2354 + .hw.init = &(struct clk_init_data){ 2355 + .name = "gcc_ufs_ahb_clk", 2356 + .ops = &clk_branch2_ops, 2357 + }, 2358 + }, 2359 + }; 2360 + 2361 + static struct clk_branch gcc_ufs_axi_clk = { 2362 + .halt_reg = 0x75008, 2363 + .halt_check = BRANCH_HALT, 2364 + .clkr = { 2365 + .enable_reg = 0x75008, 2366 + .enable_mask = BIT(0), 2367 + .hw.init = &(struct clk_init_data){ 2368 + .name = "gcc_ufs_axi_clk", 2369 + .parent_names = (const char *[]){ 2370 + "ufs_axi_clk_src", 2371 + }, 2372 + .num_parents = 1, 2373 + .ops = &clk_branch2_ops, 2374 + }, 2375 + }, 2376 + }; 2377 + 2378 + static struct clk_branch gcc_ufs_ice_core_clk = { 2379 + .halt_reg = 0x7600c, 2380 + .halt_check = BRANCH_HALT, 2381 + .clkr = { 2382 + .enable_reg = 0x7600c, 2383 + .enable_mask = BIT(0), 2384 + .hw.init = &(struct clk_init_data){ 2385 + .name = "gcc_ufs_ice_core_clk", 2386 + .ops = &clk_branch2_ops, 2387 + }, 2388 + }, 2389 + }; 2390 + 2391 + static struct clk_branch gcc_ufs_phy_aux_clk = { 2392 + .halt_reg = 0x76040, 2393 + .halt_check = BRANCH_HALT, 2394 + .clkr = { 2395 + .enable_reg = 0x76040, 2396 + .enable_mask = BIT(0), 2397 + .hw.init = &(struct clk_init_data){ 2398 + .name = "gcc_ufs_phy_aux_clk", 2399 + .ops = &clk_branch2_ops, 2400 + }, 2401 + }, 2402 + }; 2403 + 2404 + static struct clk_branch gcc_ufs_rx_symbol_0_clk = { 2405 + .halt_reg = 0x75014, 2406 + .halt_check = BRANCH_HALT, 2407 + .clkr = { 2408 + .enable_reg = 0x75014, 2409 + .enable_mask = BIT(0), 2410 + .hw.init = &(struct clk_init_data){ 2411 + .name = "gcc_ufs_rx_symbol_0_clk", 2412 + .ops = &clk_branch2_ops, 2413 + }, 2414 + }, 2415 + }; 2416 + 2417 + static struct clk_branch gcc_ufs_rx_symbol_1_clk = { 2418 + .halt_reg = 0x7605c, 2419 + .halt_check = BRANCH_HALT, 2420 + .clkr = { 2421 + .enable_reg = 0x7605c, 2422 + .enable_mask = BIT(0), 2423 + .hw.init = &(struct clk_init_data){ 2424 + .name = "gcc_ufs_rx_symbol_1_clk", 2425 + .ops = &clk_branch2_ops, 2426 + }, 2427 + }, 2428 + }; 2429 + 2430 + static struct clk_branch gcc_ufs_tx_symbol_0_clk = { 2431 + .halt_reg = 0x75010, 2432 + .halt_check = BRANCH_HALT, 2433 + .clkr = { 2434 + .enable_reg = 0x75010, 2435 + .enable_mask = BIT(0), 2436 + .hw.init = &(struct clk_init_data){ 2437 + .name = "gcc_ufs_tx_symbol_0_clk", 2438 + .ops = &clk_branch2_ops, 2439 + }, 2440 + }, 2441 + }; 2442 + 2443 + static struct clk_branch gcc_ufs_unipro_core_clk = { 2444 + .halt_reg = 0x76008, 2445 + .halt_check = BRANCH_HALT, 2446 + .clkr = { 2447 + .enable_reg = 0x76008, 2448 + .enable_mask = BIT(0), 2449 + .hw.init = &(struct clk_init_data){ 2450 + .name = "gcc_ufs_unipro_core_clk", 2451 + .ops = &clk_branch2_ops, 2452 + }, 2453 + }, 2454 + }; 2455 + 2456 + static struct clk_branch gcc_usb30_master_clk = { 2457 + .halt_reg = 0xf008, 2458 + .halt_check = BRANCH_HALT, 2459 + .clkr = { 2460 + .enable_reg = 0xf008, 2461 + .enable_mask = BIT(0), 2462 + .hw.init = &(struct clk_init_data){ 2463 + .name = "gcc_usb30_master_clk", 2464 + .parent_names = (const char *[]){ 2465 + "usb30_master_clk_src", 2466 + }, 2467 + .num_parents = 1, 2468 + .ops = &clk_branch2_ops, 2469 + }, 2470 + }, 2471 + }; 2472 + 2473 + static struct clk_branch gcc_usb30_mock_utmi_clk = { 2474 + .halt_reg = 0xf010, 2475 + .halt_check = BRANCH_HALT, 2476 + .clkr = { 2477 + .enable_reg = 0xf010, 2478 + .enable_mask = BIT(0), 2479 + .hw.init = &(struct clk_init_data){ 2480 + .name = "gcc_usb30_mock_utmi_clk", 2481 + .parent_names = (const char *[]){ 2482 + "usb30_mock_utmi_clk_src", 2483 + }, 2484 + .num_parents = 1, 2485 + .ops = &clk_branch2_ops, 2486 + }, 2487 + }, 2488 + }; 2489 + 2490 + static struct clk_branch gcc_usb30_sleep_clk = { 2491 + .halt_reg = 0xf00c, 2492 + .halt_check = BRANCH_HALT, 2493 + .clkr = { 2494 + .enable_reg = 0xf00c, 2495 + .enable_mask = BIT(0), 2496 + .hw.init = &(struct clk_init_data){ 2497 + .name = "gcc_usb30_sleep_clk", 2498 + .ops = &clk_branch2_ops, 2499 + }, 2500 + }, 2501 + }; 2502 + 2503 + static struct clk_branch gcc_usb3_phy_aux_clk = { 2504 + .halt_reg = 0x50000, 2505 + .halt_check = BRANCH_HALT, 2506 + .clkr = { 2507 + .enable_reg = 0x50000, 2508 + .enable_mask = BIT(0), 2509 + .hw.init = &(struct clk_init_data){ 2510 + .name = "gcc_usb3_phy_aux_clk", 2511 + .parent_names = (const char *[]){ 2512 + "usb3_phy_aux_clk_src", 2513 + }, 2514 + .num_parents = 1, 2515 + .ops = &clk_branch2_ops, 2516 + }, 2517 + }, 2518 + }; 2519 + 2520 + static struct clk_branch gcc_usb3_phy_pipe_clk = { 2521 + .halt_reg = 0x50004, 2522 + .halt_check = BRANCH_HALT, 2523 + .clkr = { 2524 + .enable_reg = 0x50004, 2525 + .enable_mask = BIT(0), 2526 + .hw.init = &(struct clk_init_data){ 2527 + .name = "gcc_usb3_phy_pipe_clk", 2528 + .ops = &clk_branch2_ops, 2529 + }, 2530 + }, 2531 + }; 2532 + 2533 + static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = { 2534 + .halt_reg = 0x6a004, 2535 + .halt_check = BRANCH_HALT, 2536 + .clkr = { 2537 + .enable_reg = 0x6a004, 2538 + .enable_mask = BIT(0), 2539 + .hw.init = &(struct clk_init_data){ 2540 + .name = "gcc_usb_phy_cfg_ahb2phy_clk", 2541 + .ops = &clk_branch2_ops, 2542 + }, 2543 + }, 2544 + }; 2545 + 2546 + static struct gdsc pcie_0_gdsc = { 2547 + .gdscr = 0x6b004, 2548 + .gds_hw_ctrl = 0x0, 2549 + .pd = { 2550 + .name = "pcie_0_gdsc", 2551 + }, 2552 + .pwrsts = PWRSTS_OFF_ON, 2553 + .flags = VOTABLE, 2554 + }; 2555 + 2556 + static struct gdsc ufs_gdsc = { 2557 + .gdscr = 0x75004, 2558 + .gds_hw_ctrl = 0x0, 2559 + .pd = { 2560 + .name = "ufs_gdsc", 2561 + }, 2562 + .pwrsts = PWRSTS_OFF_ON, 2563 + .flags = VOTABLE, 2564 + }; 2565 + 2566 + static struct gdsc usb_30_gdsc = { 2567 + .gdscr = 0xf004, 2568 + .gds_hw_ctrl = 0x0, 2569 + .pd = { 2570 + .name = "usb_30_gdsc", 2571 + }, 2572 + .pwrsts = PWRSTS_OFF_ON, 2573 + .flags = VOTABLE, 2574 + }; 2575 + 2576 + static struct clk_regmap *gcc_msm8998_clocks[] = { 2577 + [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr, 2578 + [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr, 2579 + [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr, 2580 + [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr, 2581 + [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr, 2582 + [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr, 2583 + [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr, 2584 + [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr, 2585 + [BLSP1_QUP5_I2C_APPS_CLK_SRC] = &blsp1_qup5_i2c_apps_clk_src.clkr, 2586 + [BLSP1_QUP5_SPI_APPS_CLK_SRC] = &blsp1_qup5_spi_apps_clk_src.clkr, 2587 + [BLSP1_QUP6_I2C_APPS_CLK_SRC] = &blsp1_qup6_i2c_apps_clk_src.clkr, 2588 + [BLSP1_QUP6_SPI_APPS_CLK_SRC] = &blsp1_qup6_spi_apps_clk_src.clkr, 2589 + [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr, 2590 + [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr, 2591 + [BLSP1_UART3_APPS_CLK_SRC] = &blsp1_uart3_apps_clk_src.clkr, 2592 + [BLSP2_QUP1_I2C_APPS_CLK_SRC] = &blsp2_qup1_i2c_apps_clk_src.clkr, 2593 + [BLSP2_QUP1_SPI_APPS_CLK_SRC] = &blsp2_qup1_spi_apps_clk_src.clkr, 2594 + [BLSP2_QUP2_I2C_APPS_CLK_SRC] = &blsp2_qup2_i2c_apps_clk_src.clkr, 2595 + [BLSP2_QUP2_SPI_APPS_CLK_SRC] = &blsp2_qup2_spi_apps_clk_src.clkr, 2596 + [BLSP2_QUP3_I2C_APPS_CLK_SRC] = &blsp2_qup3_i2c_apps_clk_src.clkr, 2597 + [BLSP2_QUP3_SPI_APPS_CLK_SRC] = &blsp2_qup3_spi_apps_clk_src.clkr, 2598 + [BLSP2_QUP4_I2C_APPS_CLK_SRC] = &blsp2_qup4_i2c_apps_clk_src.clkr, 2599 + [BLSP2_QUP4_SPI_APPS_CLK_SRC] = &blsp2_qup4_spi_apps_clk_src.clkr, 2600 + [BLSP2_QUP5_I2C_APPS_CLK_SRC] = &blsp2_qup5_i2c_apps_clk_src.clkr, 2601 + [BLSP2_QUP5_SPI_APPS_CLK_SRC] = &blsp2_qup5_spi_apps_clk_src.clkr, 2602 + [BLSP2_QUP6_I2C_APPS_CLK_SRC] = &blsp2_qup6_i2c_apps_clk_src.clkr, 2603 + [BLSP2_QUP6_SPI_APPS_CLK_SRC] = &blsp2_qup6_spi_apps_clk_src.clkr, 2604 + [BLSP2_UART1_APPS_CLK_SRC] = &blsp2_uart1_apps_clk_src.clkr, 2605 + [BLSP2_UART2_APPS_CLK_SRC] = &blsp2_uart2_apps_clk_src.clkr, 2606 + [BLSP2_UART3_APPS_CLK_SRC] = &blsp2_uart3_apps_clk_src.clkr, 2607 + [GCC_AGGRE1_NOC_XO_CLK] = &gcc_aggre1_noc_xo_clk.clkr, 2608 + [GCC_AGGRE1_UFS_AXI_CLK] = &gcc_aggre1_ufs_axi_clk.clkr, 2609 + [GCC_AGGRE1_USB3_AXI_CLK] = &gcc_aggre1_usb3_axi_clk.clkr, 2610 + [GCC_APSS_QDSS_TSCTR_DIV2_CLK] = &gcc_apss_qdss_tsctr_div2_clk.clkr, 2611 + [GCC_APSS_QDSS_TSCTR_DIV8_CLK] = &gcc_apss_qdss_tsctr_div8_clk.clkr, 2612 + [GCC_BIMC_HMSS_AXI_CLK] = &gcc_bimc_hmss_axi_clk.clkr, 2613 + [GCC_BIMC_MSS_Q6_AXI_CLK] = &gcc_bimc_mss_q6_axi_clk.clkr, 2614 + [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr, 2615 + [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr, 2616 + [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr, 2617 + [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr, 2618 + [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr, 2619 + [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr, 2620 + [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr, 2621 + [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr, 2622 + [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr, 2623 + [GCC_BLSP1_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr, 2624 + [GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr, 2625 + [GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr, 2626 + [GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_spi_apps_clk.clkr, 2627 + [GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr, 2628 + [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr, 2629 + [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr, 2630 + [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr, 2631 + [GCC_BLSP2_AHB_CLK] = &gcc_blsp2_ahb_clk.clkr, 2632 + [GCC_BLSP2_QUP1_I2C_APPS_CLK] = &gcc_blsp2_qup1_i2c_apps_clk.clkr, 2633 + [GCC_BLSP2_QUP1_SPI_APPS_CLK] = &gcc_blsp2_qup1_spi_apps_clk.clkr, 2634 + [GCC_BLSP2_QUP2_I2C_APPS_CLK] = &gcc_blsp2_qup2_i2c_apps_clk.clkr, 2635 + [GCC_BLSP2_QUP2_SPI_APPS_CLK] = &gcc_blsp2_qup2_spi_apps_clk.clkr, 2636 + [GCC_BLSP2_QUP3_I2C_APPS_CLK] = &gcc_blsp2_qup3_i2c_apps_clk.clkr, 2637 + [GCC_BLSP2_QUP3_SPI_APPS_CLK] = &gcc_blsp2_qup3_spi_apps_clk.clkr, 2638 + [GCC_BLSP2_QUP4_I2C_APPS_CLK] = &gcc_blsp2_qup4_i2c_apps_clk.clkr, 2639 + [GCC_BLSP2_QUP4_SPI_APPS_CLK] = &gcc_blsp2_qup4_spi_apps_clk.clkr, 2640 + [GCC_BLSP2_QUP5_I2C_APPS_CLK] = &gcc_blsp2_qup5_i2c_apps_clk.clkr, 2641 + [GCC_BLSP2_QUP5_SPI_APPS_CLK] = &gcc_blsp2_qup5_spi_apps_clk.clkr, 2642 + [GCC_BLSP2_QUP6_I2C_APPS_CLK] = &gcc_blsp2_qup6_i2c_apps_clk.clkr, 2643 + [GCC_BLSP2_QUP6_SPI_APPS_CLK] = &gcc_blsp2_qup6_spi_apps_clk.clkr, 2644 + [GCC_BLSP2_SLEEP_CLK] = &gcc_blsp2_sleep_clk.clkr, 2645 + [GCC_BLSP2_UART1_APPS_CLK] = &gcc_blsp2_uart1_apps_clk.clkr, 2646 + [GCC_BLSP2_UART2_APPS_CLK] = &gcc_blsp2_uart2_apps_clk.clkr, 2647 + [GCC_BLSP2_UART3_APPS_CLK] = &gcc_blsp2_uart3_apps_clk.clkr, 2648 + [GCC_CFG_NOC_USB3_AXI_CLK] = &gcc_cfg_noc_usb3_axi_clk.clkr, 2649 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 2650 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 2651 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 2652 + [GCC_GPU_BIMC_GFX_CLK] = &gcc_gpu_bimc_gfx_clk.clkr, 2653 + [GCC_GPU_BIMC_GFX_SRC_CLK] = &gcc_gpu_bimc_gfx_src_clk.clkr, 2654 + [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr, 2655 + [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, 2656 + [GCC_HMSS_AHB_CLK] = &gcc_hmss_ahb_clk.clkr, 2657 + [GCC_HMSS_AT_CLK] = &gcc_hmss_at_clk.clkr, 2658 + [GCC_HMSS_DVM_BUS_CLK] = &gcc_hmss_dvm_bus_clk.clkr, 2659 + [GCC_HMSS_RBCPR_CLK] = &gcc_hmss_rbcpr_clk.clkr, 2660 + [GCC_HMSS_TRIG_CLK] = &gcc_hmss_trig_clk.clkr, 2661 + [GCC_LPASS_AT_CLK] = &gcc_lpass_at_clk.clkr, 2662 + [GCC_LPASS_TRIG_CLK] = &gcc_lpass_trig_clk.clkr, 2663 + [GCC_MMSS_NOC_CFG_AHB_CLK] = &gcc_mmss_noc_cfg_ahb_clk.clkr, 2664 + [GCC_MMSS_QM_AHB_CLK] = &gcc_mmss_qm_ahb_clk.clkr, 2665 + [GCC_MMSS_QM_CORE_CLK] = &gcc_mmss_qm_core_clk.clkr, 2666 + [GCC_MMSS_SYS_NOC_AXI_CLK] = &gcc_mmss_sys_noc_axi_clk.clkr, 2667 + [GCC_MSS_AT_CLK] = &gcc_mss_at_clk.clkr, 2668 + [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr, 2669 + [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr, 2670 + [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr, 2671 + [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr, 2672 + [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr, 2673 + [GCC_PCIE_PHY_AUX_CLK] = &gcc_pcie_phy_aux_clk.clkr, 2674 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 2675 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 2676 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 2677 + [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, 2678 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 2679 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 2680 + [GCC_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr, 2681 + [GCC_SDCC4_APPS_CLK] = &gcc_sdcc4_apps_clk.clkr, 2682 + [GCC_TSIF_AHB_CLK] = &gcc_tsif_ahb_clk.clkr, 2683 + [GCC_TSIF_INACTIVITY_TIMERS_CLK] = &gcc_tsif_inactivity_timers_clk.clkr, 2684 + [GCC_TSIF_REF_CLK] = &gcc_tsif_ref_clk.clkr, 2685 + [GCC_UFS_AHB_CLK] = &gcc_ufs_ahb_clk.clkr, 2686 + [GCC_UFS_AXI_CLK] = &gcc_ufs_axi_clk.clkr, 2687 + [GCC_UFS_ICE_CORE_CLK] = &gcc_ufs_ice_core_clk.clkr, 2688 + [GCC_UFS_PHY_AUX_CLK] = &gcc_ufs_phy_aux_clk.clkr, 2689 + [GCC_UFS_RX_SYMBOL_0_CLK] = &gcc_ufs_rx_symbol_0_clk.clkr, 2690 + [GCC_UFS_RX_SYMBOL_1_CLK] = &gcc_ufs_rx_symbol_1_clk.clkr, 2691 + [GCC_UFS_TX_SYMBOL_0_CLK] = &gcc_ufs_tx_symbol_0_clk.clkr, 2692 + [GCC_UFS_UNIPRO_CORE_CLK] = &gcc_ufs_unipro_core_clk.clkr, 2693 + [GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr, 2694 + [GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr, 2695 + [GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr, 2696 + [GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr, 2697 + [GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr, 2698 + [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr, 2699 + [GP1_CLK_SRC] = &gp1_clk_src.clkr, 2700 + [GP2_CLK_SRC] = &gp2_clk_src.clkr, 2701 + [GP3_CLK_SRC] = &gp3_clk_src.clkr, 2702 + [GPLL0] = &gpll0.clkr, 2703 + [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr, 2704 + [GPLL0_OUT_MAIN] = &gpll0_out_main.clkr, 2705 + [GPLL0_OUT_ODD] = &gpll0_out_odd.clkr, 2706 + [GPLL0_OUT_TEST] = &gpll0_out_test.clkr, 2707 + [GPLL1] = &gpll1.clkr, 2708 + [GPLL1_OUT_EVEN] = &gpll1_out_even.clkr, 2709 + [GPLL1_OUT_MAIN] = &gpll1_out_main.clkr, 2710 + [GPLL1_OUT_ODD] = &gpll1_out_odd.clkr, 2711 + [GPLL1_OUT_TEST] = &gpll1_out_test.clkr, 2712 + [GPLL2] = &gpll2.clkr, 2713 + [GPLL2_OUT_EVEN] = &gpll2_out_even.clkr, 2714 + [GPLL2_OUT_MAIN] = &gpll2_out_main.clkr, 2715 + [GPLL2_OUT_ODD] = &gpll2_out_odd.clkr, 2716 + [GPLL2_OUT_TEST] = &gpll2_out_test.clkr, 2717 + [GPLL3] = &gpll3.clkr, 2718 + [GPLL3_OUT_EVEN] = &gpll3_out_even.clkr, 2719 + [GPLL3_OUT_MAIN] = &gpll3_out_main.clkr, 2720 + [GPLL3_OUT_ODD] = &gpll3_out_odd.clkr, 2721 + [GPLL3_OUT_TEST] = &gpll3_out_test.clkr, 2722 + [GPLL4] = &gpll4.clkr, 2723 + [GPLL4_OUT_EVEN] = &gpll4_out_even.clkr, 2724 + [GPLL4_OUT_MAIN] = &gpll4_out_main.clkr, 2725 + [GPLL4_OUT_ODD] = &gpll4_out_odd.clkr, 2726 + [GPLL4_OUT_TEST] = &gpll4_out_test.clkr, 2727 + [HMSS_AHB_CLK_SRC] = &hmss_ahb_clk_src.clkr, 2728 + [HMSS_RBCPR_CLK_SRC] = &hmss_rbcpr_clk_src.clkr, 2729 + [PCIE_AUX_CLK_SRC] = &pcie_aux_clk_src.clkr, 2730 + [PDM2_CLK_SRC] = &pdm2_clk_src.clkr, 2731 + [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr, 2732 + [SDCC4_APPS_CLK_SRC] = &sdcc4_apps_clk_src.clkr, 2733 + [TSIF_REF_CLK_SRC] = &tsif_ref_clk_src.clkr, 2734 + [UFS_AXI_CLK_SRC] = &ufs_axi_clk_src.clkr, 2735 + [USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr, 2736 + [USB30_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr, 2737 + [USB3_PHY_AUX_CLK_SRC] = &usb3_phy_aux_clk_src.clkr, 2738 + }; 2739 + 2740 + static struct gdsc *gcc_msm8998_gdscs[] = { 2741 + [PCIE_0_GDSC] = &pcie_0_gdsc, 2742 + [UFS_GDSC] = &ufs_gdsc, 2743 + [USB_30_GDSC] = &usb_30_gdsc, 2744 + }; 2745 + 2746 + static const struct qcom_reset_map gcc_msm8998_resets[] = { 2747 + [GCC_BLSP1_QUP1_BCR] = { 0x102400 }, 2748 + [GCC_BLSP1_QUP2_BCR] = { 0x110592 }, 2749 + [GCC_BLSP1_QUP3_BCR] = { 0x118784 }, 2750 + [GCC_BLSP1_QUP4_BCR] = { 0x126976 }, 2751 + [GCC_BLSP1_QUP5_BCR] = { 0x135168 }, 2752 + [GCC_BLSP1_QUP6_BCR] = { 0x143360 }, 2753 + [GCC_BLSP2_QUP1_BCR] = { 0x155648 }, 2754 + [GCC_BLSP2_QUP2_BCR] = { 0x163840 }, 2755 + [GCC_BLSP2_QUP3_BCR] = { 0x172032 }, 2756 + [GCC_BLSP2_QUP4_BCR] = { 0x180224 }, 2757 + [GCC_BLSP2_QUP5_BCR] = { 0x188416 }, 2758 + [GCC_BLSP2_QUP6_BCR] = { 0x196608 }, 2759 + [GCC_PCIE_0_BCR] = { 0x438272 }, 2760 + [GCC_PDM_BCR] = { 0x208896 }, 2761 + [GCC_SDCC2_BCR] = { 0x81920 }, 2762 + [GCC_SDCC4_BCR] = { 0x90112 }, 2763 + [GCC_TSIF_BCR] = { 0x221184 }, 2764 + [GCC_UFS_BCR] = { 0x479232 }, 2765 + [GCC_USB_30_BCR] = { 0x61440 }, 2766 + }; 2767 + 2768 + static const struct regmap_config gcc_msm8998_regmap_config = { 2769 + .reg_bits = 32, 2770 + .reg_stride = 4, 2771 + .val_bits = 32, 2772 + .max_register = 0x8f000, 2773 + .fast_io = true, 2774 + }; 2775 + 2776 + static const struct qcom_cc_desc gcc_msm8998_desc = { 2777 + .config = &gcc_msm8998_regmap_config, 2778 + .clks = gcc_msm8998_clocks, 2779 + .num_clks = ARRAY_SIZE(gcc_msm8998_clocks), 2780 + .resets = gcc_msm8998_resets, 2781 + .num_resets = ARRAY_SIZE(gcc_msm8998_resets), 2782 + .gdscs = gcc_msm8998_gdscs, 2783 + .num_gdscs = ARRAY_SIZE(gcc_msm8998_gdscs), 2784 + }; 2785 + 2786 + static int gcc_msm8998_probe(struct platform_device *pdev) 2787 + { 2788 + struct regmap *regmap; 2789 + int ret; 2790 + 2791 + regmap = qcom_cc_map(pdev, &gcc_msm8998_desc); 2792 + if (IS_ERR(regmap)) 2793 + return PTR_ERR(regmap); 2794 + 2795 + /* 2796 + * Set the HMSS_AHB_CLK_SLEEP_ENA bit to allow the hmss_ahb_clk to be 2797 + * turned off by hardware during certain apps low power modes. 2798 + */ 2799 + ret = regmap_update_bits(regmap, 0x52008, BIT(21), BIT(21)); 2800 + if (ret) 2801 + return ret; 2802 + 2803 + return qcom_cc_really_probe(pdev, &gcc_msm8998_desc, regmap); 2804 + } 2805 + 2806 + static const struct of_device_id gcc_msm8998_match_table[] = { 2807 + { .compatible = "qcom,gcc-msm8998" }, 2808 + { } 2809 + }; 2810 + MODULE_DEVICE_TABLE(of, gcc_msm8998_match_table); 2811 + 2812 + static struct platform_driver gcc_msm8998_driver = { 2813 + .probe = gcc_msm8998_probe, 2814 + .driver = { 2815 + .name = "gcc-msm8998", 2816 + .of_match_table = gcc_msm8998_match_table, 2817 + }, 2818 + }; 2819 + 2820 + static int __init gcc_msm8998_init(void) 2821 + { 2822 + return platform_driver_register(&gcc_msm8998_driver); 2823 + } 2824 + core_initcall(gcc_msm8998_init); 2825 + 2826 + static void __exit gcc_msm8998_exit(void) 2827 + { 2828 + platform_driver_unregister(&gcc_msm8998_driver); 2829 + } 2830 + module_exit(gcc_msm8998_exit); 2831 + 2832 + MODULE_DESCRIPTION("QCOM GCC msm8998 Driver"); 2833 + MODULE_LICENSE("GPL v2"); 2834 + MODULE_ALIAS("platform:gcc-msm8998");
+3465
drivers/clk/qcom/gcc-sdm845.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2018, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/kernel.h> 7 + #include <linux/bitops.h> 8 + #include <linux/err.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/module.h> 11 + #include <linux/of.h> 12 + #include <linux/of_device.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/regmap.h> 15 + #include <linux/reset-controller.h> 16 + 17 + #include <dt-bindings/clock/qcom,gcc-sdm845.h> 18 + 19 + #include "common.h" 20 + #include "clk-regmap.h" 21 + #include "clk-pll.h" 22 + #include "clk-rcg.h" 23 + #include "clk-branch.h" 24 + #include "clk-alpha-pll.h" 25 + #include "gdsc.h" 26 + #include "reset.h" 27 + 28 + #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) } 29 + 30 + enum { 31 + P_BI_TCXO, 32 + P_AUD_REF_CLK, 33 + P_CORE_BI_PLL_TEST_SE, 34 + P_GPLL0_OUT_EVEN, 35 + P_GPLL0_OUT_MAIN, 36 + P_GPLL4_OUT_MAIN, 37 + P_SLEEP_CLK, 38 + }; 39 + 40 + static const struct parent_map gcc_parent_map_0[] = { 41 + { P_BI_TCXO, 0 }, 42 + { P_GPLL0_OUT_MAIN, 1 }, 43 + { P_GPLL0_OUT_EVEN, 6 }, 44 + { P_CORE_BI_PLL_TEST_SE, 7 }, 45 + }; 46 + 47 + static const char * const gcc_parent_names_0[] = { 48 + "bi_tcxo", 49 + "gpll0", 50 + "gpll0_out_even", 51 + "core_bi_pll_test_se", 52 + }; 53 + 54 + static const struct parent_map gcc_parent_map_1[] = { 55 + { P_BI_TCXO, 0 }, 56 + { P_GPLL0_OUT_MAIN, 1 }, 57 + { P_SLEEP_CLK, 5 }, 58 + { P_GPLL0_OUT_EVEN, 6 }, 59 + { P_CORE_BI_PLL_TEST_SE, 7 }, 60 + }; 61 + 62 + static const char * const gcc_parent_names_1[] = { 63 + "bi_tcxo", 64 + "gpll0", 65 + "core_pi_sleep_clk", 66 + "gpll0_out_even", 67 + "core_bi_pll_test_se", 68 + }; 69 + 70 + static const struct parent_map gcc_parent_map_2[] = { 71 + { P_BI_TCXO, 0 }, 72 + { P_SLEEP_CLK, 5 }, 73 + { P_CORE_BI_PLL_TEST_SE, 7 }, 74 + }; 75 + 76 + static const char * const gcc_parent_names_2[] = { 77 + "bi_tcxo", 78 + "core_pi_sleep_clk", 79 + "core_bi_pll_test_se", 80 + }; 81 + 82 + static const struct parent_map gcc_parent_map_3[] = { 83 + { P_BI_TCXO, 0 }, 84 + { P_GPLL0_OUT_MAIN, 1 }, 85 + { P_CORE_BI_PLL_TEST_SE, 7 }, 86 + }; 87 + 88 + static const char * const gcc_parent_names_3[] = { 89 + "bi_tcxo", 90 + "gpll0", 91 + "core_bi_pll_test_se", 92 + }; 93 + 94 + static const struct parent_map gcc_parent_map_4[] = { 95 + { P_BI_TCXO, 0 }, 96 + { P_CORE_BI_PLL_TEST_SE, 7 }, 97 + }; 98 + 99 + static const char * const gcc_parent_names_4[] = { 100 + "bi_tcxo", 101 + "core_bi_pll_test_se", 102 + }; 103 + 104 + static const struct parent_map gcc_parent_map_5[] = { 105 + { P_BI_TCXO, 0 }, 106 + { P_GPLL0_OUT_MAIN, 1 }, 107 + { P_GPLL4_OUT_MAIN, 5 }, 108 + { P_GPLL0_OUT_EVEN, 6 }, 109 + { P_CORE_BI_PLL_TEST_SE, 7 }, 110 + }; 111 + 112 + static const char * const gcc_parent_names_5[] = { 113 + "bi_tcxo", 114 + "gpll0", 115 + "gpll4", 116 + "gpll0_out_even", 117 + "core_bi_pll_test_se", 118 + }; 119 + 120 + static const struct parent_map gcc_parent_map_6[] = { 121 + { P_BI_TCXO, 0 }, 122 + { P_GPLL0_OUT_MAIN, 1 }, 123 + { P_AUD_REF_CLK, 2 }, 124 + { P_GPLL0_OUT_EVEN, 6 }, 125 + { P_CORE_BI_PLL_TEST_SE, 7 }, 126 + }; 127 + 128 + static const char * const gcc_parent_names_6[] = { 129 + "bi_tcxo", 130 + "gpll0", 131 + "aud_ref_clk", 132 + "gpll0_out_even", 133 + "core_bi_pll_test_se", 134 + }; 135 + 136 + static const char * const gcc_parent_names_7[] = { 137 + "bi_tcxo", 138 + "gpll0", 139 + "gpll0_out_even", 140 + "core_bi_pll_test_se", 141 + }; 142 + 143 + static const char * const gcc_parent_names_8[] = { 144 + "bi_tcxo", 145 + "gpll0", 146 + "core_bi_pll_test_se", 147 + }; 148 + 149 + static const struct parent_map gcc_parent_map_10[] = { 150 + { P_BI_TCXO, 0 }, 151 + { P_GPLL0_OUT_MAIN, 1 }, 152 + { P_GPLL4_OUT_MAIN, 5 }, 153 + { P_GPLL0_OUT_EVEN, 6 }, 154 + { P_CORE_BI_PLL_TEST_SE, 7 }, 155 + }; 156 + 157 + static const char * const gcc_parent_names_10[] = { 158 + "bi_tcxo", 159 + "gpll0", 160 + "gpll4", 161 + "gpll0_out_even", 162 + "core_bi_pll_test_se", 163 + }; 164 + 165 + static struct clk_alpha_pll gpll0 = { 166 + .offset = 0x0, 167 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 168 + .clkr = { 169 + .enable_reg = 0x52000, 170 + .enable_mask = BIT(0), 171 + .hw.init = &(struct clk_init_data){ 172 + .name = "gpll0", 173 + .parent_names = (const char *[]){ "bi_tcxo" }, 174 + .num_parents = 1, 175 + .ops = &clk_alpha_pll_fixed_fabia_ops, 176 + }, 177 + }, 178 + }; 179 + 180 + static struct clk_alpha_pll gpll4 = { 181 + .offset = 0x76000, 182 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 183 + .clkr = { 184 + .enable_reg = 0x52000, 185 + .enable_mask = BIT(4), 186 + .hw.init = &(struct clk_init_data){ 187 + .name = "gpll4", 188 + .parent_names = (const char *[]){ "bi_tcxo" }, 189 + .num_parents = 1, 190 + .ops = &clk_alpha_pll_fixed_fabia_ops, 191 + }, 192 + }, 193 + }; 194 + 195 + static const struct clk_div_table post_div_table_fabia_even[] = { 196 + { 0x0, 1 }, 197 + { 0x1, 2 }, 198 + { 0x3, 4 }, 199 + { 0x7, 8 }, 200 + { } 201 + }; 202 + 203 + static struct clk_alpha_pll_postdiv gpll0_out_even = { 204 + .offset = 0x0, 205 + .post_div_shift = 8, 206 + .post_div_table = post_div_table_fabia_even, 207 + .num_post_div = ARRAY_SIZE(post_div_table_fabia_even), 208 + .width = 4, 209 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 210 + .clkr.hw.init = &(struct clk_init_data){ 211 + .name = "gpll0_out_even", 212 + .parent_names = (const char *[]){ "gpll0" }, 213 + .num_parents = 1, 214 + .ops = &clk_alpha_pll_postdiv_fabia_ops, 215 + }, 216 + }; 217 + 218 + static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = { 219 + F(19200000, P_BI_TCXO, 1, 0, 0), 220 + { } 221 + }; 222 + 223 + static struct clk_rcg2 gcc_cpuss_ahb_clk_src = { 224 + .cmd_rcgr = 0x48014, 225 + .mnd_width = 0, 226 + .hid_width = 5, 227 + .parent_map = gcc_parent_map_0, 228 + .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src, 229 + .clkr.hw.init = &(struct clk_init_data){ 230 + .name = "gcc_cpuss_ahb_clk_src", 231 + .parent_names = gcc_parent_names_7, 232 + .num_parents = 4, 233 + .ops = &clk_rcg2_ops, 234 + }, 235 + }; 236 + 237 + static const struct freq_tbl ftbl_gcc_cpuss_rbcpr_clk_src[] = { 238 + F(19200000, P_BI_TCXO, 1, 0, 0), 239 + { } 240 + }; 241 + 242 + static struct clk_rcg2 gcc_cpuss_rbcpr_clk_src = { 243 + .cmd_rcgr = 0x4815c, 244 + .mnd_width = 0, 245 + .hid_width = 5, 246 + .parent_map = gcc_parent_map_3, 247 + .freq_tbl = ftbl_gcc_cpuss_rbcpr_clk_src, 248 + .clkr.hw.init = &(struct clk_init_data){ 249 + .name = "gcc_cpuss_rbcpr_clk_src", 250 + .parent_names = gcc_parent_names_8, 251 + .num_parents = 3, 252 + .ops = &clk_rcg2_ops, 253 + }, 254 + }; 255 + 256 + static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 257 + F(19200000, P_BI_TCXO, 1, 0, 0), 258 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 259 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 260 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 261 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 262 + { } 263 + }; 264 + 265 + static struct clk_rcg2 gcc_gp1_clk_src = { 266 + .cmd_rcgr = 0x64004, 267 + .mnd_width = 8, 268 + .hid_width = 5, 269 + .parent_map = gcc_parent_map_1, 270 + .freq_tbl = ftbl_gcc_gp1_clk_src, 271 + .clkr.hw.init = &(struct clk_init_data){ 272 + .name = "gcc_gp1_clk_src", 273 + .parent_names = gcc_parent_names_1, 274 + .num_parents = 5, 275 + .ops = &clk_rcg2_ops, 276 + }, 277 + }; 278 + 279 + static struct clk_rcg2 gcc_gp2_clk_src = { 280 + .cmd_rcgr = 0x65004, 281 + .mnd_width = 8, 282 + .hid_width = 5, 283 + .parent_map = gcc_parent_map_1, 284 + .freq_tbl = ftbl_gcc_gp1_clk_src, 285 + .clkr.hw.init = &(struct clk_init_data){ 286 + .name = "gcc_gp2_clk_src", 287 + .parent_names = gcc_parent_names_1, 288 + .num_parents = 5, 289 + .ops = &clk_rcg2_ops, 290 + }, 291 + }; 292 + 293 + static struct clk_rcg2 gcc_gp3_clk_src = { 294 + .cmd_rcgr = 0x66004, 295 + .mnd_width = 8, 296 + .hid_width = 5, 297 + .parent_map = gcc_parent_map_1, 298 + .freq_tbl = ftbl_gcc_gp1_clk_src, 299 + .clkr.hw.init = &(struct clk_init_data){ 300 + .name = "gcc_gp3_clk_src", 301 + .parent_names = gcc_parent_names_1, 302 + .num_parents = 5, 303 + .ops = &clk_rcg2_ops, 304 + }, 305 + }; 306 + 307 + static const struct freq_tbl ftbl_gcc_pcie_0_aux_clk_src[] = { 308 + F(9600000, P_BI_TCXO, 2, 0, 0), 309 + F(19200000, P_BI_TCXO, 1, 0, 0), 310 + { } 311 + }; 312 + 313 + static struct clk_rcg2 gcc_pcie_0_aux_clk_src = { 314 + .cmd_rcgr = 0x6b028, 315 + .mnd_width = 16, 316 + .hid_width = 5, 317 + .parent_map = gcc_parent_map_2, 318 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 319 + .clkr.hw.init = &(struct clk_init_data){ 320 + .name = "gcc_pcie_0_aux_clk_src", 321 + .parent_names = gcc_parent_names_2, 322 + .num_parents = 3, 323 + .ops = &clk_rcg2_ops, 324 + }, 325 + }; 326 + 327 + static struct clk_rcg2 gcc_pcie_1_aux_clk_src = { 328 + .cmd_rcgr = 0x8d028, 329 + .mnd_width = 16, 330 + .hid_width = 5, 331 + .parent_map = gcc_parent_map_2, 332 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 333 + .clkr.hw.init = &(struct clk_init_data){ 334 + .name = "gcc_pcie_1_aux_clk_src", 335 + .parent_names = gcc_parent_names_2, 336 + .num_parents = 3, 337 + .ops = &clk_rcg2_ops, 338 + }, 339 + }; 340 + 341 + static const struct freq_tbl ftbl_gcc_pcie_phy_refgen_clk_src[] = { 342 + F(19200000, P_BI_TCXO, 1, 0, 0), 343 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 344 + { } 345 + }; 346 + 347 + static struct clk_rcg2 gcc_pcie_phy_refgen_clk_src = { 348 + .cmd_rcgr = 0x6f014, 349 + .mnd_width = 0, 350 + .hid_width = 5, 351 + .parent_map = gcc_parent_map_0, 352 + .freq_tbl = ftbl_gcc_pcie_phy_refgen_clk_src, 353 + .clkr.hw.init = &(struct clk_init_data){ 354 + .name = "gcc_pcie_phy_refgen_clk_src", 355 + .parent_names = gcc_parent_names_0, 356 + .num_parents = 4, 357 + .ops = &clk_rcg2_ops, 358 + }, 359 + }; 360 + 361 + static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = { 362 + F(9600000, P_BI_TCXO, 2, 0, 0), 363 + F(19200000, P_BI_TCXO, 1, 0, 0), 364 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 365 + { } 366 + }; 367 + 368 + static struct clk_rcg2 gcc_pdm2_clk_src = { 369 + .cmd_rcgr = 0x33010, 370 + .mnd_width = 0, 371 + .hid_width = 5, 372 + .parent_map = gcc_parent_map_0, 373 + .freq_tbl = ftbl_gcc_pdm2_clk_src, 374 + .clkr.hw.init = &(struct clk_init_data){ 375 + .name = "gcc_pdm2_clk_src", 376 + .parent_names = gcc_parent_names_0, 377 + .num_parents = 4, 378 + .ops = &clk_rcg2_ops, 379 + }, 380 + }; 381 + 382 + static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = { 383 + F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625), 384 + F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625), 385 + F(19200000, P_BI_TCXO, 1, 0, 0), 386 + F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625), 387 + F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75), 388 + F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25), 389 + F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75), 390 + F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15), 391 + F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25), 392 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 393 + F(102400000, P_GPLL0_OUT_EVEN, 1, 128, 375), 394 + F(112000000, P_GPLL0_OUT_EVEN, 1, 28, 75), 395 + F(117964800, P_GPLL0_OUT_EVEN, 1, 6144, 15625), 396 + F(120000000, P_GPLL0_OUT_EVEN, 2.5, 0, 0), 397 + F(128000000, P_GPLL0_OUT_MAIN, 1, 16, 75), 398 + { } 399 + }; 400 + 401 + static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = { 402 + .cmd_rcgr = 0x17034, 403 + .mnd_width = 16, 404 + .hid_width = 5, 405 + .parent_map = gcc_parent_map_0, 406 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 407 + .clkr.hw.init = &(struct clk_init_data){ 408 + .name = "gcc_qupv3_wrap0_s0_clk_src", 409 + .parent_names = gcc_parent_names_0, 410 + .num_parents = 4, 411 + .ops = &clk_rcg2_shared_ops, 412 + }, 413 + }; 414 + 415 + static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = { 416 + .cmd_rcgr = 0x17164, 417 + .mnd_width = 16, 418 + .hid_width = 5, 419 + .parent_map = gcc_parent_map_0, 420 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 421 + .clkr.hw.init = &(struct clk_init_data){ 422 + .name = "gcc_qupv3_wrap0_s1_clk_src", 423 + .parent_names = gcc_parent_names_0, 424 + .num_parents = 4, 425 + .ops = &clk_rcg2_shared_ops, 426 + }, 427 + }; 428 + 429 + static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = { 430 + .cmd_rcgr = 0x17294, 431 + .mnd_width = 16, 432 + .hid_width = 5, 433 + .parent_map = gcc_parent_map_0, 434 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 435 + .clkr.hw.init = &(struct clk_init_data){ 436 + .name = "gcc_qupv3_wrap0_s2_clk_src", 437 + .parent_names = gcc_parent_names_0, 438 + .num_parents = 4, 439 + .ops = &clk_rcg2_shared_ops, 440 + }, 441 + }; 442 + 443 + static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = { 444 + .cmd_rcgr = 0x173c4, 445 + .mnd_width = 16, 446 + .hid_width = 5, 447 + .parent_map = gcc_parent_map_0, 448 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 449 + .clkr.hw.init = &(struct clk_init_data){ 450 + .name = "gcc_qupv3_wrap0_s3_clk_src", 451 + .parent_names = gcc_parent_names_0, 452 + .num_parents = 4, 453 + .ops = &clk_rcg2_shared_ops, 454 + }, 455 + }; 456 + 457 + static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = { 458 + .cmd_rcgr = 0x174f4, 459 + .mnd_width = 16, 460 + .hid_width = 5, 461 + .parent_map = gcc_parent_map_0, 462 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 463 + .clkr.hw.init = &(struct clk_init_data){ 464 + .name = "gcc_qupv3_wrap0_s4_clk_src", 465 + .parent_names = gcc_parent_names_0, 466 + .num_parents = 4, 467 + .ops = &clk_rcg2_shared_ops, 468 + }, 469 + }; 470 + 471 + static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = { 472 + .cmd_rcgr = 0x17624, 473 + .mnd_width = 16, 474 + .hid_width = 5, 475 + .parent_map = gcc_parent_map_0, 476 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 477 + .clkr.hw.init = &(struct clk_init_data){ 478 + .name = "gcc_qupv3_wrap0_s5_clk_src", 479 + .parent_names = gcc_parent_names_0, 480 + .num_parents = 4, 481 + .ops = &clk_rcg2_shared_ops, 482 + }, 483 + }; 484 + 485 + static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = { 486 + .cmd_rcgr = 0x17754, 487 + .mnd_width = 16, 488 + .hid_width = 5, 489 + .parent_map = gcc_parent_map_0, 490 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 491 + .clkr.hw.init = &(struct clk_init_data){ 492 + .name = "gcc_qupv3_wrap0_s6_clk_src", 493 + .parent_names = gcc_parent_names_0, 494 + .num_parents = 4, 495 + .ops = &clk_rcg2_shared_ops, 496 + }, 497 + }; 498 + 499 + static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = { 500 + .cmd_rcgr = 0x17884, 501 + .mnd_width = 16, 502 + .hid_width = 5, 503 + .parent_map = gcc_parent_map_0, 504 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 505 + .clkr.hw.init = &(struct clk_init_data){ 506 + .name = "gcc_qupv3_wrap0_s7_clk_src", 507 + .parent_names = gcc_parent_names_0, 508 + .num_parents = 4, 509 + .ops = &clk_rcg2_shared_ops, 510 + }, 511 + }; 512 + 513 + static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { 514 + .cmd_rcgr = 0x18018, 515 + .mnd_width = 16, 516 + .hid_width = 5, 517 + .parent_map = gcc_parent_map_0, 518 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 519 + .clkr.hw.init = &(struct clk_init_data){ 520 + .name = "gcc_qupv3_wrap1_s0_clk_src", 521 + .parent_names = gcc_parent_names_0, 522 + .num_parents = 4, 523 + .ops = &clk_rcg2_shared_ops, 524 + }, 525 + }; 526 + 527 + static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { 528 + .cmd_rcgr = 0x18148, 529 + .mnd_width = 16, 530 + .hid_width = 5, 531 + .parent_map = gcc_parent_map_0, 532 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 533 + .clkr.hw.init = &(struct clk_init_data){ 534 + .name = "gcc_qupv3_wrap1_s1_clk_src", 535 + .parent_names = gcc_parent_names_0, 536 + .num_parents = 4, 537 + .ops = &clk_rcg2_shared_ops, 538 + }, 539 + }; 540 + 541 + static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = { 542 + .cmd_rcgr = 0x18278, 543 + .mnd_width = 16, 544 + .hid_width = 5, 545 + .parent_map = gcc_parent_map_0, 546 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 547 + .clkr.hw.init = &(struct clk_init_data){ 548 + .name = "gcc_qupv3_wrap1_s2_clk_src", 549 + .parent_names = gcc_parent_names_0, 550 + .num_parents = 4, 551 + .ops = &clk_rcg2_shared_ops, 552 + }, 553 + }; 554 + 555 + static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { 556 + .cmd_rcgr = 0x183a8, 557 + .mnd_width = 16, 558 + .hid_width = 5, 559 + .parent_map = gcc_parent_map_0, 560 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 561 + .clkr.hw.init = &(struct clk_init_data){ 562 + .name = "gcc_qupv3_wrap1_s3_clk_src", 563 + .parent_names = gcc_parent_names_0, 564 + .num_parents = 4, 565 + .ops = &clk_rcg2_shared_ops, 566 + }, 567 + }; 568 + 569 + static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { 570 + .cmd_rcgr = 0x184d8, 571 + .mnd_width = 16, 572 + .hid_width = 5, 573 + .parent_map = gcc_parent_map_0, 574 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 575 + .clkr.hw.init = &(struct clk_init_data){ 576 + .name = "gcc_qupv3_wrap1_s4_clk_src", 577 + .parent_names = gcc_parent_names_0, 578 + .num_parents = 4, 579 + .ops = &clk_rcg2_shared_ops, 580 + }, 581 + }; 582 + 583 + static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { 584 + .cmd_rcgr = 0x18608, 585 + .mnd_width = 16, 586 + .hid_width = 5, 587 + .parent_map = gcc_parent_map_0, 588 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 589 + .clkr.hw.init = &(struct clk_init_data){ 590 + .name = "gcc_qupv3_wrap1_s5_clk_src", 591 + .parent_names = gcc_parent_names_0, 592 + .num_parents = 4, 593 + .ops = &clk_rcg2_shared_ops, 594 + }, 595 + }; 596 + 597 + static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = { 598 + .cmd_rcgr = 0x18738, 599 + .mnd_width = 16, 600 + .hid_width = 5, 601 + .parent_map = gcc_parent_map_0, 602 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 603 + .clkr.hw.init = &(struct clk_init_data){ 604 + .name = "gcc_qupv3_wrap1_s6_clk_src", 605 + .parent_names = gcc_parent_names_0, 606 + .num_parents = 4, 607 + .ops = &clk_rcg2_shared_ops, 608 + }, 609 + }; 610 + 611 + static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = { 612 + .cmd_rcgr = 0x18868, 613 + .mnd_width = 16, 614 + .hid_width = 5, 615 + .parent_map = gcc_parent_map_0, 616 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 617 + .clkr.hw.init = &(struct clk_init_data){ 618 + .name = "gcc_qupv3_wrap1_s7_clk_src", 619 + .parent_names = gcc_parent_names_0, 620 + .num_parents = 4, 621 + .ops = &clk_rcg2_shared_ops, 622 + }, 623 + }; 624 + 625 + static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 626 + F(400000, P_BI_TCXO, 12, 1, 4), 627 + F(9600000, P_BI_TCXO, 2, 0, 0), 628 + F(19200000, P_BI_TCXO, 1, 0, 0), 629 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 630 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 631 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 632 + F(201500000, P_GPLL4_OUT_MAIN, 4, 0, 0), 633 + { } 634 + }; 635 + 636 + static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { 637 + .cmd_rcgr = 0x1400c, 638 + .mnd_width = 8, 639 + .hid_width = 5, 640 + .parent_map = gcc_parent_map_10, 641 + .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src, 642 + .clkr.hw.init = &(struct clk_init_data){ 643 + .name = "gcc_sdcc2_apps_clk_src", 644 + .parent_names = gcc_parent_names_10, 645 + .num_parents = 5, 646 + .ops = &clk_rcg2_ops, 647 + }, 648 + }; 649 + 650 + static const struct freq_tbl ftbl_gcc_sdcc4_apps_clk_src[] = { 651 + F(400000, P_BI_TCXO, 12, 1, 4), 652 + F(9600000, P_BI_TCXO, 2, 0, 0), 653 + F(19200000, P_BI_TCXO, 1, 0, 0), 654 + F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2), 655 + F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 656 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 657 + { } 658 + }; 659 + 660 + static struct clk_rcg2 gcc_sdcc4_apps_clk_src = { 661 + .cmd_rcgr = 0x1600c, 662 + .mnd_width = 8, 663 + .hid_width = 5, 664 + .parent_map = gcc_parent_map_0, 665 + .freq_tbl = ftbl_gcc_sdcc4_apps_clk_src, 666 + .clkr.hw.init = &(struct clk_init_data){ 667 + .name = "gcc_sdcc4_apps_clk_src", 668 + .parent_names = gcc_parent_names_0, 669 + .num_parents = 4, 670 + .ops = &clk_rcg2_ops, 671 + }, 672 + }; 673 + 674 + static const struct freq_tbl ftbl_gcc_tsif_ref_clk_src[] = { 675 + F(105495, P_BI_TCXO, 2, 1, 91), 676 + { } 677 + }; 678 + 679 + static struct clk_rcg2 gcc_tsif_ref_clk_src = { 680 + .cmd_rcgr = 0x36010, 681 + .mnd_width = 8, 682 + .hid_width = 5, 683 + .parent_map = gcc_parent_map_6, 684 + .freq_tbl = ftbl_gcc_tsif_ref_clk_src, 685 + .clkr.hw.init = &(struct clk_init_data){ 686 + .name = "gcc_tsif_ref_clk_src", 687 + .parent_names = gcc_parent_names_6, 688 + .num_parents = 5, 689 + .ops = &clk_rcg2_ops, 690 + }, 691 + }; 692 + 693 + static const struct freq_tbl ftbl_gcc_ufs_card_axi_clk_src[] = { 694 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 695 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 696 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 697 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 698 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 699 + { } 700 + }; 701 + 702 + static struct clk_rcg2 gcc_ufs_card_axi_clk_src = { 703 + .cmd_rcgr = 0x7501c, 704 + .mnd_width = 8, 705 + .hid_width = 5, 706 + .parent_map = gcc_parent_map_0, 707 + .freq_tbl = ftbl_gcc_ufs_card_axi_clk_src, 708 + .clkr.hw.init = &(struct clk_init_data){ 709 + .name = "gcc_ufs_card_axi_clk_src", 710 + .parent_names = gcc_parent_names_0, 711 + .num_parents = 4, 712 + .ops = &clk_rcg2_shared_ops, 713 + }, 714 + }; 715 + 716 + static const struct freq_tbl ftbl_gcc_ufs_card_ice_core_clk_src[] = { 717 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 718 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 719 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 720 + F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 721 + { } 722 + }; 723 + 724 + static struct clk_rcg2 gcc_ufs_card_ice_core_clk_src = { 725 + .cmd_rcgr = 0x7505c, 726 + .mnd_width = 0, 727 + .hid_width = 5, 728 + .parent_map = gcc_parent_map_0, 729 + .freq_tbl = ftbl_gcc_ufs_card_ice_core_clk_src, 730 + .clkr.hw.init = &(struct clk_init_data){ 731 + .name = "gcc_ufs_card_ice_core_clk_src", 732 + .parent_names = gcc_parent_names_0, 733 + .num_parents = 4, 734 + .ops = &clk_rcg2_shared_ops, 735 + }, 736 + }; 737 + 738 + static struct clk_rcg2 gcc_ufs_card_phy_aux_clk_src = { 739 + .cmd_rcgr = 0x75090, 740 + .mnd_width = 0, 741 + .hid_width = 5, 742 + .parent_map = gcc_parent_map_4, 743 + .freq_tbl = ftbl_gcc_cpuss_rbcpr_clk_src, 744 + .clkr.hw.init = &(struct clk_init_data){ 745 + .name = "gcc_ufs_card_phy_aux_clk_src", 746 + .parent_names = gcc_parent_names_4, 747 + .num_parents = 2, 748 + .ops = &clk_rcg2_ops, 749 + }, 750 + }; 751 + 752 + static const struct freq_tbl ftbl_gcc_ufs_card_unipro_core_clk_src[] = { 753 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 754 + F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0), 755 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 756 + { } 757 + }; 758 + 759 + static struct clk_rcg2 gcc_ufs_card_unipro_core_clk_src = { 760 + .cmd_rcgr = 0x75074, 761 + .mnd_width = 0, 762 + .hid_width = 5, 763 + .parent_map = gcc_parent_map_0, 764 + .freq_tbl = ftbl_gcc_ufs_card_unipro_core_clk_src, 765 + .clkr.hw.init = &(struct clk_init_data){ 766 + .name = "gcc_ufs_card_unipro_core_clk_src", 767 + .parent_names = gcc_parent_names_0, 768 + .num_parents = 4, 769 + .ops = &clk_rcg2_shared_ops, 770 + }, 771 + }; 772 + 773 + static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = { 774 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 775 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 776 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 777 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 778 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 779 + { } 780 + }; 781 + 782 + static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = { 783 + .cmd_rcgr = 0x7701c, 784 + .mnd_width = 8, 785 + .hid_width = 5, 786 + .parent_map = gcc_parent_map_0, 787 + .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src, 788 + .clkr.hw.init = &(struct clk_init_data){ 789 + .name = "gcc_ufs_phy_axi_clk_src", 790 + .parent_names = gcc_parent_names_0, 791 + .num_parents = 4, 792 + .ops = &clk_rcg2_shared_ops, 793 + }, 794 + }; 795 + 796 + static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = { 797 + .cmd_rcgr = 0x7705c, 798 + .mnd_width = 0, 799 + .hid_width = 5, 800 + .parent_map = gcc_parent_map_0, 801 + .freq_tbl = ftbl_gcc_ufs_card_ice_core_clk_src, 802 + .clkr.hw.init = &(struct clk_init_data){ 803 + .name = "gcc_ufs_phy_ice_core_clk_src", 804 + .parent_names = gcc_parent_names_0, 805 + .num_parents = 4, 806 + .ops = &clk_rcg2_shared_ops, 807 + }, 808 + }; 809 + 810 + static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = { 811 + .cmd_rcgr = 0x77090, 812 + .mnd_width = 0, 813 + .hid_width = 5, 814 + .parent_map = gcc_parent_map_4, 815 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 816 + .clkr.hw.init = &(struct clk_init_data){ 817 + .name = "gcc_ufs_phy_phy_aux_clk_src", 818 + .parent_names = gcc_parent_names_4, 819 + .num_parents = 2, 820 + .ops = &clk_rcg2_shared_ops, 821 + }, 822 + }; 823 + 824 + static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { 825 + .cmd_rcgr = 0x77074, 826 + .mnd_width = 0, 827 + .hid_width = 5, 828 + .parent_map = gcc_parent_map_0, 829 + .freq_tbl = ftbl_gcc_ufs_card_unipro_core_clk_src, 830 + .clkr.hw.init = &(struct clk_init_data){ 831 + .name = "gcc_ufs_phy_unipro_core_clk_src", 832 + .parent_names = gcc_parent_names_0, 833 + .num_parents = 4, 834 + .ops = &clk_rcg2_shared_ops, 835 + }, 836 + }; 837 + 838 + static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = { 839 + F(33333333, P_GPLL0_OUT_EVEN, 9, 0, 0), 840 + F(66666667, P_GPLL0_OUT_EVEN, 4.5, 0, 0), 841 + F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0), 842 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 843 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 844 + { } 845 + }; 846 + 847 + static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { 848 + .cmd_rcgr = 0xf018, 849 + .mnd_width = 8, 850 + .hid_width = 5, 851 + .parent_map = gcc_parent_map_0, 852 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 853 + .clkr.hw.init = &(struct clk_init_data){ 854 + .name = "gcc_usb30_prim_master_clk_src", 855 + .parent_names = gcc_parent_names_0, 856 + .num_parents = 4, 857 + .ops = &clk_rcg2_shared_ops, 858 + }, 859 + }; 860 + 861 + static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = { 862 + F(19200000, P_BI_TCXO, 1, 0, 0), 863 + F(20000000, P_GPLL0_OUT_EVEN, 15, 0, 0), 864 + F(40000000, P_GPLL0_OUT_EVEN, 7.5, 0, 0), 865 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 866 + { } 867 + }; 868 + 869 + static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = { 870 + .cmd_rcgr = 0xf030, 871 + .mnd_width = 0, 872 + .hid_width = 5, 873 + .parent_map = gcc_parent_map_0, 874 + .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src, 875 + .clkr.hw.init = &(struct clk_init_data){ 876 + .name = "gcc_usb30_prim_mock_utmi_clk_src", 877 + .parent_names = gcc_parent_names_0, 878 + .num_parents = 4, 879 + .ops = &clk_rcg2_shared_ops, 880 + }, 881 + }; 882 + 883 + static struct clk_rcg2 gcc_usb30_sec_master_clk_src = { 884 + .cmd_rcgr = 0x10018, 885 + .mnd_width = 8, 886 + .hid_width = 5, 887 + .parent_map = gcc_parent_map_0, 888 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 889 + .clkr.hw.init = &(struct clk_init_data){ 890 + .name = "gcc_usb30_sec_master_clk_src", 891 + .parent_names = gcc_parent_names_0, 892 + .num_parents = 4, 893 + .ops = &clk_rcg2_ops, 894 + }, 895 + }; 896 + 897 + static struct clk_rcg2 gcc_usb30_sec_mock_utmi_clk_src = { 898 + .cmd_rcgr = 0x10030, 899 + .mnd_width = 0, 900 + .hid_width = 5, 901 + .parent_map = gcc_parent_map_0, 902 + .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src, 903 + .clkr.hw.init = &(struct clk_init_data){ 904 + .name = "gcc_usb30_sec_mock_utmi_clk_src", 905 + .parent_names = gcc_parent_names_0, 906 + .num_parents = 4, 907 + .ops = &clk_rcg2_ops, 908 + }, 909 + }; 910 + 911 + static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = { 912 + .cmd_rcgr = 0xf05c, 913 + .mnd_width = 0, 914 + .hid_width = 5, 915 + .parent_map = gcc_parent_map_2, 916 + .freq_tbl = ftbl_gcc_cpuss_rbcpr_clk_src, 917 + .clkr.hw.init = &(struct clk_init_data){ 918 + .name = "gcc_usb3_prim_phy_aux_clk_src", 919 + .parent_names = gcc_parent_names_2, 920 + .num_parents = 3, 921 + .ops = &clk_rcg2_ops, 922 + }, 923 + }; 924 + 925 + static struct clk_rcg2 gcc_usb3_sec_phy_aux_clk_src = { 926 + .cmd_rcgr = 0x1005c, 927 + .mnd_width = 0, 928 + .hid_width = 5, 929 + .parent_map = gcc_parent_map_2, 930 + .freq_tbl = ftbl_gcc_cpuss_rbcpr_clk_src, 931 + .clkr.hw.init = &(struct clk_init_data){ 932 + .name = "gcc_usb3_sec_phy_aux_clk_src", 933 + .parent_names = gcc_parent_names_2, 934 + .num_parents = 3, 935 + .ops = &clk_rcg2_shared_ops, 936 + }, 937 + }; 938 + 939 + static struct clk_rcg2 gcc_vs_ctrl_clk_src = { 940 + .cmd_rcgr = 0x7a030, 941 + .mnd_width = 0, 942 + .hid_width = 5, 943 + .parent_map = gcc_parent_map_3, 944 + .freq_tbl = ftbl_gcc_cpuss_rbcpr_clk_src, 945 + .clkr.hw.init = &(struct clk_init_data){ 946 + .name = "gcc_vs_ctrl_clk_src", 947 + .parent_names = gcc_parent_names_3, 948 + .num_parents = 3, 949 + .ops = &clk_rcg2_ops, 950 + }, 951 + }; 952 + 953 + static const struct freq_tbl ftbl_gcc_vsensor_clk_src[] = { 954 + F(19200000, P_BI_TCXO, 1, 0, 0), 955 + F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 956 + F(600000000, P_GPLL0_OUT_MAIN, 1, 0, 0), 957 + { } 958 + }; 959 + 960 + static struct clk_rcg2 gcc_vsensor_clk_src = { 961 + .cmd_rcgr = 0x7a018, 962 + .mnd_width = 0, 963 + .hid_width = 5, 964 + .parent_map = gcc_parent_map_3, 965 + .freq_tbl = ftbl_gcc_vsensor_clk_src, 966 + .clkr.hw.init = &(struct clk_init_data){ 967 + .name = "gcc_vsensor_clk_src", 968 + .parent_names = gcc_parent_names_8, 969 + .num_parents = 3, 970 + .ops = &clk_rcg2_ops, 971 + }, 972 + }; 973 + 974 + static struct clk_branch gcc_aggre_noc_pcie_tbu_clk = { 975 + .halt_reg = 0x90014, 976 + .halt_check = BRANCH_HALT, 977 + .clkr = { 978 + .enable_reg = 0x90014, 979 + .enable_mask = BIT(0), 980 + .hw.init = &(struct clk_init_data){ 981 + .name = "gcc_aggre_noc_pcie_tbu_clk", 982 + .ops = &clk_branch2_ops, 983 + }, 984 + }, 985 + }; 986 + 987 + static struct clk_branch gcc_aggre_ufs_card_axi_clk = { 988 + .halt_reg = 0x82028, 989 + .halt_check = BRANCH_HALT, 990 + .hwcg_reg = 0x82028, 991 + .hwcg_bit = 1, 992 + .clkr = { 993 + .enable_reg = 0x82028, 994 + .enable_mask = BIT(0), 995 + .hw.init = &(struct clk_init_data){ 996 + .name = "gcc_aggre_ufs_card_axi_clk", 997 + .parent_names = (const char *[]){ 998 + "gcc_ufs_card_axi_clk_src", 999 + }, 1000 + .num_parents = 1, 1001 + .flags = CLK_SET_RATE_PARENT, 1002 + .ops = &clk_branch2_ops, 1003 + }, 1004 + }, 1005 + }; 1006 + 1007 + static struct clk_branch gcc_aggre_ufs_phy_axi_clk = { 1008 + .halt_reg = 0x82024, 1009 + .halt_check = BRANCH_HALT, 1010 + .hwcg_reg = 0x82024, 1011 + .hwcg_bit = 1, 1012 + .clkr = { 1013 + .enable_reg = 0x82024, 1014 + .enable_mask = BIT(0), 1015 + .hw.init = &(struct clk_init_data){ 1016 + .name = "gcc_aggre_ufs_phy_axi_clk", 1017 + .parent_names = (const char *[]){ 1018 + "gcc_ufs_phy_axi_clk_src", 1019 + }, 1020 + .num_parents = 1, 1021 + .flags = CLK_SET_RATE_PARENT, 1022 + .ops = &clk_branch2_ops, 1023 + }, 1024 + }, 1025 + }; 1026 + 1027 + static struct clk_branch gcc_aggre_usb3_prim_axi_clk = { 1028 + .halt_reg = 0x8201c, 1029 + .halt_check = BRANCH_HALT, 1030 + .clkr = { 1031 + .enable_reg = 0x8201c, 1032 + .enable_mask = BIT(0), 1033 + .hw.init = &(struct clk_init_data){ 1034 + .name = "gcc_aggre_usb3_prim_axi_clk", 1035 + .parent_names = (const char *[]){ 1036 + "gcc_usb30_prim_master_clk_src", 1037 + }, 1038 + .num_parents = 1, 1039 + .flags = CLK_SET_RATE_PARENT, 1040 + .ops = &clk_branch2_ops, 1041 + }, 1042 + }, 1043 + }; 1044 + 1045 + static struct clk_branch gcc_aggre_usb3_sec_axi_clk = { 1046 + .halt_reg = 0x82020, 1047 + .halt_check = BRANCH_HALT, 1048 + .clkr = { 1049 + .enable_reg = 0x82020, 1050 + .enable_mask = BIT(0), 1051 + .hw.init = &(struct clk_init_data){ 1052 + .name = "gcc_aggre_usb3_sec_axi_clk", 1053 + .parent_names = (const char *[]){ 1054 + "gcc_usb30_sec_master_clk_src", 1055 + }, 1056 + .num_parents = 1, 1057 + .flags = CLK_SET_RATE_PARENT, 1058 + .ops = &clk_branch2_ops, 1059 + }, 1060 + }, 1061 + }; 1062 + 1063 + static struct clk_branch gcc_apc_vs_clk = { 1064 + .halt_reg = 0x7a050, 1065 + .halt_check = BRANCH_HALT, 1066 + .clkr = { 1067 + .enable_reg = 0x7a050, 1068 + .enable_mask = BIT(0), 1069 + .hw.init = &(struct clk_init_data){ 1070 + .name = "gcc_apc_vs_clk", 1071 + .parent_names = (const char *[]){ 1072 + "gcc_vsensor_clk_src", 1073 + }, 1074 + .num_parents = 1, 1075 + .flags = CLK_SET_RATE_PARENT, 1076 + .ops = &clk_branch2_ops, 1077 + }, 1078 + }, 1079 + }; 1080 + 1081 + static struct clk_branch gcc_boot_rom_ahb_clk = { 1082 + .halt_reg = 0x38004, 1083 + .halt_check = BRANCH_HALT_VOTED, 1084 + .hwcg_reg = 0x38004, 1085 + .hwcg_bit = 1, 1086 + .clkr = { 1087 + .enable_reg = 0x52004, 1088 + .enable_mask = BIT(10), 1089 + .hw.init = &(struct clk_init_data){ 1090 + .name = "gcc_boot_rom_ahb_clk", 1091 + .ops = &clk_branch2_ops, 1092 + }, 1093 + }, 1094 + }; 1095 + 1096 + static struct clk_branch gcc_camera_ahb_clk = { 1097 + .halt_reg = 0xb008, 1098 + .halt_check = BRANCH_HALT, 1099 + .hwcg_reg = 0xb008, 1100 + .hwcg_bit = 1, 1101 + .clkr = { 1102 + .enable_reg = 0xb008, 1103 + .enable_mask = BIT(0), 1104 + .hw.init = &(struct clk_init_data){ 1105 + .name = "gcc_camera_ahb_clk", 1106 + .ops = &clk_branch2_ops, 1107 + }, 1108 + }, 1109 + }; 1110 + 1111 + static struct clk_branch gcc_camera_axi_clk = { 1112 + .halt_reg = 0xb020, 1113 + .halt_check = BRANCH_VOTED, 1114 + .clkr = { 1115 + .enable_reg = 0xb020, 1116 + .enable_mask = BIT(0), 1117 + .hw.init = &(struct clk_init_data){ 1118 + .name = "gcc_camera_axi_clk", 1119 + .ops = &clk_branch2_ops, 1120 + }, 1121 + }, 1122 + }; 1123 + 1124 + static struct clk_branch gcc_camera_xo_clk = { 1125 + .halt_reg = 0xb02c, 1126 + .halt_check = BRANCH_HALT, 1127 + .clkr = { 1128 + .enable_reg = 0xb02c, 1129 + .enable_mask = BIT(0), 1130 + .hw.init = &(struct clk_init_data){ 1131 + .name = "gcc_camera_xo_clk", 1132 + .ops = &clk_branch2_ops, 1133 + }, 1134 + }, 1135 + }; 1136 + 1137 + static struct clk_branch gcc_ce1_ahb_clk = { 1138 + .halt_reg = 0x4100c, 1139 + .halt_check = BRANCH_HALT_VOTED, 1140 + .hwcg_reg = 0x4100c, 1141 + .hwcg_bit = 1, 1142 + .clkr = { 1143 + .enable_reg = 0x52004, 1144 + .enable_mask = BIT(3), 1145 + .hw.init = &(struct clk_init_data){ 1146 + .name = "gcc_ce1_ahb_clk", 1147 + .ops = &clk_branch2_ops, 1148 + }, 1149 + }, 1150 + }; 1151 + 1152 + static struct clk_branch gcc_ce1_axi_clk = { 1153 + .halt_reg = 0x41008, 1154 + .halt_check = BRANCH_HALT_VOTED, 1155 + .clkr = { 1156 + .enable_reg = 0x52004, 1157 + .enable_mask = BIT(4), 1158 + .hw.init = &(struct clk_init_data){ 1159 + .name = "gcc_ce1_axi_clk", 1160 + .ops = &clk_branch2_ops, 1161 + }, 1162 + }, 1163 + }; 1164 + 1165 + static struct clk_branch gcc_ce1_clk = { 1166 + .halt_reg = 0x41004, 1167 + .halt_check = BRANCH_HALT_VOTED, 1168 + .clkr = { 1169 + .enable_reg = 0x52004, 1170 + .enable_mask = BIT(5), 1171 + .hw.init = &(struct clk_init_data){ 1172 + .name = "gcc_ce1_clk", 1173 + .ops = &clk_branch2_ops, 1174 + }, 1175 + }, 1176 + }; 1177 + 1178 + static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = { 1179 + .halt_reg = 0x502c, 1180 + .halt_check = BRANCH_HALT, 1181 + .clkr = { 1182 + .enable_reg = 0x502c, 1183 + .enable_mask = BIT(0), 1184 + .hw.init = &(struct clk_init_data){ 1185 + .name = "gcc_cfg_noc_usb3_prim_axi_clk", 1186 + .parent_names = (const char *[]){ 1187 + "gcc_usb30_prim_master_clk_src", 1188 + }, 1189 + .num_parents = 1, 1190 + .flags = CLK_SET_RATE_PARENT, 1191 + .ops = &clk_branch2_ops, 1192 + }, 1193 + }, 1194 + }; 1195 + 1196 + static struct clk_branch gcc_cfg_noc_usb3_sec_axi_clk = { 1197 + .halt_reg = 0x5030, 1198 + .halt_check = BRANCH_HALT, 1199 + .clkr = { 1200 + .enable_reg = 0x5030, 1201 + .enable_mask = BIT(0), 1202 + .hw.init = &(struct clk_init_data){ 1203 + .name = "gcc_cfg_noc_usb3_sec_axi_clk", 1204 + .parent_names = (const char *[]){ 1205 + "gcc_usb30_sec_master_clk_src", 1206 + }, 1207 + .num_parents = 1, 1208 + .flags = CLK_SET_RATE_PARENT, 1209 + .ops = &clk_branch2_ops, 1210 + }, 1211 + }, 1212 + }; 1213 + 1214 + static struct clk_branch gcc_cpuss_ahb_clk = { 1215 + .halt_reg = 0x48000, 1216 + .halt_check = BRANCH_HALT_VOTED, 1217 + .clkr = { 1218 + .enable_reg = 0x52004, 1219 + .enable_mask = BIT(21), 1220 + .hw.init = &(struct clk_init_data){ 1221 + .name = "gcc_cpuss_ahb_clk", 1222 + .parent_names = (const char *[]){ 1223 + "gcc_cpuss_ahb_clk_src", 1224 + }, 1225 + .num_parents = 1, 1226 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1227 + .ops = &clk_branch2_ops, 1228 + }, 1229 + }, 1230 + }; 1231 + 1232 + static struct clk_branch gcc_cpuss_rbcpr_clk = { 1233 + .halt_reg = 0x48008, 1234 + .halt_check = BRANCH_HALT, 1235 + .clkr = { 1236 + .enable_reg = 0x48008, 1237 + .enable_mask = BIT(0), 1238 + .hw.init = &(struct clk_init_data){ 1239 + .name = "gcc_cpuss_rbcpr_clk", 1240 + .parent_names = (const char *[]){ 1241 + "gcc_cpuss_rbcpr_clk_src", 1242 + }, 1243 + .num_parents = 1, 1244 + .flags = CLK_SET_RATE_PARENT, 1245 + .ops = &clk_branch2_ops, 1246 + }, 1247 + }, 1248 + }; 1249 + 1250 + static struct clk_branch gcc_ddrss_gpu_axi_clk = { 1251 + .halt_reg = 0x44038, 1252 + .halt_check = BRANCH_VOTED, 1253 + .clkr = { 1254 + .enable_reg = 0x44038, 1255 + .enable_mask = BIT(0), 1256 + .hw.init = &(struct clk_init_data){ 1257 + .name = "gcc_ddrss_gpu_axi_clk", 1258 + .ops = &clk_branch2_ops, 1259 + }, 1260 + }, 1261 + }; 1262 + 1263 + static struct clk_branch gcc_disp_ahb_clk = { 1264 + .halt_reg = 0xb00c, 1265 + .halt_check = BRANCH_HALT, 1266 + .hwcg_reg = 0xb00c, 1267 + .hwcg_bit = 1, 1268 + .clkr = { 1269 + .enable_reg = 0xb00c, 1270 + .enable_mask = BIT(0), 1271 + .hw.init = &(struct clk_init_data){ 1272 + .name = "gcc_disp_ahb_clk", 1273 + .ops = &clk_branch2_ops, 1274 + }, 1275 + }, 1276 + }; 1277 + 1278 + static struct clk_branch gcc_disp_axi_clk = { 1279 + .halt_reg = 0xb024, 1280 + .halt_check = BRANCH_VOTED, 1281 + .clkr = { 1282 + .enable_reg = 0xb024, 1283 + .enable_mask = BIT(0), 1284 + .hw.init = &(struct clk_init_data){ 1285 + .name = "gcc_disp_axi_clk", 1286 + .ops = &clk_branch2_ops, 1287 + }, 1288 + }, 1289 + }; 1290 + 1291 + static struct clk_branch gcc_disp_gpll0_clk_src = { 1292 + .halt_check = BRANCH_HALT_DELAY, 1293 + .clkr = { 1294 + .enable_reg = 0x52004, 1295 + .enable_mask = BIT(18), 1296 + .hw.init = &(struct clk_init_data){ 1297 + .name = "gcc_disp_gpll0_clk_src", 1298 + .parent_names = (const char *[]){ 1299 + "gpll0", 1300 + }, 1301 + .num_parents = 1, 1302 + .ops = &clk_branch2_ops, 1303 + }, 1304 + }, 1305 + }; 1306 + 1307 + static struct clk_branch gcc_disp_gpll0_div_clk_src = { 1308 + .halt_check = BRANCH_HALT_DELAY, 1309 + .clkr = { 1310 + .enable_reg = 0x52004, 1311 + .enable_mask = BIT(19), 1312 + .hw.init = &(struct clk_init_data){ 1313 + .name = "gcc_disp_gpll0_div_clk_src", 1314 + .parent_names = (const char *[]){ 1315 + "gpll0_out_even", 1316 + }, 1317 + .num_parents = 1, 1318 + .ops = &clk_branch2_ops, 1319 + }, 1320 + }, 1321 + }; 1322 + 1323 + static struct clk_branch gcc_disp_xo_clk = { 1324 + .halt_reg = 0xb030, 1325 + .halt_check = BRANCH_HALT, 1326 + .clkr = { 1327 + .enable_reg = 0xb030, 1328 + .enable_mask = BIT(0), 1329 + .hw.init = &(struct clk_init_data){ 1330 + .name = "gcc_disp_xo_clk", 1331 + .ops = &clk_branch2_ops, 1332 + }, 1333 + }, 1334 + }; 1335 + 1336 + static struct clk_branch gcc_gp1_clk = { 1337 + .halt_reg = 0x64000, 1338 + .halt_check = BRANCH_HALT, 1339 + .clkr = { 1340 + .enable_reg = 0x64000, 1341 + .enable_mask = BIT(0), 1342 + .hw.init = &(struct clk_init_data){ 1343 + .name = "gcc_gp1_clk", 1344 + .parent_names = (const char *[]){ 1345 + "gcc_gp1_clk_src", 1346 + }, 1347 + .num_parents = 1, 1348 + .flags = CLK_SET_RATE_PARENT, 1349 + .ops = &clk_branch2_ops, 1350 + }, 1351 + }, 1352 + }; 1353 + 1354 + static struct clk_branch gcc_gp2_clk = { 1355 + .halt_reg = 0x65000, 1356 + .halt_check = BRANCH_HALT, 1357 + .clkr = { 1358 + .enable_reg = 0x65000, 1359 + .enable_mask = BIT(0), 1360 + .hw.init = &(struct clk_init_data){ 1361 + .name = "gcc_gp2_clk", 1362 + .parent_names = (const char *[]){ 1363 + "gcc_gp2_clk_src", 1364 + }, 1365 + .num_parents = 1, 1366 + .flags = CLK_SET_RATE_PARENT, 1367 + .ops = &clk_branch2_ops, 1368 + }, 1369 + }, 1370 + }; 1371 + 1372 + static struct clk_branch gcc_gp3_clk = { 1373 + .halt_reg = 0x66000, 1374 + .halt_check = BRANCH_HALT, 1375 + .clkr = { 1376 + .enable_reg = 0x66000, 1377 + .enable_mask = BIT(0), 1378 + .hw.init = &(struct clk_init_data){ 1379 + .name = "gcc_gp3_clk", 1380 + .parent_names = (const char *[]){ 1381 + "gcc_gp3_clk_src", 1382 + }, 1383 + .num_parents = 1, 1384 + .flags = CLK_SET_RATE_PARENT, 1385 + .ops = &clk_branch2_ops, 1386 + }, 1387 + }, 1388 + }; 1389 + 1390 + static struct clk_branch gcc_gpu_cfg_ahb_clk = { 1391 + .halt_reg = 0x71004, 1392 + .halt_check = BRANCH_HALT, 1393 + .hwcg_reg = 0x71004, 1394 + .hwcg_bit = 1, 1395 + .clkr = { 1396 + .enable_reg = 0x71004, 1397 + .enable_mask = BIT(0), 1398 + .hw.init = &(struct clk_init_data){ 1399 + .name = "gcc_gpu_cfg_ahb_clk", 1400 + .ops = &clk_branch2_ops, 1401 + }, 1402 + }, 1403 + }; 1404 + 1405 + static struct clk_branch gcc_gpu_gpll0_clk_src = { 1406 + .halt_check = BRANCH_HALT_DELAY, 1407 + .clkr = { 1408 + .enable_reg = 0x52004, 1409 + .enable_mask = BIT(15), 1410 + .hw.init = &(struct clk_init_data){ 1411 + .name = "gcc_gpu_gpll0_clk_src", 1412 + .parent_names = (const char *[]){ 1413 + "gpll0", 1414 + }, 1415 + .num_parents = 1, 1416 + .ops = &clk_branch2_ops, 1417 + }, 1418 + }, 1419 + }; 1420 + 1421 + static struct clk_branch gcc_gpu_gpll0_div_clk_src = { 1422 + .halt_check = BRANCH_HALT_DELAY, 1423 + .clkr = { 1424 + .enable_reg = 0x52004, 1425 + .enable_mask = BIT(16), 1426 + .hw.init = &(struct clk_init_data){ 1427 + .name = "gcc_gpu_gpll0_div_clk_src", 1428 + .parent_names = (const char *[]){ 1429 + "gpll0_out_even", 1430 + }, 1431 + .num_parents = 1, 1432 + .ops = &clk_branch2_ops, 1433 + }, 1434 + }, 1435 + }; 1436 + 1437 + static struct clk_branch gcc_gpu_iref_clk = { 1438 + .halt_reg = 0x8c010, 1439 + .halt_check = BRANCH_HALT, 1440 + .clkr = { 1441 + .enable_reg = 0x8c010, 1442 + .enable_mask = BIT(0), 1443 + .hw.init = &(struct clk_init_data){ 1444 + .name = "gcc_gpu_iref_clk", 1445 + .ops = &clk_branch2_ops, 1446 + }, 1447 + }, 1448 + }; 1449 + 1450 + static struct clk_branch gcc_gpu_memnoc_gfx_clk = { 1451 + .halt_reg = 0x7100c, 1452 + .halt_check = BRANCH_VOTED, 1453 + .clkr = { 1454 + .enable_reg = 0x7100c, 1455 + .enable_mask = BIT(0), 1456 + .hw.init = &(struct clk_init_data){ 1457 + .name = "gcc_gpu_memnoc_gfx_clk", 1458 + .ops = &clk_branch2_ops, 1459 + }, 1460 + }, 1461 + }; 1462 + 1463 + static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = { 1464 + .halt_reg = 0x71018, 1465 + .halt_check = BRANCH_HALT, 1466 + .clkr = { 1467 + .enable_reg = 0x71018, 1468 + .enable_mask = BIT(0), 1469 + .hw.init = &(struct clk_init_data){ 1470 + .name = "gcc_gpu_snoc_dvm_gfx_clk", 1471 + .ops = &clk_branch2_ops, 1472 + }, 1473 + }, 1474 + }; 1475 + 1476 + static struct clk_branch gcc_gpu_vs_clk = { 1477 + .halt_reg = 0x7a04c, 1478 + .halt_check = BRANCH_HALT, 1479 + .clkr = { 1480 + .enable_reg = 0x7a04c, 1481 + .enable_mask = BIT(0), 1482 + .hw.init = &(struct clk_init_data){ 1483 + .name = "gcc_gpu_vs_clk", 1484 + .parent_names = (const char *[]){ 1485 + "gcc_vsensor_clk_src", 1486 + }, 1487 + .num_parents = 1, 1488 + .flags = CLK_SET_RATE_PARENT, 1489 + .ops = &clk_branch2_ops, 1490 + }, 1491 + }, 1492 + }; 1493 + 1494 + static struct clk_branch gcc_mss_axis2_clk = { 1495 + .halt_reg = 0x8a008, 1496 + .halt_check = BRANCH_HALT, 1497 + .clkr = { 1498 + .enable_reg = 0x8a008, 1499 + .enable_mask = BIT(0), 1500 + .hw.init = &(struct clk_init_data){ 1501 + .name = "gcc_mss_axis2_clk", 1502 + .ops = &clk_branch2_ops, 1503 + }, 1504 + }, 1505 + }; 1506 + 1507 + static struct clk_branch gcc_mss_cfg_ahb_clk = { 1508 + .halt_reg = 0x8a000, 1509 + .halt_check = BRANCH_HALT, 1510 + .hwcg_reg = 0x8a000, 1511 + .hwcg_bit = 1, 1512 + .clkr = { 1513 + .enable_reg = 0x8a000, 1514 + .enable_mask = BIT(0), 1515 + .hw.init = &(struct clk_init_data){ 1516 + .name = "gcc_mss_cfg_ahb_clk", 1517 + .ops = &clk_branch2_ops, 1518 + }, 1519 + }, 1520 + }; 1521 + 1522 + static struct clk_branch gcc_mss_gpll0_div_clk_src = { 1523 + .halt_check = BRANCH_HALT_DELAY, 1524 + .clkr = { 1525 + .enable_reg = 0x52004, 1526 + .enable_mask = BIT(17), 1527 + .hw.init = &(struct clk_init_data){ 1528 + .name = "gcc_mss_gpll0_div_clk_src", 1529 + .ops = &clk_branch2_ops, 1530 + }, 1531 + }, 1532 + }; 1533 + 1534 + static struct clk_branch gcc_mss_mfab_axis_clk = { 1535 + .halt_reg = 0x8a004, 1536 + .halt_check = BRANCH_VOTED, 1537 + .hwcg_reg = 0x8a004, 1538 + .hwcg_bit = 1, 1539 + .clkr = { 1540 + .enable_reg = 0x8a004, 1541 + .enable_mask = BIT(0), 1542 + .hw.init = &(struct clk_init_data){ 1543 + .name = "gcc_mss_mfab_axis_clk", 1544 + .ops = &clk_branch2_ops, 1545 + }, 1546 + }, 1547 + }; 1548 + 1549 + static struct clk_branch gcc_mss_q6_memnoc_axi_clk = { 1550 + .halt_reg = 0x8a154, 1551 + .halt_check = BRANCH_VOTED, 1552 + .clkr = { 1553 + .enable_reg = 0x8a154, 1554 + .enable_mask = BIT(0), 1555 + .hw.init = &(struct clk_init_data){ 1556 + .name = "gcc_mss_q6_memnoc_axi_clk", 1557 + .ops = &clk_branch2_ops, 1558 + }, 1559 + }, 1560 + }; 1561 + 1562 + static struct clk_branch gcc_mss_snoc_axi_clk = { 1563 + .halt_reg = 0x8a150, 1564 + .halt_check = BRANCH_HALT, 1565 + .clkr = { 1566 + .enable_reg = 0x8a150, 1567 + .enable_mask = BIT(0), 1568 + .hw.init = &(struct clk_init_data){ 1569 + .name = "gcc_mss_snoc_axi_clk", 1570 + .ops = &clk_branch2_ops, 1571 + }, 1572 + }, 1573 + }; 1574 + 1575 + static struct clk_branch gcc_mss_vs_clk = { 1576 + .halt_reg = 0x7a048, 1577 + .halt_check = BRANCH_HALT, 1578 + .clkr = { 1579 + .enable_reg = 0x7a048, 1580 + .enable_mask = BIT(0), 1581 + .hw.init = &(struct clk_init_data){ 1582 + .name = "gcc_mss_vs_clk", 1583 + .parent_names = (const char *[]){ 1584 + "gcc_vsensor_clk_src", 1585 + }, 1586 + .num_parents = 1, 1587 + .flags = CLK_SET_RATE_PARENT, 1588 + .ops = &clk_branch2_ops, 1589 + }, 1590 + }, 1591 + }; 1592 + 1593 + static struct clk_branch gcc_pcie_0_aux_clk = { 1594 + .halt_reg = 0x6b01c, 1595 + .halt_check = BRANCH_HALT_VOTED, 1596 + .clkr = { 1597 + .enable_reg = 0x5200c, 1598 + .enable_mask = BIT(3), 1599 + .hw.init = &(struct clk_init_data){ 1600 + .name = "gcc_pcie_0_aux_clk", 1601 + .parent_names = (const char *[]){ 1602 + "gcc_pcie_0_aux_clk_src", 1603 + }, 1604 + .num_parents = 1, 1605 + .flags = CLK_SET_RATE_PARENT, 1606 + .ops = &clk_branch2_ops, 1607 + }, 1608 + }, 1609 + }; 1610 + 1611 + static struct clk_branch gcc_pcie_0_cfg_ahb_clk = { 1612 + .halt_reg = 0x6b018, 1613 + .halt_check = BRANCH_HALT_VOTED, 1614 + .hwcg_reg = 0x6b018, 1615 + .hwcg_bit = 1, 1616 + .clkr = { 1617 + .enable_reg = 0x5200c, 1618 + .enable_mask = BIT(2), 1619 + .hw.init = &(struct clk_init_data){ 1620 + .name = "gcc_pcie_0_cfg_ahb_clk", 1621 + .ops = &clk_branch2_ops, 1622 + }, 1623 + }, 1624 + }; 1625 + 1626 + static struct clk_branch gcc_pcie_0_clkref_clk = { 1627 + .halt_reg = 0x8c00c, 1628 + .halt_check = BRANCH_HALT, 1629 + .clkr = { 1630 + .enable_reg = 0x8c00c, 1631 + .enable_mask = BIT(0), 1632 + .hw.init = &(struct clk_init_data){ 1633 + .name = "gcc_pcie_0_clkref_clk", 1634 + .ops = &clk_branch2_ops, 1635 + }, 1636 + }, 1637 + }; 1638 + 1639 + static struct clk_branch gcc_pcie_0_mstr_axi_clk = { 1640 + .halt_reg = 0x6b014, 1641 + .halt_check = BRANCH_HALT_VOTED, 1642 + .clkr = { 1643 + .enable_reg = 0x5200c, 1644 + .enable_mask = BIT(1), 1645 + .hw.init = &(struct clk_init_data){ 1646 + .name = "gcc_pcie_0_mstr_axi_clk", 1647 + .ops = &clk_branch2_ops, 1648 + }, 1649 + }, 1650 + }; 1651 + 1652 + static struct clk_branch gcc_pcie_0_pipe_clk = { 1653 + .halt_check = BRANCH_HALT_SKIP, 1654 + .clkr = { 1655 + .enable_reg = 0x5200c, 1656 + .enable_mask = BIT(4), 1657 + .hw.init = &(struct clk_init_data){ 1658 + .name = "gcc_pcie_0_pipe_clk", 1659 + .ops = &clk_branch2_ops, 1660 + }, 1661 + }, 1662 + }; 1663 + 1664 + static struct clk_branch gcc_pcie_0_slv_axi_clk = { 1665 + .halt_reg = 0x6b010, 1666 + .halt_check = BRANCH_HALT_VOTED, 1667 + .hwcg_reg = 0x6b010, 1668 + .hwcg_bit = 1, 1669 + .clkr = { 1670 + .enable_reg = 0x5200c, 1671 + .enable_mask = BIT(0), 1672 + .hw.init = &(struct clk_init_data){ 1673 + .name = "gcc_pcie_0_slv_axi_clk", 1674 + .ops = &clk_branch2_ops, 1675 + }, 1676 + }, 1677 + }; 1678 + 1679 + static struct clk_branch gcc_pcie_0_slv_q2a_axi_clk = { 1680 + .halt_reg = 0x6b00c, 1681 + .halt_check = BRANCH_HALT_VOTED, 1682 + .clkr = { 1683 + .enable_reg = 0x5200c, 1684 + .enable_mask = BIT(5), 1685 + .hw.init = &(struct clk_init_data){ 1686 + .name = "gcc_pcie_0_slv_q2a_axi_clk", 1687 + .ops = &clk_branch2_ops, 1688 + }, 1689 + }, 1690 + }; 1691 + 1692 + static struct clk_branch gcc_pcie_1_aux_clk = { 1693 + .halt_reg = 0x8d01c, 1694 + .halt_check = BRANCH_HALT_VOTED, 1695 + .clkr = { 1696 + .enable_reg = 0x52004, 1697 + .enable_mask = BIT(29), 1698 + .hw.init = &(struct clk_init_data){ 1699 + .name = "gcc_pcie_1_aux_clk", 1700 + .parent_names = (const char *[]){ 1701 + "gcc_pcie_1_aux_clk_src", 1702 + }, 1703 + .num_parents = 1, 1704 + .flags = CLK_SET_RATE_PARENT, 1705 + .ops = &clk_branch2_ops, 1706 + }, 1707 + }, 1708 + }; 1709 + 1710 + static struct clk_branch gcc_pcie_1_cfg_ahb_clk = { 1711 + .halt_reg = 0x8d018, 1712 + .halt_check = BRANCH_HALT_VOTED, 1713 + .hwcg_reg = 0x8d018, 1714 + .hwcg_bit = 1, 1715 + .clkr = { 1716 + .enable_reg = 0x52004, 1717 + .enable_mask = BIT(28), 1718 + .hw.init = &(struct clk_init_data){ 1719 + .name = "gcc_pcie_1_cfg_ahb_clk", 1720 + .ops = &clk_branch2_ops, 1721 + }, 1722 + }, 1723 + }; 1724 + 1725 + static struct clk_branch gcc_pcie_1_clkref_clk = { 1726 + .halt_reg = 0x8c02c, 1727 + .halt_check = BRANCH_HALT, 1728 + .clkr = { 1729 + .enable_reg = 0x8c02c, 1730 + .enable_mask = BIT(0), 1731 + .hw.init = &(struct clk_init_data){ 1732 + .name = "gcc_pcie_1_clkref_clk", 1733 + .ops = &clk_branch2_ops, 1734 + }, 1735 + }, 1736 + }; 1737 + 1738 + static struct clk_branch gcc_pcie_1_mstr_axi_clk = { 1739 + .halt_reg = 0x8d014, 1740 + .halt_check = BRANCH_HALT_VOTED, 1741 + .clkr = { 1742 + .enable_reg = 0x52004, 1743 + .enable_mask = BIT(27), 1744 + .hw.init = &(struct clk_init_data){ 1745 + .name = "gcc_pcie_1_mstr_axi_clk", 1746 + .ops = &clk_branch2_ops, 1747 + }, 1748 + }, 1749 + }; 1750 + 1751 + static struct clk_branch gcc_pcie_1_pipe_clk = { 1752 + .halt_check = BRANCH_HALT_SKIP, 1753 + .clkr = { 1754 + .enable_reg = 0x52004, 1755 + .enable_mask = BIT(30), 1756 + .hw.init = &(struct clk_init_data){ 1757 + .name = "gcc_pcie_1_pipe_clk", 1758 + .ops = &clk_branch2_ops, 1759 + }, 1760 + }, 1761 + }; 1762 + 1763 + static struct clk_branch gcc_pcie_1_slv_axi_clk = { 1764 + .halt_reg = 0x8d010, 1765 + .halt_check = BRANCH_HALT_VOTED, 1766 + .hwcg_reg = 0x8d010, 1767 + .hwcg_bit = 1, 1768 + .clkr = { 1769 + .enable_reg = 0x52004, 1770 + .enable_mask = BIT(26), 1771 + .hw.init = &(struct clk_init_data){ 1772 + .name = "gcc_pcie_1_slv_axi_clk", 1773 + .ops = &clk_branch2_ops, 1774 + }, 1775 + }, 1776 + }; 1777 + 1778 + static struct clk_branch gcc_pcie_1_slv_q2a_axi_clk = { 1779 + .halt_reg = 0x8d00c, 1780 + .halt_check = BRANCH_HALT_VOTED, 1781 + .clkr = { 1782 + .enable_reg = 0x52004, 1783 + .enable_mask = BIT(25), 1784 + .hw.init = &(struct clk_init_data){ 1785 + .name = "gcc_pcie_1_slv_q2a_axi_clk", 1786 + .ops = &clk_branch2_ops, 1787 + }, 1788 + }, 1789 + }; 1790 + 1791 + static struct clk_branch gcc_pcie_phy_aux_clk = { 1792 + .halt_reg = 0x6f004, 1793 + .halt_check = BRANCH_HALT, 1794 + .clkr = { 1795 + .enable_reg = 0x6f004, 1796 + .enable_mask = BIT(0), 1797 + .hw.init = &(struct clk_init_data){ 1798 + .name = "gcc_pcie_phy_aux_clk", 1799 + .parent_names = (const char *[]){ 1800 + "gcc_pcie_0_aux_clk_src", 1801 + }, 1802 + .num_parents = 1, 1803 + .flags = CLK_SET_RATE_PARENT, 1804 + .ops = &clk_branch2_ops, 1805 + }, 1806 + }, 1807 + }; 1808 + 1809 + static struct clk_branch gcc_pcie_phy_refgen_clk = { 1810 + .halt_reg = 0x6f02c, 1811 + .halt_check = BRANCH_HALT, 1812 + .clkr = { 1813 + .enable_reg = 0x6f02c, 1814 + .enable_mask = BIT(0), 1815 + .hw.init = &(struct clk_init_data){ 1816 + .name = "gcc_pcie_phy_refgen_clk", 1817 + .parent_names = (const char *[]){ 1818 + "gcc_pcie_phy_refgen_clk_src", 1819 + }, 1820 + .num_parents = 1, 1821 + .flags = CLK_SET_RATE_PARENT, 1822 + .ops = &clk_branch2_ops, 1823 + }, 1824 + }, 1825 + }; 1826 + 1827 + static struct clk_branch gcc_pdm2_clk = { 1828 + .halt_reg = 0x3300c, 1829 + .halt_check = BRANCH_HALT, 1830 + .clkr = { 1831 + .enable_reg = 0x3300c, 1832 + .enable_mask = BIT(0), 1833 + .hw.init = &(struct clk_init_data){ 1834 + .name = "gcc_pdm2_clk", 1835 + .parent_names = (const char *[]){ 1836 + "gcc_pdm2_clk_src", 1837 + }, 1838 + .num_parents = 1, 1839 + .flags = CLK_SET_RATE_PARENT, 1840 + .ops = &clk_branch2_ops, 1841 + }, 1842 + }, 1843 + }; 1844 + 1845 + static struct clk_branch gcc_pdm_ahb_clk = { 1846 + .halt_reg = 0x33004, 1847 + .halt_check = BRANCH_HALT, 1848 + .hwcg_reg = 0x33004, 1849 + .hwcg_bit = 1, 1850 + .clkr = { 1851 + .enable_reg = 0x33004, 1852 + .enable_mask = BIT(0), 1853 + .hw.init = &(struct clk_init_data){ 1854 + .name = "gcc_pdm_ahb_clk", 1855 + .ops = &clk_branch2_ops, 1856 + }, 1857 + }, 1858 + }; 1859 + 1860 + static struct clk_branch gcc_pdm_xo4_clk = { 1861 + .halt_reg = 0x33008, 1862 + .halt_check = BRANCH_HALT, 1863 + .clkr = { 1864 + .enable_reg = 0x33008, 1865 + .enable_mask = BIT(0), 1866 + .hw.init = &(struct clk_init_data){ 1867 + .name = "gcc_pdm_xo4_clk", 1868 + .ops = &clk_branch2_ops, 1869 + }, 1870 + }, 1871 + }; 1872 + 1873 + static struct clk_branch gcc_prng_ahb_clk = { 1874 + .halt_reg = 0x34004, 1875 + .halt_check = BRANCH_HALT_VOTED, 1876 + .hwcg_reg = 0x34004, 1877 + .hwcg_bit = 1, 1878 + .clkr = { 1879 + .enable_reg = 0x52004, 1880 + .enable_mask = BIT(13), 1881 + .hw.init = &(struct clk_init_data){ 1882 + .name = "gcc_prng_ahb_clk", 1883 + .ops = &clk_branch2_ops, 1884 + }, 1885 + }, 1886 + }; 1887 + 1888 + static struct clk_branch gcc_qmip_camera_ahb_clk = { 1889 + .halt_reg = 0xb014, 1890 + .halt_check = BRANCH_HALT, 1891 + .hwcg_reg = 0xb014, 1892 + .hwcg_bit = 1, 1893 + .clkr = { 1894 + .enable_reg = 0xb014, 1895 + .enable_mask = BIT(0), 1896 + .hw.init = &(struct clk_init_data){ 1897 + .name = "gcc_qmip_camera_ahb_clk", 1898 + .ops = &clk_branch2_ops, 1899 + }, 1900 + }, 1901 + }; 1902 + 1903 + static struct clk_branch gcc_qmip_disp_ahb_clk = { 1904 + .halt_reg = 0xb018, 1905 + .halt_check = BRANCH_HALT, 1906 + .hwcg_reg = 0xb018, 1907 + .hwcg_bit = 1, 1908 + .clkr = { 1909 + .enable_reg = 0xb018, 1910 + .enable_mask = BIT(0), 1911 + .hw.init = &(struct clk_init_data){ 1912 + .name = "gcc_qmip_disp_ahb_clk", 1913 + .ops = &clk_branch2_ops, 1914 + }, 1915 + }, 1916 + }; 1917 + 1918 + static struct clk_branch gcc_qmip_video_ahb_clk = { 1919 + .halt_reg = 0xb010, 1920 + .halt_check = BRANCH_HALT, 1921 + .hwcg_reg = 0xb010, 1922 + .hwcg_bit = 1, 1923 + .clkr = { 1924 + .enable_reg = 0xb010, 1925 + .enable_mask = BIT(0), 1926 + .hw.init = &(struct clk_init_data){ 1927 + .name = "gcc_qmip_video_ahb_clk", 1928 + .ops = &clk_branch2_ops, 1929 + }, 1930 + }, 1931 + }; 1932 + 1933 + static struct clk_branch gcc_qupv3_wrap0_s0_clk = { 1934 + .halt_reg = 0x17030, 1935 + .halt_check = BRANCH_HALT_VOTED, 1936 + .clkr = { 1937 + .enable_reg = 0x5200c, 1938 + .enable_mask = BIT(10), 1939 + .hw.init = &(struct clk_init_data){ 1940 + .name = "gcc_qupv3_wrap0_s0_clk", 1941 + .parent_names = (const char *[]){ 1942 + "gcc_qupv3_wrap0_s0_clk_src", 1943 + }, 1944 + .num_parents = 1, 1945 + .flags = CLK_SET_RATE_PARENT, 1946 + .ops = &clk_branch2_ops, 1947 + }, 1948 + }, 1949 + }; 1950 + 1951 + static struct clk_branch gcc_qupv3_wrap0_s1_clk = { 1952 + .halt_reg = 0x17160, 1953 + .halt_check = BRANCH_HALT_VOTED, 1954 + .clkr = { 1955 + .enable_reg = 0x5200c, 1956 + .enable_mask = BIT(11), 1957 + .hw.init = &(struct clk_init_data){ 1958 + .name = "gcc_qupv3_wrap0_s1_clk", 1959 + .parent_names = (const char *[]){ 1960 + "gcc_qupv3_wrap0_s1_clk_src", 1961 + }, 1962 + .num_parents = 1, 1963 + .flags = CLK_SET_RATE_PARENT, 1964 + .ops = &clk_branch2_ops, 1965 + }, 1966 + }, 1967 + }; 1968 + 1969 + static struct clk_branch gcc_qupv3_wrap0_s2_clk = { 1970 + .halt_reg = 0x17290, 1971 + .halt_check = BRANCH_HALT_VOTED, 1972 + .clkr = { 1973 + .enable_reg = 0x5200c, 1974 + .enable_mask = BIT(12), 1975 + .hw.init = &(struct clk_init_data){ 1976 + .name = "gcc_qupv3_wrap0_s2_clk", 1977 + .parent_names = (const char *[]){ 1978 + "gcc_qupv3_wrap0_s2_clk_src", 1979 + }, 1980 + .num_parents = 1, 1981 + .flags = CLK_SET_RATE_PARENT, 1982 + .ops = &clk_branch2_ops, 1983 + }, 1984 + }, 1985 + }; 1986 + 1987 + static struct clk_branch gcc_qupv3_wrap0_s3_clk = { 1988 + .halt_reg = 0x173c0, 1989 + .halt_check = BRANCH_HALT_VOTED, 1990 + .clkr = { 1991 + .enable_reg = 0x5200c, 1992 + .enable_mask = BIT(13), 1993 + .hw.init = &(struct clk_init_data){ 1994 + .name = "gcc_qupv3_wrap0_s3_clk", 1995 + .parent_names = (const char *[]){ 1996 + "gcc_qupv3_wrap0_s3_clk_src", 1997 + }, 1998 + .num_parents = 1, 1999 + .flags = CLK_SET_RATE_PARENT, 2000 + .ops = &clk_branch2_ops, 2001 + }, 2002 + }, 2003 + }; 2004 + 2005 + static struct clk_branch gcc_qupv3_wrap0_s4_clk = { 2006 + .halt_reg = 0x174f0, 2007 + .halt_check = BRANCH_HALT_VOTED, 2008 + .clkr = { 2009 + .enable_reg = 0x5200c, 2010 + .enable_mask = BIT(14), 2011 + .hw.init = &(struct clk_init_data){ 2012 + .name = "gcc_qupv3_wrap0_s4_clk", 2013 + .parent_names = (const char *[]){ 2014 + "gcc_qupv3_wrap0_s4_clk_src", 2015 + }, 2016 + .num_parents = 1, 2017 + .flags = CLK_SET_RATE_PARENT, 2018 + .ops = &clk_branch2_ops, 2019 + }, 2020 + }, 2021 + }; 2022 + 2023 + static struct clk_branch gcc_qupv3_wrap0_s5_clk = { 2024 + .halt_reg = 0x17620, 2025 + .halt_check = BRANCH_HALT_VOTED, 2026 + .clkr = { 2027 + .enable_reg = 0x5200c, 2028 + .enable_mask = BIT(15), 2029 + .hw.init = &(struct clk_init_data){ 2030 + .name = "gcc_qupv3_wrap0_s5_clk", 2031 + .parent_names = (const char *[]){ 2032 + "gcc_qupv3_wrap0_s5_clk_src", 2033 + }, 2034 + .num_parents = 1, 2035 + .flags = CLK_SET_RATE_PARENT, 2036 + .ops = &clk_branch2_ops, 2037 + }, 2038 + }, 2039 + }; 2040 + 2041 + static struct clk_branch gcc_qupv3_wrap0_s6_clk = { 2042 + .halt_reg = 0x17750, 2043 + .halt_check = BRANCH_HALT_VOTED, 2044 + .clkr = { 2045 + .enable_reg = 0x5200c, 2046 + .enable_mask = BIT(16), 2047 + .hw.init = &(struct clk_init_data){ 2048 + .name = "gcc_qupv3_wrap0_s6_clk", 2049 + .parent_names = (const char *[]){ 2050 + "gcc_qupv3_wrap0_s6_clk_src", 2051 + }, 2052 + .num_parents = 1, 2053 + .flags = CLK_SET_RATE_PARENT, 2054 + .ops = &clk_branch2_ops, 2055 + }, 2056 + }, 2057 + }; 2058 + 2059 + static struct clk_branch gcc_qupv3_wrap0_s7_clk = { 2060 + .halt_reg = 0x17880, 2061 + .halt_check = BRANCH_HALT_VOTED, 2062 + .clkr = { 2063 + .enable_reg = 0x5200c, 2064 + .enable_mask = BIT(17), 2065 + .hw.init = &(struct clk_init_data){ 2066 + .name = "gcc_qupv3_wrap0_s7_clk", 2067 + .parent_names = (const char *[]){ 2068 + "gcc_qupv3_wrap0_s7_clk_src", 2069 + }, 2070 + .num_parents = 1, 2071 + .flags = CLK_SET_RATE_PARENT, 2072 + .ops = &clk_branch2_ops, 2073 + }, 2074 + }, 2075 + }; 2076 + 2077 + static struct clk_branch gcc_qupv3_wrap1_s0_clk = { 2078 + .halt_reg = 0x18014, 2079 + .halt_check = BRANCH_HALT_VOTED, 2080 + .clkr = { 2081 + .enable_reg = 0x5200c, 2082 + .enable_mask = BIT(22), 2083 + .hw.init = &(struct clk_init_data){ 2084 + .name = "gcc_qupv3_wrap1_s0_clk", 2085 + .parent_names = (const char *[]){ 2086 + "gcc_qupv3_wrap1_s0_clk_src", 2087 + }, 2088 + .num_parents = 1, 2089 + .flags = CLK_SET_RATE_PARENT, 2090 + .ops = &clk_branch2_ops, 2091 + }, 2092 + }, 2093 + }; 2094 + 2095 + static struct clk_branch gcc_qupv3_wrap1_s1_clk = { 2096 + .halt_reg = 0x18144, 2097 + .halt_check = BRANCH_HALT_VOTED, 2098 + .clkr = { 2099 + .enable_reg = 0x5200c, 2100 + .enable_mask = BIT(23), 2101 + .hw.init = &(struct clk_init_data){ 2102 + .name = "gcc_qupv3_wrap1_s1_clk", 2103 + .parent_names = (const char *[]){ 2104 + "gcc_qupv3_wrap1_s1_clk_src", 2105 + }, 2106 + .num_parents = 1, 2107 + .flags = CLK_SET_RATE_PARENT, 2108 + .ops = &clk_branch2_ops, 2109 + }, 2110 + }, 2111 + }; 2112 + 2113 + static struct clk_branch gcc_qupv3_wrap1_s2_clk = { 2114 + .halt_reg = 0x18274, 2115 + .halt_check = BRANCH_HALT_VOTED, 2116 + .clkr = { 2117 + .enable_reg = 0x5200c, 2118 + .enable_mask = BIT(24), 2119 + .hw.init = &(struct clk_init_data){ 2120 + .name = "gcc_qupv3_wrap1_s2_clk", 2121 + .parent_names = (const char *[]){ 2122 + "gcc_qupv3_wrap1_s2_clk_src", 2123 + }, 2124 + .num_parents = 1, 2125 + .flags = CLK_SET_RATE_PARENT, 2126 + .ops = &clk_branch2_ops, 2127 + }, 2128 + }, 2129 + }; 2130 + 2131 + static struct clk_branch gcc_qupv3_wrap1_s3_clk = { 2132 + .halt_reg = 0x183a4, 2133 + .halt_check = BRANCH_HALT_VOTED, 2134 + .clkr = { 2135 + .enable_reg = 0x5200c, 2136 + .enable_mask = BIT(25), 2137 + .hw.init = &(struct clk_init_data){ 2138 + .name = "gcc_qupv3_wrap1_s3_clk", 2139 + .parent_names = (const char *[]){ 2140 + "gcc_qupv3_wrap1_s3_clk_src", 2141 + }, 2142 + .num_parents = 1, 2143 + .flags = CLK_SET_RATE_PARENT, 2144 + .ops = &clk_branch2_ops, 2145 + }, 2146 + }, 2147 + }; 2148 + 2149 + static struct clk_branch gcc_qupv3_wrap1_s4_clk = { 2150 + .halt_reg = 0x184d4, 2151 + .halt_check = BRANCH_HALT_VOTED, 2152 + .clkr = { 2153 + .enable_reg = 0x5200c, 2154 + .enable_mask = BIT(26), 2155 + .hw.init = &(struct clk_init_data){ 2156 + .name = "gcc_qupv3_wrap1_s4_clk", 2157 + .parent_names = (const char *[]){ 2158 + "gcc_qupv3_wrap1_s4_clk_src", 2159 + }, 2160 + .num_parents = 1, 2161 + .flags = CLK_SET_RATE_PARENT, 2162 + .ops = &clk_branch2_ops, 2163 + }, 2164 + }, 2165 + }; 2166 + 2167 + static struct clk_branch gcc_qupv3_wrap1_s5_clk = { 2168 + .halt_reg = 0x18604, 2169 + .halt_check = BRANCH_HALT_VOTED, 2170 + .clkr = { 2171 + .enable_reg = 0x5200c, 2172 + .enable_mask = BIT(27), 2173 + .hw.init = &(struct clk_init_data){ 2174 + .name = "gcc_qupv3_wrap1_s5_clk", 2175 + .parent_names = (const char *[]){ 2176 + "gcc_qupv3_wrap1_s5_clk_src", 2177 + }, 2178 + .num_parents = 1, 2179 + .flags = CLK_SET_RATE_PARENT, 2180 + .ops = &clk_branch2_ops, 2181 + }, 2182 + }, 2183 + }; 2184 + 2185 + static struct clk_branch gcc_qupv3_wrap1_s6_clk = { 2186 + .halt_reg = 0x18734, 2187 + .halt_check = BRANCH_HALT_VOTED, 2188 + .clkr = { 2189 + .enable_reg = 0x5200c, 2190 + .enable_mask = BIT(28), 2191 + .hw.init = &(struct clk_init_data){ 2192 + .name = "gcc_qupv3_wrap1_s6_clk", 2193 + .parent_names = (const char *[]){ 2194 + "gcc_qupv3_wrap1_s6_clk_src", 2195 + }, 2196 + .num_parents = 1, 2197 + .flags = CLK_SET_RATE_PARENT, 2198 + .ops = &clk_branch2_ops, 2199 + }, 2200 + }, 2201 + }; 2202 + 2203 + static struct clk_branch gcc_qupv3_wrap1_s7_clk = { 2204 + .halt_reg = 0x18864, 2205 + .halt_check = BRANCH_HALT_VOTED, 2206 + .clkr = { 2207 + .enable_reg = 0x5200c, 2208 + .enable_mask = BIT(29), 2209 + .hw.init = &(struct clk_init_data){ 2210 + .name = "gcc_qupv3_wrap1_s7_clk", 2211 + .parent_names = (const char *[]){ 2212 + "gcc_qupv3_wrap1_s7_clk_src", 2213 + }, 2214 + .num_parents = 1, 2215 + .flags = CLK_SET_RATE_PARENT, 2216 + .ops = &clk_branch2_ops, 2217 + }, 2218 + }, 2219 + }; 2220 + 2221 + static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = { 2222 + .halt_reg = 0x17004, 2223 + .halt_check = BRANCH_HALT_VOTED, 2224 + .clkr = { 2225 + .enable_reg = 0x5200c, 2226 + .enable_mask = BIT(6), 2227 + .hw.init = &(struct clk_init_data){ 2228 + .name = "gcc_qupv3_wrap_0_m_ahb_clk", 2229 + .ops = &clk_branch2_ops, 2230 + }, 2231 + }, 2232 + }; 2233 + 2234 + static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = { 2235 + .halt_reg = 0x17008, 2236 + .halt_check = BRANCH_HALT_VOTED, 2237 + .hwcg_reg = 0x17008, 2238 + .hwcg_bit = 1, 2239 + .clkr = { 2240 + .enable_reg = 0x5200c, 2241 + .enable_mask = BIT(7), 2242 + .hw.init = &(struct clk_init_data){ 2243 + .name = "gcc_qupv3_wrap_0_s_ahb_clk", 2244 + .ops = &clk_branch2_ops, 2245 + }, 2246 + }, 2247 + }; 2248 + 2249 + static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = { 2250 + .halt_reg = 0x1800c, 2251 + .halt_check = BRANCH_HALT_VOTED, 2252 + .clkr = { 2253 + .enable_reg = 0x5200c, 2254 + .enable_mask = BIT(20), 2255 + .hw.init = &(struct clk_init_data){ 2256 + .name = "gcc_qupv3_wrap_1_m_ahb_clk", 2257 + .ops = &clk_branch2_ops, 2258 + }, 2259 + }, 2260 + }; 2261 + 2262 + static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = { 2263 + .halt_reg = 0x18010, 2264 + .halt_check = BRANCH_HALT_VOTED, 2265 + .hwcg_reg = 0x18010, 2266 + .hwcg_bit = 1, 2267 + .clkr = { 2268 + .enable_reg = 0x5200c, 2269 + .enable_mask = BIT(21), 2270 + .hw.init = &(struct clk_init_data){ 2271 + .name = "gcc_qupv3_wrap_1_s_ahb_clk", 2272 + .ops = &clk_branch2_ops, 2273 + }, 2274 + }, 2275 + }; 2276 + 2277 + static struct clk_branch gcc_sdcc2_ahb_clk = { 2278 + .halt_reg = 0x14008, 2279 + .halt_check = BRANCH_HALT, 2280 + .clkr = { 2281 + .enable_reg = 0x14008, 2282 + .enable_mask = BIT(0), 2283 + .hw.init = &(struct clk_init_data){ 2284 + .name = "gcc_sdcc2_ahb_clk", 2285 + .ops = &clk_branch2_ops, 2286 + }, 2287 + }, 2288 + }; 2289 + 2290 + static struct clk_branch gcc_sdcc2_apps_clk = { 2291 + .halt_reg = 0x14004, 2292 + .halt_check = BRANCH_HALT, 2293 + .clkr = { 2294 + .enable_reg = 0x14004, 2295 + .enable_mask = BIT(0), 2296 + .hw.init = &(struct clk_init_data){ 2297 + .name = "gcc_sdcc2_apps_clk", 2298 + .parent_names = (const char *[]){ 2299 + "gcc_sdcc2_apps_clk_src", 2300 + }, 2301 + .num_parents = 1, 2302 + .flags = CLK_SET_RATE_PARENT, 2303 + .ops = &clk_branch2_ops, 2304 + }, 2305 + }, 2306 + }; 2307 + 2308 + static struct clk_branch gcc_sdcc4_ahb_clk = { 2309 + .halt_reg = 0x16008, 2310 + .halt_check = BRANCH_HALT, 2311 + .clkr = { 2312 + .enable_reg = 0x16008, 2313 + .enable_mask = BIT(0), 2314 + .hw.init = &(struct clk_init_data){ 2315 + .name = "gcc_sdcc4_ahb_clk", 2316 + .ops = &clk_branch2_ops, 2317 + }, 2318 + }, 2319 + }; 2320 + 2321 + static struct clk_branch gcc_sdcc4_apps_clk = { 2322 + .halt_reg = 0x16004, 2323 + .halt_check = BRANCH_HALT, 2324 + .clkr = { 2325 + .enable_reg = 0x16004, 2326 + .enable_mask = BIT(0), 2327 + .hw.init = &(struct clk_init_data){ 2328 + .name = "gcc_sdcc4_apps_clk", 2329 + .parent_names = (const char *[]){ 2330 + "gcc_sdcc4_apps_clk_src", 2331 + }, 2332 + .num_parents = 1, 2333 + .flags = CLK_SET_RATE_PARENT, 2334 + .ops = &clk_branch2_ops, 2335 + }, 2336 + }, 2337 + }; 2338 + 2339 + static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = { 2340 + .halt_reg = 0x414c, 2341 + .halt_check = BRANCH_HALT_VOTED, 2342 + .clkr = { 2343 + .enable_reg = 0x52004, 2344 + .enable_mask = BIT(0), 2345 + .hw.init = &(struct clk_init_data){ 2346 + .name = "gcc_sys_noc_cpuss_ahb_clk", 2347 + .parent_names = (const char *[]){ 2348 + "gcc_cpuss_ahb_clk_src", 2349 + }, 2350 + .num_parents = 1, 2351 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 2352 + .ops = &clk_branch2_ops, 2353 + }, 2354 + }, 2355 + }; 2356 + 2357 + static struct clk_branch gcc_tsif_ahb_clk = { 2358 + .halt_reg = 0x36004, 2359 + .halt_check = BRANCH_HALT, 2360 + .clkr = { 2361 + .enable_reg = 0x36004, 2362 + .enable_mask = BIT(0), 2363 + .hw.init = &(struct clk_init_data){ 2364 + .name = "gcc_tsif_ahb_clk", 2365 + .ops = &clk_branch2_ops, 2366 + }, 2367 + }, 2368 + }; 2369 + 2370 + static struct clk_branch gcc_tsif_inactivity_timers_clk = { 2371 + .halt_reg = 0x3600c, 2372 + .halt_check = BRANCH_HALT, 2373 + .clkr = { 2374 + .enable_reg = 0x3600c, 2375 + .enable_mask = BIT(0), 2376 + .hw.init = &(struct clk_init_data){ 2377 + .name = "gcc_tsif_inactivity_timers_clk", 2378 + .ops = &clk_branch2_ops, 2379 + }, 2380 + }, 2381 + }; 2382 + 2383 + static struct clk_branch gcc_tsif_ref_clk = { 2384 + .halt_reg = 0x36008, 2385 + .halt_check = BRANCH_HALT, 2386 + .clkr = { 2387 + .enable_reg = 0x36008, 2388 + .enable_mask = BIT(0), 2389 + .hw.init = &(struct clk_init_data){ 2390 + .name = "gcc_tsif_ref_clk", 2391 + .parent_names = (const char *[]){ 2392 + "gcc_tsif_ref_clk_src", 2393 + }, 2394 + .num_parents = 1, 2395 + .flags = CLK_SET_RATE_PARENT, 2396 + .ops = &clk_branch2_ops, 2397 + }, 2398 + }, 2399 + }; 2400 + 2401 + static struct clk_branch gcc_ufs_card_ahb_clk = { 2402 + .halt_reg = 0x75010, 2403 + .halt_check = BRANCH_HALT, 2404 + .hwcg_reg = 0x75010, 2405 + .hwcg_bit = 1, 2406 + .clkr = { 2407 + .enable_reg = 0x75010, 2408 + .enable_mask = BIT(0), 2409 + .hw.init = &(struct clk_init_data){ 2410 + .name = "gcc_ufs_card_ahb_clk", 2411 + .ops = &clk_branch2_ops, 2412 + }, 2413 + }, 2414 + }; 2415 + 2416 + static struct clk_branch gcc_ufs_card_axi_clk = { 2417 + .halt_reg = 0x7500c, 2418 + .halt_check = BRANCH_HALT, 2419 + .hwcg_reg = 0x7500c, 2420 + .hwcg_bit = 1, 2421 + .clkr = { 2422 + .enable_reg = 0x7500c, 2423 + .enable_mask = BIT(0), 2424 + .hw.init = &(struct clk_init_data){ 2425 + .name = "gcc_ufs_card_axi_clk", 2426 + .parent_names = (const char *[]){ 2427 + "gcc_ufs_card_axi_clk_src", 2428 + }, 2429 + .num_parents = 1, 2430 + .flags = CLK_SET_RATE_PARENT, 2431 + .ops = &clk_branch2_ops, 2432 + }, 2433 + }, 2434 + }; 2435 + 2436 + static struct clk_branch gcc_ufs_card_clkref_clk = { 2437 + .halt_reg = 0x8c004, 2438 + .halt_check = BRANCH_HALT, 2439 + .clkr = { 2440 + .enable_reg = 0x8c004, 2441 + .enable_mask = BIT(0), 2442 + .hw.init = &(struct clk_init_data){ 2443 + .name = "gcc_ufs_card_clkref_clk", 2444 + .ops = &clk_branch2_ops, 2445 + }, 2446 + }, 2447 + }; 2448 + 2449 + static struct clk_branch gcc_ufs_card_ice_core_clk = { 2450 + .halt_reg = 0x75058, 2451 + .halt_check = BRANCH_HALT, 2452 + .hwcg_reg = 0x75058, 2453 + .hwcg_bit = 1, 2454 + .clkr = { 2455 + .enable_reg = 0x75058, 2456 + .enable_mask = BIT(0), 2457 + .hw.init = &(struct clk_init_data){ 2458 + .name = "gcc_ufs_card_ice_core_clk", 2459 + .parent_names = (const char *[]){ 2460 + "gcc_ufs_card_ice_core_clk_src", 2461 + }, 2462 + .num_parents = 1, 2463 + .flags = CLK_SET_RATE_PARENT, 2464 + .ops = &clk_branch2_ops, 2465 + }, 2466 + }, 2467 + }; 2468 + 2469 + static struct clk_branch gcc_ufs_card_phy_aux_clk = { 2470 + .halt_reg = 0x7508c, 2471 + .halt_check = BRANCH_HALT, 2472 + .hwcg_reg = 0x7508c, 2473 + .hwcg_bit = 1, 2474 + .clkr = { 2475 + .enable_reg = 0x7508c, 2476 + .enable_mask = BIT(0), 2477 + .hw.init = &(struct clk_init_data){ 2478 + .name = "gcc_ufs_card_phy_aux_clk", 2479 + .parent_names = (const char *[]){ 2480 + "gcc_ufs_card_phy_aux_clk_src", 2481 + }, 2482 + .num_parents = 1, 2483 + .flags = CLK_SET_RATE_PARENT, 2484 + .ops = &clk_branch2_ops, 2485 + }, 2486 + }, 2487 + }; 2488 + 2489 + static struct clk_branch gcc_ufs_card_rx_symbol_0_clk = { 2490 + .halt_check = BRANCH_HALT_SKIP, 2491 + .clkr = { 2492 + .enable_reg = 0x75018, 2493 + .enable_mask = BIT(0), 2494 + .hw.init = &(struct clk_init_data){ 2495 + .name = "gcc_ufs_card_rx_symbol_0_clk", 2496 + .ops = &clk_branch2_ops, 2497 + }, 2498 + }, 2499 + }; 2500 + 2501 + static struct clk_branch gcc_ufs_card_rx_symbol_1_clk = { 2502 + .halt_check = BRANCH_HALT_SKIP, 2503 + .clkr = { 2504 + .enable_reg = 0x750a8, 2505 + .enable_mask = BIT(0), 2506 + .hw.init = &(struct clk_init_data){ 2507 + .name = "gcc_ufs_card_rx_symbol_1_clk", 2508 + .ops = &clk_branch2_ops, 2509 + }, 2510 + }, 2511 + }; 2512 + 2513 + static struct clk_branch gcc_ufs_card_tx_symbol_0_clk = { 2514 + .halt_check = BRANCH_HALT_SKIP, 2515 + .clkr = { 2516 + .enable_reg = 0x75014, 2517 + .enable_mask = BIT(0), 2518 + .hw.init = &(struct clk_init_data){ 2519 + .name = "gcc_ufs_card_tx_symbol_0_clk", 2520 + .ops = &clk_branch2_ops, 2521 + }, 2522 + }, 2523 + }; 2524 + 2525 + static struct clk_branch gcc_ufs_card_unipro_core_clk = { 2526 + .halt_reg = 0x75054, 2527 + .halt_check = BRANCH_HALT, 2528 + .hwcg_reg = 0x75054, 2529 + .hwcg_bit = 1, 2530 + .clkr = { 2531 + .enable_reg = 0x75054, 2532 + .enable_mask = BIT(0), 2533 + .hw.init = &(struct clk_init_data){ 2534 + .name = "gcc_ufs_card_unipro_core_clk", 2535 + .parent_names = (const char *[]){ 2536 + "gcc_ufs_card_unipro_core_clk_src", 2537 + }, 2538 + .num_parents = 1, 2539 + .flags = CLK_SET_RATE_PARENT, 2540 + .ops = &clk_branch2_ops, 2541 + }, 2542 + }, 2543 + }; 2544 + 2545 + static struct clk_branch gcc_ufs_mem_clkref_clk = { 2546 + .halt_reg = 0x8c000, 2547 + .halt_check = BRANCH_HALT, 2548 + .clkr = { 2549 + .enable_reg = 0x8c000, 2550 + .enable_mask = BIT(0), 2551 + .hw.init = &(struct clk_init_data){ 2552 + .name = "gcc_ufs_mem_clkref_clk", 2553 + .ops = &clk_branch2_ops, 2554 + }, 2555 + }, 2556 + }; 2557 + 2558 + static struct clk_branch gcc_ufs_phy_ahb_clk = { 2559 + .halt_reg = 0x77010, 2560 + .halt_check = BRANCH_HALT, 2561 + .hwcg_reg = 0x77010, 2562 + .hwcg_bit = 1, 2563 + .clkr = { 2564 + .enable_reg = 0x77010, 2565 + .enable_mask = BIT(0), 2566 + .hw.init = &(struct clk_init_data){ 2567 + .name = "gcc_ufs_phy_ahb_clk", 2568 + .ops = &clk_branch2_ops, 2569 + }, 2570 + }, 2571 + }; 2572 + 2573 + static struct clk_branch gcc_ufs_phy_axi_clk = { 2574 + .halt_reg = 0x7700c, 2575 + .halt_check = BRANCH_HALT, 2576 + .hwcg_reg = 0x7700c, 2577 + .hwcg_bit = 1, 2578 + .clkr = { 2579 + .enable_reg = 0x7700c, 2580 + .enable_mask = BIT(0), 2581 + .hw.init = &(struct clk_init_data){ 2582 + .name = "gcc_ufs_phy_axi_clk", 2583 + .parent_names = (const char *[]){ 2584 + "gcc_ufs_phy_axi_clk_src", 2585 + }, 2586 + .num_parents = 1, 2587 + .flags = CLK_SET_RATE_PARENT, 2588 + .ops = &clk_branch2_ops, 2589 + }, 2590 + }, 2591 + }; 2592 + 2593 + static struct clk_branch gcc_ufs_phy_ice_core_clk = { 2594 + .halt_reg = 0x77058, 2595 + .halt_check = BRANCH_HALT, 2596 + .hwcg_reg = 0x77058, 2597 + .hwcg_bit = 1, 2598 + .clkr = { 2599 + .enable_reg = 0x77058, 2600 + .enable_mask = BIT(0), 2601 + .hw.init = &(struct clk_init_data){ 2602 + .name = "gcc_ufs_phy_ice_core_clk", 2603 + .parent_names = (const char *[]){ 2604 + "gcc_ufs_phy_ice_core_clk_src", 2605 + }, 2606 + .num_parents = 1, 2607 + .flags = CLK_SET_RATE_PARENT, 2608 + .ops = &clk_branch2_ops, 2609 + }, 2610 + }, 2611 + }; 2612 + 2613 + static struct clk_branch gcc_ufs_phy_phy_aux_clk = { 2614 + .halt_reg = 0x7708c, 2615 + .halt_check = BRANCH_HALT, 2616 + .hwcg_reg = 0x7708c, 2617 + .hwcg_bit = 1, 2618 + .clkr = { 2619 + .enable_reg = 0x7708c, 2620 + .enable_mask = BIT(0), 2621 + .hw.init = &(struct clk_init_data){ 2622 + .name = "gcc_ufs_phy_phy_aux_clk", 2623 + .parent_names = (const char *[]){ 2624 + "gcc_ufs_phy_phy_aux_clk_src", 2625 + }, 2626 + .num_parents = 1, 2627 + .flags = CLK_SET_RATE_PARENT, 2628 + .ops = &clk_branch2_ops, 2629 + }, 2630 + }, 2631 + }; 2632 + 2633 + static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { 2634 + .halt_check = BRANCH_HALT_SKIP, 2635 + .clkr = { 2636 + .enable_reg = 0x77018, 2637 + .enable_mask = BIT(0), 2638 + .hw.init = &(struct clk_init_data){ 2639 + .name = "gcc_ufs_phy_rx_symbol_0_clk", 2640 + .ops = &clk_branch2_ops, 2641 + }, 2642 + }, 2643 + }; 2644 + 2645 + static struct clk_branch gcc_ufs_phy_rx_symbol_1_clk = { 2646 + .halt_check = BRANCH_HALT_SKIP, 2647 + .clkr = { 2648 + .enable_reg = 0x770a8, 2649 + .enable_mask = BIT(0), 2650 + .hw.init = &(struct clk_init_data){ 2651 + .name = "gcc_ufs_phy_rx_symbol_1_clk", 2652 + .ops = &clk_branch2_ops, 2653 + }, 2654 + }, 2655 + }; 2656 + 2657 + static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { 2658 + .halt_check = BRANCH_HALT_SKIP, 2659 + .clkr = { 2660 + .enable_reg = 0x77014, 2661 + .enable_mask = BIT(0), 2662 + .hw.init = &(struct clk_init_data){ 2663 + .name = "gcc_ufs_phy_tx_symbol_0_clk", 2664 + .ops = &clk_branch2_ops, 2665 + }, 2666 + }, 2667 + }; 2668 + 2669 + static struct clk_branch gcc_ufs_phy_unipro_core_clk = { 2670 + .halt_reg = 0x77054, 2671 + .halt_check = BRANCH_HALT, 2672 + .hwcg_reg = 0x77054, 2673 + .hwcg_bit = 1, 2674 + .clkr = { 2675 + .enable_reg = 0x77054, 2676 + .enable_mask = BIT(0), 2677 + .hw.init = &(struct clk_init_data){ 2678 + .name = "gcc_ufs_phy_unipro_core_clk", 2679 + .parent_names = (const char *[]){ 2680 + "gcc_ufs_phy_unipro_core_clk_src", 2681 + }, 2682 + .num_parents = 1, 2683 + .flags = CLK_SET_RATE_PARENT, 2684 + .ops = &clk_branch2_ops, 2685 + }, 2686 + }, 2687 + }; 2688 + 2689 + static struct clk_branch gcc_usb30_prim_master_clk = { 2690 + .halt_reg = 0xf00c, 2691 + .halt_check = BRANCH_HALT, 2692 + .clkr = { 2693 + .enable_reg = 0xf00c, 2694 + .enable_mask = BIT(0), 2695 + .hw.init = &(struct clk_init_data){ 2696 + .name = "gcc_usb30_prim_master_clk", 2697 + .parent_names = (const char *[]){ 2698 + "gcc_usb30_prim_master_clk_src", 2699 + }, 2700 + .num_parents = 1, 2701 + .flags = CLK_SET_RATE_PARENT, 2702 + .ops = &clk_branch2_ops, 2703 + }, 2704 + }, 2705 + }; 2706 + 2707 + static struct clk_branch gcc_usb30_prim_mock_utmi_clk = { 2708 + .halt_reg = 0xf014, 2709 + .halt_check = BRANCH_HALT, 2710 + .clkr = { 2711 + .enable_reg = 0xf014, 2712 + .enable_mask = BIT(0), 2713 + .hw.init = &(struct clk_init_data){ 2714 + .name = "gcc_usb30_prim_mock_utmi_clk", 2715 + .parent_names = (const char *[]){ 2716 + "gcc_usb30_prim_mock_utmi_clk_src", 2717 + }, 2718 + .num_parents = 1, 2719 + .flags = CLK_SET_RATE_PARENT, 2720 + .ops = &clk_branch2_ops, 2721 + }, 2722 + }, 2723 + }; 2724 + 2725 + static struct clk_branch gcc_usb30_prim_sleep_clk = { 2726 + .halt_reg = 0xf010, 2727 + .halt_check = BRANCH_HALT, 2728 + .clkr = { 2729 + .enable_reg = 0xf010, 2730 + .enable_mask = BIT(0), 2731 + .hw.init = &(struct clk_init_data){ 2732 + .name = "gcc_usb30_prim_sleep_clk", 2733 + .ops = &clk_branch2_ops, 2734 + }, 2735 + }, 2736 + }; 2737 + 2738 + static struct clk_branch gcc_usb30_sec_master_clk = { 2739 + .halt_reg = 0x1000c, 2740 + .halt_check = BRANCH_HALT, 2741 + .clkr = { 2742 + .enable_reg = 0x1000c, 2743 + .enable_mask = BIT(0), 2744 + .hw.init = &(struct clk_init_data){ 2745 + .name = "gcc_usb30_sec_master_clk", 2746 + .parent_names = (const char *[]){ 2747 + "gcc_usb30_sec_master_clk_src", 2748 + }, 2749 + .num_parents = 1, 2750 + .flags = CLK_SET_RATE_PARENT, 2751 + .ops = &clk_branch2_ops, 2752 + }, 2753 + }, 2754 + }; 2755 + 2756 + static struct clk_branch gcc_usb30_sec_mock_utmi_clk = { 2757 + .halt_reg = 0x10014, 2758 + .halt_check = BRANCH_HALT, 2759 + .clkr = { 2760 + .enable_reg = 0x10014, 2761 + .enable_mask = BIT(0), 2762 + .hw.init = &(struct clk_init_data){ 2763 + .name = "gcc_usb30_sec_mock_utmi_clk", 2764 + .parent_names = (const char *[]){ 2765 + "gcc_usb30_sec_mock_utmi_clk_src", 2766 + }, 2767 + .num_parents = 1, 2768 + .flags = CLK_SET_RATE_PARENT, 2769 + .ops = &clk_branch2_ops, 2770 + }, 2771 + }, 2772 + }; 2773 + 2774 + static struct clk_branch gcc_usb30_sec_sleep_clk = { 2775 + .halt_reg = 0x10010, 2776 + .halt_check = BRANCH_HALT, 2777 + .clkr = { 2778 + .enable_reg = 0x10010, 2779 + .enable_mask = BIT(0), 2780 + .hw.init = &(struct clk_init_data){ 2781 + .name = "gcc_usb30_sec_sleep_clk", 2782 + .ops = &clk_branch2_ops, 2783 + }, 2784 + }, 2785 + }; 2786 + 2787 + static struct clk_branch gcc_usb3_prim_clkref_clk = { 2788 + .halt_reg = 0x8c008, 2789 + .halt_check = BRANCH_HALT, 2790 + .clkr = { 2791 + .enable_reg = 0x8c008, 2792 + .enable_mask = BIT(0), 2793 + .hw.init = &(struct clk_init_data){ 2794 + .name = "gcc_usb3_prim_clkref_clk", 2795 + .ops = &clk_branch2_ops, 2796 + }, 2797 + }, 2798 + }; 2799 + 2800 + static struct clk_branch gcc_usb3_prim_phy_aux_clk = { 2801 + .halt_reg = 0xf04c, 2802 + .halt_check = BRANCH_HALT, 2803 + .clkr = { 2804 + .enable_reg = 0xf04c, 2805 + .enable_mask = BIT(0), 2806 + .hw.init = &(struct clk_init_data){ 2807 + .name = "gcc_usb3_prim_phy_aux_clk", 2808 + .parent_names = (const char *[]){ 2809 + "gcc_usb3_prim_phy_aux_clk_src", 2810 + }, 2811 + .num_parents = 1, 2812 + .flags = CLK_SET_RATE_PARENT, 2813 + .ops = &clk_branch2_ops, 2814 + }, 2815 + }, 2816 + }; 2817 + 2818 + static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = { 2819 + .halt_reg = 0xf050, 2820 + .halt_check = BRANCH_HALT, 2821 + .clkr = { 2822 + .enable_reg = 0xf050, 2823 + .enable_mask = BIT(0), 2824 + .hw.init = &(struct clk_init_data){ 2825 + .name = "gcc_usb3_prim_phy_com_aux_clk", 2826 + .parent_names = (const char *[]){ 2827 + "gcc_usb3_prim_phy_aux_clk_src", 2828 + }, 2829 + .num_parents = 1, 2830 + .flags = CLK_SET_RATE_PARENT, 2831 + .ops = &clk_branch2_ops, 2832 + }, 2833 + }, 2834 + }; 2835 + 2836 + static struct clk_branch gcc_usb3_prim_phy_pipe_clk = { 2837 + .halt_check = BRANCH_HALT_SKIP, 2838 + .clkr = { 2839 + .enable_reg = 0xf054, 2840 + .enable_mask = BIT(0), 2841 + .hw.init = &(struct clk_init_data){ 2842 + .name = "gcc_usb3_prim_phy_pipe_clk", 2843 + .ops = &clk_branch2_ops, 2844 + }, 2845 + }, 2846 + }; 2847 + 2848 + static struct clk_branch gcc_usb3_sec_clkref_clk = { 2849 + .halt_reg = 0x8c028, 2850 + .halt_check = BRANCH_HALT, 2851 + .clkr = { 2852 + .enable_reg = 0x8c028, 2853 + .enable_mask = BIT(0), 2854 + .hw.init = &(struct clk_init_data){ 2855 + .name = "gcc_usb3_sec_clkref_clk", 2856 + .ops = &clk_branch2_ops, 2857 + }, 2858 + }, 2859 + }; 2860 + 2861 + static struct clk_branch gcc_usb3_sec_phy_aux_clk = { 2862 + .halt_reg = 0x1004c, 2863 + .halt_check = BRANCH_HALT, 2864 + .clkr = { 2865 + .enable_reg = 0x1004c, 2866 + .enable_mask = BIT(0), 2867 + .hw.init = &(struct clk_init_data){ 2868 + .name = "gcc_usb3_sec_phy_aux_clk", 2869 + .parent_names = (const char *[]){ 2870 + "gcc_usb3_sec_phy_aux_clk_src", 2871 + }, 2872 + .num_parents = 1, 2873 + .flags = CLK_SET_RATE_PARENT, 2874 + .ops = &clk_branch2_ops, 2875 + }, 2876 + }, 2877 + }; 2878 + 2879 + static struct clk_branch gcc_usb3_sec_phy_com_aux_clk = { 2880 + .halt_reg = 0x10050, 2881 + .halt_check = BRANCH_HALT, 2882 + .clkr = { 2883 + .enable_reg = 0x10050, 2884 + .enable_mask = BIT(0), 2885 + .hw.init = &(struct clk_init_data){ 2886 + .name = "gcc_usb3_sec_phy_com_aux_clk", 2887 + .parent_names = (const char *[]){ 2888 + "gcc_usb3_sec_phy_aux_clk_src", 2889 + }, 2890 + .num_parents = 1, 2891 + .flags = CLK_SET_RATE_PARENT, 2892 + .ops = &clk_branch2_ops, 2893 + }, 2894 + }, 2895 + }; 2896 + 2897 + static struct clk_branch gcc_usb3_sec_phy_pipe_clk = { 2898 + .halt_check = BRANCH_HALT_SKIP, 2899 + .clkr = { 2900 + .enable_reg = 0x10054, 2901 + .enable_mask = BIT(0), 2902 + .hw.init = &(struct clk_init_data){ 2903 + .name = "gcc_usb3_sec_phy_pipe_clk", 2904 + .ops = &clk_branch2_ops, 2905 + }, 2906 + }, 2907 + }; 2908 + 2909 + static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = { 2910 + .halt_reg = 0x6a004, 2911 + .halt_check = BRANCH_HALT, 2912 + .hwcg_reg = 0x6a004, 2913 + .hwcg_bit = 1, 2914 + .clkr = { 2915 + .enable_reg = 0x6a004, 2916 + .enable_mask = BIT(0), 2917 + .hw.init = &(struct clk_init_data){ 2918 + .name = "gcc_usb_phy_cfg_ahb2phy_clk", 2919 + .ops = &clk_branch2_ops, 2920 + }, 2921 + }, 2922 + }; 2923 + 2924 + static struct clk_branch gcc_vdda_vs_clk = { 2925 + .halt_reg = 0x7a00c, 2926 + .halt_check = BRANCH_HALT, 2927 + .clkr = { 2928 + .enable_reg = 0x7a00c, 2929 + .enable_mask = BIT(0), 2930 + .hw.init = &(struct clk_init_data){ 2931 + .name = "gcc_vdda_vs_clk", 2932 + .parent_names = (const char *[]){ 2933 + "gcc_vsensor_clk_src", 2934 + }, 2935 + .num_parents = 1, 2936 + .flags = CLK_SET_RATE_PARENT, 2937 + .ops = &clk_branch2_ops, 2938 + }, 2939 + }, 2940 + }; 2941 + 2942 + static struct clk_branch gcc_vddcx_vs_clk = { 2943 + .halt_reg = 0x7a004, 2944 + .halt_check = BRANCH_HALT, 2945 + .clkr = { 2946 + .enable_reg = 0x7a004, 2947 + .enable_mask = BIT(0), 2948 + .hw.init = &(struct clk_init_data){ 2949 + .name = "gcc_vddcx_vs_clk", 2950 + .parent_names = (const char *[]){ 2951 + "gcc_vsensor_clk_src", 2952 + }, 2953 + .num_parents = 1, 2954 + .flags = CLK_SET_RATE_PARENT, 2955 + .ops = &clk_branch2_ops, 2956 + }, 2957 + }, 2958 + }; 2959 + 2960 + static struct clk_branch gcc_vddmx_vs_clk = { 2961 + .halt_reg = 0x7a008, 2962 + .halt_check = BRANCH_HALT, 2963 + .clkr = { 2964 + .enable_reg = 0x7a008, 2965 + .enable_mask = BIT(0), 2966 + .hw.init = &(struct clk_init_data){ 2967 + .name = "gcc_vddmx_vs_clk", 2968 + .parent_names = (const char *[]){ 2969 + "gcc_vsensor_clk_src", 2970 + }, 2971 + .num_parents = 1, 2972 + .flags = CLK_SET_RATE_PARENT, 2973 + .ops = &clk_branch2_ops, 2974 + }, 2975 + }, 2976 + }; 2977 + 2978 + static struct clk_branch gcc_video_ahb_clk = { 2979 + .halt_reg = 0xb004, 2980 + .halt_check = BRANCH_HALT, 2981 + .hwcg_reg = 0xb004, 2982 + .hwcg_bit = 1, 2983 + .clkr = { 2984 + .enable_reg = 0xb004, 2985 + .enable_mask = BIT(0), 2986 + .hw.init = &(struct clk_init_data){ 2987 + .name = "gcc_video_ahb_clk", 2988 + .ops = &clk_branch2_ops, 2989 + }, 2990 + }, 2991 + }; 2992 + 2993 + static struct clk_branch gcc_video_axi_clk = { 2994 + .halt_reg = 0xb01c, 2995 + .halt_check = BRANCH_VOTED, 2996 + .clkr = { 2997 + .enable_reg = 0xb01c, 2998 + .enable_mask = BIT(0), 2999 + .hw.init = &(struct clk_init_data){ 3000 + .name = "gcc_video_axi_clk", 3001 + .ops = &clk_branch2_ops, 3002 + }, 3003 + }, 3004 + }; 3005 + 3006 + static struct clk_branch gcc_video_xo_clk = { 3007 + .halt_reg = 0xb028, 3008 + .halt_check = BRANCH_HALT, 3009 + .clkr = { 3010 + .enable_reg = 0xb028, 3011 + .enable_mask = BIT(0), 3012 + .hw.init = &(struct clk_init_data){ 3013 + .name = "gcc_video_xo_clk", 3014 + .ops = &clk_branch2_ops, 3015 + }, 3016 + }, 3017 + }; 3018 + 3019 + static struct clk_branch gcc_vs_ctrl_ahb_clk = { 3020 + .halt_reg = 0x7a014, 3021 + .halt_check = BRANCH_HALT, 3022 + .hwcg_reg = 0x7a014, 3023 + .hwcg_bit = 1, 3024 + .clkr = { 3025 + .enable_reg = 0x7a014, 3026 + .enable_mask = BIT(0), 3027 + .hw.init = &(struct clk_init_data){ 3028 + .name = "gcc_vs_ctrl_ahb_clk", 3029 + .ops = &clk_branch2_ops, 3030 + }, 3031 + }, 3032 + }; 3033 + 3034 + static struct clk_branch gcc_vs_ctrl_clk = { 3035 + .halt_reg = 0x7a010, 3036 + .halt_check = BRANCH_HALT, 3037 + .clkr = { 3038 + .enable_reg = 0x7a010, 3039 + .enable_mask = BIT(0), 3040 + .hw.init = &(struct clk_init_data){ 3041 + .name = "gcc_vs_ctrl_clk", 3042 + .parent_names = (const char *[]){ 3043 + "gcc_vs_ctrl_clk_src", 3044 + }, 3045 + .num_parents = 1, 3046 + .flags = CLK_SET_RATE_PARENT, 3047 + .ops = &clk_branch2_ops, 3048 + }, 3049 + }, 3050 + }; 3051 + 3052 + static struct gdsc pcie_0_gdsc = { 3053 + .gdscr = 0x6b004, 3054 + .pd = { 3055 + .name = "pcie_0_gdsc", 3056 + }, 3057 + .pwrsts = PWRSTS_OFF_ON, 3058 + .flags = POLL_CFG_GDSCR, 3059 + }; 3060 + 3061 + static struct gdsc pcie_1_gdsc = { 3062 + .gdscr = 0x8d004, 3063 + .pd = { 3064 + .name = "pcie_1_gdsc", 3065 + }, 3066 + .pwrsts = PWRSTS_OFF_ON, 3067 + .flags = POLL_CFG_GDSCR, 3068 + }; 3069 + 3070 + static struct gdsc ufs_card_gdsc = { 3071 + .gdscr = 0x75004, 3072 + .pd = { 3073 + .name = "ufs_card_gdsc", 3074 + }, 3075 + .pwrsts = PWRSTS_OFF_ON, 3076 + .flags = POLL_CFG_GDSCR, 3077 + }; 3078 + 3079 + static struct gdsc ufs_phy_gdsc = { 3080 + .gdscr = 0x77004, 3081 + .pd = { 3082 + .name = "ufs_phy_gdsc", 3083 + }, 3084 + .pwrsts = PWRSTS_OFF_ON, 3085 + .flags = POLL_CFG_GDSCR, 3086 + }; 3087 + 3088 + static struct gdsc usb30_prim_gdsc = { 3089 + .gdscr = 0xf004, 3090 + .pd = { 3091 + .name = "usb30_prim_gdsc", 3092 + }, 3093 + .pwrsts = PWRSTS_OFF_ON, 3094 + .flags = POLL_CFG_GDSCR, 3095 + }; 3096 + 3097 + static struct gdsc usb30_sec_gdsc = { 3098 + .gdscr = 0x10004, 3099 + .pd = { 3100 + .name = "usb30_sec_gdsc", 3101 + }, 3102 + .pwrsts = PWRSTS_OFF_ON, 3103 + .flags = POLL_CFG_GDSCR, 3104 + }; 3105 + 3106 + static struct gdsc hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc = { 3107 + .gdscr = 0x7d030, 3108 + .pd = { 3109 + .name = "hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc", 3110 + }, 3111 + .pwrsts = PWRSTS_OFF_ON, 3112 + }; 3113 + 3114 + static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = { 3115 + .gdscr = 0x7d03c, 3116 + .pd = { 3117 + .name = "hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc", 3118 + }, 3119 + .pwrsts = PWRSTS_OFF_ON, 3120 + }; 3121 + 3122 + static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = { 3123 + .gdscr = 0x7d034, 3124 + .pd = { 3125 + .name = "hlos1_vote_aggre_noc_mmu_tbu1_gdsc", 3126 + }, 3127 + .pwrsts = PWRSTS_OFF_ON, 3128 + }; 3129 + 3130 + static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = { 3131 + .gdscr = 0x7d038, 3132 + .pd = { 3133 + .name = "hlos1_vote_aggre_noc_mmu_tbu2_gdsc", 3134 + }, 3135 + .pwrsts = PWRSTS_OFF_ON, 3136 + }; 3137 + 3138 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = { 3139 + .gdscr = 0x7d040, 3140 + .pd = { 3141 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc", 3142 + }, 3143 + .pwrsts = PWRSTS_OFF_ON, 3144 + }; 3145 + 3146 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = { 3147 + .gdscr = 0x7d048, 3148 + .pd = { 3149 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc", 3150 + }, 3151 + .pwrsts = PWRSTS_OFF_ON, 3152 + }; 3153 + 3154 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = { 3155 + .gdscr = 0x7d044, 3156 + .pd = { 3157 + .name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc", 3158 + }, 3159 + .pwrsts = PWRSTS_OFF_ON, 3160 + }; 3161 + 3162 + static struct clk_regmap *gcc_sdm845_clocks[] = { 3163 + [GCC_AGGRE_NOC_PCIE_TBU_CLK] = &gcc_aggre_noc_pcie_tbu_clk.clkr, 3164 + [GCC_AGGRE_UFS_CARD_AXI_CLK] = &gcc_aggre_ufs_card_axi_clk.clkr, 3165 + [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr, 3166 + [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr, 3167 + [GCC_AGGRE_USB3_SEC_AXI_CLK] = &gcc_aggre_usb3_sec_axi_clk.clkr, 3168 + [GCC_APC_VS_CLK] = &gcc_apc_vs_clk.clkr, 3169 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 3170 + [GCC_CAMERA_AHB_CLK] = &gcc_camera_ahb_clk.clkr, 3171 + [GCC_CAMERA_AXI_CLK] = &gcc_camera_axi_clk.clkr, 3172 + [GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr, 3173 + [GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr, 3174 + [GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr, 3175 + [GCC_CE1_CLK] = &gcc_ce1_clk.clkr, 3176 + [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr, 3177 + [GCC_CFG_NOC_USB3_SEC_AXI_CLK] = &gcc_cfg_noc_usb3_sec_axi_clk.clkr, 3178 + [GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr, 3179 + [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr, 3180 + [GCC_CPUSS_RBCPR_CLK] = &gcc_cpuss_rbcpr_clk.clkr, 3181 + [GCC_CPUSS_RBCPR_CLK_SRC] = &gcc_cpuss_rbcpr_clk_src.clkr, 3182 + [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr, 3183 + [GCC_DISP_AHB_CLK] = &gcc_disp_ahb_clk.clkr, 3184 + [GCC_DISP_AXI_CLK] = &gcc_disp_axi_clk.clkr, 3185 + [GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr, 3186 + [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr, 3187 + [GCC_DISP_XO_CLK] = &gcc_disp_xo_clk.clkr, 3188 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 3189 + [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr, 3190 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 3191 + [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr, 3192 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 3193 + [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, 3194 + [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr, 3195 + [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, 3196 + [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, 3197 + [GCC_GPU_IREF_CLK] = &gcc_gpu_iref_clk.clkr, 3198 + [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr, 3199 + [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, 3200 + [GCC_GPU_VS_CLK] = &gcc_gpu_vs_clk.clkr, 3201 + [GCC_MSS_AXIS2_CLK] = &gcc_mss_axis2_clk.clkr, 3202 + [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr, 3203 + [GCC_MSS_GPLL0_DIV_CLK_SRC] = &gcc_mss_gpll0_div_clk_src.clkr, 3204 + [GCC_MSS_MFAB_AXIS_CLK] = &gcc_mss_mfab_axis_clk.clkr, 3205 + [GCC_MSS_Q6_MEMNOC_AXI_CLK] = &gcc_mss_q6_memnoc_axi_clk.clkr, 3206 + [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr, 3207 + [GCC_MSS_VS_CLK] = &gcc_mss_vs_clk.clkr, 3208 + [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr, 3209 + [GCC_PCIE_0_AUX_CLK_SRC] = &gcc_pcie_0_aux_clk_src.clkr, 3210 + [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr, 3211 + [GCC_PCIE_0_CLKREF_CLK] = &gcc_pcie_0_clkref_clk.clkr, 3212 + [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr, 3213 + [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr, 3214 + [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr, 3215 + [GCC_PCIE_0_SLV_Q2A_AXI_CLK] = &gcc_pcie_0_slv_q2a_axi_clk.clkr, 3216 + [GCC_PCIE_1_AUX_CLK] = &gcc_pcie_1_aux_clk.clkr, 3217 + [GCC_PCIE_1_AUX_CLK_SRC] = &gcc_pcie_1_aux_clk_src.clkr, 3218 + [GCC_PCIE_1_CFG_AHB_CLK] = &gcc_pcie_1_cfg_ahb_clk.clkr, 3219 + [GCC_PCIE_1_CLKREF_CLK] = &gcc_pcie_1_clkref_clk.clkr, 3220 + [GCC_PCIE_1_MSTR_AXI_CLK] = &gcc_pcie_1_mstr_axi_clk.clkr, 3221 + [GCC_PCIE_1_PIPE_CLK] = &gcc_pcie_1_pipe_clk.clkr, 3222 + [GCC_PCIE_1_SLV_AXI_CLK] = &gcc_pcie_1_slv_axi_clk.clkr, 3223 + [GCC_PCIE_1_SLV_Q2A_AXI_CLK] = &gcc_pcie_1_slv_q2a_axi_clk.clkr, 3224 + [GCC_PCIE_PHY_AUX_CLK] = &gcc_pcie_phy_aux_clk.clkr, 3225 + [GCC_PCIE_PHY_REFGEN_CLK] = &gcc_pcie_phy_refgen_clk.clkr, 3226 + [GCC_PCIE_PHY_REFGEN_CLK_SRC] = &gcc_pcie_phy_refgen_clk_src.clkr, 3227 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 3228 + [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr, 3229 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 3230 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 3231 + [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, 3232 + [GCC_QMIP_CAMERA_AHB_CLK] = &gcc_qmip_camera_ahb_clk.clkr, 3233 + [GCC_QMIP_DISP_AHB_CLK] = &gcc_qmip_disp_ahb_clk.clkr, 3234 + [GCC_QMIP_VIDEO_AHB_CLK] = &gcc_qmip_video_ahb_clk.clkr, 3235 + [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr, 3236 + [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr, 3237 + [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr, 3238 + [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr, 3239 + [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr, 3240 + [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr, 3241 + [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr, 3242 + [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr, 3243 + [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr, 3244 + [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr, 3245 + [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr, 3246 + [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr, 3247 + [GCC_QUPV3_WRAP0_S6_CLK] = &gcc_qupv3_wrap0_s6_clk.clkr, 3248 + [GCC_QUPV3_WRAP0_S6_CLK_SRC] = &gcc_qupv3_wrap0_s6_clk_src.clkr, 3249 + [GCC_QUPV3_WRAP0_S7_CLK] = &gcc_qupv3_wrap0_s7_clk.clkr, 3250 + [GCC_QUPV3_WRAP0_S7_CLK_SRC] = &gcc_qupv3_wrap0_s7_clk_src.clkr, 3251 + [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr, 3252 + [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr, 3253 + [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr, 3254 + [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr, 3255 + [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr, 3256 + [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr, 3257 + [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr, 3258 + [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr, 3259 + [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr, 3260 + [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr, 3261 + [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr, 3262 + [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr, 3263 + [GCC_QUPV3_WRAP1_S6_CLK] = &gcc_qupv3_wrap1_s6_clk.clkr, 3264 + [GCC_QUPV3_WRAP1_S6_CLK_SRC] = &gcc_qupv3_wrap1_s6_clk_src.clkr, 3265 + [GCC_QUPV3_WRAP1_S7_CLK] = &gcc_qupv3_wrap1_s7_clk.clkr, 3266 + [GCC_QUPV3_WRAP1_S7_CLK_SRC] = &gcc_qupv3_wrap1_s7_clk_src.clkr, 3267 + [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr, 3268 + [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr, 3269 + [GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr, 3270 + [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr, 3271 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 3272 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 3273 + [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr, 3274 + [GCC_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr, 3275 + [GCC_SDCC4_APPS_CLK] = &gcc_sdcc4_apps_clk.clkr, 3276 + [GCC_SDCC4_APPS_CLK_SRC] = &gcc_sdcc4_apps_clk_src.clkr, 3277 + [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr, 3278 + [GCC_TSIF_AHB_CLK] = &gcc_tsif_ahb_clk.clkr, 3279 + [GCC_TSIF_INACTIVITY_TIMERS_CLK] = 3280 + &gcc_tsif_inactivity_timers_clk.clkr, 3281 + [GCC_TSIF_REF_CLK] = &gcc_tsif_ref_clk.clkr, 3282 + [GCC_TSIF_REF_CLK_SRC] = &gcc_tsif_ref_clk_src.clkr, 3283 + [GCC_UFS_CARD_AHB_CLK] = &gcc_ufs_card_ahb_clk.clkr, 3284 + [GCC_UFS_CARD_AXI_CLK] = &gcc_ufs_card_axi_clk.clkr, 3285 + [GCC_UFS_CARD_AXI_CLK_SRC] = &gcc_ufs_card_axi_clk_src.clkr, 3286 + [GCC_UFS_CARD_CLKREF_CLK] = &gcc_ufs_card_clkref_clk.clkr, 3287 + [GCC_UFS_CARD_ICE_CORE_CLK] = &gcc_ufs_card_ice_core_clk.clkr, 3288 + [GCC_UFS_CARD_ICE_CORE_CLK_SRC] = &gcc_ufs_card_ice_core_clk_src.clkr, 3289 + [GCC_UFS_CARD_PHY_AUX_CLK] = &gcc_ufs_card_phy_aux_clk.clkr, 3290 + [GCC_UFS_CARD_PHY_AUX_CLK_SRC] = &gcc_ufs_card_phy_aux_clk_src.clkr, 3291 + [GCC_UFS_CARD_RX_SYMBOL_0_CLK] = &gcc_ufs_card_rx_symbol_0_clk.clkr, 3292 + [GCC_UFS_CARD_RX_SYMBOL_1_CLK] = &gcc_ufs_card_rx_symbol_1_clk.clkr, 3293 + [GCC_UFS_CARD_TX_SYMBOL_0_CLK] = &gcc_ufs_card_tx_symbol_0_clk.clkr, 3294 + [GCC_UFS_CARD_UNIPRO_CORE_CLK] = &gcc_ufs_card_unipro_core_clk.clkr, 3295 + [GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC] = 3296 + &gcc_ufs_card_unipro_core_clk_src.clkr, 3297 + [GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr, 3298 + [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr, 3299 + [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr, 3300 + [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr, 3301 + [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr, 3302 + [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr, 3303 + [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, 3304 + [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, 3305 + [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, 3306 + [GCC_UFS_PHY_RX_SYMBOL_1_CLK] = &gcc_ufs_phy_rx_symbol_1_clk.clkr, 3307 + [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, 3308 + [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, 3309 + [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] = 3310 + &gcc_ufs_phy_unipro_core_clk_src.clkr, 3311 + [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr, 3312 + [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr, 3313 + [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr, 3314 + [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] = 3315 + &gcc_usb30_prim_mock_utmi_clk_src.clkr, 3316 + [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr, 3317 + [GCC_USB30_SEC_MASTER_CLK] = &gcc_usb30_sec_master_clk.clkr, 3318 + [GCC_USB30_SEC_MASTER_CLK_SRC] = &gcc_usb30_sec_master_clk_src.clkr, 3319 + [GCC_USB30_SEC_MOCK_UTMI_CLK] = &gcc_usb30_sec_mock_utmi_clk.clkr, 3320 + [GCC_USB30_SEC_MOCK_UTMI_CLK_SRC] = 3321 + &gcc_usb30_sec_mock_utmi_clk_src.clkr, 3322 + [GCC_USB30_SEC_SLEEP_CLK] = &gcc_usb30_sec_sleep_clk.clkr, 3323 + [GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr, 3324 + [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr, 3325 + [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr, 3326 + [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr, 3327 + [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr, 3328 + [GCC_USB3_SEC_CLKREF_CLK] = &gcc_usb3_sec_clkref_clk.clkr, 3329 + [GCC_USB3_SEC_PHY_AUX_CLK] = &gcc_usb3_sec_phy_aux_clk.clkr, 3330 + [GCC_USB3_SEC_PHY_AUX_CLK_SRC] = &gcc_usb3_sec_phy_aux_clk_src.clkr, 3331 + [GCC_USB3_SEC_PHY_COM_AUX_CLK] = &gcc_usb3_sec_phy_com_aux_clk.clkr, 3332 + [GCC_USB3_SEC_PHY_PIPE_CLK] = &gcc_usb3_sec_phy_pipe_clk.clkr, 3333 + [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr, 3334 + [GCC_VDDA_VS_CLK] = &gcc_vdda_vs_clk.clkr, 3335 + [GCC_VDDCX_VS_CLK] = &gcc_vddcx_vs_clk.clkr, 3336 + [GCC_VDDMX_VS_CLK] = &gcc_vddmx_vs_clk.clkr, 3337 + [GCC_VIDEO_AHB_CLK] = &gcc_video_ahb_clk.clkr, 3338 + [GCC_VIDEO_AXI_CLK] = &gcc_video_axi_clk.clkr, 3339 + [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr, 3340 + [GCC_VS_CTRL_AHB_CLK] = &gcc_vs_ctrl_ahb_clk.clkr, 3341 + [GCC_VS_CTRL_CLK] = &gcc_vs_ctrl_clk.clkr, 3342 + [GCC_VS_CTRL_CLK_SRC] = &gcc_vs_ctrl_clk_src.clkr, 3343 + [GCC_VSENSOR_CLK_SRC] = &gcc_vsensor_clk_src.clkr, 3344 + [GPLL0] = &gpll0.clkr, 3345 + [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr, 3346 + [GPLL4] = &gpll4.clkr, 3347 + }; 3348 + 3349 + static const struct qcom_reset_map gcc_sdm845_resets[] = { 3350 + [GCC_MMSS_BCR] = { 0xb000 }, 3351 + [GCC_PCIE_0_BCR] = { 0x6b000 }, 3352 + [GCC_PCIE_1_BCR] = { 0x8d000 }, 3353 + [GCC_PCIE_PHY_BCR] = { 0x6f000 }, 3354 + [GCC_PDM_BCR] = { 0x33000 }, 3355 + [GCC_PRNG_BCR] = { 0x34000 }, 3356 + [GCC_QUPV3_WRAPPER_0_BCR] = { 0x17000 }, 3357 + [GCC_QUPV3_WRAPPER_1_BCR] = { 0x18000 }, 3358 + [GCC_QUSB2PHY_PRIM_BCR] = { 0x12000 }, 3359 + [GCC_QUSB2PHY_SEC_BCR] = { 0x12004 }, 3360 + [GCC_SDCC2_BCR] = { 0x14000 }, 3361 + [GCC_SDCC4_BCR] = { 0x16000 }, 3362 + [GCC_TSIF_BCR] = { 0x36000 }, 3363 + [GCC_UFS_CARD_BCR] = { 0x75000 }, 3364 + [GCC_UFS_PHY_BCR] = { 0x77000 }, 3365 + [GCC_USB30_PRIM_BCR] = { 0xf000 }, 3366 + [GCC_USB30_SEC_BCR] = { 0x10000 }, 3367 + [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 }, 3368 + [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, 3369 + [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 }, 3370 + [GCC_USB3_PHY_SEC_BCR] = { 0x5000c }, 3371 + [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, 3372 + [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 }, 3373 + [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, 3374 + [GCC_PCIE_0_PHY_BCR] = { 0x6c01c }, 3375 + [GCC_PCIE_1_PHY_BCR] = { 0x8e01c }, 3376 + }; 3377 + 3378 + static struct gdsc *gcc_sdm845_gdscs[] = { 3379 + [PCIE_0_GDSC] = &pcie_0_gdsc, 3380 + [PCIE_1_GDSC] = &pcie_1_gdsc, 3381 + [UFS_CARD_GDSC] = &ufs_card_gdsc, 3382 + [UFS_PHY_GDSC] = &ufs_phy_gdsc, 3383 + [USB30_PRIM_GDSC] = &usb30_prim_gdsc, 3384 + [USB30_SEC_GDSC] = &usb30_sec_gdsc, 3385 + [HLOS1_VOTE_AGGRE_NOC_MMU_AUDIO_TBU_GDSC] = 3386 + &hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc, 3387 + [HLOS1_VOTE_AGGRE_NOC_MMU_PCIE_TBU_GDSC] = 3388 + &hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc, 3389 + [HLOS1_VOTE_AGGRE_NOC_MMU_TBU1_GDSC] = 3390 + &hlos1_vote_aggre_noc_mmu_tbu1_gdsc, 3391 + [HLOS1_VOTE_AGGRE_NOC_MMU_TBU2_GDSC] = 3392 + &hlos1_vote_aggre_noc_mmu_tbu2_gdsc, 3393 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] = 3394 + &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc, 3395 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC] = 3396 + &hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc, 3397 + [HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_sf_gdsc, 3398 + }; 3399 + 3400 + static const struct regmap_config gcc_sdm845_regmap_config = { 3401 + .reg_bits = 32, 3402 + .reg_stride = 4, 3403 + .val_bits = 32, 3404 + .max_register = 0x182090, 3405 + .fast_io = true, 3406 + }; 3407 + 3408 + static const struct qcom_cc_desc gcc_sdm845_desc = { 3409 + .config = &gcc_sdm845_regmap_config, 3410 + .clks = gcc_sdm845_clocks, 3411 + .num_clks = ARRAY_SIZE(gcc_sdm845_clocks), 3412 + .resets = gcc_sdm845_resets, 3413 + .num_resets = ARRAY_SIZE(gcc_sdm845_resets), 3414 + .gdscs = gcc_sdm845_gdscs, 3415 + .num_gdscs = ARRAY_SIZE(gcc_sdm845_gdscs), 3416 + }; 3417 + 3418 + static const struct of_device_id gcc_sdm845_match_table[] = { 3419 + { .compatible = "qcom,gcc-sdm845" }, 3420 + { } 3421 + }; 3422 + MODULE_DEVICE_TABLE(of, gcc_sdm845_match_table); 3423 + 3424 + static int gcc_sdm845_probe(struct platform_device *pdev) 3425 + { 3426 + struct regmap *regmap; 3427 + 3428 + regmap = qcom_cc_map(pdev, &gcc_sdm845_desc); 3429 + if (IS_ERR(regmap)) 3430 + return PTR_ERR(regmap); 3431 + 3432 + /* Disable the GPLL0 active input to MMSS and GPU via MISC registers */ 3433 + regmap_update_bits(regmap, 0x09ffc, 0x3, 0x3); 3434 + regmap_update_bits(regmap, 0x71028, 0x3, 0x3); 3435 + 3436 + /* Enable CPUSS clocks */ 3437 + regmap_update_bits(regmap, 0x48190, BIT(0), 0x1); 3438 + regmap_update_bits(regmap, 0x52004, BIT(22), 0x1); 3439 + 3440 + return qcom_cc_really_probe(pdev, &gcc_sdm845_desc, regmap); 3441 + } 3442 + 3443 + static struct platform_driver gcc_sdm845_driver = { 3444 + .probe = gcc_sdm845_probe, 3445 + .driver = { 3446 + .name = "gcc-sdm845", 3447 + .of_match_table = gcc_sdm845_match_table, 3448 + }, 3449 + }; 3450 + 3451 + static int __init gcc_sdm845_init(void) 3452 + { 3453 + return platform_driver_register(&gcc_sdm845_driver); 3454 + } 3455 + subsys_initcall(gcc_sdm845_init); 3456 + 3457 + static void __exit gcc_sdm845_exit(void) 3458 + { 3459 + platform_driver_unregister(&gcc_sdm845_driver); 3460 + } 3461 + module_exit(gcc_sdm845_exit); 3462 + 3463 + MODULE_DESCRIPTION("QTI GCC SDM845 Driver"); 3464 + MODULE_LICENSE("GPL v2"); 3465 + MODULE_ALIAS("platform:gcc-sdm845");
+79 -25
drivers/clk/qcom/gdsc.c
··· 1 1 /* 2 - * Copyright (c) 2015, The Linux Foundation. All rights reserved. 2 + * Copyright (c) 2015, 2017-2018, The Linux Foundation. All rights reserved. 3 3 * 4 4 * This program is free software; you can redistribute it and/or modify 5 5 * it under the terms of the GNU General Public License version 2 and ··· 31 31 #define HW_CONTROL_MASK BIT(1) 32 32 #define SW_COLLAPSE_MASK BIT(0) 33 33 #define GMEM_CLAMP_IO_MASK BIT(0) 34 + #define GMEM_RESET_MASK BIT(4) 35 + 36 + /* CFG_GDSCR */ 37 + #define GDSC_POWER_UP_COMPLETE BIT(16) 38 + #define GDSC_POWER_DOWN_COMPLETE BIT(15) 39 + #define CFG_GDSCR_OFFSET 0x4 34 40 35 41 /* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */ 36 42 #define EN_REST_WAIT_VAL (0x2 << 20) ··· 46 40 #define RETAIN_MEM BIT(14) 47 41 #define RETAIN_PERIPH BIT(13) 48 42 49 - #define TIMEOUT_US 100 43 + #define TIMEOUT_US 500 50 44 51 45 #define domain_to_gdsc(domain) container_of(domain, struct gdsc, pd) 52 46 53 - static int gdsc_is_enabled(struct gdsc *sc, unsigned int reg) 47 + enum gdsc_status { 48 + GDSC_OFF, 49 + GDSC_ON 50 + }; 51 + 52 + /* Returns 1 if GDSC status is status, 0 if not, and < 0 on error */ 53 + static int gdsc_check_status(struct gdsc *sc, enum gdsc_status status) 54 54 { 55 + unsigned int reg; 55 56 u32 val; 56 57 int ret; 58 + 59 + if (sc->flags & POLL_CFG_GDSCR) 60 + reg = sc->gdscr + CFG_GDSCR_OFFSET; 61 + else if (sc->gds_hw_ctrl) 62 + reg = sc->gds_hw_ctrl; 63 + else 64 + reg = sc->gdscr; 57 65 58 66 ret = regmap_read(sc->regmap, reg, &val); 59 67 if (ret) 60 68 return ret; 61 69 62 - return !!(val & PWR_ON_MASK); 70 + if (sc->flags & POLL_CFG_GDSCR) { 71 + switch (status) { 72 + case GDSC_ON: 73 + return !!(val & GDSC_POWER_UP_COMPLETE); 74 + case GDSC_OFF: 75 + return !!(val & GDSC_POWER_DOWN_COMPLETE); 76 + } 77 + } 78 + 79 + switch (status) { 80 + case GDSC_ON: 81 + return !!(val & PWR_ON_MASK); 82 + case GDSC_OFF: 83 + return !(val & PWR_ON_MASK); 84 + } 85 + 86 + return -EINVAL; 63 87 } 64 88 65 89 static int gdsc_hwctrl(struct gdsc *sc, bool en) ··· 99 63 return regmap_update_bits(sc->regmap, sc->gdscr, HW_CONTROL_MASK, val); 100 64 } 101 65 102 - static int gdsc_poll_status(struct gdsc *sc, unsigned int reg, bool en) 66 + static int gdsc_poll_status(struct gdsc *sc, enum gdsc_status status) 103 67 { 104 68 ktime_t start; 105 69 106 70 start = ktime_get(); 107 71 do { 108 - if (gdsc_is_enabled(sc, reg) == en) 72 + if (gdsc_check_status(sc, status)) 109 73 return 0; 110 74 } while (ktime_us_delta(ktime_get(), start) < TIMEOUT_US); 111 75 112 - if (gdsc_is_enabled(sc, reg) == en) 76 + if (gdsc_check_status(sc, status)) 113 77 return 0; 114 78 115 79 return -ETIMEDOUT; 116 80 } 117 81 118 - static int gdsc_toggle_logic(struct gdsc *sc, bool en) 82 + static int gdsc_toggle_logic(struct gdsc *sc, enum gdsc_status status) 119 83 { 120 84 int ret; 121 - u32 val = en ? 0 : SW_COLLAPSE_MASK; 122 - unsigned int status_reg = sc->gdscr; 85 + u32 val = (status == GDSC_ON) ? 0 : SW_COLLAPSE_MASK; 123 86 124 87 ret = regmap_update_bits(sc->regmap, sc->gdscr, SW_COLLAPSE_MASK, val); 125 88 if (ret) 126 89 return ret; 127 90 128 91 /* If disabling votable gdscs, don't poll on status */ 129 - if ((sc->flags & VOTABLE) && !en) { 92 + if ((sc->flags & VOTABLE) && status == GDSC_OFF) { 130 93 /* 131 94 * Add a short delay here to ensure that an enable 132 95 * right after it was disabled does not put it in an ··· 136 101 } 137 102 138 103 if (sc->gds_hw_ctrl) { 139 - status_reg = sc->gds_hw_ctrl; 140 104 /* 141 105 * The gds hw controller asserts/de-asserts the status bit soon 142 106 * after it receives a power on/off request from a master. ··· 149 115 udelay(1); 150 116 } 151 117 152 - return gdsc_poll_status(sc, status_reg, en); 118 + return gdsc_poll_status(sc, status); 153 119 } 154 120 155 121 static inline int gdsc_deassert_reset(struct gdsc *sc) ··· 200 166 GMEM_CLAMP_IO_MASK, 1); 201 167 } 202 168 169 + static inline void gdsc_assert_reset_aon(struct gdsc *sc) 170 + { 171 + regmap_update_bits(sc->regmap, sc->clamp_io_ctrl, 172 + GMEM_RESET_MASK, 1); 173 + udelay(1); 174 + regmap_update_bits(sc->regmap, sc->clamp_io_ctrl, 175 + GMEM_RESET_MASK, 0); 176 + } 203 177 static int gdsc_enable(struct generic_pm_domain *domain) 204 178 { 205 179 struct gdsc *sc = domain_to_gdsc(domain); ··· 216 174 if (sc->pwrsts == PWRSTS_ON) 217 175 return gdsc_deassert_reset(sc); 218 176 219 - if (sc->flags & CLAMP_IO) 220 - gdsc_deassert_clamp_io(sc); 177 + if (sc->flags & SW_RESET) { 178 + gdsc_assert_reset(sc); 179 + udelay(1); 180 + gdsc_deassert_reset(sc); 181 + } 221 182 222 - ret = gdsc_toggle_logic(sc, true); 183 + if (sc->flags & CLAMP_IO) { 184 + if (sc->flags & AON_RESET) 185 + gdsc_assert_reset_aon(sc); 186 + gdsc_deassert_clamp_io(sc); 187 + } 188 + 189 + ret = gdsc_toggle_logic(sc, GDSC_ON); 223 190 if (ret) 224 191 return ret; 225 192 ··· 273 222 274 223 /* Turn off HW trigger mode if supported */ 275 224 if (sc->flags & HW_CTRL) { 276 - unsigned int reg; 277 - 278 225 ret = gdsc_hwctrl(sc, false); 279 226 if (ret < 0) 280 227 return ret; ··· 284 235 */ 285 236 udelay(1); 286 237 287 - reg = sc->gds_hw_ctrl ? sc->gds_hw_ctrl : sc->gdscr; 288 - ret = gdsc_poll_status(sc, reg, true); 238 + ret = gdsc_poll_status(sc, GDSC_ON); 289 239 if (ret) 290 240 return ret; 291 241 } ··· 292 244 if (sc->pwrsts & PWRSTS_OFF) 293 245 gdsc_clear_mem_on(sc); 294 246 295 - ret = gdsc_toggle_logic(sc, false); 247 + ret = gdsc_toggle_logic(sc, GDSC_OFF); 296 248 if (ret) 297 249 return ret; 298 250 ··· 306 258 { 307 259 u32 mask, val; 308 260 int on, ret; 309 - unsigned int reg; 310 261 311 262 /* 312 263 * Disable HW trigger: collapse/restore occur based on registers writes. ··· 321 274 322 275 /* Force gdsc ON if only ON state is supported */ 323 276 if (sc->pwrsts == PWRSTS_ON) { 324 - ret = gdsc_toggle_logic(sc, true); 277 + ret = gdsc_toggle_logic(sc, GDSC_ON); 325 278 if (ret) 326 279 return ret; 327 280 } 328 281 329 - reg = sc->gds_hw_ctrl ? sc->gds_hw_ctrl : sc->gdscr; 330 - on = gdsc_is_enabled(sc, reg); 282 + on = gdsc_check_status(sc, GDSC_ON); 331 283 if (on < 0) 332 284 return on; 333 285 ··· 336 290 */ 337 291 if ((sc->flags & VOTABLE) && on) 338 292 gdsc_enable(&sc->pd); 293 + 294 + /* If ALWAYS_ON GDSCs are not ON, turn them ON */ 295 + if (sc->flags & ALWAYS_ON) { 296 + if (!on) 297 + gdsc_enable(&sc->pd); 298 + on = true; 299 + sc->pd.flags |= GENPD_FLAG_ALWAYS_ON; 300 + } 339 301 340 302 if (on || (sc->pwrsts & PWRSTS_RET)) 341 303 gdsc_force_mem_on(sc);
+5 -1
drivers/clk/qcom/gdsc.h
··· 1 1 /* 2 - * Copyright (c) 2015, The Linux Foundation. All rights reserved. 2 + * Copyright (c) 2015, 2017-2018, The Linux Foundation. All rights reserved. 3 3 * 4 4 * This program is free software; you can redistribute it and/or modify 5 5 * it under the terms of the GNU General Public License version 2 and ··· 53 53 #define VOTABLE BIT(0) 54 54 #define CLAMP_IO BIT(1) 55 55 #define HW_CTRL BIT(2) 56 + #define SW_RESET BIT(3) 57 + #define AON_RESET BIT(4) 58 + #define POLL_CFG_GDSCR BIT(5) 59 + #define ALWAYS_ON BIT(6) 56 60 struct reset_controller_dev *rcdev; 57 61 unsigned int *resets; 58 62 unsigned int reset_count;
+11 -11
drivers/clk/qcom/mmcc-msm8996.c
··· 1245 1245 .name = "mmss_mmagic_ahb_clk", 1246 1246 .parent_names = (const char *[]){ "ahb_clk_src" }, 1247 1247 .num_parents = 1, 1248 - .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 1248 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1249 1249 .ops = &clk_branch2_ops, 1250 1250 }, 1251 1251 }, ··· 1260 1260 .name = "mmss_mmagic_cfg_ahb_clk", 1261 1261 .parent_names = (const char *[]){ "ahb_clk_src" }, 1262 1262 .num_parents = 1, 1263 - .flags = CLK_SET_RATE_PARENT, 1263 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1264 1264 .ops = &clk_branch2_ops, 1265 1265 }, 1266 1266 }, ··· 1319 1319 .name = "mmagic_camss_axi_clk", 1320 1320 .parent_names = (const char *[]){ "axi_clk_src" }, 1321 1321 .num_parents = 1, 1322 - .flags = CLK_SET_RATE_PARENT, 1322 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1323 1323 .ops = &clk_branch2_ops, 1324 1324 }, 1325 1325 }, ··· 1334 1334 .name = "mmagic_camss_noc_cfg_ahb_clk", 1335 1335 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1336 1336 .num_parents = 1, 1337 - .flags = CLK_SET_RATE_PARENT, 1337 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1338 1338 .ops = &clk_branch2_ops, 1339 1339 }, 1340 1340 }, ··· 1439 1439 .name = "mmagic_mdss_axi_clk", 1440 1440 .parent_names = (const char *[]){ "axi_clk_src" }, 1441 1441 .num_parents = 1, 1442 - .flags = CLK_SET_RATE_PARENT, 1442 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1443 1443 .ops = &clk_branch2_ops, 1444 1444 }, 1445 1445 }, ··· 1454 1454 .name = "mmagic_mdss_noc_cfg_ahb_clk", 1455 1455 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1456 1456 .num_parents = 1, 1457 - .flags = CLK_SET_RATE_PARENT, 1457 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1458 1458 .ops = &clk_branch2_ops, 1459 1459 }, 1460 1460 }, ··· 1529 1529 .name = "mmagic_video_axi_clk", 1530 1530 .parent_names = (const char *[]){ "axi_clk_src" }, 1531 1531 .num_parents = 1, 1532 - .flags = CLK_SET_RATE_PARENT, 1532 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1533 1533 .ops = &clk_branch2_ops, 1534 1534 }, 1535 1535 }, ··· 1544 1544 .name = "mmagic_video_noc_cfg_ahb_clk", 1545 1545 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1546 1546 .num_parents = 1, 1547 - .flags = CLK_SET_RATE_PARENT, 1547 + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1548 1548 .ops = &clk_branch2_ops, 1549 1549 }, 1550 1550 }, ··· 2919 2919 .name = "mmagic_video", 2920 2920 }, 2921 2921 .pwrsts = PWRSTS_OFF_ON, 2922 - .flags = VOTABLE, 2922 + .flags = VOTABLE | ALWAYS_ON, 2923 2923 }; 2924 2924 2925 2925 static struct gdsc mmagic_mdss_gdsc = { ··· 2929 2929 .name = "mmagic_mdss", 2930 2930 }, 2931 2931 .pwrsts = PWRSTS_OFF_ON, 2932 - .flags = VOTABLE, 2932 + .flags = VOTABLE | ALWAYS_ON, 2933 2933 }; 2934 2934 2935 2935 static struct gdsc mmagic_camss_gdsc = { ··· 2939 2939 .name = "mmagic_camss", 2940 2940 }, 2941 2941 .pwrsts = PWRSTS_OFF_ON, 2942 - .flags = VOTABLE, 2942 + .flags = VOTABLE | ALWAYS_ON, 2943 2943 }; 2944 2944 2945 2945 static struct gdsc venus_gdsc = {
+358
drivers/clk/qcom/videocc-sdm845.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2018, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/module.h> 8 + #include <linux/platform_device.h> 9 + #include <linux/regmap.h> 10 + 11 + #include <dt-bindings/clock/qcom,videocc-sdm845.h> 12 + 13 + #include "common.h" 14 + #include "clk-alpha-pll.h" 15 + #include "clk-branch.h" 16 + #include "clk-rcg.h" 17 + #include "clk-regmap.h" 18 + #include "clk-pll.h" 19 + #include "gdsc.h" 20 + 21 + #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) } 22 + 23 + enum { 24 + P_BI_TCXO, 25 + P_CORE_BI_PLL_TEST_SE, 26 + P_VIDEO_PLL0_OUT_EVEN, 27 + P_VIDEO_PLL0_OUT_MAIN, 28 + P_VIDEO_PLL0_OUT_ODD, 29 + }; 30 + 31 + static const struct parent_map video_cc_parent_map_0[] = { 32 + { P_BI_TCXO, 0 }, 33 + { P_VIDEO_PLL0_OUT_MAIN, 1 }, 34 + { P_VIDEO_PLL0_OUT_EVEN, 2 }, 35 + { P_VIDEO_PLL0_OUT_ODD, 3 }, 36 + { P_CORE_BI_PLL_TEST_SE, 4 }, 37 + }; 38 + 39 + static const char * const video_cc_parent_names_0[] = { 40 + "bi_tcxo", 41 + "video_pll0", 42 + "video_pll0_out_even", 43 + "video_pll0_out_odd", 44 + "core_bi_pll_test_se", 45 + }; 46 + 47 + static const struct alpha_pll_config video_pll0_config = { 48 + .l = 0x10, 49 + .alpha = 0xaaab, 50 + }; 51 + 52 + static struct clk_alpha_pll video_pll0 = { 53 + .offset = 0x42c, 54 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 55 + .clkr = { 56 + .hw.init = &(struct clk_init_data){ 57 + .name = "video_pll0", 58 + .parent_names = (const char *[]){ "bi_tcxo" }, 59 + .num_parents = 1, 60 + .ops = &clk_alpha_pll_fabia_ops, 61 + }, 62 + }, 63 + }; 64 + 65 + static const struct freq_tbl ftbl_video_cc_venus_clk_src[] = { 66 + F(100000000, P_VIDEO_PLL0_OUT_MAIN, 4, 0, 0), 67 + F(200000000, P_VIDEO_PLL0_OUT_MAIN, 2, 0, 0), 68 + F(330000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0), 69 + F(404000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0), 70 + F(444000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0), 71 + F(533000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0), 72 + { } 73 + }; 74 + 75 + static struct clk_rcg2 video_cc_venus_clk_src = { 76 + .cmd_rcgr = 0x7f0, 77 + .mnd_width = 0, 78 + .hid_width = 5, 79 + .parent_map = video_cc_parent_map_0, 80 + .freq_tbl = ftbl_video_cc_venus_clk_src, 81 + .clkr.hw.init = &(struct clk_init_data){ 82 + .name = "video_cc_venus_clk_src", 83 + .parent_names = video_cc_parent_names_0, 84 + .num_parents = 5, 85 + .flags = CLK_SET_RATE_PARENT, 86 + .ops = &clk_rcg2_shared_ops, 87 + }, 88 + }; 89 + 90 + static struct clk_branch video_cc_apb_clk = { 91 + .halt_reg = 0x990, 92 + .halt_check = BRANCH_HALT, 93 + .clkr = { 94 + .enable_reg = 0x990, 95 + .enable_mask = BIT(0), 96 + .hw.init = &(struct clk_init_data){ 97 + .name = "video_cc_apb_clk", 98 + .ops = &clk_branch2_ops, 99 + }, 100 + }, 101 + }; 102 + 103 + static struct clk_branch video_cc_at_clk = { 104 + .halt_reg = 0x9f0, 105 + .halt_check = BRANCH_HALT, 106 + .clkr = { 107 + .enable_reg = 0x9f0, 108 + .enable_mask = BIT(0), 109 + .hw.init = &(struct clk_init_data){ 110 + .name = "video_cc_at_clk", 111 + .ops = &clk_branch2_ops, 112 + }, 113 + }, 114 + }; 115 + 116 + static struct clk_branch video_cc_qdss_trig_clk = { 117 + .halt_reg = 0x970, 118 + .halt_check = BRANCH_HALT, 119 + .clkr = { 120 + .enable_reg = 0x970, 121 + .enable_mask = BIT(0), 122 + .hw.init = &(struct clk_init_data){ 123 + .name = "video_cc_qdss_trig_clk", 124 + .ops = &clk_branch2_ops, 125 + }, 126 + }, 127 + }; 128 + 129 + static struct clk_branch video_cc_qdss_tsctr_div8_clk = { 130 + .halt_reg = 0x9d0, 131 + .halt_check = BRANCH_HALT, 132 + .clkr = { 133 + .enable_reg = 0x9d0, 134 + .enable_mask = BIT(0), 135 + .hw.init = &(struct clk_init_data){ 136 + .name = "video_cc_qdss_tsctr_div8_clk", 137 + .ops = &clk_branch2_ops, 138 + }, 139 + }, 140 + }; 141 + 142 + static struct clk_branch video_cc_vcodec0_axi_clk = { 143 + .halt_reg = 0x930, 144 + .halt_check = BRANCH_HALT, 145 + .clkr = { 146 + .enable_reg = 0x930, 147 + .enable_mask = BIT(0), 148 + .hw.init = &(struct clk_init_data){ 149 + .name = "video_cc_vcodec0_axi_clk", 150 + .ops = &clk_branch2_ops, 151 + }, 152 + }, 153 + }; 154 + 155 + static struct clk_branch video_cc_vcodec0_core_clk = { 156 + .halt_reg = 0x890, 157 + .halt_check = BRANCH_VOTED, 158 + .clkr = { 159 + .enable_reg = 0x890, 160 + .enable_mask = BIT(0), 161 + .hw.init = &(struct clk_init_data){ 162 + .name = "video_cc_vcodec0_core_clk", 163 + .parent_names = (const char *[]){ 164 + "video_cc_venus_clk_src", 165 + }, 166 + .num_parents = 1, 167 + .flags = CLK_SET_RATE_PARENT, 168 + .ops = &clk_branch2_ops, 169 + }, 170 + }, 171 + }; 172 + 173 + static struct clk_branch video_cc_vcodec1_axi_clk = { 174 + .halt_reg = 0x950, 175 + .halt_check = BRANCH_HALT, 176 + .clkr = { 177 + .enable_reg = 0x950, 178 + .enable_mask = BIT(0), 179 + .hw.init = &(struct clk_init_data){ 180 + .name = "video_cc_vcodec1_axi_clk", 181 + .ops = &clk_branch2_ops, 182 + }, 183 + }, 184 + }; 185 + 186 + static struct clk_branch video_cc_vcodec1_core_clk = { 187 + .halt_reg = 0x8d0, 188 + .halt_check = BRANCH_VOTED, 189 + .clkr = { 190 + .enable_reg = 0x8d0, 191 + .enable_mask = BIT(0), 192 + .hw.init = &(struct clk_init_data){ 193 + .name = "video_cc_vcodec1_core_clk", 194 + .parent_names = (const char *[]){ 195 + "video_cc_venus_clk_src", 196 + }, 197 + .num_parents = 1, 198 + .flags = CLK_SET_RATE_PARENT, 199 + .ops = &clk_branch2_ops, 200 + }, 201 + }, 202 + }; 203 + 204 + static struct clk_branch video_cc_venus_ahb_clk = { 205 + .halt_reg = 0x9b0, 206 + .halt_check = BRANCH_HALT, 207 + .clkr = { 208 + .enable_reg = 0x9b0, 209 + .enable_mask = BIT(0), 210 + .hw.init = &(struct clk_init_data){ 211 + .name = "video_cc_venus_ahb_clk", 212 + .ops = &clk_branch2_ops, 213 + }, 214 + }, 215 + }; 216 + 217 + static struct clk_branch video_cc_venus_ctl_axi_clk = { 218 + .halt_reg = 0x910, 219 + .halt_check = BRANCH_HALT, 220 + .clkr = { 221 + .enable_reg = 0x910, 222 + .enable_mask = BIT(0), 223 + .hw.init = &(struct clk_init_data){ 224 + .name = "video_cc_venus_ctl_axi_clk", 225 + .ops = &clk_branch2_ops, 226 + }, 227 + }, 228 + }; 229 + 230 + static struct clk_branch video_cc_venus_ctl_core_clk = { 231 + .halt_reg = 0x850, 232 + .halt_check = BRANCH_HALT, 233 + .clkr = { 234 + .enable_reg = 0x850, 235 + .enable_mask = BIT(0), 236 + .hw.init = &(struct clk_init_data){ 237 + .name = "video_cc_venus_ctl_core_clk", 238 + .parent_names = (const char *[]){ 239 + "video_cc_venus_clk_src", 240 + }, 241 + .num_parents = 1, 242 + .flags = CLK_SET_RATE_PARENT, 243 + .ops = &clk_branch2_ops, 244 + }, 245 + }, 246 + }; 247 + 248 + static struct gdsc venus_gdsc = { 249 + .gdscr = 0x814, 250 + .pd = { 251 + .name = "venus_gdsc", 252 + }, 253 + .cxcs = (unsigned int []){ 0x850, 0x910 }, 254 + .cxc_count = 2, 255 + .pwrsts = PWRSTS_OFF_ON, 256 + .flags = POLL_CFG_GDSCR, 257 + }; 258 + 259 + static struct gdsc vcodec0_gdsc = { 260 + .gdscr = 0x874, 261 + .pd = { 262 + .name = "vcodec0_gdsc", 263 + }, 264 + .cxcs = (unsigned int []){ 0x890, 0x930 }, 265 + .cxc_count = 2, 266 + .flags = HW_CTRL | POLL_CFG_GDSCR, 267 + .pwrsts = PWRSTS_OFF_ON, 268 + }; 269 + 270 + static struct gdsc vcodec1_gdsc = { 271 + .gdscr = 0x8b4, 272 + .pd = { 273 + .name = "vcodec1_gdsc", 274 + }, 275 + .cxcs = (unsigned int []){ 0x8d0, 0x950 }, 276 + .cxc_count = 2, 277 + .flags = HW_CTRL | POLL_CFG_GDSCR, 278 + .pwrsts = PWRSTS_OFF_ON, 279 + }; 280 + 281 + static struct clk_regmap *video_cc_sdm845_clocks[] = { 282 + [VIDEO_CC_APB_CLK] = &video_cc_apb_clk.clkr, 283 + [VIDEO_CC_AT_CLK] = &video_cc_at_clk.clkr, 284 + [VIDEO_CC_QDSS_TRIG_CLK] = &video_cc_qdss_trig_clk.clkr, 285 + [VIDEO_CC_QDSS_TSCTR_DIV8_CLK] = &video_cc_qdss_tsctr_div8_clk.clkr, 286 + [VIDEO_CC_VCODEC0_AXI_CLK] = &video_cc_vcodec0_axi_clk.clkr, 287 + [VIDEO_CC_VCODEC0_CORE_CLK] = &video_cc_vcodec0_core_clk.clkr, 288 + [VIDEO_CC_VCODEC1_AXI_CLK] = &video_cc_vcodec1_axi_clk.clkr, 289 + [VIDEO_CC_VCODEC1_CORE_CLK] = &video_cc_vcodec1_core_clk.clkr, 290 + [VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr, 291 + [VIDEO_CC_VENUS_CLK_SRC] = &video_cc_venus_clk_src.clkr, 292 + [VIDEO_CC_VENUS_CTL_AXI_CLK] = &video_cc_venus_ctl_axi_clk.clkr, 293 + [VIDEO_CC_VENUS_CTL_CORE_CLK] = &video_cc_venus_ctl_core_clk.clkr, 294 + [VIDEO_PLL0] = &video_pll0.clkr, 295 + }; 296 + 297 + static struct gdsc *video_cc_sdm845_gdscs[] = { 298 + [VENUS_GDSC] = &venus_gdsc, 299 + [VCODEC0_GDSC] = &vcodec0_gdsc, 300 + [VCODEC1_GDSC] = &vcodec1_gdsc, 301 + }; 302 + 303 + static const struct regmap_config video_cc_sdm845_regmap_config = { 304 + .reg_bits = 32, 305 + .reg_stride = 4, 306 + .val_bits = 32, 307 + .max_register = 0xb90, 308 + .fast_io = true, 309 + }; 310 + 311 + static const struct qcom_cc_desc video_cc_sdm845_desc = { 312 + .config = &video_cc_sdm845_regmap_config, 313 + .clks = video_cc_sdm845_clocks, 314 + .num_clks = ARRAY_SIZE(video_cc_sdm845_clocks), 315 + .gdscs = video_cc_sdm845_gdscs, 316 + .num_gdscs = ARRAY_SIZE(video_cc_sdm845_gdscs), 317 + }; 318 + 319 + static const struct of_device_id video_cc_sdm845_match_table[] = { 320 + { .compatible = "qcom,sdm845-videocc" }, 321 + { } 322 + }; 323 + MODULE_DEVICE_TABLE(of, video_cc_sdm845_match_table); 324 + 325 + static int video_cc_sdm845_probe(struct platform_device *pdev) 326 + { 327 + struct regmap *regmap; 328 + 329 + regmap = qcom_cc_map(pdev, &video_cc_sdm845_desc); 330 + if (IS_ERR(regmap)) 331 + return PTR_ERR(regmap); 332 + 333 + clk_fabia_pll_configure(&video_pll0, regmap, &video_pll0_config); 334 + 335 + return qcom_cc_really_probe(pdev, &video_cc_sdm845_desc, regmap); 336 + } 337 + 338 + static struct platform_driver video_cc_sdm845_driver = { 339 + .probe = video_cc_sdm845_probe, 340 + .driver = { 341 + .name = "sdm845-videocc", 342 + .of_match_table = video_cc_sdm845_match_table, 343 + }, 344 + }; 345 + 346 + static int __init video_cc_sdm845_init(void) 347 + { 348 + return platform_driver_register(&video_cc_sdm845_driver); 349 + } 350 + subsys_initcall(video_cc_sdm845_init); 351 + 352 + static void __exit video_cc_sdm845_exit(void) 353 + { 354 + platform_driver_unregister(&video_cc_sdm845_driver); 355 + } 356 + module_exit(video_cc_sdm845_exit); 357 + 358 + MODULE_LICENSE("GPL v2");
+10
drivers/clk/renesas/Kconfig
··· 7 7 select CLK_R8A7740 if ARCH_R8A7740 8 8 select CLK_R8A7743 if ARCH_R8A7743 9 9 select CLK_R8A7745 if ARCH_R8A7745 10 + select CLK_R8A77470 if ARCH_R8A77470 10 11 select CLK_R8A7778 if ARCH_R8A7778 11 12 select CLK_R8A7779 if ARCH_R8A7779 12 13 select CLK_R8A7790 if ARCH_R8A7790 ··· 19 18 select CLK_R8A77965 if ARCH_R8A77965 20 19 select CLK_R8A77970 if ARCH_R8A77970 21 20 select CLK_R8A77980 if ARCH_R8A77980 21 + select CLK_R8A77990 if ARCH_R8A77990 22 22 select CLK_R8A77995 if ARCH_R8A77995 23 23 select CLK_SH73A0 if ARCH_SH73A0 24 24 ··· 60 58 61 59 config CLK_R8A7745 62 60 bool "RZ/G1E clock support" if COMPILE_TEST 61 + select CLK_RCAR_GEN2_CPG 62 + 63 + config CLK_R8A77470 64 + bool "RZ/G1C clock support" if COMPILE_TEST 63 65 select CLK_RCAR_GEN2_CPG 64 66 65 67 config CLK_R8A7778 ··· 115 109 116 110 config CLK_R8A77980 117 111 bool "R-Car V3H clock support" if COMPILE_TEST 112 + select CLK_RCAR_GEN3_CPG 113 + 114 + config CLK_R8A77990 115 + bool "R-Car E3 clock support" if COMPILE_TEST 118 116 select CLK_RCAR_GEN3_CPG 119 117 120 118 config CLK_R8A77995
+2
drivers/clk/renesas/Makefile
··· 6 6 obj-$(CONFIG_CLK_R8A7740) += clk-r8a7740.o 7 7 obj-$(CONFIG_CLK_R8A7743) += r8a7743-cpg-mssr.o 8 8 obj-$(CONFIG_CLK_R8A7745) += r8a7745-cpg-mssr.o 9 + obj-$(CONFIG_CLK_R8A77470) += r8a77470-cpg-mssr.o 9 10 obj-$(CONFIG_CLK_R8A7778) += clk-r8a7778.o 10 11 obj-$(CONFIG_CLK_R8A7779) += clk-r8a7779.o 11 12 obj-$(CONFIG_CLK_R8A7790) += r8a7790-cpg-mssr.o ··· 18 17 obj-$(CONFIG_CLK_R8A77965) += r8a77965-cpg-mssr.o 19 18 obj-$(CONFIG_CLK_R8A77970) += r8a77970-cpg-mssr.o 20 19 obj-$(CONFIG_CLK_R8A77980) += r8a77980-cpg-mssr.o 20 + obj-$(CONFIG_CLK_R8A77990) += r8a77990-cpg-mssr.o 21 21 obj-$(CONFIG_CLK_R8A77995) += r8a77995-cpg-mssr.o 22 22 obj-$(CONFIG_CLK_SH73A0) += clk-sh73a0.o 23 23
+1 -1
drivers/clk/renesas/r8a7743-cpg-mssr.c
··· 52 52 53 53 /* Core Clock Outputs */ 54 54 DEF_BASE("z", R8A7743_CLK_Z, CLK_TYPE_GEN2_Z, CLK_PLL0), 55 - DEF_BASE("lb", R8A7743_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 56 55 DEF_BASE("sdh", R8A7743_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 57 56 DEF_BASE("sd0", R8A7743_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), 58 57 DEF_BASE("qspi", R8A7743_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), ··· 62 63 DEF_FIXED("zs", R8A7743_CLK_ZS, CLK_PLL1, 6, 1), 63 64 DEF_FIXED("hp", R8A7743_CLK_HP, CLK_PLL1, 12, 1), 64 65 DEF_FIXED("b", R8A7743_CLK_B, CLK_PLL1, 12, 1), 66 + DEF_FIXED("lb", R8A7743_CLK_LB, CLK_PLL1, 24, 1), 65 67 DEF_FIXED("p", R8A7743_CLK_P, CLK_PLL1, 24, 1), 66 68 DEF_FIXED("cl", R8A7743_CLK_CL, CLK_PLL1, 48, 1), 67 69 DEF_FIXED("m2", R8A7743_CLK_M2, CLK_PLL1, 8, 1),
+1 -1
drivers/clk/renesas/r8a7745-cpg-mssr.c
··· 51 51 DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 52 52 53 53 /* Core Clock Outputs */ 54 - DEF_BASE("lb", R8A7745_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 55 54 DEF_BASE("sdh", R8A7745_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 56 55 DEF_BASE("sd0", R8A7745_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), 57 56 DEF_BASE("qspi", R8A7745_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), ··· 62 63 DEF_FIXED("zs", R8A7745_CLK_ZS, CLK_PLL1, 6, 1), 63 64 DEF_FIXED("hp", R8A7745_CLK_HP, CLK_PLL1, 12, 1), 64 65 DEF_FIXED("b", R8A7745_CLK_B, CLK_PLL1, 12, 1), 66 + DEF_FIXED("lb", R8A7745_CLK_LB, CLK_PLL1, 24, 1), 65 67 DEF_FIXED("p", R8A7745_CLK_P, CLK_PLL1, 24, 1), 66 68 DEF_FIXED("cl", R8A7745_CLK_CL, CLK_PLL1, 48, 1), 67 69 DEF_FIXED("cp", R8A7745_CLK_CP, CLK_PLL1, 48, 1),
+229
drivers/clk/renesas/r8a77470-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a77470 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2018 Renesas Electronics Corp. 6 + */ 7 + 8 + #include <linux/device.h> 9 + #include <linux/init.h> 10 + #include <linux/kernel.h> 11 + #include <linux/soc/renesas/rcar-rst.h> 12 + 13 + #include <dt-bindings/clock/r8a77470-cpg-mssr.h> 14 + 15 + #include "renesas-cpg-mssr.h" 16 + #include "rcar-gen2-cpg.h" 17 + 18 + enum clk_ids { 19 + /* Core Clock Outputs exported to DT */ 20 + LAST_DT_CORE_CLK = R8A77470_CLK_OSC, 21 + 22 + /* External Input Clocks */ 23 + CLK_EXTAL, 24 + CLK_USB_EXTAL, 25 + 26 + /* Internal Core Clocks */ 27 + CLK_MAIN, 28 + CLK_PLL0, 29 + CLK_PLL1, 30 + CLK_PLL3, 31 + CLK_PLL1_DIV2, 32 + 33 + /* Module Clocks */ 34 + MOD_CLK_BASE 35 + }; 36 + 37 + static const struct cpg_core_clk r8a77470_core_clks[] __initconst = { 38 + /* External Clock Inputs */ 39 + DEF_INPUT("extal", CLK_EXTAL), 40 + DEF_INPUT("usb_extal", CLK_USB_EXTAL), 41 + 42 + /* Internal Core Clocks */ 43 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN2_MAIN, CLK_EXTAL), 44 + DEF_BASE(".pll0", CLK_PLL0, CLK_TYPE_GEN2_PLL0, CLK_MAIN), 45 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN2_PLL1, CLK_MAIN), 46 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN2_PLL3, CLK_MAIN), 47 + 48 + DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 49 + 50 + /* Core Clock Outputs */ 51 + DEF_BASE("sdh", R8A77470_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 52 + DEF_BASE("sd0", R8A77470_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), 53 + DEF_BASE("sd1", R8A77470_CLK_SD1, CLK_TYPE_GEN2_SD1, CLK_PLL1), 54 + DEF_BASE("qspi", R8A77470_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), 55 + DEF_BASE("rcan", R8A77470_CLK_RCAN, CLK_TYPE_GEN2_RCAN, CLK_USB_EXTAL), 56 + 57 + DEF_FIXED("z2", R8A77470_CLK_Z2, CLK_PLL0, 1, 1), 58 + DEF_FIXED("zx", R8A77470_CLK_ZX, CLK_PLL1, 3, 1), 59 + DEF_FIXED("zs", R8A77470_CLK_ZS, CLK_PLL1, 6, 1), 60 + DEF_FIXED("hp", R8A77470_CLK_HP, CLK_PLL1, 12, 1), 61 + DEF_FIXED("b", R8A77470_CLK_B, CLK_PLL1, 12, 1), 62 + DEF_FIXED("lb", R8A77470_CLK_LB, CLK_PLL1, 24, 1), 63 + DEF_FIXED("p", R8A77470_CLK_P, CLK_PLL1, 24, 1), 64 + DEF_FIXED("cl", R8A77470_CLK_CL, CLK_PLL1, 48, 1), 65 + DEF_FIXED("cp", R8A77470_CLK_CP, CLK_PLL1, 48, 1), 66 + DEF_FIXED("m2", R8A77470_CLK_M2, CLK_PLL1, 8, 1), 67 + DEF_FIXED("zb3", R8A77470_CLK_ZB3, CLK_PLL3, 4, 1), 68 + DEF_FIXED("mp", R8A77470_CLK_MP, CLK_PLL1_DIV2, 15, 1), 69 + DEF_FIXED("cpex", R8A77470_CLK_CPEX, CLK_EXTAL, 2, 1), 70 + DEF_FIXED("r", R8A77470_CLK_R, CLK_PLL1, 49152, 1), 71 + DEF_FIXED("osc", R8A77470_CLK_OSC, CLK_PLL1, 12288, 1), 72 + 73 + DEF_DIV6P1("sd2", R8A77470_CLK_SD2, CLK_PLL1_DIV2, 0x078), 74 + }; 75 + 76 + static const struct mssr_mod_clk r8a77470_mod_clks[] __initconst = { 77 + DEF_MOD("msiof0", 0, R8A77470_CLK_MP), 78 + DEF_MOD("vcp0", 101, R8A77470_CLK_ZS), 79 + DEF_MOD("vpc0", 103, R8A77470_CLK_ZS), 80 + DEF_MOD("tmu1", 111, R8A77470_CLK_P), 81 + DEF_MOD("3dg", 112, R8A77470_CLK_ZS), 82 + DEF_MOD("2d-dmac", 115, R8A77470_CLK_ZS), 83 + DEF_MOD("fdp1-0", 119, R8A77470_CLK_ZS), 84 + DEF_MOD("tmu3", 121, R8A77470_CLK_P), 85 + DEF_MOD("tmu2", 122, R8A77470_CLK_P), 86 + DEF_MOD("cmt0", 124, R8A77470_CLK_R), 87 + DEF_MOD("vsp1du0", 128, R8A77470_CLK_ZS), 88 + DEF_MOD("vsp1-sy", 131, R8A77470_CLK_ZS), 89 + DEF_MOD("msiof2", 205, R8A77470_CLK_MP), 90 + DEF_MOD("msiof1", 208, R8A77470_CLK_MP), 91 + DEF_MOD("sys-dmac1", 218, R8A77470_CLK_ZS), 92 + DEF_MOD("sys-dmac0", 219, R8A77470_CLK_ZS), 93 + DEF_MOD("sdhi2", 312, R8A77470_CLK_SD2), 94 + DEF_MOD("sdhi1", 313, R8A77470_CLK_SD1), 95 + DEF_MOD("sdhi0", 314, R8A77470_CLK_SD0), 96 + DEF_MOD("usbhs-dmac0-ch1", 326, R8A77470_CLK_HP), 97 + DEF_MOD("usbhs-dmac1-ch1", 327, R8A77470_CLK_HP), 98 + DEF_MOD("cmt1", 329, R8A77470_CLK_R), 99 + DEF_MOD("usbhs-dmac0-ch0", 330, R8A77470_CLK_HP), 100 + DEF_MOD("usbhs-dmac1-ch0", 331, R8A77470_CLK_HP), 101 + DEF_MOD("rwdt", 402, R8A77470_CLK_R), 102 + DEF_MOD("irqc", 407, R8A77470_CLK_CP), 103 + DEF_MOD("intc-sys", 408, R8A77470_CLK_ZS), 104 + DEF_MOD("audio-dmac0", 502, R8A77470_CLK_HP), 105 + DEF_MOD("pwm", 523, R8A77470_CLK_P), 106 + DEF_MOD("usb-ehci-0", 703, R8A77470_CLK_MP), 107 + DEF_MOD("usbhs-0", 704, R8A77470_CLK_HP), 108 + DEF_MOD("usb-ehci-1", 705, R8A77470_CLK_MP), 109 + DEF_MOD("usbhs-1", 706, R8A77470_CLK_HP), 110 + DEF_MOD("hscif2", 713, R8A77470_CLK_ZS), 111 + DEF_MOD("scif5", 714, R8A77470_CLK_P), 112 + DEF_MOD("scif4", 715, R8A77470_CLK_P), 113 + DEF_MOD("hscif1", 716, R8A77470_CLK_ZS), 114 + DEF_MOD("hscif0", 717, R8A77470_CLK_ZS), 115 + DEF_MOD("scif3", 718, R8A77470_CLK_P), 116 + DEF_MOD("scif2", 719, R8A77470_CLK_P), 117 + DEF_MOD("scif1", 720, R8A77470_CLK_P), 118 + DEF_MOD("scif0", 721, R8A77470_CLK_P), 119 + DEF_MOD("du1", 723, R8A77470_CLK_ZX), 120 + DEF_MOD("du0", 724, R8A77470_CLK_ZX), 121 + DEF_MOD("ipmmu-sgx", 800, R8A77470_CLK_ZX), 122 + DEF_MOD("etheravb", 812, R8A77470_CLK_HP), 123 + DEF_MOD("ether", 813, R8A77470_CLK_P), 124 + DEF_MOD("gpio5", 907, R8A77470_CLK_CP), 125 + DEF_MOD("gpio4", 908, R8A77470_CLK_CP), 126 + DEF_MOD("gpio3", 909, R8A77470_CLK_CP), 127 + DEF_MOD("gpio2", 910, R8A77470_CLK_CP), 128 + DEF_MOD("gpio1", 911, R8A77470_CLK_CP), 129 + DEF_MOD("gpio0", 912, R8A77470_CLK_CP), 130 + DEF_MOD("can1", 915, R8A77470_CLK_P), 131 + DEF_MOD("can0", 916, R8A77470_CLK_P), 132 + DEF_MOD("qspi_mod-1", 917, R8A77470_CLK_QSPI), 133 + DEF_MOD("qspi_mod-0", 918, R8A77470_CLK_QSPI), 134 + DEF_MOD("i2c4", 927, R8A77470_CLK_HP), 135 + DEF_MOD("i2c3", 928, R8A77470_CLK_HP), 136 + DEF_MOD("i2c2", 929, R8A77470_CLK_HP), 137 + DEF_MOD("i2c1", 930, R8A77470_CLK_HP), 138 + DEF_MOD("i2c0", 931, R8A77470_CLK_HP), 139 + DEF_MOD("ssi-all", 1005, R8A77470_CLK_P), 140 + DEF_MOD("ssi9", 1006, MOD_CLK_ID(1005)), 141 + DEF_MOD("ssi8", 1007, MOD_CLK_ID(1005)), 142 + DEF_MOD("ssi7", 1008, MOD_CLK_ID(1005)), 143 + DEF_MOD("ssi6", 1009, MOD_CLK_ID(1005)), 144 + DEF_MOD("ssi5", 1010, MOD_CLK_ID(1005)), 145 + DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)), 146 + DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)), 147 + DEF_MOD("ssi2", 1013, MOD_CLK_ID(1005)), 148 + DEF_MOD("ssi1", 1014, MOD_CLK_ID(1005)), 149 + DEF_MOD("ssi0", 1015, MOD_CLK_ID(1005)), 150 + DEF_MOD("scu-all", 1017, R8A77470_CLK_P), 151 + DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)), 152 + DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)), 153 + DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)), 154 + DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)), 155 + DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)), 156 + DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)), 157 + DEF_MOD("scu-src4", 1027, MOD_CLK_ID(1017)), 158 + DEF_MOD("scu-src3", 1028, MOD_CLK_ID(1017)), 159 + DEF_MOD("scu-src2", 1029, MOD_CLK_ID(1017)), 160 + DEF_MOD("scu-src1", 1030, MOD_CLK_ID(1017)), 161 + }; 162 + 163 + static const unsigned int r8a77470_crit_mod_clks[] __initconst = { 164 + MOD_CLK_ID(402), /* RWDT */ 165 + MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 166 + }; 167 + 168 + /* 169 + * CPG Clock Data 170 + */ 171 + 172 + /* 173 + * MD EXTAL PLL0 PLL1 PLL3 174 + * 14 13 (MHz) *1 *2 175 + *--------------------------------------------------- 176 + * 0 0 20 x80 x78 x50 177 + * 0 1 26 x60 x60 x56 178 + * 1 0 Prohibitted setting 179 + * 1 1 30 x52 x52 x50 180 + * 181 + * *1 : Table 7.4 indicates VCO output (PLL0 = VCO) 182 + * *2 : Table 7.4 indicates VCO output (PLL1 = VCO) 183 + */ 184 + #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 13) | \ 185 + (((md) & BIT(13)) >> 13)) 186 + 187 + static const struct rcar_gen2_cpg_pll_config cpg_pll_configs[4] __initconst = { 188 + /* EXTAL div PLL1 mult x2 PLL3 mult */ 189 + { 1, 156, 50, }, 190 + { 1, 120, 56, }, 191 + { /* Invalid*/ }, 192 + { 1, 104, 50, }, 193 + }; 194 + 195 + static int __init r8a77470_cpg_mssr_init(struct device *dev) 196 + { 197 + const struct rcar_gen2_cpg_pll_config *cpg_pll_config; 198 + u32 cpg_mode; 199 + int error; 200 + 201 + error = rcar_rst_read_mode_pins(&cpg_mode); 202 + if (error) 203 + return error; 204 + 205 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 206 + 207 + return rcar_gen2_cpg_init(cpg_pll_config, 2, cpg_mode); 208 + } 209 + 210 + const struct cpg_mssr_info r8a77470_cpg_mssr_info __initconst = { 211 + /* Core Clocks */ 212 + .core_clks = r8a77470_core_clks, 213 + .num_core_clks = ARRAY_SIZE(r8a77470_core_clks), 214 + .last_dt_core_clk = LAST_DT_CORE_CLK, 215 + .num_total_core_clks = MOD_CLK_BASE, 216 + 217 + /* Module Clocks */ 218 + .mod_clks = r8a77470_mod_clks, 219 + .num_mod_clks = ARRAY_SIZE(r8a77470_mod_clks), 220 + .num_hw_mod_clks = 12 * 32, 221 + 222 + /* Critical Module Clocks */ 223 + .crit_mod_clks = r8a77470_crit_mod_clks, 224 + .num_crit_mod_clks = ARRAY_SIZE(r8a77470_crit_mod_clks), 225 + 226 + /* Callbacks */ 227 + .init = r8a77470_cpg_mssr_init, 228 + .cpg_clk_register = rcar_gen2_cpg_clk_register, 229 + };
+1 -1
drivers/clk/renesas/r8a7791-cpg-mssr.c
··· 57 57 58 58 /* Core Clock Outputs */ 59 59 DEF_BASE("z", R8A7791_CLK_Z, CLK_TYPE_GEN2_Z, CLK_PLL0), 60 - DEF_BASE("lb", R8A7791_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 61 60 DEF_BASE("adsp", R8A7791_CLK_ADSP, CLK_TYPE_GEN2_ADSP, CLK_PLL1), 62 61 DEF_BASE("sdh", R8A7791_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 63 62 DEF_BASE("sd0", R8A7791_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), ··· 69 70 DEF_FIXED("hp", R8A7791_CLK_HP, CLK_PLL1, 12, 1), 70 71 DEF_FIXED("i", R8A7791_CLK_I, CLK_PLL1, 2, 1), 71 72 DEF_FIXED("b", R8A7791_CLK_B, CLK_PLL1, 12, 1), 73 + DEF_FIXED("lb", R8A7791_CLK_LB, CLK_PLL1, 24, 1), 72 74 DEF_FIXED("p", R8A7791_CLK_P, CLK_PLL1, 24, 1), 73 75 DEF_FIXED("cl", R8A7791_CLK_CL, CLK_PLL1, 48, 1), 74 76 DEF_FIXED("m2", R8A7791_CLK_M2, CLK_PLL1, 8, 1),
+1 -1
drivers/clk/renesas/r8a7792-cpg-mssr.c
··· 53 53 DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 54 54 55 55 /* Core Clock Outputs */ 56 - DEF_BASE("lb", R8A7792_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 57 56 DEF_BASE("qspi", R8A7792_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), 58 57 59 58 DEF_FIXED("z", R8A7792_CLK_Z, CLK_PLL0, 1, 1), ··· 62 63 DEF_FIXED("hp", R8A7792_CLK_HP, CLK_PLL1, 12, 1), 63 64 DEF_FIXED("i", R8A7792_CLK_I, CLK_PLL1, 3, 1), 64 65 DEF_FIXED("b", R8A7792_CLK_B, CLK_PLL1, 12, 1), 66 + DEF_FIXED("lb", R8A7792_CLK_LB, CLK_PLL1, 24, 1), 65 67 DEF_FIXED("p", R8A7792_CLK_P, CLK_PLL1, 24, 1), 66 68 DEF_FIXED("cl", R8A7792_CLK_CL, CLK_PLL1, 48, 1), 67 69 DEF_FIXED("m2", R8A7792_CLK_M2, CLK_PLL1, 8, 1),
+1 -1
drivers/clk/renesas/r8a7794-cpg-mssr.c
··· 55 55 DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 56 56 57 57 /* Core Clock Outputs */ 58 - DEF_BASE("lb", R8A7794_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 59 58 DEF_BASE("adsp", R8A7794_CLK_ADSP, CLK_TYPE_GEN2_ADSP, CLK_PLL1), 60 59 DEF_BASE("sdh", R8A7794_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 61 60 DEF_BASE("sd0", R8A7794_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), ··· 68 69 DEF_FIXED("hp", R8A7794_CLK_HP, CLK_PLL1, 12, 1), 69 70 DEF_FIXED("i", R8A7794_CLK_I, CLK_PLL1, 2, 1), 70 71 DEF_FIXED("b", R8A7794_CLK_B, CLK_PLL1, 12, 1), 72 + DEF_FIXED("lb", R8A7794_CLK_LB, CLK_PLL1, 24, 1), 71 73 DEF_FIXED("p", R8A7794_CLK_P, CLK_PLL1, 24, 1), 72 74 DEF_FIXED("cl", R8A7794_CLK_CL, CLK_PLL1, 48, 1), 73 75 DEF_FIXED("cp", R8A7794_CLK_CP, CLK_PLL1, 48, 1),
+4
drivers/clk/renesas/r8a77965-cpg-mssr.c
··· 116 116 DEF_MOD("scif3", 204, R8A77965_CLK_S3D4), 117 117 DEF_MOD("scif1", 206, R8A77965_CLK_S3D4), 118 118 DEF_MOD("scif0", 207, R8A77965_CLK_S3D4), 119 + DEF_MOD("msiof3", 208, R8A77965_CLK_MSO), 120 + DEF_MOD("msiof2", 209, R8A77965_CLK_MSO), 121 + DEF_MOD("msiof1", 210, R8A77965_CLK_MSO), 122 + DEF_MOD("msiof0", 211, R8A77965_CLK_MSO), 119 123 DEF_MOD("sys-dmac2", 217, R8A77965_CLK_S0D3), 120 124 DEF_MOD("sys-dmac1", 218, R8A77965_CLK_S0D3), 121 125 DEF_MOD("sys-dmac0", 219, R8A77965_CLK_S0D3),
+1 -1
drivers/clk/renesas/r8a77980-cpg-mssr.c
··· 116 116 DEF_MOD("sys-dmac1", 218, R8A77980_CLK_S0D3), 117 117 DEF_MOD("tpu0", 304, R8A77980_CLK_S3D4), 118 118 DEF_MOD("sdif", 314, R8A77980_CLK_SD0), 119 - DEF_MOD("pciec0", 319, R8A77980_CLK_S3D1), 119 + DEF_MOD("pciec0", 319, R8A77980_CLK_S2D2), 120 120 DEF_MOD("intc-ex", 407, R8A77980_CLK_CP), 121 121 DEF_MOD("intc-ap", 408, R8A77980_CLK_S0D3), 122 122 DEF_MOD("hscif3", 517, R8A77980_CLK_S3D1),
+289
drivers/clk/renesas/r8a77990-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a77990 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2018 Renesas Electronics Corp. 6 + * 7 + * Based on r8a7795-cpg-mssr.c 8 + * 9 + * Copyright (C) 2015 Glider bvba 10 + * Copyright (C) 2015 Renesas Electronics Corp. 11 + */ 12 + 13 + #include <linux/device.h> 14 + #include <linux/init.h> 15 + #include <linux/kernel.h> 16 + #include <linux/soc/renesas/rcar-rst.h> 17 + 18 + #include <dt-bindings/clock/r8a77990-cpg-mssr.h> 19 + 20 + #include "renesas-cpg-mssr.h" 21 + #include "rcar-gen3-cpg.h" 22 + 23 + enum clk_ids { 24 + /* Core Clock Outputs exported to DT */ 25 + LAST_DT_CORE_CLK = R8A77990_CLK_CPEX, 26 + 27 + /* External Input Clocks */ 28 + CLK_EXTAL, 29 + 30 + /* Internal Core Clocks */ 31 + CLK_MAIN, 32 + CLK_PLL0, 33 + CLK_PLL1, 34 + CLK_PLL3, 35 + CLK_PLL0D4, 36 + CLK_PLL0D6, 37 + CLK_PLL0D8, 38 + CLK_PLL0D20, 39 + CLK_PLL0D24, 40 + CLK_PLL1D2, 41 + CLK_PE, 42 + CLK_S0, 43 + CLK_S1, 44 + CLK_S2, 45 + CLK_S3, 46 + CLK_SDSRC, 47 + 48 + /* Module Clocks */ 49 + MOD_CLK_BASE 50 + }; 51 + 52 + static const struct cpg_core_clk r8a77990_core_clks[] __initconst = { 53 + /* External Clock Inputs */ 54 + DEF_INPUT("extal", CLK_EXTAL), 55 + 56 + /* Internal Core Clocks */ 57 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), 58 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), 59 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), 60 + 61 + DEF_FIXED(".pll0", CLK_PLL0, CLK_MAIN, 1, 100), 62 + DEF_FIXED(".pll0d4", CLK_PLL0D4, CLK_PLL0, 4, 1), 63 + DEF_FIXED(".pll0d6", CLK_PLL0D6, CLK_PLL0, 6, 1), 64 + DEF_FIXED(".pll0d8", CLK_PLL0D8, CLK_PLL0, 8, 1), 65 + DEF_FIXED(".pll0d20", CLK_PLL0D20, CLK_PLL0, 20, 1), 66 + DEF_FIXED(".pll0d24", CLK_PLL0D24, CLK_PLL0, 24, 1), 67 + DEF_FIXED(".pll1d2", CLK_PLL1D2, CLK_PLL1, 2, 1), 68 + DEF_FIXED(".pe", CLK_PE, CLK_PLL0D20, 1, 1), 69 + DEF_FIXED(".s0", CLK_S0, CLK_PLL1, 2, 1), 70 + DEF_FIXED(".s1", CLK_S1, CLK_PLL1, 3, 1), 71 + DEF_FIXED(".s2", CLK_S2, CLK_PLL1, 4, 1), 72 + DEF_FIXED(".s3", CLK_S3, CLK_PLL1, 6, 1), 73 + DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1, 2, 1), 74 + 75 + /* Core Clock Outputs */ 76 + DEF_FIXED("za2", R8A77990_CLK_ZA2, CLK_PLL0D24, 1, 1), 77 + DEF_FIXED("za8", R8A77990_CLK_ZA8, CLK_PLL0D8, 1, 1), 78 + DEF_FIXED("ztr", R8A77990_CLK_ZTR, CLK_PLL1, 6, 1), 79 + DEF_FIXED("zt", R8A77990_CLK_ZT, CLK_PLL1, 4, 1), 80 + DEF_FIXED("zx", R8A77990_CLK_ZX, CLK_PLL1, 3, 1), 81 + DEF_FIXED("s0d1", R8A77990_CLK_S0D1, CLK_S0, 1, 1), 82 + DEF_FIXED("s0d3", R8A77990_CLK_S0D3, CLK_S0, 3, 1), 83 + DEF_FIXED("s0d6", R8A77990_CLK_S0D6, CLK_S0, 6, 1), 84 + DEF_FIXED("s0d12", R8A77990_CLK_S0D12, CLK_S0, 12, 1), 85 + DEF_FIXED("s0d24", R8A77990_CLK_S0D24, CLK_S0, 24, 1), 86 + DEF_FIXED("s1d1", R8A77990_CLK_S1D1, CLK_S1, 1, 1), 87 + DEF_FIXED("s1d2", R8A77990_CLK_S1D2, CLK_S1, 2, 1), 88 + DEF_FIXED("s1d4", R8A77990_CLK_S1D4, CLK_S1, 4, 1), 89 + DEF_FIXED("s2d1", R8A77990_CLK_S2D1, CLK_S2, 1, 1), 90 + DEF_FIXED("s2d2", R8A77990_CLK_S2D2, CLK_S2, 2, 1), 91 + DEF_FIXED("s2d4", R8A77990_CLK_S2D4, CLK_S2, 4, 1), 92 + DEF_FIXED("s3d1", R8A77990_CLK_S3D1, CLK_S3, 1, 1), 93 + DEF_FIXED("s3d2", R8A77990_CLK_S3D2, CLK_S3, 2, 1), 94 + DEF_FIXED("s3d4", R8A77990_CLK_S3D4, CLK_S3, 4, 1), 95 + 96 + DEF_GEN3_SD("sd0", R8A77990_CLK_SD0, CLK_SDSRC, 0x0074), 97 + DEF_GEN3_SD("sd1", R8A77990_CLK_SD1, CLK_SDSRC, 0x0078), 98 + DEF_GEN3_SD("sd3", R8A77990_CLK_SD3, CLK_SDSRC, 0x026c), 99 + 100 + DEF_FIXED("cl", R8A77990_CLK_CL, CLK_PLL1, 48, 1), 101 + DEF_FIXED("cp", R8A77990_CLK_CP, CLK_EXTAL, 2, 1), 102 + DEF_FIXED("cpex", R8A77990_CLK_CPEX, CLK_EXTAL, 4, 1), 103 + DEF_FIXED("osc", R8A77990_CLK_OSC, CLK_EXTAL, 384, 1), 104 + DEF_FIXED("r", R8A77990_CLK_R, CLK_EXTAL, 1536, 1), 105 + 106 + DEF_GEN3_PE("s0d6c", R8A77990_CLK_S0D6C, CLK_S0, 6, CLK_PE, 2), 107 + DEF_GEN3_PE("s3d1c", R8A77990_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1), 108 + DEF_GEN3_PE("s3d2c", R8A77990_CLK_S3D2C, CLK_S3, 2, CLK_PE, 2), 109 + DEF_GEN3_PE("s3d4c", R8A77990_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4), 110 + 111 + DEF_DIV6P1("canfd", R8A77990_CLK_CANFD, CLK_PLL0D6, 0x244), 112 + DEF_DIV6P1("csi0", R8A77990_CLK_CSI0, CLK_PLL1D2, 0x00c), 113 + DEF_DIV6P1("mso", R8A77990_CLK_MSO, CLK_PLL1D2, 0x014), 114 + }; 115 + 116 + static const struct mssr_mod_clk r8a77990_mod_clks[] __initconst = { 117 + DEF_MOD("scif5", 202, R8A77990_CLK_S3D4C), 118 + DEF_MOD("scif4", 203, R8A77990_CLK_S3D4C), 119 + DEF_MOD("scif3", 204, R8A77990_CLK_S3D4C), 120 + DEF_MOD("scif1", 206, R8A77990_CLK_S3D4C), 121 + DEF_MOD("scif0", 207, R8A77990_CLK_S3D4C), 122 + DEF_MOD("msiof3", 208, R8A77990_CLK_MSO), 123 + DEF_MOD("msiof2", 209, R8A77990_CLK_MSO), 124 + DEF_MOD("msiof1", 210, R8A77990_CLK_MSO), 125 + DEF_MOD("msiof0", 211, R8A77990_CLK_MSO), 126 + DEF_MOD("sys-dmac2", 217, R8A77990_CLK_S3D1), 127 + DEF_MOD("sys-dmac1", 218, R8A77990_CLK_S3D1), 128 + DEF_MOD("sys-dmac0", 219, R8A77990_CLK_S3D1), 129 + 130 + DEF_MOD("cmt3", 300, R8A77990_CLK_R), 131 + DEF_MOD("cmt2", 301, R8A77990_CLK_R), 132 + DEF_MOD("cmt1", 302, R8A77990_CLK_R), 133 + DEF_MOD("cmt0", 303, R8A77990_CLK_R), 134 + DEF_MOD("scif2", 310, R8A77990_CLK_S3D4C), 135 + DEF_MOD("sdif3", 311, R8A77990_CLK_SD3), 136 + DEF_MOD("sdif1", 313, R8A77990_CLK_SD1), 137 + DEF_MOD("sdif0", 314, R8A77990_CLK_SD0), 138 + DEF_MOD("pcie0", 319, R8A77990_CLK_S3D1), 139 + DEF_MOD("usb3-if0", 328, R8A77990_CLK_S3D1), 140 + DEF_MOD("usb-dmac0", 330, R8A77990_CLK_S3D1), 141 + DEF_MOD("usb-dmac1", 331, R8A77990_CLK_S3D1), 142 + 143 + DEF_MOD("rwdt", 402, R8A77990_CLK_R), 144 + DEF_MOD("intc-ex", 407, R8A77990_CLK_CP), 145 + DEF_MOD("intc-ap", 408, R8A77990_CLK_S0D3), 146 + 147 + DEF_MOD("audmac0", 502, R8A77990_CLK_S3D4), 148 + DEF_MOD("drif7", 508, R8A77990_CLK_S3D2), 149 + DEF_MOD("drif6", 509, R8A77990_CLK_S3D2), 150 + DEF_MOD("drif5", 510, R8A77990_CLK_S3D2), 151 + DEF_MOD("drif4", 511, R8A77990_CLK_S3D2), 152 + DEF_MOD("drif3", 512, R8A77990_CLK_S3D2), 153 + DEF_MOD("drif2", 513, R8A77990_CLK_S3D2), 154 + DEF_MOD("drif1", 514, R8A77990_CLK_S3D2), 155 + DEF_MOD("drif0", 515, R8A77990_CLK_S3D2), 156 + DEF_MOD("hscif4", 516, R8A77990_CLK_S3D1C), 157 + DEF_MOD("hscif3", 517, R8A77990_CLK_S3D1C), 158 + DEF_MOD("hscif2", 518, R8A77990_CLK_S3D1C), 159 + DEF_MOD("hscif1", 519, R8A77990_CLK_S3D1C), 160 + DEF_MOD("hscif0", 520, R8A77990_CLK_S3D1C), 161 + DEF_MOD("thermal", 522, R8A77990_CLK_CP), 162 + DEF_MOD("pwm", 523, R8A77990_CLK_S3D4C), 163 + 164 + DEF_MOD("fcpvd1", 602, R8A77990_CLK_S1D2), 165 + DEF_MOD("fcpvd0", 603, R8A77990_CLK_S1D2), 166 + DEF_MOD("fcpvb0", 607, R8A77990_CLK_S0D1), 167 + DEF_MOD("fcpvi0", 611, R8A77990_CLK_S0D1), 168 + DEF_MOD("fcpf0", 615, R8A77990_CLK_S0D1), 169 + DEF_MOD("fcpcs", 619, R8A77990_CLK_S0D1), 170 + DEF_MOD("vspd1", 622, R8A77990_CLK_S1D2), 171 + DEF_MOD("vspd0", 623, R8A77990_CLK_S1D2), 172 + DEF_MOD("vspb", 626, R8A77990_CLK_S0D1), 173 + DEF_MOD("vspi0", 631, R8A77990_CLK_S0D1), 174 + 175 + DEF_MOD("ehci0", 703, R8A77990_CLK_S3D4), 176 + DEF_MOD("hsusb", 704, R8A77990_CLK_S3D4), 177 + DEF_MOD("csi40", 716, R8A77990_CLK_CSI0), 178 + DEF_MOD("du1", 723, R8A77990_CLK_S2D1), 179 + DEF_MOD("du0", 724, R8A77990_CLK_S2D1), 180 + DEF_MOD("lvds", 727, R8A77990_CLK_S2D1), 181 + 182 + DEF_MOD("vin5", 806, R8A77990_CLK_S1D2), 183 + DEF_MOD("vin4", 807, R8A77990_CLK_S1D2), 184 + DEF_MOD("etheravb", 812, R8A77990_CLK_S3D2), 185 + 186 + DEF_MOD("gpio6", 906, R8A77990_CLK_S3D4), 187 + DEF_MOD("gpio5", 907, R8A77990_CLK_S3D4), 188 + DEF_MOD("gpio4", 908, R8A77990_CLK_S3D4), 189 + DEF_MOD("gpio3", 909, R8A77990_CLK_S3D4), 190 + DEF_MOD("gpio2", 910, R8A77990_CLK_S3D4), 191 + DEF_MOD("gpio1", 911, R8A77990_CLK_S3D4), 192 + DEF_MOD("gpio0", 912, R8A77990_CLK_S3D4), 193 + DEF_MOD("can-fd", 914, R8A77990_CLK_S3D2), 194 + DEF_MOD("can-if1", 915, R8A77990_CLK_S3D4), 195 + DEF_MOD("can-if0", 916, R8A77990_CLK_S3D4), 196 + DEF_MOD("i2c6", 918, R8A77990_CLK_S3D2), 197 + DEF_MOD("i2c5", 919, R8A77990_CLK_S3D2), 198 + DEF_MOD("i2c-dvfs", 926, R8A77990_CLK_CP), 199 + DEF_MOD("i2c4", 927, R8A77990_CLK_S3D2), 200 + DEF_MOD("i2c3", 928, R8A77990_CLK_S3D2), 201 + DEF_MOD("i2c2", 929, R8A77990_CLK_S3D2), 202 + DEF_MOD("i2c1", 930, R8A77990_CLK_S3D2), 203 + DEF_MOD("i2c0", 931, R8A77990_CLK_S3D2), 204 + 205 + DEF_MOD("ssi-all", 1005, R8A77990_CLK_S3D4), 206 + DEF_MOD("ssi9", 1006, MOD_CLK_ID(1005)), 207 + DEF_MOD("ssi8", 1007, MOD_CLK_ID(1005)), 208 + DEF_MOD("ssi7", 1008, MOD_CLK_ID(1005)), 209 + DEF_MOD("ssi6", 1009, MOD_CLK_ID(1005)), 210 + DEF_MOD("ssi5", 1010, MOD_CLK_ID(1005)), 211 + DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)), 212 + DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)), 213 + DEF_MOD("ssi2", 1013, MOD_CLK_ID(1005)), 214 + DEF_MOD("ssi1", 1014, MOD_CLK_ID(1005)), 215 + DEF_MOD("ssi0", 1015, MOD_CLK_ID(1005)), 216 + DEF_MOD("scu-all", 1017, R8A77990_CLK_S3D4), 217 + DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)), 218 + DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)), 219 + DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)), 220 + DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)), 221 + DEF_MOD("scu-src9", 1022, MOD_CLK_ID(1017)), 222 + DEF_MOD("scu-src8", 1023, MOD_CLK_ID(1017)), 223 + DEF_MOD("scu-src7", 1024, MOD_CLK_ID(1017)), 224 + DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)), 225 + DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)), 226 + DEF_MOD("scu-src4", 1027, MOD_CLK_ID(1017)), 227 + DEF_MOD("scu-src3", 1028, MOD_CLK_ID(1017)), 228 + DEF_MOD("scu-src2", 1029, MOD_CLK_ID(1017)), 229 + DEF_MOD("scu-src1", 1030, MOD_CLK_ID(1017)), 230 + DEF_MOD("scu-src0", 1031, MOD_CLK_ID(1017)), 231 + }; 232 + 233 + static const unsigned int r8a77990_crit_mod_clks[] __initconst = { 234 + MOD_CLK_ID(408), /* INTC-AP (GIC) */ 235 + }; 236 + 237 + /* 238 + * CPG Clock Data 239 + */ 240 + 241 + /* 242 + * MD19 EXTAL (MHz) PLL0 PLL1 PLL3 243 + *-------------------------------------------------------------------- 244 + * 0 48 x 1 x100/4 x100/3 x100/3 245 + * 1 48 x 1 x100/4 x100/3 x58/3 246 + */ 247 + #define CPG_PLL_CONFIG_INDEX(md) (((md) & BIT(19)) >> 19) 248 + 249 + static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[2] __initconst = { 250 + /* EXTAL div PLL1 mult/div PLL3 mult/div */ 251 + { 1, 100, 3, 100, 3, }, 252 + { 1, 100, 3, 58, 3, }, 253 + }; 254 + 255 + static int __init r8a77990_cpg_mssr_init(struct device *dev) 256 + { 257 + const struct rcar_gen3_cpg_pll_config *cpg_pll_config; 258 + u32 cpg_mode; 259 + int error; 260 + 261 + error = rcar_rst_read_mode_pins(&cpg_mode); 262 + if (error) 263 + return error; 264 + 265 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 266 + 267 + return rcar_gen3_cpg_init(cpg_pll_config, 0, cpg_mode); 268 + } 269 + 270 + const struct cpg_mssr_info r8a77990_cpg_mssr_info __initconst = { 271 + /* Core Clocks */ 272 + .core_clks = r8a77990_core_clks, 273 + .num_core_clks = ARRAY_SIZE(r8a77990_core_clks), 274 + .last_dt_core_clk = LAST_DT_CORE_CLK, 275 + .num_total_core_clks = MOD_CLK_BASE, 276 + 277 + /* Module Clocks */ 278 + .mod_clks = r8a77990_mod_clks, 279 + .num_mod_clks = ARRAY_SIZE(r8a77990_mod_clks), 280 + .num_hw_mod_clks = 12 * 32, 281 + 282 + /* Critical Module Clocks */ 283 + .crit_mod_clks = r8a77990_crit_mod_clks, 284 + .num_crit_mod_clks = ARRAY_SIZE(r8a77990_crit_mod_clks), 285 + 286 + /* Callbacks */ 287 + .init = r8a77990_cpg_mssr_init, 288 + .cpg_clk_register = rcar_gen3_cpg_clk_register, 289 + };
+24
drivers/clk/renesas/rcar-gen2-cpg.c
··· 16 16 #include <linux/init.h> 17 17 #include <linux/io.h> 18 18 #include <linux/slab.h> 19 + #include <linux/sys_soc.h> 19 20 20 21 #include "renesas-cpg-mssr.h" 21 22 #include "rcar-gen2-cpg.h" ··· 261 260 static const struct rcar_gen2_cpg_pll_config *cpg_pll_config __initdata; 262 261 static unsigned int cpg_pll0_div __initdata; 263 262 static u32 cpg_mode __initdata; 263 + static u32 cpg_quirks __initdata; 264 + 265 + #define SD_SKIP_FIRST BIT(0) /* Skip first clock in SD table */ 266 + 267 + static const struct soc_device_attribute cpg_quirks_match[] __initconst = { 268 + { 269 + .soc_id = "r8a77470", 270 + .data = (void *)SD_SKIP_FIRST, 271 + }, 272 + { /* sentinel */ } 273 + }; 264 274 265 275 struct clk * __init rcar_gen2_cpg_clk_register(struct device *dev, 266 276 const struct cpg_core_clk *core, const struct cpg_mssr_info *info, ··· 339 327 340 328 case CLK_TYPE_GEN2_SD0: 341 329 table = cpg_sd01_div_table; 330 + if (cpg_quirks & SD_SKIP_FIRST) 331 + table++; 332 + 342 333 shift = 4; 343 334 break; 344 335 345 336 case CLK_TYPE_GEN2_SD1: 346 337 table = cpg_sd01_div_table; 338 + if (cpg_quirks & SD_SKIP_FIRST) 339 + table++; 340 + 347 341 shift = 0; 348 342 break; 349 343 ··· 378 360 int __init rcar_gen2_cpg_init(const struct rcar_gen2_cpg_pll_config *config, 379 361 unsigned int pll0_div, u32 mode) 380 362 { 363 + const struct soc_device_attribute *attr; 364 + 381 365 cpg_pll_config = config; 382 366 cpg_pll0_div = pll0_div; 383 367 cpg_mode = mode; 368 + attr = soc_device_match(cpg_quirks_match); 369 + if (attr) 370 + cpg_quirks = (uintptr_t)attr->data; 371 + pr_debug("%s: mode = 0x%x quirks = 0x%x\n", __func__, mode, cpg_quirks); 384 372 385 373 spin_lock_init(&cpg_lock); 386 374
+12
drivers/clk/renesas/renesas-cpg-mssr.c
··· 653 653 .data = &r8a7745_cpg_mssr_info, 654 654 }, 655 655 #endif 656 + #ifdef CONFIG_CLK_R8A77470 657 + { 658 + .compatible = "renesas,r8a77470-cpg-mssr", 659 + .data = &r8a77470_cpg_mssr_info, 660 + }, 661 + #endif 656 662 #ifdef CONFIG_CLK_R8A7790 657 663 { 658 664 .compatible = "renesas,r8a7790-cpg-mssr", ··· 716 710 { 717 711 .compatible = "renesas,r8a77980-cpg-mssr", 718 712 .data = &r8a77980_cpg_mssr_info, 713 + }, 714 + #endif 715 + #ifdef CONFIG_CLK_R8A77990 716 + { 717 + .compatible = "renesas,r8a77990-cpg-mssr", 718 + .data = &r8a77990_cpg_mssr_info, 719 719 }, 720 720 #endif 721 721 #ifdef CONFIG_CLK_R8A77995
+2
drivers/clk/renesas/renesas-cpg-mssr.h
··· 133 133 134 134 extern const struct cpg_mssr_info r8a7743_cpg_mssr_info; 135 135 extern const struct cpg_mssr_info r8a7745_cpg_mssr_info; 136 + extern const struct cpg_mssr_info r8a77470_cpg_mssr_info; 136 137 extern const struct cpg_mssr_info r8a7790_cpg_mssr_info; 137 138 extern const struct cpg_mssr_info r8a7791_cpg_mssr_info; 138 139 extern const struct cpg_mssr_info r8a7792_cpg_mssr_info; ··· 143 142 extern const struct cpg_mssr_info r8a77965_cpg_mssr_info; 144 143 extern const struct cpg_mssr_info r8a77970_cpg_mssr_info; 145 144 extern const struct cpg_mssr_info r8a77980_cpg_mssr_info; 145 + extern const struct cpg_mssr_info r8a77990_cpg_mssr_info; 146 146 extern const struct cpg_mssr_info r8a77995_cpg_mssr_info; 147 147 148 148
-1
drivers/clk/rockchip/Makefile
··· 3 3 # Rockchip Clock specific Makefile 4 4 # 5 5 6 - obj-y += clk-rockchip.o 7 6 obj-y += clk.o 8 7 obj-y += clk-pll.o 9 8 obj-y += clk-cpu.o
-98
drivers/clk/rockchip/clk-rockchip.c
··· 1 - /* 2 - * Copyright (c) 2013 MundoReader S.L. 3 - * Author: Heiko Stuebner <heiko@sntech.de> 4 - * 5 - * This program is free software; you can redistribute it and/or modify 6 - * it under the terms of the GNU General Public License as published by 7 - * the Free Software Foundation; either version 2 of the License, or 8 - * (at your option) any later version. 9 - * 10 - * This program is distributed in the hope that it will be useful, 11 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 - * GNU General Public License for more details. 14 - */ 15 - 16 - #include <linux/clk-provider.h> 17 - #include <linux/clkdev.h> 18 - #include <linux/of.h> 19 - #include <linux/of_address.h> 20 - 21 - static DEFINE_SPINLOCK(clk_lock); 22 - 23 - /* 24 - * Gate clocks 25 - */ 26 - 27 - static void __init rk2928_gate_clk_init(struct device_node *node) 28 - { 29 - struct clk_onecell_data *clk_data; 30 - const char *clk_parent; 31 - const char *clk_name; 32 - void __iomem *reg; 33 - void __iomem *reg_idx; 34 - int flags; 35 - int qty; 36 - int reg_bit; 37 - int clkflags = CLK_SET_RATE_PARENT; 38 - int i; 39 - 40 - qty = of_property_count_strings(node, "clock-output-names"); 41 - if (qty < 0) { 42 - pr_err("%s: error in clock-output-names %d\n", __func__, qty); 43 - return; 44 - } 45 - 46 - if (qty == 0) { 47 - pr_info("%s: nothing to do\n", __func__); 48 - return; 49 - } 50 - 51 - reg = of_iomap(node, 0); 52 - if (!reg) 53 - return; 54 - 55 - clk_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL); 56 - if (!clk_data) { 57 - iounmap(reg); 58 - return; 59 - } 60 - 61 - clk_data->clks = kzalloc(qty * sizeof(struct clk *), GFP_KERNEL); 62 - if (!clk_data->clks) { 63 - kfree(clk_data); 64 - iounmap(reg); 65 - return; 66 - } 67 - 68 - flags = CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE; 69 - 70 - for (i = 0; i < qty; i++) { 71 - of_property_read_string_index(node, "clock-output-names", 72 - i, &clk_name); 73 - 74 - /* ignore empty slots */ 75 - if (!strcmp("reserved", clk_name)) 76 - continue; 77 - 78 - clk_parent = of_clk_get_parent_name(node, i); 79 - 80 - /* keep all gates untouched for now */ 81 - clkflags |= CLK_IGNORE_UNUSED; 82 - 83 - reg_idx = reg + (4 * (i / 16)); 84 - reg_bit = (i % 16); 85 - 86 - clk_data->clks[i] = clk_register_gate(NULL, clk_name, 87 - clk_parent, clkflags, 88 - reg_idx, reg_bit, 89 - flags, 90 - &clk_lock); 91 - WARN_ON(IS_ERR(clk_data->clks[i])); 92 - } 93 - 94 - clk_data->clk_num = qty; 95 - 96 - of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); 97 - } 98 - CLK_OF_DECLARE(rk2928_gate, "rockchip,rk2928-gate-clk", rk2928_gate_clk_init);
+5 -11
drivers/clk/rockchip/clk.c
··· 274 274 struct clk_mux *frac_mux = &frac->mux; 275 275 struct clk_init_data init; 276 276 struct clk *mux_clk; 277 - int i, ret; 277 + int ret; 278 278 279 - frac->mux_frac_idx = -1; 280 - for (i = 0; i < child->num_parents; i++) { 281 - if (!strcmp(name, child->parent_names[i])) { 282 - pr_debug("%s: found fractional parent in mux at pos %d\n", 283 - __func__, i); 284 - frac->mux_frac_idx = i; 285 - break; 286 - } 287 - } 288 - 279 + frac->mux_frac_idx = match_string(child->parent_names, 280 + child->num_parents, name); 289 281 frac->mux_ops = &clk_mux_ops; 290 282 frac->clk_nb.notifier_call = rockchip_clk_frac_notifier_cb; 291 283 ··· 304 312 305 313 /* notifier on the fraction divider to catch rate changes */ 306 314 if (frac->mux_frac_idx >= 0) { 315 + pr_debug("%s: found fractional parent in mux at pos %d\n", 316 + __func__, frac->mux_frac_idx); 307 317 ret = clk_notifier_register(clk, &frac->clk_nb); 308 318 if (ret) 309 319 pr_err("%s: failed to register clock notifier for %s\n",
+2 -4
drivers/clk/samsung/clk-s3c2410-dclk.c
··· 219 219 #ifdef CONFIG_PM_SLEEP 220 220 static int s3c24xx_dclk_suspend(struct device *dev) 221 221 { 222 - struct platform_device *pdev = to_platform_device(dev); 223 - struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); 222 + struct s3c24xx_dclk *s3c24xx_dclk = dev_get_drvdata(dev); 224 223 225 224 s3c24xx_dclk->reg_save = readl_relaxed(s3c24xx_dclk->base); 226 225 return 0; ··· 227 228 228 229 static int s3c24xx_dclk_resume(struct device *dev) 229 230 { 230 - struct platform_device *pdev = to_platform_device(dev); 231 - struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); 231 + struct s3c24xx_dclk *s3c24xx_dclk = dev_get_drvdata(dev); 232 232 233 233 writel_relaxed(s3c24xx_dclk->reg_save, s3c24xx_dclk->base); 234 234 return 0;
+18 -22
drivers/clk/socfpga/clk-s10.c
··· 260 260 return 0; 261 261 } 262 262 263 - static struct stratix10_clock_data *__socfpga_s10_clk_init(struct device_node *np, 263 + static struct stratix10_clock_data *__socfpga_s10_clk_init(struct platform_device *pdev, 264 264 int nr_clks) 265 265 { 266 + struct device_node *np = pdev->dev.of_node; 267 + struct device *dev = &pdev->dev; 266 268 struct stratix10_clock_data *clk_data; 267 269 struct clk **clk_table; 270 + struct resource *res; 268 271 void __iomem *base; 269 272 270 - base = of_iomap(np, 0); 271 - if (!base) { 273 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 274 + base = devm_ioremap_resource(dev, res); 275 + if (IS_ERR(base)) { 272 276 pr_err("%s: failed to map clock registers\n", __func__); 273 - goto err; 277 + return ERR_CAST(base); 274 278 } 275 279 276 - clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL); 280 + clk_data = devm_kzalloc(dev, sizeof(*clk_data), GFP_KERNEL); 277 281 if (!clk_data) 278 - goto err; 282 + return ERR_PTR(-ENOMEM); 279 283 280 284 clk_data->base = base; 281 - clk_table = kcalloc(nr_clks, sizeof(*clk_table), GFP_KERNEL); 285 + clk_table = devm_kcalloc(dev, nr_clks, sizeof(*clk_table), GFP_KERNEL); 282 286 if (!clk_table) 283 - goto err_data; 287 + return ERR_PTR(-ENOMEM); 284 288 285 289 clk_data->clk_data.clks = clk_table; 286 290 clk_data->clk_data.clk_num = nr_clks; 287 291 of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data->clk_data); 288 292 return clk_data; 289 - 290 - err_data: 291 - kfree(clk_data); 292 - err: 293 - return NULL; 294 293 } 295 294 296 - static int s10_clkmgr_init(struct device_node *np) 295 + static int s10_clkmgr_init(struct platform_device *pdev) 297 296 { 298 297 struct stratix10_clock_data *clk_data; 299 298 300 - clk_data = __socfpga_s10_clk_init(np, STRATIX10_NUM_CLKS); 301 - if (!clk_data) 302 - return -ENOMEM; 299 + clk_data = __socfpga_s10_clk_init(pdev, STRATIX10_NUM_CLKS); 300 + if (IS_ERR(clk_data)) 301 + return PTR_ERR(clk_data); 303 302 304 303 s10_clk_register_pll(s10_pll_clks, ARRAY_SIZE(s10_pll_clks), clk_data); 305 304 ··· 316 317 317 318 static int s10_clkmgr_probe(struct platform_device *pdev) 318 319 { 319 - struct device_node *np = pdev->dev.of_node; 320 - 321 - s10_clkmgr_init(np); 322 - 323 - return 0; 320 + return s10_clkmgr_init(pdev); 324 321 } 325 322 326 323 static const struct of_device_id stratix10_clkmgr_match_table[] = { ··· 329 334 .probe = s10_clkmgr_probe, 330 335 .driver = { 331 336 .name = "stratix10-clkmgr", 337 + .suppress_bind_attrs = true, 332 338 .of_match_table = stratix10_clkmgr_match_table, 333 339 }, 334 340 };
+1 -1
drivers/clk/spear/spear6xx_clock.c
··· 147 147 148 148 clk = clk_register_fixed_factor(NULL, "wdt_clk", "osc_30m_clk", 0, 1, 149 149 1); 150 - clk_register_clkdev(clk, NULL, "wdt"); 150 + clk_register_clkdev(clk, NULL, "fc880000.wdt"); 151 151 152 152 /* clock derived from pll1 clk */ 153 153 clk = clk_register_fixed_factor(NULL, "cpu_clk", "pll1_clk",
+5
drivers/clk/sunxi-ng/Kconfig
··· 16 16 default ARM64 && ARCH_SUNXI 17 17 depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST 18 18 19 + config SUN50I_H6_R_CCU 20 + bool "Support for the Allwinner H6 PRCM CCU" 21 + default ARM64 && ARCH_SUNXI 22 + depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST 23 + 19 24 config SUN4I_A10_CCU 20 25 bool "Support for the Allwinner A10/A20 CCU" 21 26 default MACH_SUN4I
+1
drivers/clk/sunxi-ng/Makefile
··· 23 23 # SoC support 24 24 obj-$(CONFIG_SUN50I_A64_CCU) += ccu-sun50i-a64.o 25 25 obj-$(CONFIG_SUN50I_H6_CCU) += ccu-sun50i-h6.o 26 + obj-$(CONFIG_SUN50I_H6_R_CCU) += ccu-sun50i-h6-r.o 26 27 obj-$(CONFIG_SUN4I_A10_CCU) += ccu-sun4i-a10.o 27 28 obj-$(CONFIG_SUN5I_CCU) += ccu-sun5i.o 28 29 obj-$(CONFIG_SUN6I_A31_CCU) += ccu-sun6i-a31.o
+207
drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.xyz> 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/of_address.h> 8 + #include <linux/platform_device.h> 9 + 10 + #include "ccu_common.h" 11 + #include "ccu_reset.h" 12 + 13 + #include "ccu_div.h" 14 + #include "ccu_gate.h" 15 + #include "ccu_mp.h" 16 + #include "ccu_nm.h" 17 + 18 + #include "ccu-sun50i-h6-r.h" 19 + 20 + /* 21 + * Information about AR100 and AHB/APB clocks in R_CCU are gathered from 22 + * clock definitions in the BSP source code. 23 + */ 24 + 25 + static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k", 26 + "pll-periph0", "iosc" }; 27 + static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = { 28 + { .index = 2, .shift = 0, .width = 5 }, 29 + }; 30 + 31 + static struct ccu_div ar100_clk = { 32 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 33 + 34 + .mux = { 35 + .shift = 24, 36 + .width = 2, 37 + 38 + .var_predivs = ar100_r_apb2_predivs, 39 + .n_var_predivs = ARRAY_SIZE(ar100_r_apb2_predivs), 40 + }, 41 + 42 + .common = { 43 + .reg = 0x000, 44 + .features = CCU_FEATURE_VARIABLE_PREDIV, 45 + .hw.init = CLK_HW_INIT_PARENTS("ar100", 46 + ar100_r_apb2_parents, 47 + &ccu_div_ops, 48 + 0), 49 + }, 50 + }; 51 + 52 + static CLK_FIXED_FACTOR(r_ahb_clk, "r-ahb", "ar100", 1, 1, 0); 53 + 54 + static struct ccu_div r_apb1_clk = { 55 + .div = _SUNXI_CCU_DIV(0, 2), 56 + 57 + .common = { 58 + .reg = 0x00c, 59 + .hw.init = CLK_HW_INIT("r-apb1", 60 + "r-ahb", 61 + &ccu_div_ops, 62 + 0), 63 + }, 64 + }; 65 + 66 + static struct ccu_div r_apb2_clk = { 67 + .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), 68 + 69 + .mux = { 70 + .shift = 24, 71 + .width = 2, 72 + 73 + .var_predivs = ar100_r_apb2_predivs, 74 + .n_var_predivs = ARRAY_SIZE(ar100_r_apb2_predivs), 75 + }, 76 + 77 + .common = { 78 + .reg = 0x010, 79 + .features = CCU_FEATURE_VARIABLE_PREDIV, 80 + .hw.init = CLK_HW_INIT_PARENTS("r-apb2", 81 + ar100_r_apb2_parents, 82 + &ccu_div_ops, 83 + 0), 84 + }, 85 + }; 86 + 87 + /* 88 + * Information about the gate/resets are gathered from the clock header file 89 + * in the BSP source code, although most of them are unused. The existence 90 + * of the hardware block is verified with "3.1 Memory Mapping" chapter in 91 + * "Allwinner H6 V200 User Manual V1.1"; and the parent APB buses are verified 92 + * with "3.3.2.1 System Bus Tree" chapter inthe same document. 93 + */ 94 + static SUNXI_CCU_GATE(r_apb1_timer_clk, "r-apb1-timer", "r-apb1", 95 + 0x11c, BIT(0), 0); 96 + static SUNXI_CCU_GATE(r_apb1_twd_clk, "r-apb1-twd", "r-apb1", 97 + 0x12c, BIT(0), 0); 98 + static SUNXI_CCU_GATE(r_apb1_pwm_clk, "r-apb1-pwm", "r-apb1", 99 + 0x13c, BIT(0), 0); 100 + static SUNXI_CCU_GATE(r_apb2_uart_clk, "r-apb2-uart", "r-apb2", 101 + 0x18c, BIT(0), 0); 102 + static SUNXI_CCU_GATE(r_apb2_i2c_clk, "r-apb2-i2c", "r-apb2", 103 + 0x19c, BIT(0), 0); 104 + static SUNXI_CCU_GATE(r_apb1_ir_clk, "r-apb1-ir", "r-apb1", 105 + 0x1cc, BIT(0), 0); 106 + static SUNXI_CCU_GATE(r_apb1_w1_clk, "r-apb1-w1", "r-apb1", 107 + 0x1cc, BIT(0), 0); 108 + 109 + /* Information of IR(RX) mod clock is gathered from BSP source code */ 110 + static const char * const r_mod0_default_parents[] = { "osc32k", "osc24M" }; 111 + static SUNXI_CCU_MP_WITH_MUX_GATE(ir_clk, "ir", 112 + r_mod0_default_parents, 0x1c0, 113 + 0, 5, /* M */ 114 + 8, 2, /* P */ 115 + 24, 1, /* mux */ 116 + BIT(31), /* gate */ 117 + 0); 118 + 119 + /* 120 + * BSP didn't use the 1-wire function at all now, and the information about 121 + * this mod clock is guessed from the IR mod clock above. The existence of 122 + * this mod clock is proven by BSP clock header, and the dividers are verified 123 + * by contents in the 1-wire related chapter of the User Manual. 124 + */ 125 + 126 + static SUNXI_CCU_MP_WITH_MUX_GATE(w1_clk, "w1", 127 + r_mod0_default_parents, 0x1e0, 128 + 0, 5, /* M */ 129 + 8, 2, /* P */ 130 + 24, 1, /* mux */ 131 + BIT(31), /* gate */ 132 + 0); 133 + 134 + static struct ccu_common *sun50i_h6_r_ccu_clks[] = { 135 + &ar100_clk.common, 136 + &r_apb1_clk.common, 137 + &r_apb2_clk.common, 138 + &r_apb1_timer_clk.common, 139 + &r_apb1_twd_clk.common, 140 + &r_apb1_pwm_clk.common, 141 + &r_apb2_uart_clk.common, 142 + &r_apb2_i2c_clk.common, 143 + &r_apb1_ir_clk.common, 144 + &r_apb1_w1_clk.common, 145 + &ir_clk.common, 146 + &w1_clk.common, 147 + }; 148 + 149 + static struct clk_hw_onecell_data sun50i_h6_r_hw_clks = { 150 + .hws = { 151 + [CLK_AR100] = &ar100_clk.common.hw, 152 + [CLK_R_AHB] = &r_ahb_clk.hw, 153 + [CLK_R_APB1] = &r_apb1_clk.common.hw, 154 + [CLK_R_APB2] = &r_apb2_clk.common.hw, 155 + [CLK_R_APB1_TIMER] = &r_apb1_timer_clk.common.hw, 156 + [CLK_R_APB1_TWD] = &r_apb1_twd_clk.common.hw, 157 + [CLK_R_APB1_PWM] = &r_apb1_pwm_clk.common.hw, 158 + [CLK_R_APB2_UART] = &r_apb2_uart_clk.common.hw, 159 + [CLK_R_APB2_I2C] = &r_apb2_i2c_clk.common.hw, 160 + [CLK_R_APB1_IR] = &r_apb1_ir_clk.common.hw, 161 + [CLK_R_APB1_W1] = &r_apb1_w1_clk.common.hw, 162 + [CLK_IR] = &ir_clk.common.hw, 163 + [CLK_W1] = &w1_clk.common.hw, 164 + }, 165 + .num = CLK_NUMBER, 166 + }; 167 + 168 + static struct ccu_reset_map sun50i_h6_r_ccu_resets[] = { 169 + [RST_R_APB1_TIMER] = { 0x11c, BIT(16) }, 170 + [RST_R_APB1_TWD] = { 0x12c, BIT(16) }, 171 + [RST_R_APB1_PWM] = { 0x13c, BIT(16) }, 172 + [RST_R_APB2_UART] = { 0x18c, BIT(16) }, 173 + [RST_R_APB2_I2C] = { 0x19c, BIT(16) }, 174 + [RST_R_APB1_IR] = { 0x1cc, BIT(16) }, 175 + [RST_R_APB1_W1] = { 0x1ec, BIT(16) }, 176 + }; 177 + 178 + static const struct sunxi_ccu_desc sun50i_h6_r_ccu_desc = { 179 + .ccu_clks = sun50i_h6_r_ccu_clks, 180 + .num_ccu_clks = ARRAY_SIZE(sun50i_h6_r_ccu_clks), 181 + 182 + .hw_clks = &sun50i_h6_r_hw_clks, 183 + 184 + .resets = sun50i_h6_r_ccu_resets, 185 + .num_resets = ARRAY_SIZE(sun50i_h6_r_ccu_resets), 186 + }; 187 + 188 + static void __init sunxi_r_ccu_init(struct device_node *node, 189 + const struct sunxi_ccu_desc *desc) 190 + { 191 + void __iomem *reg; 192 + 193 + reg = of_io_request_and_map(node, 0, of_node_full_name(node)); 194 + if (IS_ERR(reg)) { 195 + pr_err("%pOF: Could not map the clock registers\n", node); 196 + return; 197 + } 198 + 199 + sunxi_ccu_probe(node, reg, desc); 200 + } 201 + 202 + static void __init sun50i_h6_r_ccu_setup(struct device_node *node) 203 + { 204 + sunxi_r_ccu_init(node, &sun50i_h6_r_ccu_desc); 205 + } 206 + CLK_OF_DECLARE(sun50i_h6_r_ccu, "allwinner,sun50i-h6-r-ccu", 207 + sun50i_h6_r_ccu_setup);
+19
drivers/clk/sunxi-ng/ccu-sun50i-h6-r.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright 2017 Icenowy Zheng <icenowy@aosc.xyz> 4 + */ 5 + 6 + #ifndef _CCU_SUN50I_H6_R_H 7 + #define _CCU_SUN50I_H6_R_H 8 + 9 + #include <dt-bindings/clock/sun50i-h6-r-ccu.h> 10 + #include <dt-bindings/reset/sun50i-h6-r-ccu.h> 11 + 12 + /* AHB/APB bus clocks are not exported except APB1 for R_PIO */ 13 + #define CLK_R_AHB 1 14 + 15 + #define CLK_R_APB2 3 16 + 17 + #define CLK_NUMBER (CLK_W1 + 1) 18 + 19 + #endif /* _CCU_SUN50I_H6_R_H */
+61 -11
drivers/clk/sunxi-ng/ccu-sun8i-r40.c
··· 12 12 */ 13 13 14 14 #include <linux/clk-provider.h> 15 - #include <linux/of_address.h> 15 + #include <linux/platform_device.h> 16 + #include <linux/regmap.h> 16 17 17 18 #include "ccu_common.h" 18 19 #include "ccu_reset.h" ··· 1251 1250 .bypass_index = 1, /* index of 24 MHz oscillator */ 1252 1251 }; 1253 1252 1254 - static void __init sun8i_r40_ccu_setup(struct device_node *node) 1253 + /* 1254 + * Add a regmap for the GMAC driver (dwmac-sun8i) to access the 1255 + * GMAC configuration register. 1256 + * Only this register is allowed to be written, in order to 1257 + * prevent overriding critical clock configuration. 1258 + */ 1259 + 1260 + #define SUN8I_R40_GMAC_CFG_REG 0x164 1261 + static bool sun8i_r40_ccu_regmap_accessible_reg(struct device *dev, 1262 + unsigned int reg) 1255 1263 { 1264 + if (reg == SUN8I_R40_GMAC_CFG_REG) 1265 + return true; 1266 + return false; 1267 + } 1268 + 1269 + static struct regmap_config sun8i_r40_ccu_regmap_config = { 1270 + .reg_bits = 32, 1271 + .val_bits = 32, 1272 + .reg_stride = 4, 1273 + .max_register = 0x320, /* PLL_LOCK_CTRL_REG */ 1274 + 1275 + /* other devices have no business accessing other registers */ 1276 + .readable_reg = sun8i_r40_ccu_regmap_accessible_reg, 1277 + .writeable_reg = sun8i_r40_ccu_regmap_accessible_reg, 1278 + }; 1279 + 1280 + static int sun8i_r40_ccu_probe(struct platform_device *pdev) 1281 + { 1282 + struct resource *res; 1283 + struct regmap *regmap; 1256 1284 void __iomem *reg; 1257 1285 u32 val; 1286 + int ret; 1258 1287 1259 - reg = of_io_request_and_map(node, 0, of_node_full_name(node)); 1260 - if (IS_ERR(reg)) { 1261 - pr_err("%s: Could not map the clock registers\n", 1262 - of_node_full_name(node)); 1263 - return; 1264 - } 1288 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1289 + reg = devm_ioremap_resource(&pdev->dev, res); 1290 + if (IS_ERR(reg)) 1291 + return PTR_ERR(reg); 1265 1292 1266 1293 /* Force the PLL-Audio-1x divider to 4 */ 1267 1294 val = readl(reg + SUN8I_R40_PLL_AUDIO_REG); ··· 1306 1277 val &= ~GENMASK(25, 20); 1307 1278 writel(val, reg + SUN8I_R40_USB_CLK_REG); 1308 1279 1309 - sunxi_ccu_probe(node, reg, &sun8i_r40_ccu_desc); 1280 + regmap = devm_regmap_init_mmio(&pdev->dev, reg, 1281 + &sun8i_r40_ccu_regmap_config); 1282 + if (IS_ERR(regmap)) 1283 + return PTR_ERR(regmap); 1284 + 1285 + ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_r40_ccu_desc); 1286 + if (ret) 1287 + return ret; 1310 1288 1311 1289 /* Gate then ungate PLL CPU after any rate changes */ 1312 1290 ccu_pll_notifier_register(&sun8i_r40_pll_cpu_nb); ··· 1321 1285 /* Reparent CPU during PLL CPU rate changes */ 1322 1286 ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk, 1323 1287 &sun8i_r40_cpu_nb); 1288 + 1289 + return 0; 1324 1290 } 1325 - CLK_OF_DECLARE(sun8i_r40_ccu, "allwinner,sun8i-r40-ccu", 1326 - sun8i_r40_ccu_setup); 1291 + 1292 + static const struct of_device_id sun8i_r40_ccu_ids[] = { 1293 + { .compatible = "allwinner,sun8i-r40-ccu" }, 1294 + { } 1295 + }; 1296 + 1297 + static struct platform_driver sun8i_r40_ccu_driver = { 1298 + .probe = sun8i_r40_ccu_probe, 1299 + .driver = { 1300 + .name = "sun8i-r40-ccu", 1301 + .of_match_table = sun8i_r40_ccu_ids, 1302 + }, 1303 + }; 1304 + builtin_platform_driver(sun8i_r40_ccu_driver);
+11 -31
drivers/clk/tegra/clk-dfll.c
··· 1196 1196 .release = single_release, 1197 1197 }; 1198 1198 1199 - static int dfll_debug_init(struct tegra_dfll *td) 1199 + static void dfll_debug_init(struct tegra_dfll *td) 1200 1200 { 1201 - int ret; 1201 + struct dentry *root; 1202 1202 1203 1203 if (!td || (td->mode == DFLL_UNINITIALIZED)) 1204 - return 0; 1204 + return; 1205 1205 1206 - td->debugfs_dir = debugfs_create_dir("tegra_dfll_fcpu", NULL); 1207 - if (!td->debugfs_dir) 1208 - return -ENOMEM; 1206 + root = debugfs_create_dir("tegra_dfll_fcpu", NULL); 1207 + td->debugfs_dir = root; 1209 1208 1210 - ret = -ENOMEM; 1211 - 1212 - if (!debugfs_create_file("enable", S_IRUGO | S_IWUSR, 1213 - td->debugfs_dir, td, &enable_fops)) 1214 - goto err_out; 1215 - 1216 - if (!debugfs_create_file("lock", S_IRUGO, 1217 - td->debugfs_dir, td, &lock_fops)) 1218 - goto err_out; 1219 - 1220 - if (!debugfs_create_file("rate", S_IRUGO, 1221 - td->debugfs_dir, td, &rate_fops)) 1222 - goto err_out; 1223 - 1224 - if (!debugfs_create_file("registers", S_IRUGO, 1225 - td->debugfs_dir, td, &attr_registers_fops)) 1226 - goto err_out; 1227 - 1228 - return 0; 1229 - 1230 - err_out: 1231 - debugfs_remove_recursive(td->debugfs_dir); 1232 - return ret; 1209 + debugfs_create_file("enable", S_IRUGO | S_IWUSR, root, td, &enable_fops); 1210 + debugfs_create_file("lock", S_IRUGO, root, td, &lock_fops); 1211 + debugfs_create_file("rate", S_IRUGO, root, td, &rate_fops); 1212 + debugfs_create_file("registers", S_IRUGO, root, td, &attr_registers_fops); 1233 1213 } 1234 1214 1215 + #else 1216 + static void inline dfll_debug_init(struct tegra_dfll *td) { } 1235 1217 #endif /* CONFIG_DEBUG_FS */ 1236 1218 1237 1219 /* ··· 1697 1715 return ret; 1698 1716 } 1699 1717 1700 - #ifdef CONFIG_DEBUG_FS 1701 1718 dfll_debug_init(td); 1702 - #endif 1703 1719 1704 1720 return 0; 1705 1721 }
+1 -1
drivers/clk/tegra/clk-tegra114.c
··· 1367 1367 tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks, 1368 1368 &pll_x_params); 1369 1369 1370 - tegra_add_of_provider(np); 1370 + tegra_add_of_provider(np, of_clk_src_onecell_get); 1371 1371 tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1372 1372 1373 1373 tegra_clk_apply_init_table = tegra114_clock_apply_init_table;
+1 -1
drivers/clk/tegra/clk-tegra124.c
··· 1479 1479 &pll_x_params); 1480 1480 tegra_init_special_resets(1, tegra124_reset_assert, 1481 1481 tegra124_reset_deassert); 1482 - tegra_add_of_provider(np); 1482 + tegra_add_of_provider(np, of_clk_src_onecell_get); 1483 1483 1484 1484 clks[TEGRA124_CLK_EMC] = tegra_clk_register_emc(clk_base, np, 1485 1485 &emc_lock);
+47 -5
drivers/clk/tegra/clk-tegra20.c
··· 26 26 #include "clk.h" 27 27 #include "clk-id.h" 28 28 29 + #define MISC_CLK_ENB 0x48 30 + 29 31 #define OSC_CTRL 0x50 30 32 #define OSC_CTRL_OSC_FREQ_MASK (3<<30) 31 33 #define OSC_CTRL_OSC_FREQ_13MHZ (0<<30) ··· 833 831 periph_clk_enb_refcnt); 834 832 clks[TEGRA20_CLK_PEX] = clk; 835 833 834 + /* dev1 OSC divider */ 835 + clk_register_divider(NULL, "dev1_osc_div", "clk_m", 836 + 0, clk_base + MISC_CLK_ENB, 22, 2, 837 + CLK_DIVIDER_POWER_OF_TWO | CLK_DIVIDER_READ_ONLY, 838 + NULL); 839 + 840 + /* dev2 OSC divider */ 841 + clk_register_divider(NULL, "dev2_osc_div", "clk_m", 842 + 0, clk_base + MISC_CLK_ENB, 20, 2, 843 + CLK_DIVIDER_POWER_OF_TWO | CLK_DIVIDER_READ_ONLY, 844 + NULL); 845 + 836 846 /* cdev1 */ 837 - clk = clk_register_fixed_rate(NULL, "cdev1_fixed", NULL, 0, 26000000); 838 - clk = tegra_clk_register_periph_gate("cdev1", "cdev1_fixed", 0, 847 + clk = tegra_clk_register_periph_gate("cdev1", "cdev1_mux", 0, 839 848 clk_base, 0, 94, periph_clk_enb_refcnt); 840 849 clks[TEGRA20_CLK_CDEV1] = clk; 841 850 842 851 /* cdev2 */ 843 - clk = clk_register_fixed_rate(NULL, "cdev2_fixed", NULL, 0, 26000000); 844 - clk = tegra_clk_register_periph_gate("cdev2", "cdev2_fixed", 0, 852 + clk = tegra_clk_register_periph_gate("cdev2", "cdev2_mux", 0, 845 853 clk_base, 0, 93, periph_clk_enb_refcnt); 846 854 clks[TEGRA20_CLK_CDEV2] = clk; 847 855 ··· 1089 1077 { }, 1090 1078 }; 1091 1079 1080 + static struct clk *tegra20_clk_src_onecell_get(struct of_phandle_args *clkspec, 1081 + void *data) 1082 + { 1083 + struct clk_hw *parent_hw; 1084 + struct clk_hw *hw; 1085 + struct clk *clk; 1086 + 1087 + clk = of_clk_src_onecell_get(clkspec, data); 1088 + if (IS_ERR(clk)) 1089 + return clk; 1090 + 1091 + /* 1092 + * Tegra20 CDEV1 and CDEV2 clocks are a bit special case, their parent 1093 + * clock is created by the pinctrl driver. It is possible for clk user 1094 + * to request these clocks before pinctrl driver got probed and hence 1095 + * user will get an orphaned clock. That might be undesirable because 1096 + * user may expect parent clock to be enabled by the child. 1097 + */ 1098 + if (clkspec->args[0] == TEGRA20_CLK_CDEV1 || 1099 + clkspec->args[0] == TEGRA20_CLK_CDEV2) { 1100 + hw = __clk_get_hw(clk); 1101 + 1102 + parent_hw = clk_hw_get_parent(hw); 1103 + if (!parent_hw) 1104 + return ERR_PTR(-EPROBE_DEFER); 1105 + } 1106 + 1107 + return clk; 1108 + } 1109 + 1092 1110 static void __init tegra20_clock_init(struct device_node *np) 1093 1111 { 1094 1112 struct device_node *node; ··· 1157 1115 1158 1116 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA20_CLK_CLK_MAX); 1159 1117 1160 - tegra_add_of_provider(np); 1118 + tegra_add_of_provider(np, tegra20_clk_src_onecell_get); 1161 1119 tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1162 1120 1163 1121 tegra_clk_apply_init_table = tegra20_clock_apply_init_table;
+1 -1
drivers/clk/tegra/clk-tegra210.c
··· 3567 3567 tegra_init_special_resets(2, tegra210_reset_assert, 3568 3568 tegra210_reset_deassert); 3569 3569 3570 - tegra_add_of_provider(np); 3570 + tegra_add_of_provider(np, of_clk_src_onecell_get); 3571 3571 tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 3572 3572 3573 3573 tegra210_mbist_clk_init();
+1 -1
drivers/clk/tegra/clk-tegra30.c
··· 1349 1349 1350 1350 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX); 1351 1351 1352 - tegra_add_of_provider(np); 1352 + tegra_add_of_provider(np, of_clk_src_onecell_get); 1353 1353 tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1354 1354 1355 1355 tegra_clk_apply_init_table = tegra30_clock_apply_init_table;
+3 -2
drivers/clk/tegra/clk.c
··· 298 298 .of_reset_n_cells = 1, 299 299 }; 300 300 301 - void __init tegra_add_of_provider(struct device_node *np) 301 + void __init tegra_add_of_provider(struct device_node *np, 302 + void *clk_src_onecell_get) 302 303 { 303 304 int i; 304 305 ··· 315 314 316 315 clk_data.clks = clks; 317 316 clk_data.clk_num = clk_num; 318 - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 317 + of_clk_add_provider(np, clk_src_onecell_get, &clk_data); 319 318 320 319 rst_ctlr.of_node = np; 321 320 rst_ctlr.nr_resets = periph_banks * 32 + num_special_reset;
+1 -1
drivers/clk/tegra/clk.h
··· 763 763 764 764 struct clk **tegra_lookup_dt_id(int clk_id, struct tegra_clk *tegra_clk); 765 765 766 - void tegra_add_of_provider(struct device_node *np); 766 + void tegra_add_of_provider(struct device_node *np, void *clk_src_onecell_get); 767 767 void tegra_register_devclks(struct tegra_devclk *dev_clks, int num); 768 768 769 769 void tegra_audio_clk_init(void __iomem *clk_base,
+5
drivers/clk/uniphier/clk-uniphier-sys.c
··· 51 51 #define UNIPHIER_LD11_SYS_CLK_STDMAC(idx) \ 52 52 UNIPHIER_CLK_GATE("stdmac", (idx), NULL, 0x210c, 8) 53 53 54 + #define UNIPHIER_LD11_SYS_CLK_HSC(idx) \ 55 + UNIPHIER_CLK_GATE("hsc", (idx), NULL, 0x210c, 9) 56 + 54 57 #define UNIPHIER_PRO4_SYS_CLK_GIO(idx) \ 55 58 UNIPHIER_CLK_GATE("gio", (idx), NULL, 0x2104, 6) 56 59 ··· 185 182 /* Index 5 reserved for eMMC PHY */ 186 183 UNIPHIER_LD11_SYS_CLK_ETHER(6), 187 184 UNIPHIER_LD11_SYS_CLK_STDMAC(8), /* HSC, MIO */ 185 + UNIPHIER_LD11_SYS_CLK_HSC(9), 188 186 UNIPHIER_CLK_FACTOR("usb2", -1, "ref", 24, 25), 189 187 UNIPHIER_LD11_SYS_CLK_AIO(40), 190 188 UNIPHIER_LD11_SYS_CLK_EVEA(41), ··· 219 215 UNIPHIER_LD20_SYS_CLK_SD, 220 216 UNIPHIER_LD11_SYS_CLK_ETHER(6), 221 217 UNIPHIER_LD11_SYS_CLK_STDMAC(8), /* HSC */ 218 + UNIPHIER_LD11_SYS_CLK_HSC(9), 222 219 /* GIO is always clock-enabled: no function for 0x210c bit5 */ 223 220 /* 224 221 * clock for USB Link is enabled by the logic "OR" of bit 14 and bit 15.
+2 -1
drivers/clocksource/timer-sp804.c
··· 27 27 #include <linux/io.h> 28 28 #include <linux/of.h> 29 29 #include <linux/of_address.h> 30 + #include <linux/of_clk.h> 30 31 #include <linux/of_irq.h> 31 32 #include <linux/sched_clock.h> 32 33 ··· 246 245 clk1 = NULL; 247 246 248 247 /* Get the 2nd clock if the timer has 3 timer clocks */ 249 - if (of_count_phandle_with_args(np, "clocks", "#clock-cells") == 3) { 248 + if (of_clk_get_parent_count(np) == 3) { 250 249 clk2 = of_clk_get(np, 1); 251 250 if (IS_ERR(clk2)) { 252 251 pr_err("sp804: %s clock not found: %d\n", np->name,
+2 -2
drivers/pinctrl/sunxi/pinctrl-sunxi.c
··· 12 12 13 13 #include <linux/io.h> 14 14 #include <linux/clk.h> 15 - #include <linux/clk-provider.h> 16 15 #include <linux/gpio/driver.h> 17 16 #include <linux/irqdomain.h> 18 17 #include <linux/irqchip/chained_irq.h> 19 18 #include <linux/export.h> 20 19 #include <linux/of.h> 20 + #include <linux/of_clk.h> 21 21 #include <linux/of_address.h> 22 22 #include <linux/of_device.h> 23 23 #include <linux/of_irq.h> ··· 1361 1361 goto gpiochip_error; 1362 1362 } 1363 1363 1364 - ret = of_count_phandle_with_args(node, "clocks", "#clock-cells"); 1364 + ret = of_clk_get_parent_count(node); 1365 1365 clk = devm_clk_get(&pdev->dev, ret == 1 ? NULL : "apb"); 1366 1366 if (IS_ERR(clk)) { 1367 1367 ret = PTR_ERR(clk);
+2 -2
drivers/soc/rockchip/pm_domains.c
··· 14 14 #include <linux/pm_clock.h> 15 15 #include <linux/pm_domain.h> 16 16 #include <linux/of_address.h> 17 + #include <linux/of_clk.h> 17 18 #include <linux/of_platform.h> 18 19 #include <linux/clk.h> 19 20 #include <linux/regmap.h> ··· 401 400 pd->info = pd_info; 402 401 pd->pmu = pmu; 403 402 404 - pd->num_clks = of_count_phandle_with_args(node, "clocks", 405 - "#clock-cells"); 403 + pd->num_clks = of_clk_get_parent_count(node); 406 404 if (pd->num_clks > 0) { 407 405 pd->clks = devm_kcalloc(pmu->dev, pd->num_clks, 408 406 sizeof(*pd->clks), GFP_KERNEL);
+2 -1
drivers/soc/tegra/pmc.c
··· 31 31 #include <linux/iopoll.h> 32 32 #include <linux/of.h> 33 33 #include <linux/of_address.h> 34 + #include <linux/of_clk.h> 34 35 #include <linux/of_platform.h> 35 36 #include <linux/platform_device.h> 36 37 #include <linux/pm_domain.h> ··· 732 731 unsigned int i, count; 733 732 int err; 734 733 735 - count = of_count_phandle_with_args(np, "clocks", "#clock-cells"); 734 + count = of_clk_get_parent_count(np); 736 735 if (count == 0) 737 736 return -ENODEV; 738 737
+129
include/dt-bindings/clock/actions,s900-cmu.h
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // Device Tree binding constants for Actions Semi S900 Clock Management Unit 4 + // 5 + // Copyright (c) 2014 Actions Semi Inc. 6 + // Copyright (c) 2018 Linaro Ltd. 7 + 8 + #ifndef __DT_BINDINGS_CLOCK_S900_CMU_H 9 + #define __DT_BINDINGS_CLOCK_S900_CMU_H 10 + 11 + #define CLK_NONE 0 12 + 13 + /* fixed rate clocks */ 14 + #define CLK_LOSC 1 15 + #define CLK_HOSC 2 16 + 17 + /* pll clocks */ 18 + #define CLK_CORE_PLL 3 19 + #define CLK_DEV_PLL 4 20 + #define CLK_DDR_PLL 5 21 + #define CLK_NAND_PLL 6 22 + #define CLK_DISPLAY_PLL 7 23 + #define CLK_DSI_PLL 8 24 + #define CLK_ASSIST_PLL 9 25 + #define CLK_AUDIO_PLL 10 26 + 27 + /* system clock */ 28 + #define CLK_CPU 15 29 + #define CLK_DEV 16 30 + #define CLK_NOC 17 31 + #define CLK_NOC_MUX 18 32 + #define CLK_NOC_DIV 19 33 + #define CLK_AHB 20 34 + #define CLK_APB 21 35 + #define CLK_DMAC 22 36 + 37 + /* peripheral device clock */ 38 + #define CLK_GPIO 23 39 + 40 + #define CLK_BISP 24 41 + #define CLK_CSI0 25 42 + #define CLK_CSI1 26 43 + 44 + #define CLK_DE0 27 45 + #define CLK_DE1 28 46 + #define CLK_DE2 29 47 + #define CLK_DE3 30 48 + #define CLK_DSI 32 49 + 50 + #define CLK_GPU 33 51 + #define CLK_GPU_CORE 34 52 + #define CLK_GPU_MEM 35 53 + #define CLK_GPU_SYS 36 54 + 55 + #define CLK_HDE 37 56 + #define CLK_I2C0 38 57 + #define CLK_I2C1 39 58 + #define CLK_I2C2 40 59 + #define CLK_I2C3 41 60 + #define CLK_I2C4 42 61 + #define CLK_I2C5 43 62 + #define CLK_I2SRX 44 63 + #define CLK_I2STX 45 64 + #define CLK_IMX 46 65 + #define CLK_LCD 47 66 + #define CLK_NAND0 48 67 + #define CLK_NAND1 49 68 + #define CLK_PWM0 50 69 + #define CLK_PWM1 51 70 + #define CLK_PWM2 52 71 + #define CLK_PWM3 53 72 + #define CLK_PWM4 54 73 + #define CLK_PWM5 55 74 + #define CLK_SD0 56 75 + #define CLK_SD1 57 76 + #define CLK_SD2 58 77 + #define CLK_SD3 59 78 + #define CLK_SENSOR 60 79 + #define CLK_SPEED_SENSOR 61 80 + #define CLK_SPI0 62 81 + #define CLK_SPI1 63 82 + #define CLK_SPI2 64 83 + #define CLK_SPI3 65 84 + #define CLK_THERMAL_SENSOR 66 85 + #define CLK_UART0 67 86 + #define CLK_UART1 68 87 + #define CLK_UART2 69 88 + #define CLK_UART3 70 89 + #define CLK_UART4 71 90 + #define CLK_UART5 72 91 + #define CLK_UART6 73 92 + #define CLK_VCE 74 93 + #define CLK_VDE 75 94 + 95 + #define CLK_USB3_480MPLL0 76 96 + #define CLK_USB3_480MPHY0 77 97 + #define CLK_USB3_5GPHY 78 98 + #define CLK_USB3_CCE 79 99 + #define CLK_USB3_MAC 80 100 + 101 + #define CLK_TIMER 83 102 + 103 + #define CLK_HDMI_AUDIO 84 104 + 105 + #define CLK_24M 85 106 + 107 + #define CLK_EDP 86 108 + 109 + #define CLK_24M_EDP 87 110 + #define CLK_EDP_PLL 88 111 + #define CLK_EDP_LINK 89 112 + 113 + #define CLK_USB2H0_PLLEN 90 114 + #define CLK_USB2H0_PHY 91 115 + #define CLK_USB2H0_CCE 92 116 + #define CLK_USB2H1_PLLEN 93 117 + #define CLK_USB2H1_PHY 94 118 + #define CLK_USB2H1_CCE 95 119 + 120 + #define CLK_DDR0 96 121 + #define CLK_DDR1 97 122 + #define CLK_DMM 98 123 + 124 + #define CLK_ETH_MAC 99 125 + #define CLK_RMII_REF 100 126 + 127 + #define CLK_NR_CLKS (CLK_RMII_REF + 1) 128 + 129 + #endif /* __DT_BINDINGS_CLOCK_S900_CMU_H */
+3 -1
include/dt-bindings/clock/aspeed-clock.h
··· 38 38 #define ASPEED_CLK_MAC 32 39 39 #define ASPEED_CLK_BCLK 33 40 40 #define ASPEED_CLK_MPLL 34 41 + #define ASPEED_CLK_24M 35 41 42 42 43 #define ASPEED_RESET_XDMA 0 43 44 #define ASPEED_RESET_MCTP 1 ··· 46 45 #define ASPEED_RESET_JTAG_MASTER 3 47 46 #define ASPEED_RESET_MIC 4 48 47 #define ASPEED_RESET_PWM 5 49 - #define ASPEED_RESET_PCIVGA 6 48 + #define ASPEED_RESET_PECI 6 50 49 #define ASPEED_RESET_I2C 7 51 50 #define ASPEED_RESET_AHB 8 51 + #define ASPEED_RESET_CRT1 9 52 52 53 53 #endif
+26
include/dt-bindings/clock/axg-aoclkc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 2 + /* 3 + * Copyright (c) 2016 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + */ 9 + 10 + #ifndef DT_BINDINGS_CLOCK_AMLOGIC_MESON_AXG_AOCLK 11 + #define DT_BINDINGS_CLOCK_AMLOGIC_MESON_AXG_AOCLK 12 + 13 + #define CLKID_AO_REMOTE 0 14 + #define CLKID_AO_I2C_MASTER 1 15 + #define CLKID_AO_I2C_SLAVE 2 16 + #define CLKID_AO_UART1 3 17 + #define CLKID_AO_UART2 4 18 + #define CLKID_AO_IR_BLASTER 5 19 + #define CLKID_AO_SAR_ADC 6 20 + #define CLKID_AO_CLK81 7 21 + #define CLKID_AO_SAR_ADC_SEL 8 22 + #define CLKID_AO_SAR_ADC_DIV 9 23 + #define CLKID_AO_SAR_ADC_CLK 10 24 + #define CLKID_AO_ALT_XTAL 11 25 + 26 + #endif
+17 -7
include/dt-bindings/clock/bcm-sr.h
··· 35 35 36 36 /* GENPLL 0 clock channel ID SCR HSLS FS PCIE */ 37 37 #define BCM_SR_GENPLL0 0 38 - #define BCM_SR_GENPLL0_SATA_CLK 1 38 + #define BCM_SR_GENPLL0_125M_CLK 1 39 39 #define BCM_SR_GENPLL0_SCR_CLK 2 40 40 #define BCM_SR_GENPLL0_250M_CLK 3 41 41 #define BCM_SR_GENPLL0_PCIE_AXI_CLK 4 ··· 50 50 /* GENPLL 2 clock channel ID NITRO MHB*/ 51 51 #define BCM_SR_GENPLL2 0 52 52 #define BCM_SR_GENPLL2_NIC_CLK 1 53 - #define BCM_SR_GENPLL2_250_NITRO_CLK 2 53 + #define BCM_SR_GENPLL2_TS_500_CLK 2 54 54 #define BCM_SR_GENPLL2_125_NITRO_CLK 3 55 55 #define BCM_SR_GENPLL2_CHIMP_CLK 4 56 + #define BCM_SR_GENPLL2_NIC_FLASH_CLK 5 57 + #define BCM_SR_GENPLL2_FS4_CLK 6 56 58 57 59 /* GENPLL 3 HSLS clock channel ID */ 58 60 #define BCM_SR_GENPLL3 0 ··· 64 62 /* GENPLL 4 SCR clock channel ID */ 65 63 #define BCM_SR_GENPLL4 0 66 64 #define BCM_SR_GENPLL4_CCN_CLK 1 65 + #define BCM_SR_GENPLL4_TPIU_PLL_CLK 2 66 + #define BCM_SR_GENPLL4_NOC_CLK 3 67 + #define BCM_SR_GENPLL4_CHCLK_FS4_CLK 4 68 + #define BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK 5 67 69 68 70 /* GENPLL 5 FS4 clock channel ID */ 69 71 #define BCM_SR_GENPLL5 0 70 - #define BCM_SR_GENPLL5_FS_CLK 1 71 - #define BCM_SR_GENPLL5_SPU_CLK 2 72 + #define BCM_SR_GENPLL5_FS4_HF_CLK 1 73 + #define BCM_SR_GENPLL5_CRYPTO_AE_CLK 2 74 + #define BCM_SR_GENPLL5_RAID_AE_CLK 3 72 75 73 76 /* GENPLL 6 NITRO clock channel ID */ 74 77 #define BCM_SR_GENPLL6 0 ··· 81 74 82 75 /* LCPLL0 clock channel ID */ 83 76 #define BCM_SR_LCPLL0 0 84 - #define BCM_SR_LCPLL0_SATA_REF_CLK 1 85 - #define BCM_SR_LCPLL0_USB_REF_CLK 2 86 - #define BCM_SR_LCPLL0_SATA_REFPN_CLK 3 77 + #define BCM_SR_LCPLL0_SATA_REFP_CLK 1 78 + #define BCM_SR_LCPLL0_SATA_REFN_CLK 2 79 + #define BCM_SR_LCPLL0_SATA_350_CLK 3 80 + #define BCM_SR_LCPLL0_SATA_500_CLK 4 87 81 88 82 /* LCPLL1 clock channel ID */ 89 83 #define BCM_SR_LCPLL1 0 90 84 #define BCM_SR_LCPLL1_WAN_CLK 1 85 + #define BCM_SR_LCPLL1_USB_REF_CLK 2 86 + #define BCM_SR_LCPLL1_CRMU_TS_CLK 3 91 87 92 88 /* LCPLL PCIE clock channel ID */ 93 89 #define BCM_SR_LCPLL_PCIE 0
+2
include/dt-bindings/clock/gxbb-clkc.h
··· 125 125 #define CLKID_VAPB_1 138 126 126 #define CLKID_VAPB_SEL 139 127 127 #define CLKID_VAPB 140 128 + #define CLKID_VDEC_1 153 129 + #define CLKID_VDEC_HEVC 156 128 130 129 131 #endif /* __GXBB_CLKC_H */
+8
include/dt-bindings/clock/histb-clock.h
··· 62 62 #define HISTB_USB2_PHY1_REF_CLK 40 63 63 #define HISTB_USB2_PHY2_REF_CLK 41 64 64 #define HISTB_COMBPHY0_CLK 42 65 + #define HISTB_USB3_BUS_CLK 43 66 + #define HISTB_USB3_UTMI_CLK 44 67 + #define HISTB_USB3_PIPE_CLK 45 68 + #define HISTB_USB3_SUSPEND_CLK 46 69 + #define HISTB_USB3_BUS_CLK1 47 70 + #define HISTB_USB3_UTMI_CLK1 48 71 + #define HISTB_USB3_PIPE_CLK1 49 72 + #define HISTB_USB3_SUSPEND_CLK1 50 65 73 66 74 /* clocks provided by mcu CRG */ 67 75 #define HISTB_MCE_CLK 1
+3 -1
include/dt-bindings/clock/imx6qdl-clock.h
··· 271 271 #define IMX6QDL_CLK_PRE_AXI 258 272 272 #define IMX6QDL_CLK_MLB_SEL 259 273 273 #define IMX6QDL_CLK_MLB_PODF 260 274 - #define IMX6QDL_CLK_END 261 274 + #define IMX6QDL_CLK_EPIT1 261 275 + #define IMX6QDL_CLK_EPIT2 262 276 + #define IMX6QDL_CLK_END 263 275 277 276 278 #endif /* __DT_BINDINGS_CLOCK_IMX6QDL_H */
+5 -1
include/dt-bindings/clock/imx6sx-clock.h
··· 275 275 #define IMX6SX_PLL6_BYPASS 262 276 276 #define IMX6SX_PLL7_BYPASS 263 277 277 #define IMX6SX_CLK_SPDIF_GCLK 264 278 - #define IMX6SX_CLK_CLK_END 265 278 + #define IMX6SX_CLK_LVDS2_SEL 265 279 + #define IMX6SX_CLK_LVDS2_OUT 266 280 + #define IMX6SX_CLK_LVDS2_IN 267 281 + #define IMX6SX_CLK_ANACLK2 268 282 + #define IMX6SX_CLK_CLK_END 269 279 283 280 284 #endif /* __DT_BINDINGS_CLOCK_IMX6SX_H */
+20 -13
include/dt-bindings/clock/imx6ul-clock.h
··· 235 235 #define IMX6UL_CLK_CSI_PODF 222 236 236 #define IMX6UL_CLK_PLL3_120M 223 237 237 #define IMX6UL_CLK_KPP 224 238 + #define IMX6UL_CLK_CKO1_SEL 225 239 + #define IMX6UL_CLK_CKO1_PODF 226 240 + #define IMX6UL_CLK_CKO1 227 241 + #define IMX6UL_CLK_CKO2_SEL 228 242 + #define IMX6UL_CLK_CKO2_PODF 229 243 + #define IMX6UL_CLK_CKO2 230 244 + #define IMX6UL_CLK_CKO 231 238 245 239 246 /* For i.MX6ULL */ 240 - #define IMX6ULL_CLK_ESAI_PRED 225 241 - #define IMX6ULL_CLK_ESAI_PODF 226 242 - #define IMX6ULL_CLK_ESAI_EXTAL 227 243 - #define IMX6ULL_CLK_ESAI_MEM 228 244 - #define IMX6ULL_CLK_ESAI_IPG 229 245 - #define IMX6ULL_CLK_DCP_CLK 230 246 - #define IMX6ULL_CLK_EPDC_PRE_SEL 231 247 - #define IMX6ULL_CLK_EPDC_SEL 232 248 - #define IMX6ULL_CLK_EPDC_PODF 233 249 - #define IMX6ULL_CLK_EPDC_ACLK 234 250 - #define IMX6ULL_CLK_EPDC_PIX 235 251 - #define IMX6ULL_CLK_ESAI_SEL 236 252 - #define IMX6UL_CLK_END 237 247 + #define IMX6ULL_CLK_ESAI_PRED 232 248 + #define IMX6ULL_CLK_ESAI_PODF 233 249 + #define IMX6ULL_CLK_ESAI_EXTAL 234 250 + #define IMX6ULL_CLK_ESAI_MEM 235 251 + #define IMX6ULL_CLK_ESAI_IPG 236 252 + #define IMX6ULL_CLK_DCP_CLK 237 253 + #define IMX6ULL_CLK_EPDC_PRE_SEL 238 254 + #define IMX6ULL_CLK_EPDC_SEL 239 255 + #define IMX6ULL_CLK_EPDC_PODF 240 256 + #define IMX6ULL_CLK_EPDC_ACLK 241 257 + #define IMX6ULL_CLK_EPDC_PIX 242 258 + #define IMX6ULL_CLK_ESAI_SEL 243 259 + #define IMX6UL_CLK_END 244 253 260 254 261 #endif /* __DT_BINDINGS_CLOCK_IMX6UL_H */
+2 -2
include/dt-bindings/clock/imx7d-clock.h
··· 168 168 #define IMX7D_SPDIF_ROOT_SRC 155 169 169 #define IMX7D_SPDIF_ROOT_CG 156 170 170 #define IMX7D_SPDIF_ROOT_DIV 157 171 - #define IMX7D_ENET1_REF_ROOT_CLK 158 171 + #define IMX7D_ENET1_IPG_ROOT_CLK 158 172 172 #define IMX7D_ENET1_REF_ROOT_SRC 159 173 173 #define IMX7D_ENET1_REF_ROOT_CG 160 174 174 #define IMX7D_ENET1_REF_ROOT_DIV 161 ··· 176 176 #define IMX7D_ENET1_TIME_ROOT_SRC 163 177 177 #define IMX7D_ENET1_TIME_ROOT_CG 164 178 178 #define IMX7D_ENET1_TIME_ROOT_DIV 165 179 - #define IMX7D_ENET2_REF_ROOT_CLK 166 179 + #define IMX7D_ENET2_IPG_ROOT_CLK 166 180 180 #define IMX7D_ENET2_REF_ROOT_SRC 167 181 181 #define IMX7D_ENET2_REF_ROOT_CG 168 182 182 #define IMX7D_ENET2_REF_ROOT_DIV 169
+1
include/dt-bindings/clock/meson8b-clkc.h
··· 102 102 #define CLKID_MPLL0 93 103 103 #define CLKID_MPLL1 94 104 104 #define CLKID_MPLL2 95 105 + #define CLKID_NAND_CLK 112 105 106 106 107 #endif /* __MESON8B_CLKC_H */
+12 -8
include/dt-bindings/clock/mt2701-clk.h
··· 171 171 #define CLK_TOP_8BDAC 151 172 172 #define CLK_TOP_WBG_DIG_416M 152 173 173 #define CLK_TOP_DPI 153 174 - #define CLK_TOP_HDMITX_CLKDIG_CTS 154 175 - #define CLK_TOP_DSI0_LNTC_DSI 155 176 - #define CLK_TOP_AUD_EXT1 156 177 - #define CLK_TOP_AUD_EXT2 157 178 - #define CLK_TOP_NFI1X_PAD 158 179 - #define CLK_TOP_AXISEL_D4 159 180 - #define CLK_TOP_NR 160 174 + #define CLK_TOP_DSI0_LNTC_DSI 154 175 + #define CLK_TOP_AUD_EXT1 155 176 + #define CLK_TOP_AUD_EXT2 156 177 + #define CLK_TOP_NFI1X_PAD 157 178 + #define CLK_TOP_AXISEL_D4 158 179 + #define CLK_TOP_NR 159 181 180 182 181 /* APMIXEDSYS */ 183 182 ··· 193 194 #define CLK_APMIXED_HADDS2PLL 11 194 195 #define CLK_APMIXED_AUD2PLL 12 195 196 #define CLK_APMIXED_TVD2PLL 13 196 - #define CLK_APMIXED_NR 14 197 + #define CLK_APMIXED_HDMI_REF 14 198 + #define CLK_APMIXED_NR 15 197 199 198 200 /* DDRPHY */ 199 201 ··· 430 430 #define CLK_ETHSYS_I2S 7 431 431 #define CLK_ETHSYS_CRYPTO 8 432 432 #define CLK_ETHSYS_NR 9 433 + 434 + /* G3DSYS */ 435 + #define CLK_G3DSYS_CORE 1 436 + #define CLK_G3DSYS_NR 2 433 437 434 438 /* BDP */ 435 439
+44
include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Nuvoton NPCM7xx Clock Generator binding 4 + * clock binding number for all clocks supportted by nuvoton,npcm7xx-clk 5 + * 6 + * Copyright (C) 2018 Nuvoton Technologies tali.perry@nuvoton.com 7 + * 8 + */ 9 + 10 + #ifndef __DT_BINDINGS_CLOCK_NPCM7XX_H 11 + #define __DT_BINDINGS_CLOCK_NPCM7XX_H 12 + 13 + 14 + #define NPCM7XX_CLK_CPU 0 15 + #define NPCM7XX_CLK_GFX_PIXEL 1 16 + #define NPCM7XX_CLK_MC 2 17 + #define NPCM7XX_CLK_ADC 3 18 + #define NPCM7XX_CLK_AHB 4 19 + #define NPCM7XX_CLK_TIMER 5 20 + #define NPCM7XX_CLK_UART 6 21 + #define NPCM7XX_CLK_MMC 7 22 + #define NPCM7XX_CLK_SPI3 8 23 + #define NPCM7XX_CLK_PCI 9 24 + #define NPCM7XX_CLK_AXI 10 25 + #define NPCM7XX_CLK_APB4 11 26 + #define NPCM7XX_CLK_APB3 12 27 + #define NPCM7XX_CLK_APB2 13 28 + #define NPCM7XX_CLK_APB1 14 29 + #define NPCM7XX_CLK_APB5 15 30 + #define NPCM7XX_CLK_CLKOUT 16 31 + #define NPCM7XX_CLK_GFX 17 32 + #define NPCM7XX_CLK_SU 18 33 + #define NPCM7XX_CLK_SU48 19 34 + #define NPCM7XX_CLK_SDHC 20 35 + #define NPCM7XX_CLK_SPI0 21 36 + #define NPCM7XX_CLK_SPIX 22 37 + 38 + #define NPCM7XX_CLK_REFCLK 23 39 + #define NPCM7XX_CLK_SYSBYPCK 24 40 + #define NPCM7XX_CLK_MCBYPCK 25 41 + 42 + #define NPCM7XX_NUM_CLOCKS (NPCM7XX_CLK_MCBYPCK+1) 43 + 44 + #endif
+208
include/dt-bindings/clock/qcom,gcc-msm8998.h
··· 1 + /* 2 + * Copyright (c) 2016, The Linux Foundation. All rights reserved. 3 + * 4 + * This software is licensed under the terms of the GNU General Public 5 + * License version 2, as published by the Free Software Foundation, and 6 + * may be copied, distributed, and modified under those terms. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #ifndef _DT_BINDINGS_CLK_MSM_GCC_COBALT_H 15 + #define _DT_BINDINGS_CLK_MSM_GCC_COBALT_H 16 + 17 + #define BLSP1_QUP1_I2C_APPS_CLK_SRC 0 18 + #define BLSP1_QUP1_SPI_APPS_CLK_SRC 1 19 + #define BLSP1_QUP2_I2C_APPS_CLK_SRC 2 20 + #define BLSP1_QUP2_SPI_APPS_CLK_SRC 3 21 + #define BLSP1_QUP3_I2C_APPS_CLK_SRC 4 22 + #define BLSP1_QUP3_SPI_APPS_CLK_SRC 5 23 + #define BLSP1_QUP4_I2C_APPS_CLK_SRC 6 24 + #define BLSP1_QUP4_SPI_APPS_CLK_SRC 7 25 + #define BLSP1_QUP5_I2C_APPS_CLK_SRC 8 26 + #define BLSP1_QUP5_SPI_APPS_CLK_SRC 9 27 + #define BLSP1_QUP6_I2C_APPS_CLK_SRC 10 28 + #define BLSP1_QUP6_SPI_APPS_CLK_SRC 11 29 + #define BLSP1_UART1_APPS_CLK_SRC 12 30 + #define BLSP1_UART2_APPS_CLK_SRC 13 31 + #define BLSP1_UART3_APPS_CLK_SRC 14 32 + #define BLSP2_QUP1_I2C_APPS_CLK_SRC 15 33 + #define BLSP2_QUP1_SPI_APPS_CLK_SRC 16 34 + #define BLSP2_QUP2_I2C_APPS_CLK_SRC 17 35 + #define BLSP2_QUP2_SPI_APPS_CLK_SRC 18 36 + #define BLSP2_QUP3_I2C_APPS_CLK_SRC 19 37 + #define BLSP2_QUP3_SPI_APPS_CLK_SRC 20 38 + #define BLSP2_QUP4_I2C_APPS_CLK_SRC 21 39 + #define BLSP2_QUP4_SPI_APPS_CLK_SRC 22 40 + #define BLSP2_QUP5_I2C_APPS_CLK_SRC 23 41 + #define BLSP2_QUP5_SPI_APPS_CLK_SRC 24 42 + #define BLSP2_QUP6_I2C_APPS_CLK_SRC 25 43 + #define BLSP2_QUP6_SPI_APPS_CLK_SRC 26 44 + #define BLSP2_UART1_APPS_CLK_SRC 27 45 + #define BLSP2_UART2_APPS_CLK_SRC 28 46 + #define BLSP2_UART3_APPS_CLK_SRC 29 47 + #define GCC_AGGRE1_NOC_XO_CLK 30 48 + #define GCC_AGGRE1_UFS_AXI_CLK 31 49 + #define GCC_AGGRE1_USB3_AXI_CLK 32 50 + #define GCC_APSS_QDSS_TSCTR_DIV2_CLK 33 51 + #define GCC_APSS_QDSS_TSCTR_DIV8_CLK 34 52 + #define GCC_BIMC_HMSS_AXI_CLK 35 53 + #define GCC_BIMC_MSS_Q6_AXI_CLK 36 54 + #define GCC_BLSP1_AHB_CLK 37 55 + #define GCC_BLSP1_QUP1_I2C_APPS_CLK 38 56 + #define GCC_BLSP1_QUP1_SPI_APPS_CLK 39 57 + #define GCC_BLSP1_QUP2_I2C_APPS_CLK 40 58 + #define GCC_BLSP1_QUP2_SPI_APPS_CLK 41 59 + #define GCC_BLSP1_QUP3_I2C_APPS_CLK 42 60 + #define GCC_BLSP1_QUP3_SPI_APPS_CLK 43 61 + #define GCC_BLSP1_QUP4_I2C_APPS_CLK 44 62 + #define GCC_BLSP1_QUP4_SPI_APPS_CLK 45 63 + #define GCC_BLSP1_QUP5_I2C_APPS_CLK 46 64 + #define GCC_BLSP1_QUP5_SPI_APPS_CLK 47 65 + #define GCC_BLSP1_QUP6_I2C_APPS_CLK 48 66 + #define GCC_BLSP1_QUP6_SPI_APPS_CLK 49 67 + #define GCC_BLSP1_SLEEP_CLK 50 68 + #define GCC_BLSP1_UART1_APPS_CLK 51 69 + #define GCC_BLSP1_UART2_APPS_CLK 52 70 + #define GCC_BLSP1_UART3_APPS_CLK 53 71 + #define GCC_BLSP2_AHB_CLK 54 72 + #define GCC_BLSP2_QUP1_I2C_APPS_CLK 55 73 + #define GCC_BLSP2_QUP1_SPI_APPS_CLK 56 74 + #define GCC_BLSP2_QUP2_I2C_APPS_CLK 57 75 + #define GCC_BLSP2_QUP2_SPI_APPS_CLK 58 76 + #define GCC_BLSP2_QUP3_I2C_APPS_CLK 59 77 + #define GCC_BLSP2_QUP3_SPI_APPS_CLK 60 78 + #define GCC_BLSP2_QUP4_I2C_APPS_CLK 61 79 + #define GCC_BLSP2_QUP4_SPI_APPS_CLK 62 80 + #define GCC_BLSP2_QUP5_I2C_APPS_CLK 63 81 + #define GCC_BLSP2_QUP5_SPI_APPS_CLK 64 82 + #define GCC_BLSP2_QUP6_I2C_APPS_CLK 65 83 + #define GCC_BLSP2_QUP6_SPI_APPS_CLK 66 84 + #define GCC_BLSP2_SLEEP_CLK 67 85 + #define GCC_BLSP2_UART1_APPS_CLK 68 86 + #define GCC_BLSP2_UART2_APPS_CLK 69 87 + #define GCC_BLSP2_UART3_APPS_CLK 70 88 + #define GCC_CFG_NOC_USB3_AXI_CLK 71 89 + #define GCC_GP1_CLK 72 90 + #define GCC_GP2_CLK 73 91 + #define GCC_GP3_CLK 74 92 + #define GCC_GPU_BIMC_GFX_CLK 75 93 + #define GCC_GPU_BIMC_GFX_SRC_CLK 76 94 + #define GCC_GPU_CFG_AHB_CLK 77 95 + #define GCC_GPU_SNOC_DVM_GFX_CLK 78 96 + #define GCC_HMSS_AHB_CLK 79 97 + #define GCC_HMSS_AT_CLK 80 98 + #define GCC_HMSS_DVM_BUS_CLK 81 99 + #define GCC_HMSS_RBCPR_CLK 82 100 + #define GCC_HMSS_TRIG_CLK 83 101 + #define GCC_LPASS_AT_CLK 84 102 + #define GCC_LPASS_TRIG_CLK 85 103 + #define GCC_MMSS_NOC_CFG_AHB_CLK 86 104 + #define GCC_MMSS_QM_AHB_CLK 87 105 + #define GCC_MMSS_QM_CORE_CLK 88 106 + #define GCC_MMSS_SYS_NOC_AXI_CLK 89 107 + #define GCC_MSS_AT_CLK 90 108 + #define GCC_PCIE_0_AUX_CLK 91 109 + #define GCC_PCIE_0_CFG_AHB_CLK 92 110 + #define GCC_PCIE_0_MSTR_AXI_CLK 93 111 + #define GCC_PCIE_0_PIPE_CLK 94 112 + #define GCC_PCIE_0_SLV_AXI_CLK 95 113 + #define GCC_PCIE_PHY_AUX_CLK 96 114 + #define GCC_PDM2_CLK 97 115 + #define GCC_PDM_AHB_CLK 98 116 + #define GCC_PDM_XO4_CLK 99 117 + #define GCC_PRNG_AHB_CLK 100 118 + #define GCC_SDCC2_AHB_CLK 101 119 + #define GCC_SDCC2_APPS_CLK 102 120 + #define GCC_SDCC4_AHB_CLK 103 121 + #define GCC_SDCC4_APPS_CLK 104 122 + #define GCC_TSIF_AHB_CLK 105 123 + #define GCC_TSIF_INACTIVITY_TIMERS_CLK 106 124 + #define GCC_TSIF_REF_CLK 107 125 + #define GCC_UFS_AHB_CLK 108 126 + #define GCC_UFS_AXI_CLK 109 127 + #define GCC_UFS_ICE_CORE_CLK 110 128 + #define GCC_UFS_PHY_AUX_CLK 111 129 + #define GCC_UFS_RX_SYMBOL_0_CLK 112 130 + #define GCC_UFS_RX_SYMBOL_1_CLK 113 131 + #define GCC_UFS_TX_SYMBOL_0_CLK 114 132 + #define GCC_UFS_UNIPRO_CORE_CLK 115 133 + #define GCC_USB30_MASTER_CLK 116 134 + #define GCC_USB30_MOCK_UTMI_CLK 117 135 + #define GCC_USB30_SLEEP_CLK 118 136 + #define GCC_USB3_PHY_AUX_CLK 119 137 + #define GCC_USB3_PHY_PIPE_CLK 120 138 + #define GCC_USB_PHY_CFG_AHB2PHY_CLK 121 139 + #define GP1_CLK_SRC 122 140 + #define GP2_CLK_SRC 123 141 + #define GP3_CLK_SRC 124 142 + #define GPLL0 125 143 + #define GPLL0_OUT_EVEN 126 144 + #define GPLL0_OUT_MAIN 127 145 + #define GPLL0_OUT_ODD 128 146 + #define GPLL0_OUT_TEST 129 147 + #define GPLL1 130 148 + #define GPLL1_OUT_EVEN 131 149 + #define GPLL1_OUT_MAIN 132 150 + #define GPLL1_OUT_ODD 133 151 + #define GPLL1_OUT_TEST 134 152 + #define GPLL2 135 153 + #define GPLL2_OUT_EVEN 136 154 + #define GPLL2_OUT_MAIN 137 155 + #define GPLL2_OUT_ODD 138 156 + #define GPLL2_OUT_TEST 139 157 + #define GPLL3 140 158 + #define GPLL3_OUT_EVEN 141 159 + #define GPLL3_OUT_MAIN 142 160 + #define GPLL3_OUT_ODD 143 161 + #define GPLL3_OUT_TEST 144 162 + #define GPLL4 145 163 + #define GPLL4_OUT_EVEN 146 164 + #define GPLL4_OUT_MAIN 147 165 + #define GPLL4_OUT_ODD 148 166 + #define GPLL4_OUT_TEST 149 167 + #define GPLL6 150 168 + #define GPLL6_OUT_EVEN 151 169 + #define GPLL6_OUT_MAIN 152 170 + #define GPLL6_OUT_ODD 153 171 + #define GPLL6_OUT_TEST 154 172 + #define HMSS_AHB_CLK_SRC 155 173 + #define HMSS_RBCPR_CLK_SRC 156 174 + #define PCIE_AUX_CLK_SRC 157 175 + #define PDM2_CLK_SRC 158 176 + #define SDCC2_APPS_CLK_SRC 159 177 + #define SDCC4_APPS_CLK_SRC 160 178 + #define TSIF_REF_CLK_SRC 161 179 + #define UFS_AXI_CLK_SRC 162 180 + #define USB30_MASTER_CLK_SRC 163 181 + #define USB30_MOCK_UTMI_CLK_SRC 164 182 + #define USB3_PHY_AUX_CLK_SRC 165 183 + 184 + #define PCIE_0_GDSC 0 185 + #define UFS_GDSC 1 186 + #define USB_30_GDSC 2 187 + 188 + #define GCC_BLSP1_QUP1_BCR 0 189 + #define GCC_BLSP1_QUP2_BCR 1 190 + #define GCC_BLSP1_QUP3_BCR 2 191 + #define GCC_BLSP1_QUP4_BCR 3 192 + #define GCC_BLSP1_QUP5_BCR 4 193 + #define GCC_BLSP1_QUP6_BCR 5 194 + #define GCC_BLSP2_QUP1_BCR 6 195 + #define GCC_BLSP2_QUP2_BCR 7 196 + #define GCC_BLSP2_QUP3_BCR 8 197 + #define GCC_BLSP2_QUP4_BCR 9 198 + #define GCC_BLSP2_QUP5_BCR 10 199 + #define GCC_BLSP2_QUP6_BCR 11 200 + #define GCC_PCIE_0_BCR 12 201 + #define GCC_PDM_BCR 13 202 + #define GCC_SDCC2_BCR 14 203 + #define GCC_SDCC4_BCR 15 204 + #define GCC_TSIF_BCR 16 205 + #define GCC_UFS_BCR 17 206 + #define GCC_USB_30_BCR 18 207 + 208 + #endif
+239
include/dt-bindings/clock/qcom,gcc-sdm845.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2018, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_SDM_GCC_SDM845_H 7 + #define _DT_BINDINGS_CLK_SDM_GCC_SDM845_H 8 + 9 + /* GCC clock registers */ 10 + #define GCC_AGGRE_NOC_PCIE_TBU_CLK 0 11 + #define GCC_AGGRE_UFS_CARD_AXI_CLK 1 12 + #define GCC_AGGRE_UFS_PHY_AXI_CLK 2 13 + #define GCC_AGGRE_USB3_PRIM_AXI_CLK 3 14 + #define GCC_AGGRE_USB3_SEC_AXI_CLK 4 15 + #define GCC_BOOT_ROM_AHB_CLK 5 16 + #define GCC_CAMERA_AHB_CLK 6 17 + #define GCC_CAMERA_AXI_CLK 7 18 + #define GCC_CAMERA_XO_CLK 8 19 + #define GCC_CE1_AHB_CLK 9 20 + #define GCC_CE1_AXI_CLK 10 21 + #define GCC_CE1_CLK 11 22 + #define GCC_CFG_NOC_USB3_PRIM_AXI_CLK 12 23 + #define GCC_CFG_NOC_USB3_SEC_AXI_CLK 13 24 + #define GCC_CPUSS_AHB_CLK 14 25 + #define GCC_CPUSS_AHB_CLK_SRC 15 26 + #define GCC_CPUSS_RBCPR_CLK 16 27 + #define GCC_CPUSS_RBCPR_CLK_SRC 17 28 + #define GCC_DDRSS_GPU_AXI_CLK 18 29 + #define GCC_DISP_AHB_CLK 19 30 + #define GCC_DISP_AXI_CLK 20 31 + #define GCC_DISP_GPLL0_CLK_SRC 21 32 + #define GCC_DISP_GPLL0_DIV_CLK_SRC 22 33 + #define GCC_DISP_XO_CLK 23 34 + #define GCC_GP1_CLK 24 35 + #define GCC_GP1_CLK_SRC 25 36 + #define GCC_GP2_CLK 26 37 + #define GCC_GP2_CLK_SRC 27 38 + #define GCC_GP3_CLK 28 39 + #define GCC_GP3_CLK_SRC 29 40 + #define GCC_GPU_CFG_AHB_CLK 30 41 + #define GCC_GPU_GPLL0_CLK_SRC 31 42 + #define GCC_GPU_GPLL0_DIV_CLK_SRC 32 43 + #define GCC_GPU_MEMNOC_GFX_CLK 33 44 + #define GCC_GPU_SNOC_DVM_GFX_CLK 34 45 + #define GCC_MSS_AXIS2_CLK 35 46 + #define GCC_MSS_CFG_AHB_CLK 36 47 + #define GCC_MSS_GPLL0_DIV_CLK_SRC 37 48 + #define GCC_MSS_MFAB_AXIS_CLK 38 49 + #define GCC_MSS_Q6_MEMNOC_AXI_CLK 39 50 + #define GCC_MSS_SNOC_AXI_CLK 40 51 + #define GCC_PCIE_0_AUX_CLK 41 52 + #define GCC_PCIE_0_AUX_CLK_SRC 42 53 + #define GCC_PCIE_0_CFG_AHB_CLK 43 54 + #define GCC_PCIE_0_CLKREF_CLK 44 55 + #define GCC_PCIE_0_MSTR_AXI_CLK 45 56 + #define GCC_PCIE_0_PIPE_CLK 46 57 + #define GCC_PCIE_0_SLV_AXI_CLK 47 58 + #define GCC_PCIE_0_SLV_Q2A_AXI_CLK 48 59 + #define GCC_PCIE_1_AUX_CLK 49 60 + #define GCC_PCIE_1_AUX_CLK_SRC 50 61 + #define GCC_PCIE_1_CFG_AHB_CLK 51 62 + #define GCC_PCIE_1_CLKREF_CLK 52 63 + #define GCC_PCIE_1_MSTR_AXI_CLK 53 64 + #define GCC_PCIE_1_PIPE_CLK 54 65 + #define GCC_PCIE_1_SLV_AXI_CLK 55 66 + #define GCC_PCIE_1_SLV_Q2A_AXI_CLK 56 67 + #define GCC_PCIE_PHY_AUX_CLK 57 68 + #define GCC_PCIE_PHY_REFGEN_CLK 58 69 + #define GCC_PCIE_PHY_REFGEN_CLK_SRC 59 70 + #define GCC_PDM2_CLK 60 71 + #define GCC_PDM2_CLK_SRC 61 72 + #define GCC_PDM_AHB_CLK 62 73 + #define GCC_PDM_XO4_CLK 63 74 + #define GCC_PRNG_AHB_CLK 64 75 + #define GCC_QMIP_CAMERA_AHB_CLK 65 76 + #define GCC_QMIP_DISP_AHB_CLK 66 77 + #define GCC_QMIP_VIDEO_AHB_CLK 67 78 + #define GCC_QUPV3_WRAP0_S0_CLK 68 79 + #define GCC_QUPV3_WRAP0_S0_CLK_SRC 69 80 + #define GCC_QUPV3_WRAP0_S1_CLK 70 81 + #define GCC_QUPV3_WRAP0_S1_CLK_SRC 71 82 + #define GCC_QUPV3_WRAP0_S2_CLK 72 83 + #define GCC_QUPV3_WRAP0_S2_CLK_SRC 73 84 + #define GCC_QUPV3_WRAP0_S3_CLK 74 85 + #define GCC_QUPV3_WRAP0_S3_CLK_SRC 75 86 + #define GCC_QUPV3_WRAP0_S4_CLK 76 87 + #define GCC_QUPV3_WRAP0_S4_CLK_SRC 77 88 + #define GCC_QUPV3_WRAP0_S5_CLK 78 89 + #define GCC_QUPV3_WRAP0_S5_CLK_SRC 79 90 + #define GCC_QUPV3_WRAP0_S6_CLK 80 91 + #define GCC_QUPV3_WRAP0_S6_CLK_SRC 81 92 + #define GCC_QUPV3_WRAP0_S7_CLK 82 93 + #define GCC_QUPV3_WRAP0_S7_CLK_SRC 83 94 + #define GCC_QUPV3_WRAP1_S0_CLK 84 95 + #define GCC_QUPV3_WRAP1_S0_CLK_SRC 85 96 + #define GCC_QUPV3_WRAP1_S1_CLK 86 97 + #define GCC_QUPV3_WRAP1_S1_CLK_SRC 87 98 + #define GCC_QUPV3_WRAP1_S2_CLK 88 99 + #define GCC_QUPV3_WRAP1_S2_CLK_SRC 89 100 + #define GCC_QUPV3_WRAP1_S3_CLK 90 101 + #define GCC_QUPV3_WRAP1_S3_CLK_SRC 91 102 + #define GCC_QUPV3_WRAP1_S4_CLK 92 103 + #define GCC_QUPV3_WRAP1_S4_CLK_SRC 93 104 + #define GCC_QUPV3_WRAP1_S5_CLK 94 105 + #define GCC_QUPV3_WRAP1_S5_CLK_SRC 95 106 + #define GCC_QUPV3_WRAP1_S6_CLK 96 107 + #define GCC_QUPV3_WRAP1_S6_CLK_SRC 97 108 + #define GCC_QUPV3_WRAP1_S7_CLK 98 109 + #define GCC_QUPV3_WRAP1_S7_CLK_SRC 99 110 + #define GCC_QUPV3_WRAP_0_M_AHB_CLK 100 111 + #define GCC_QUPV3_WRAP_0_S_AHB_CLK 101 112 + #define GCC_QUPV3_WRAP_1_M_AHB_CLK 102 113 + #define GCC_QUPV3_WRAP_1_S_AHB_CLK 103 114 + #define GCC_SDCC2_AHB_CLK 104 115 + #define GCC_SDCC2_APPS_CLK 105 116 + #define GCC_SDCC2_APPS_CLK_SRC 106 117 + #define GCC_SDCC4_AHB_CLK 107 118 + #define GCC_SDCC4_APPS_CLK 108 119 + #define GCC_SDCC4_APPS_CLK_SRC 109 120 + #define GCC_SYS_NOC_CPUSS_AHB_CLK 110 121 + #define GCC_TSIF_AHB_CLK 111 122 + #define GCC_TSIF_INACTIVITY_TIMERS_CLK 112 123 + #define GCC_TSIF_REF_CLK 113 124 + #define GCC_TSIF_REF_CLK_SRC 114 125 + #define GCC_UFS_CARD_AHB_CLK 115 126 + #define GCC_UFS_CARD_AXI_CLK 116 127 + #define GCC_UFS_CARD_AXI_CLK_SRC 117 128 + #define GCC_UFS_CARD_CLKREF_CLK 118 129 + #define GCC_UFS_CARD_ICE_CORE_CLK 119 130 + #define GCC_UFS_CARD_ICE_CORE_CLK_SRC 120 131 + #define GCC_UFS_CARD_PHY_AUX_CLK 121 132 + #define GCC_UFS_CARD_PHY_AUX_CLK_SRC 122 133 + #define GCC_UFS_CARD_RX_SYMBOL_0_CLK 123 134 + #define GCC_UFS_CARD_RX_SYMBOL_1_CLK 124 135 + #define GCC_UFS_CARD_TX_SYMBOL_0_CLK 125 136 + #define GCC_UFS_CARD_UNIPRO_CORE_CLK 126 137 + #define GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC 127 138 + #define GCC_UFS_MEM_CLKREF_CLK 128 139 + #define GCC_UFS_PHY_AHB_CLK 129 140 + #define GCC_UFS_PHY_AXI_CLK 130 141 + #define GCC_UFS_PHY_AXI_CLK_SRC 131 142 + #define GCC_UFS_PHY_ICE_CORE_CLK 132 143 + #define GCC_UFS_PHY_ICE_CORE_CLK_SRC 133 144 + #define GCC_UFS_PHY_PHY_AUX_CLK 134 145 + #define GCC_UFS_PHY_PHY_AUX_CLK_SRC 135 146 + #define GCC_UFS_PHY_RX_SYMBOL_0_CLK 136 147 + #define GCC_UFS_PHY_RX_SYMBOL_1_CLK 137 148 + #define GCC_UFS_PHY_TX_SYMBOL_0_CLK 138 149 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK 139 150 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC 140 151 + #define GCC_USB30_PRIM_MASTER_CLK 141 152 + #define GCC_USB30_PRIM_MASTER_CLK_SRC 142 153 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK 143 154 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC 144 155 + #define GCC_USB30_PRIM_SLEEP_CLK 145 156 + #define GCC_USB30_SEC_MASTER_CLK 146 157 + #define GCC_USB30_SEC_MASTER_CLK_SRC 147 158 + #define GCC_USB30_SEC_MOCK_UTMI_CLK 148 159 + #define GCC_USB30_SEC_MOCK_UTMI_CLK_SRC 149 160 + #define GCC_USB30_SEC_SLEEP_CLK 150 161 + #define GCC_USB3_PRIM_CLKREF_CLK 151 162 + #define GCC_USB3_PRIM_PHY_AUX_CLK 152 163 + #define GCC_USB3_PRIM_PHY_AUX_CLK_SRC 153 164 + #define GCC_USB3_PRIM_PHY_COM_AUX_CLK 154 165 + #define GCC_USB3_PRIM_PHY_PIPE_CLK 155 166 + #define GCC_USB3_SEC_CLKREF_CLK 156 167 + #define GCC_USB3_SEC_PHY_AUX_CLK 157 168 + #define GCC_USB3_SEC_PHY_AUX_CLK_SRC 158 169 + #define GCC_USB3_SEC_PHY_PIPE_CLK 159 170 + #define GCC_USB3_SEC_PHY_COM_AUX_CLK 160 171 + #define GCC_USB_PHY_CFG_AHB2PHY_CLK 161 172 + #define GCC_VIDEO_AHB_CLK 162 173 + #define GCC_VIDEO_AXI_CLK 163 174 + #define GCC_VIDEO_XO_CLK 164 175 + #define GPLL0 165 176 + #define GPLL0_OUT_EVEN 166 177 + #define GPLL0_OUT_MAIN 167 178 + #define GCC_GPU_IREF_CLK 168 179 + #define GCC_SDCC1_AHB_CLK 169 180 + #define GCC_SDCC1_APPS_CLK 170 181 + #define GCC_SDCC1_ICE_CORE_CLK 171 182 + #define GCC_SDCC1_APPS_CLK_SRC 172 183 + #define GCC_SDCC1_ICE_CORE_CLK_SRC 173 184 + #define GCC_APC_VS_CLK 174 185 + #define GCC_GPU_VS_CLK 175 186 + #define GCC_MSS_VS_CLK 176 187 + #define GCC_VDDA_VS_CLK 177 188 + #define GCC_VDDCX_VS_CLK 178 189 + #define GCC_VDDMX_VS_CLK 179 190 + #define GCC_VS_CTRL_AHB_CLK 180 191 + #define GCC_VS_CTRL_CLK 181 192 + #define GCC_VS_CTRL_CLK_SRC 182 193 + #define GCC_VSENSOR_CLK_SRC 183 194 + #define GPLL4 184 195 + 196 + /* GCC Resets */ 197 + #define GCC_MMSS_BCR 0 198 + #define GCC_PCIE_0_BCR 1 199 + #define GCC_PCIE_1_BCR 2 200 + #define GCC_PCIE_PHY_BCR 3 201 + #define GCC_PDM_BCR 4 202 + #define GCC_PRNG_BCR 5 203 + #define GCC_QUPV3_WRAPPER_0_BCR 6 204 + #define GCC_QUPV3_WRAPPER_1_BCR 7 205 + #define GCC_QUSB2PHY_PRIM_BCR 8 206 + #define GCC_QUSB2PHY_SEC_BCR 9 207 + #define GCC_SDCC2_BCR 10 208 + #define GCC_SDCC4_BCR 11 209 + #define GCC_TSIF_BCR 12 210 + #define GCC_UFS_CARD_BCR 13 211 + #define GCC_UFS_PHY_BCR 14 212 + #define GCC_USB30_PRIM_BCR 15 213 + #define GCC_USB30_SEC_BCR 16 214 + #define GCC_USB3_PHY_PRIM_BCR 17 215 + #define GCC_USB3PHY_PHY_PRIM_BCR 18 216 + #define GCC_USB3_DP_PHY_PRIM_BCR 19 217 + #define GCC_USB3_PHY_SEC_BCR 20 218 + #define GCC_USB3PHY_PHY_SEC_BCR 21 219 + #define GCC_USB3_DP_PHY_SEC_BCR 22 220 + #define GCC_USB_PHY_CFG_AHB2PHY_BCR 23 221 + #define GCC_PCIE_0_PHY_BCR 24 222 + #define GCC_PCIE_1_PHY_BCR 25 223 + 224 + /* GCC GDSCRs */ 225 + #define PCIE_0_GDSC 0 226 + #define PCIE_1_GDSC 1 227 + #define UFS_CARD_GDSC 2 228 + #define UFS_PHY_GDSC 3 229 + #define USB30_PRIM_GDSC 4 230 + #define USB30_SEC_GDSC 5 231 + #define HLOS1_VOTE_AGGRE_NOC_MMU_AUDIO_TBU_GDSC 6 232 + #define HLOS1_VOTE_AGGRE_NOC_MMU_PCIE_TBU_GDSC 7 233 + #define HLOS1_VOTE_AGGRE_NOC_MMU_TBU1_GDSC 8 234 + #define HLOS1_VOTE_AGGRE_NOC_MMU_TBU2_GDSC 9 235 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC 10 236 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC 11 237 + #define HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC 12 238 + 239 + #endif
+22
include/dt-bindings/clock/qcom,rpmh.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* Copyright (c) 2018, The Linux Foundation. All rights reserved. */ 3 + 4 + 5 + #ifndef _DT_BINDINGS_CLK_MSM_RPMH_H 6 + #define _DT_BINDINGS_CLK_MSM_RPMH_H 7 + 8 + /* RPMh controlled clocks */ 9 + #define RPMH_CXO_CLK 0 10 + #define RPMH_CXO_CLK_A 1 11 + #define RPMH_LN_BB_CLK2 2 12 + #define RPMH_LN_BB_CLK2_A 3 13 + #define RPMH_LN_BB_CLK3 4 14 + #define RPMH_LN_BB_CLK3_A 5 15 + #define RPMH_RF_CLK1 6 16 + #define RPMH_RF_CLK1_A 7 17 + #define RPMH_RF_CLK2 8 18 + #define RPMH_RF_CLK2_A 9 19 + #define RPMH_RF_CLK3 10 20 + #define RPMH_RF_CLK3_A 11 21 + 22 + #endif
+35
include/dt-bindings/clock/qcom,videocc-sdm845.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2018, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_SDM_VIDEO_CC_SDM845_H 7 + #define _DT_BINDINGS_CLK_SDM_VIDEO_CC_SDM845_H 8 + 9 + /* VIDEO_CC clock registers */ 10 + #define VIDEO_CC_APB_CLK 0 11 + #define VIDEO_CC_AT_CLK 1 12 + #define VIDEO_CC_QDSS_TRIG_CLK 2 13 + #define VIDEO_CC_QDSS_TSCTR_DIV8_CLK 3 14 + #define VIDEO_CC_VCODEC0_AXI_CLK 4 15 + #define VIDEO_CC_VCODEC0_CORE_CLK 5 16 + #define VIDEO_CC_VCODEC1_AXI_CLK 6 17 + #define VIDEO_CC_VCODEC1_CORE_CLK 7 18 + #define VIDEO_CC_VENUS_AHB_CLK 8 19 + #define VIDEO_CC_VENUS_CLK_SRC 9 20 + #define VIDEO_CC_VENUS_CTL_AXI_CLK 10 21 + #define VIDEO_CC_VENUS_CTL_CORE_CLK 11 22 + #define VIDEO_PLL0 12 23 + 24 + /* VIDEO_CC Resets */ 25 + #define VIDEO_CC_VENUS_BCR 0 26 + #define VIDEO_CC_VCODEC0_BCR 1 27 + #define VIDEO_CC_VCODEC1_BCR 2 28 + #define VIDEO_CC_INTERFACE_BCR 3 29 + 30 + /* VIDEO_CC GDSCRs */ 31 + #define VENUS_GDSC 0 32 + #define VCODEC0_GDSC 1 33 + #define VCODEC1_GDSC 2 34 + 35 + #endif
+36
include/dt-bindings/clock/r8a77470-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 2 + * 3 + * Copyright (C) 2018 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A77470_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A77470_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a77470 CPG Core Clocks */ 11 + #define R8A77470_CLK_Z2 0 12 + #define R8A77470_CLK_ZTR 1 13 + #define R8A77470_CLK_ZTRD2 2 14 + #define R8A77470_CLK_ZT 3 15 + #define R8A77470_CLK_ZX 4 16 + #define R8A77470_CLK_ZS 5 17 + #define R8A77470_CLK_HP 6 18 + #define R8A77470_CLK_B 7 19 + #define R8A77470_CLK_LB 8 20 + #define R8A77470_CLK_P 9 21 + #define R8A77470_CLK_CL 10 22 + #define R8A77470_CLK_CP 11 23 + #define R8A77470_CLK_M2 12 24 + #define R8A77470_CLK_ZB3 13 25 + #define R8A77470_CLK_SDH 14 26 + #define R8A77470_CLK_SD0 15 27 + #define R8A77470_CLK_SD1 16 28 + #define R8A77470_CLK_SD2 17 29 + #define R8A77470_CLK_MP 18 30 + #define R8A77470_CLK_QSPI 19 31 + #define R8A77470_CLK_CPEX 20 32 + #define R8A77470_CLK_RCAN 21 33 + #define R8A77470_CLK_R 22 34 + #define R8A77470_CLK_OSC 23 35 + 36 + #endif /* __DT_BINDINGS_CLOCK_R8A77470_CPG_MSSR_H__ */
+62
include/dt-bindings/clock/r8a77990-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2018 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A77990_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A77990_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a77990 CPG Core Clocks */ 11 + #define R8A77990_CLK_Z2 0 12 + #define R8A77990_CLK_ZR 1 13 + #define R8A77990_CLK_ZG 2 14 + #define R8A77990_CLK_ZTR 3 15 + #define R8A77990_CLK_ZT 4 16 + #define R8A77990_CLK_ZX 5 17 + #define R8A77990_CLK_S0D1 6 18 + #define R8A77990_CLK_S0D3 7 19 + #define R8A77990_CLK_S0D6 8 20 + #define R8A77990_CLK_S0D12 9 21 + #define R8A77990_CLK_S0D24 10 22 + #define R8A77990_CLK_S1D1 11 23 + #define R8A77990_CLK_S1D2 12 24 + #define R8A77990_CLK_S1D4 13 25 + #define R8A77990_CLK_S2D1 14 26 + #define R8A77990_CLK_S2D2 15 27 + #define R8A77990_CLK_S2D4 16 28 + #define R8A77990_CLK_S3D1 17 29 + #define R8A77990_CLK_S3D2 18 30 + #define R8A77990_CLK_S3D4 19 31 + #define R8A77990_CLK_S0D6C 20 32 + #define R8A77990_CLK_S3D1C 21 33 + #define R8A77990_CLK_S3D2C 22 34 + #define R8A77990_CLK_S3D4C 23 35 + #define R8A77990_CLK_LB 24 36 + #define R8A77990_CLK_CL 25 37 + #define R8A77990_CLK_ZB3 26 38 + #define R8A77990_CLK_ZB3D2 27 39 + #define R8A77990_CLK_CR 28 40 + #define R8A77990_CLK_CRD2 29 41 + #define R8A77990_CLK_SD0H 30 42 + #define R8A77990_CLK_SD0 31 43 + #define R8A77990_CLK_SD1H 32 44 + #define R8A77990_CLK_SD1 33 45 + #define R8A77990_CLK_SD3H 34 46 + #define R8A77990_CLK_SD3 35 47 + #define R8A77990_CLK_RPC 36 48 + #define R8A77990_CLK_RPCD2 37 49 + #define R8A77990_CLK_ZA2 38 50 + #define R8A77990_CLK_ZA8 39 51 + #define R8A77990_CLK_Z2D 40 52 + #define R8A77990_CLK_CANFD 41 53 + #define R8A77990_CLK_MSO 42 54 + #define R8A77990_CLK_R 43 55 + #define R8A77990_CLK_OSC 44 56 + #define R8A77990_CLK_LV0 45 57 + #define R8A77990_CLK_LV1 46 58 + #define R8A77990_CLK_CSI0 47 59 + #define R8A77990_CLK_CP 48 60 + #define R8A77990_CLK_CPEX 49 61 + 62 + #endif /* __DT_BINDINGS_CLOCK_R8A77990_CPG_MSSR_H__ */
+24
include/dt-bindings/clock/sun50i-h6-r-ccu.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.xyz> 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_SUN50I_H6_R_CCU_H_ 7 + #define _DT_BINDINGS_CLK_SUN50I_H6_R_CCU_H_ 8 + 9 + #define CLK_AR100 0 10 + 11 + #define CLK_R_APB1 2 12 + 13 + #define CLK_R_APB1_TIMER 4 14 + #define CLK_R_APB1_TWD 5 15 + #define CLK_R_APB1_PWM 6 16 + #define CLK_R_APB2_UART 7 17 + #define CLK_R_APB2_I2C 8 18 + #define CLK_R_APB1_IR 9 19 + #define CLK_R_APB1_W1 10 20 + 21 + #define CLK_IR 11 22 + #define CLK_W1 12 23 + 24 + #endif /* _DT_BINDINGS_CLK_SUN50I_H6_R_CCU_H_ */
+20
include/dt-bindings/reset/axg-aoclkc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 2 + /* 3 + * Copyright (c) 2016 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + */ 9 + 10 + #ifndef DT_BINDINGS_RESET_AMLOGIC_MESON_AXG_AOCLK 11 + #define DT_BINDINGS_RESET_AMLOGIC_MESON_AXG_AOCLK 12 + 13 + #define RESET_AO_REMOTE 0 14 + #define RESET_AO_I2C_MASTER 1 15 + #define RESET_AO_I2C_SLAVE 2 16 + #define RESET_AO_UART1 3 17 + #define RESET_AO_UART2 4 18 + #define RESET_AO_IR_BLASTER 5 19 + 20 + #endif
+3
include/dt-bindings/reset/mt2701-resets.h
··· 87 87 #define MT2701_ETHSYS_GMAC_RST 23 88 88 #define MT2701_ETHSYS_PPE_RST 31 89 89 90 + /* G3DSYS resets */ 91 + #define MT2701_G3DSYS_CORE_RST 0 92 + 90 93 #endif /* _DT_BINDINGS_RESET_CONTROLLER_MT2701 */
+17
include/dt-bindings/reset/sun50i-h6-r-ccu.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ or MIT) */ 2 + /* 3 + * Copyright (C) 2016 Icenowy Zheng <icenowy@aosc.xyz> 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_RST_SUN50I_H6_R_CCU_H_ 7 + #define _DT_BINDINGS_RST_SUN50I_H6_R_CCU_H_ 8 + 9 + #define RST_R_APB1_TIMER 0 10 + #define RST_R_APB1_TWD 1 11 + #define RST_R_APB1_PWM 2 12 + #define RST_R_APB2_UART 3 13 + #define RST_R_APB2_I2C 4 14 + #define RST_R_APB1_IR 5 15 + #define RST_R_APB1_W1 6 16 + 17 + #endif /* _DT_BINDINGS_RST_SUN50I_H6_R_CCU_H_ */
+2 -21
include/linux/clk-provider.h
··· 13 13 14 14 #include <linux/io.h> 15 15 #include <linux/of.h> 16 + #include <linux/of_clk.h> 16 17 17 18 #ifdef CONFIG_COMMON_CLK 18 19 ··· 219 218 int (*get_phase)(struct clk_hw *hw); 220 219 int (*set_phase)(struct clk_hw *hw, int degrees); 221 220 void (*init)(struct clk_hw *hw); 222 - int (*debug_init)(struct clk_hw *hw, struct dentry *dentry); 221 + void (*debug_init)(struct clk_hw *hw, struct dentry *dentry); 223 222 }; 224 223 225 224 /** ··· 806 805 807 806 struct of_device_id; 808 807 809 - typedef void (*of_clk_init_cb_t)(struct device_node *); 810 - 811 808 struct clk_onecell_data { 812 809 struct clk **clks; 813 810 unsigned int clk_num; ··· 892 893 struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data); 893 894 struct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec, 894 895 void *data); 895 - unsigned int of_clk_get_parent_count(struct device_node *np); 896 896 int of_clk_parent_fill(struct device_node *np, const char **parents, 897 897 unsigned int size); 898 - const char *of_clk_get_parent_name(struct device_node *np, int index); 899 898 int of_clk_detect_critical(struct device_node *np, int index, 900 899 unsigned long *flags); 901 - void of_clk_init(const struct of_device_id *matches); 902 900 903 901 #else /* !CONFIG_OF */ 904 902 ··· 942 946 { 943 947 return ERR_PTR(-ENOENT); 944 948 } 945 - static inline unsigned int of_clk_get_parent_count(struct device_node *np) 946 - { 947 - return 0; 948 - } 949 949 static inline int of_clk_parent_fill(struct device_node *np, 950 950 const char **parents, unsigned int size) 951 951 { 952 952 return 0; 953 - } 954 - static inline const char *of_clk_get_parent_name(struct device_node *np, 955 - int index) 956 - { 957 - return NULL; 958 953 } 959 954 static inline int of_clk_detect_critical(struct device_node *np, int index, 960 955 unsigned long *flags) 961 956 { 962 957 return 0; 963 958 } 964 - static inline void of_clk_init(const struct of_device_id *matches) {} 965 959 #endif /* CONFIG_OF */ 966 960 967 961 /* ··· 984 998 } 985 999 986 1000 #endif /* platform dependent I/O accessors */ 987 - 988 - #ifdef CONFIG_DEBUG_FS 989 - struct dentry *clk_debugfs_add_file(struct clk_hw *hw, char *name, umode_t mode, 990 - void *data, const struct file_operations *fops); 991 - #endif 992 1001 993 1002 #endif /* CONFIG_COMMON_CLK */ 994 1003 #endif /* CLK_PROVIDER_H */
+40
include/linux/clk/davinci.h
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Clock drivers for TI DaVinci PLL and PSC controllers 4 + * 5 + * Copyright (C) 2018 David Lechner <david@lechnology.com> 6 + */ 7 + 8 + #ifndef __LINUX_CLK_DAVINCI_PLL_H___ 9 + #define __LINUX_CLK_DAVINCI_PLL_H___ 10 + 11 + #include <linux/device.h> 12 + #include <linux/regmap.h> 13 + 14 + /* function for registering clocks in early boot */ 15 + 16 + #ifdef CONFIG_ARCH_DAVINCI_DA830 17 + int da830_pll_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 18 + #endif 19 + #ifdef CONFIG_ARCH_DAVINCI_DA850 20 + int da850_pll0_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 21 + #endif 22 + #ifdef CONFIG_ARCH_DAVINCI_DM355 23 + int dm355_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 24 + int dm355_psc_init(struct device *dev, void __iomem *base); 25 + #endif 26 + #ifdef CONFIG_ARCH_DAVINCI_DM365 27 + int dm365_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 28 + int dm365_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 29 + int dm365_psc_init(struct device *dev, void __iomem *base); 30 + #endif 31 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 32 + int dm644x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 33 + int dm644x_psc_init(struct device *dev, void __iomem *base); 34 + #endif 35 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 36 + int dm646x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 37 + int dm646x_psc_init(struct device *dev, void __iomem *base); 38 + #endif 39 + 40 + #endif /* __LINUX_CLK_DAVINCI_PLL_H___ */
+30
include/linux/of_clk.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * OF clock helpers 4 + */ 5 + 6 + #ifndef __LINUX_OF_CLK_H 7 + #define __LINUX_OF_CLK_H 8 + 9 + #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_OF) 10 + 11 + unsigned int of_clk_get_parent_count(struct device_node *np); 12 + const char *of_clk_get_parent_name(struct device_node *np, int index); 13 + void of_clk_init(const struct of_device_id *matches); 14 + 15 + #else /* !CONFIG_COMMON_CLK || !CONFIG_OF */ 16 + 17 + static inline unsigned int of_clk_get_parent_count(struct device_node *np) 18 + { 19 + return 0; 20 + } 21 + static inline const char *of_clk_get_parent_name(struct device_node *np, 22 + int index) 23 + { 24 + return NULL; 25 + } 26 + static inline void of_clk_init(const struct of_device_id *matches) {} 27 + 28 + #endif /* !CONFIG_COMMON_CLK || !CONFIG_OF */ 29 + 30 + #endif /* __LINUX_OF_CLK_H */