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:
"There's not much to see in the core framework this time around.
Instead the majority of the diff is the normal collection of driver
additions for new SoCs and non-critical clk data fixes and updates.
The framework must be middle aged.

The two biggest directories in the diffstat show that the Qualcomm and
Unisoc support added a handful of big drivers for new SoCs but that's
not really the whole story because those new drivers tend to add large
numbers of lines of clk data. There's a handful of AT91 clk drivers
added this time around too and a bunch of improvements to drivers like
the i.MX driver. All around lots of updates and fixes in various clk
drivers which is good to see.

The core framework has only one real major change which has been
baking in next for the past couple months. It fixes the framework so
that it stops caching a clk's phase when the phase clk_op returns an
error. Before this change we would consider some negative errno as a
phase and that just doesn't make sense.

Core:
- Don't show clk phase when it is invalid

New Drivers:
- Add support for Unisoc SC9863A clks
- Qualcomm SM8250 RPMh and MSM8976 RPM clks
- Qualcomm SM8250 Global Clock Controller (GCC) support
- Qualcomm SC7180 Modem Clock Controller (MSS CC) support
- EHRPWM's TimeBase clock(TBCLK) for TI AM654 SoCs
- Support PMC clks on at91sam9n12, at91rm9200, sama5d3, and
at91sam9g45 SoCs

Updates:
- GPU GX GDSC support on Qualcomm sc7180
- Fixes and improvements for the Marvell MMP2/MMP3 SoC clk drivers
- A series from Anson to convert i.MX8 clock bindings to json-schema
- Update i.MX pll14xx driver to include new frequency entries for
pll1443x table, and return error for invalid PLL type
- Add missing of_node_put() call for a number of i.MX clock drivers
- Drop flag CLK_IS_CRITICAL from 'A53_CORE' mux clock, as we already
have the flag on its child cpu clock
- Fix a53 cpu clock for i.MX8 drivers to get it source from ARM PLL
via CORE_SEL slice, and source from A53 CCM clk root when we need
to change ARM PLL frequency. Thus, we can support core running
above 1GHz safely
- Update i.MX pfdv2 driver to check zero rate and use determine_rate
for getting the best rate
- Add CLKO2 for imx8mm, SNVS clock for imx8mn, and PXP clock for
imx7d
- Remove PMC clks from Tegra clk driver
- Improved clock/reset handling for the Renesas R-Car USB2 Clock
Selector
- Conversion to json-schema of the Renesas CPG/MSSR DT bindings
- Add Crypto clocks on Renesas R-Car M3-W/W+, M3-N, E3, and D3
- Add RPC (QSPI/HyperFLASH) clocks on Renesas R-Car H3, M3-W/W+, and
M3-N
- Update Amlogic audio clock gate hierarchy for meson8 and gxbb
- Update Amlogic g12a spicc clock sources
- Support for Ingenic X1000 TCU clks"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (146 commits)
clk: sprd: fix to get a correct ibias of pll
dt-bindings: imx8mm-clock: Fix the file path
dt-bindings: imx8mq-clock: Fix the file path
clk: qcom: rpmh: Drop unnecessary semicolons
clk: qcom: rpmh: Simplify clk_rpmh_bcm_send_cmd()
clk: tegra: Use NULL for pointer initialization
clk: sprd: add clocks support for SC9863A
clk: sprd: support to get regmap from parent node
clk: sprd: Add macros for referencing parents without strings
clk: sprd: Add dt-bindings include file for SC9863A
dt-bindings: clk: sprd: add bindings for sc9863a clock controller
dt-bindings: clk: sprd: rename the common file name sprd.txt to SoC specific
clk: sprd: add gate for pll clocks
MAINTAINERS: dt: update reference for arm-integrator.txt
clk: mmp2: Fix bit masks for LCDC I/O and pixel clocks
clk: mmp2: Add clock for fifth SD HCI on MMP3
dt-bindings: marvell,mmp2: Add clock id for the fifth SD HCI on MMP3
clk: mmp2: Add clocks for the thermal sensors
dt-bindings: marvell,mmp2: Add clock ids for the thermal sensors
clk: mmp2: add the GPU clocks
...

+10338 -1136
+103
Documentation/devicetree/bindings/clock/arm,syscon-icst.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/arm,syscon-icst.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: ARM System Controller ICST Clocks 8 + 9 + maintainers: 10 + - Linus Walleij <linusw@kernel.org> 11 + 12 + description: | 13 + The ICS525 and ICS307 oscillators are produced by Integrated 14 + Devices Technology (IDT). ARM integrated these oscillators deeply into their 15 + reference designs by adding special control registers that manage such 16 + oscillators to their system controllers. 17 + 18 + The various ARM system controllers contain logic to serialize and initialize 19 + an ICST clock request after a write to the 32 bit register at an offset 20 + into the system controller. Furthermore, to even be able to alter one of 21 + these frequencies, the system controller must first be unlocked by 22 + writing a special token to another offset in the system controller. 23 + 24 + Some ARM hardware contain special versions of the serial interface that only 25 + connects the low 8 bits of the VDW (missing one bit), hard-wires RDW to 26 + different values and sometimes also hard-wires the output divider. They 27 + therefore have special compatible strings as per this table (the OD value is 28 + the value on the pins, not the resulting output divider). 29 + 30 + In the core modules and logic tiles, the ICST is a configurable clock fed 31 + from a 24 MHz clock on the motherboard (usually the main crystal) used for 32 + generating e.g. video clocks. It is located on the core module and there is 33 + only one of these. This clock node must be a subnode of the core module. 34 + 35 + Hardware variant RDW OD VDW 36 + 37 + Integrator/AP 22 1 Bit 8 0, rest variable 38 + integratorap-cm 39 + 40 + Integrator/AP 46 3 Bit 8 0, rest variable 41 + integratorap-sys 42 + 43 + Integrator/AP 22 or 1 17 or (33 or 25 MHz) 44 + integratorap-pci 14 1 14 45 + 46 + Integrator/CP 22 variable Bit 8 0, rest variable 47 + integratorcp-cm-core 48 + 49 + Integrator/CP 22 variable Bit 8 0, rest variable 50 + integratorcp-cm-mem 51 + 52 + The ICST oscillator must be provided inside a system controller node. 53 + 54 + properties: 55 + "#clock-cells": 56 + const: 0 57 + 58 + compatible: 59 + enum: 60 + - arm,syscon-icst525 61 + - arm,syscon-icst307 62 + - arm,syscon-icst525-integratorap-cm 63 + - arm,syscon-icst525-integratorap-sys 64 + - arm,syscon-icst525-integratorap-pci 65 + - arm,syscon-icst525-integratorcp-cm-core 66 + - arm,syscon-icst525-integratorcp-cm-mem 67 + - arm,integrator-cm-auxosc 68 + - arm,versatile-cm-auxosc 69 + - arm,impd-vco1 70 + - arm,impd-vco2 71 + 72 + clocks: 73 + description: Parent clock for the ICST VCO 74 + maxItems: 1 75 + 76 + clock-output-names: 77 + maxItems: 1 78 + 79 + lock-offset: 80 + $ref: '/schemas/types.yaml#/definitions/uint32' 81 + description: Offset to the unlocking register for the oscillator 82 + 83 + vco-offset: 84 + $ref: '/schemas/types.yaml#/definitions/uint32' 85 + description: Offset to the VCO register for the oscillator 86 + 87 + required: 88 + - "#clock-cells" 89 + - compatible 90 + - clocks 91 + 92 + examples: 93 + - | 94 + vco1: clock@00 { 95 + compatible = "arm,impd1-vco1"; 96 + #clock-cells = <0>; 97 + lock-offset = <0x08>; 98 + vco-offset = <0x00>; 99 + clocks = <&sysclk>; 100 + clock-output-names = "IM-PD1-VCO1"; 101 + }; 102 + 103 + ...
-34
Documentation/devicetree/bindings/clock/arm-integrator.txt
··· 1 - Clock bindings for ARM Integrator and Versatile Core Module clocks 2 - 3 - Auxiliary Oscillator Clock 4 - 5 - This is a configurable clock fed from a 24 MHz chrystal, 6 - used for generating e.g. video clocks. It is located on the 7 - core module and there is only one of these. 8 - 9 - This clock node *must* be a subnode of the core module, since 10 - it obtains the base address for it's address range from its 11 - parent node. 12 - 13 - 14 - Required properties: 15 - - compatible: must be "arm,integrator-cm-auxosc" or "arm,versatile-cm-auxosc" 16 - - #clock-cells: must be <0> 17 - 18 - Optional properties: 19 - - clocks: parent clock(s) 20 - 21 - Example: 22 - 23 - core-module@10000000 { 24 - xtal24mhz: xtal24mhz@24M { 25 - #clock-cells = <0>; 26 - compatible = "fixed-clock"; 27 - clock-frequency = <24000000>; 28 - }; 29 - auxosc: cm_aux_osc@25M { 30 - #clock-cells = <0>; 31 - compatible = "arm,integrator-cm-auxosc"; 32 - clocks = <&xtal24mhz>; 33 - }; 34 - };
-70
Documentation/devicetree/bindings/clock/arm-syscon-icst.txt
··· 1 - ARM System Controller ICST clocks 2 - 3 - The ICS525 and ICS307 oscillators are produced by Integrated Devices 4 - Technology (IDT). ARM integrated these oscillators deeply into their 5 - reference designs by adding special control registers that manage such 6 - oscillators to their system controllers. 7 - 8 - The various ARM system controllers contain logic to serialize and initialize 9 - an ICST clock request after a write to the 32 bit register at an offset 10 - into the system controller. Furthermore, to even be able to alter one of 11 - these frequencies, the system controller must first be unlocked by 12 - writing a special token to another offset in the system controller. 13 - 14 - Some ARM hardware contain special versions of the serial interface that only 15 - connects the low 8 bits of the VDW (missing one bit), hardwires RDW to 16 - different values and sometimes also hardwire the output divider. They 17 - therefore have special compatible strings as per this table (the OD value is 18 - the value on the pins, not the resulting output divider): 19 - 20 - Hardware variant: RDW OD VDW 21 - 22 - Integrator/AP 22 1 Bit 8 0, rest variable 23 - integratorap-cm 24 - 25 - Integrator/AP 46 3 Bit 8 0, rest variable 26 - integratorap-sys 27 - 28 - Integrator/AP 22 or 1 17 or (33 or 25 MHz) 29 - integratorap-pci 14 1 14 30 - 31 - Integrator/CP 22 variable Bit 8 0, rest variable 32 - integratorcp-cm-core 33 - 34 - Integrator/CP 22 variable Bit 8 0, rest variable 35 - integratorcp-cm-mem 36 - 37 - The ICST oscillator must be provided inside a system controller node. 38 - 39 - Required properties: 40 - - compatible: must be one of 41 - "arm,syscon-icst525" 42 - "arm,syscon-icst307" 43 - "arm,syscon-icst525-integratorap-cm" 44 - "arm,syscon-icst525-integratorap-sys" 45 - "arm,syscon-icst525-integratorap-pci" 46 - "arm,syscon-icst525-integratorcp-cm-core" 47 - "arm,syscon-icst525-integratorcp-cm-mem" 48 - - lock-offset: the offset address into the system controller where the 49 - unlocking register is located 50 - - vco-offset: the offset address into the system controller where the 51 - ICST control register is located (even 32 bit address) 52 - - #clock-cells: must be <0> 53 - - clocks: parent clock, since the ICST needs a parent clock to derive its 54 - frequency from, this attribute is compulsory. 55 - 56 - Example: 57 - 58 - syscon: syscon@10000000 { 59 - compatible = "syscon"; 60 - reg = <0x10000000 0x1000>; 61 - 62 - oscclk0: osc0@c { 63 - compatible = "arm,syscon-icst307"; 64 - #clock-cells = <0>; 65 - lock-offset = <0x20>; 66 - vco-offset = <0x0c>; 67 - clocks = <&xtal24mhz>; 68 - }; 69 - (...) 70 - };
-29
Documentation/devicetree/bindings/clock/imx8mm-clock.txt
··· 1 - * Clock bindings for NXP i.MX8M Mini 2 - 3 - Required properties: 4 - - compatible: Should be "fsl,imx8mm-ccm" 5 - - reg: Address and length of the register set 6 - - #clock-cells: Should be <1> 7 - - clocks: list of clock specifiers, must contain an entry for each required 8 - entry in clock-names 9 - - clock-names: should include the following entries: 10 - - "osc_32k" 11 - - "osc_24m" 12 - - "clk_ext1" 13 - - "clk_ext2" 14 - - "clk_ext3" 15 - - "clk_ext4" 16 - 17 - clk: clock-controller@30380000 { 18 - compatible = "fsl,imx8mm-ccm"; 19 - reg = <0x0 0x30380000 0x0 0x10000>; 20 - #clock-cells = <1>; 21 - clocks = <&osc_32k>, <&osc_24m>, <&clk_ext1>, <&clk_ext2>, 22 - <&clk_ext3>, <&clk_ext4>; 23 - clock-names = "osc_32k", "osc_24m", "clk_ext1", "clk_ext2", 24 - "clk_ext3", "clk_ext4"; 25 - }; 26 - 27 - The clock consumer should specify the desired clock by having the clock 28 - ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx8mm-clock.h 29 - for the full list of i.MX8M Mini clock IDs.
+68
Documentation/devicetree/bindings/clock/imx8mm-clock.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/imx8mm-clock.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: NXP i.MX8M Mini Clock Control Module Binding 8 + 9 + maintainers: 10 + - Anson Huang <Anson.Huang@nxp.com> 11 + 12 + description: | 13 + NXP i.MX8M Mini clock control module is an integrated clock controller, which 14 + generates and supplies to all modules. 15 + 16 + properties: 17 + compatible: 18 + const: fsl,imx8mm-ccm 19 + 20 + reg: 21 + maxItems: 1 22 + 23 + clocks: 24 + items: 25 + - description: 32k osc 26 + - description: 24m osc 27 + - description: ext1 clock input 28 + - description: ext2 clock input 29 + - description: ext3 clock input 30 + - description: ext4 clock input 31 + 32 + clock-names: 33 + items: 34 + - const: osc_32k 35 + - const: osc_24m 36 + - const: clk_ext1 37 + - const: clk_ext2 38 + - const: clk_ext3 39 + - const: clk_ext4 40 + 41 + '#clock-cells': 42 + const: 1 43 + description: 44 + The clock consumer should specify the desired clock by having the clock 45 + ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx8mm-clock.h 46 + for the full list of i.MX8M Mini clock IDs. 47 + 48 + required: 49 + - compatible 50 + - reg 51 + - clocks 52 + - clock-names 53 + - '#clock-cells' 54 + 55 + examples: 56 + # Clock Control Module node: 57 + - | 58 + clk: clock-controller@30380000 { 59 + compatible = "fsl,imx8mm-ccm"; 60 + reg = <0x30380000 0x10000>; 61 + #clock-cells = <1>; 62 + clocks = <&osc_32k>, <&osc_24m>, <&clk_ext1>, <&clk_ext2>, 63 + <&clk_ext3>, <&clk_ext4>; 64 + clock-names = "osc_32k", "osc_24m", "clk_ext1", "clk_ext2", 65 + "clk_ext3", "clk_ext4"; 66 + }; 67 + 68 + ...
+2 -46
Documentation/devicetree/bindings/clock/imx8mn-clock.yaml
··· 40 40 41 41 '#clock-cells': 42 42 const: 1 43 - description: | 43 + description: 44 44 The clock consumer should specify the desired clock by having the clock 45 45 ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx8mn-clock.h 46 46 for the full list of i.MX8M Nano clock IDs. ··· 59 59 - | 60 60 clk: clock-controller@30380000 { 61 61 compatible = "fsl,imx8mn-ccm"; 62 - reg = <0x0 0x30380000 0x0 0x10000>; 62 + reg = <0x30380000 0x10000>; 63 63 #clock-cells = <1>; 64 64 clocks = <&osc_32k>, <&osc_24m>, <&clk_ext1>, 65 65 <&clk_ext2>, <&clk_ext3>, <&clk_ext4>; 66 66 clock-names = "osc_32k", "osc_24m", "clk_ext1", 67 67 "clk_ext2", "clk_ext3", "clk_ext4"; 68 - }; 69 - 70 - # Required external clocks for Clock Control Module node: 71 - - | 72 - osc_32k: clock-osc-32k { 73 - compatible = "fixed-clock"; 74 - #clock-cells = <0>; 75 - clock-frequency = <32768>; 76 - clock-output-names = "osc_32k"; 77 - }; 78 - 79 - osc_24m: clock-osc-24m { 80 - compatible = "fixed-clock"; 81 - #clock-cells = <0>; 82 - clock-frequency = <24000000>; 83 - clock-output-names = "osc_24m"; 84 - }; 85 - 86 - clk_ext1: clock-ext1 { 87 - compatible = "fixed-clock"; 88 - #clock-cells = <0>; 89 - clock-frequency = <133000000>; 90 - clock-output-names = "clk_ext1"; 91 - }; 92 - 93 - clk_ext2: clock-ext2 { 94 - compatible = "fixed-clock"; 95 - #clock-cells = <0>; 96 - clock-frequency = <133000000>; 97 - clock-output-names = "clk_ext2"; 98 - }; 99 - 100 - clk_ext3: clock-ext3 { 101 - compatible = "fixed-clock"; 102 - #clock-cells = <0>; 103 - clock-frequency = <133000000>; 104 - clock-output-names = "clk_ext3"; 105 - }; 106 - 107 - clk_ext4: clock-ext4 { 108 - compatible = "fixed-clock"; 109 - #clock-cells = <0>; 110 - clock-frequency= <133000000>; 111 - clock-output-names = "clk_ext4"; 112 68 }; 113 69 114 70 ...
-20
Documentation/devicetree/bindings/clock/imx8mq-clock.txt
··· 1 - * Clock bindings for NXP i.MX8M Quad 2 - 3 - Required properties: 4 - - compatible: Should be "fsl,imx8mq-ccm" 5 - - reg: Address and length of the register set 6 - - #clock-cells: Should be <1> 7 - - clocks: list of clock specifiers, must contain an entry for each required 8 - entry in clock-names 9 - - clock-names: should include the following entries: 10 - - "ckil" 11 - - "osc_25m" 12 - - "osc_27m" 13 - - "clk_ext1" 14 - - "clk_ext2" 15 - - "clk_ext3" 16 - - "clk_ext4" 17 - 18 - The clock consumer should specify the desired clock by having the clock 19 - ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx8mq-clock.h 20 - for the full list of i.MX8M Quad clock IDs.
+72
Documentation/devicetree/bindings/clock/imx8mq-clock.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/imx8mq-clock.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: NXP i.MX8M Quad Clock Control Module Binding 8 + 9 + maintainers: 10 + - Anson Huang <Anson.Huang@nxp.com> 11 + 12 + description: | 13 + NXP i.MX8M Quad clock control module is an integrated clock controller, which 14 + generates and supplies to all modules. 15 + 16 + properties: 17 + compatible: 18 + const: fsl,imx8mq-ccm 19 + 20 + reg: 21 + maxItems: 1 22 + 23 + clocks: 24 + items: 25 + - description: 32k osc 26 + - description: 25m osc 27 + - description: 27m osc 28 + - description: ext1 clock input 29 + - description: ext2 clock input 30 + - description: ext3 clock input 31 + - description: ext4 clock input 32 + 33 + clock-names: 34 + items: 35 + - const: ckil 36 + - const: osc_25m 37 + - const: osc_27m 38 + - const: clk_ext1 39 + - const: clk_ext2 40 + - const: clk_ext3 41 + - const: clk_ext4 42 + 43 + '#clock-cells': 44 + const: 1 45 + description: 46 + The clock consumer should specify the desired clock by having the clock 47 + ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx8mq-clock.h 48 + for the full list of i.MX8M Quad clock IDs. 49 + 50 + required: 51 + - compatible 52 + - reg 53 + - clocks 54 + - clock-names 55 + - '#clock-cells' 56 + 57 + examples: 58 + # Clock Control Module node: 59 + - | 60 + clk: clock-controller@30380000 { 61 + compatible = "fsl,imx8mq-ccm"; 62 + reg = <0x30380000 0x10000>; 63 + #clock-cells = <1>; 64 + clocks = <&ckil>, <&osc_25m>, <&osc_27m>, 65 + <&clk_ext1>, <&clk_ext2>, 66 + <&clk_ext3>, <&clk_ext4>; 67 + clock-names = "ckil", "osc_25m", "osc_27m", 68 + "clk_ext1", "clk_ext2", 69 + "clk_ext3", "clk_ext4"; 70 + }; 71 + 72 + ...
+64
Documentation/devicetree/bindings/clock/marvell,mmp2-clock.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/marvell,mmp2-clock.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Marvell MMP2 and MMP3 Clock Controller 8 + 9 + maintainers: 10 + - Lubomir Rintel <lkundrak@v3.sk> 11 + 12 + description: | 13 + The clock subsystem on MMP2 or MMP3 generates and supplies clock to various 14 + controllers within the SoC. 15 + 16 + Each clock is assigned an identifier and client nodes use this identifier 17 + to specify the clock which they consume. 18 + 19 + All these identifiers could be found in <dt-bindings/clock/marvell,mmp2.h>. 20 + 21 + properties: 22 + compatible: 23 + enum: 24 + - marvell,mmp2-clock # controller compatible with MMP2 SoC 25 + - marvell,mmp3-clock # controller compatible with MMP3 SoC 26 + 27 + reg: 28 + items: 29 + - description: MPMU register region 30 + - description: APMU register region 31 + - description: APBC register region 32 + 33 + reg-names: 34 + items: 35 + - const: mpmu 36 + - const: apmu 37 + - const: apbc 38 + 39 + '#clock-cells': 40 + const: 1 41 + 42 + '#reset-cells': 43 + const: 1 44 + 45 + required: 46 + - compatible 47 + - reg 48 + - reg-names 49 + - '#clock-cells' 50 + - '#reset-cells' 51 + 52 + additionalProperties: false 53 + 54 + examples: 55 + - | 56 + clock-controller@d4050000 { 57 + compatible = "marvell,mmp2-clock"; 58 + reg = <0xd4050000 0x1000>, 59 + <0xd4282800 0x400>, 60 + <0xd4015000 0x1000>; 61 + reg-names = "mpmu", "apmu", "apbc"; 62 + #clock-cells = <1>; 63 + #reset-cells = <1>; 64 + };
-21
Documentation/devicetree/bindings/clock/marvell,mmp2.txt
··· 1 - * Marvell MMP2 Clock Controller 2 - 3 - The MMP2 clock subsystem generates and supplies clock to various 4 - controllers within the MMP2 SoC. 5 - 6 - Required Properties: 7 - 8 - - compatible: should be one of the following. 9 - - "marvell,mmp2-clock" - controller compatible with MMP2 SoC. 10 - 11 - - reg: physical base address of the clock subsystem and length of memory mapped 12 - region. There are 3 places in SOC has clock control logic: 13 - "mpmu", "apmu", "apbc". So three reg spaces need to be defined. 14 - 15 - - #clock-cells: should be 1. 16 - - #reset-cells: should be 1. 17 - 18 - Each clock is assigned an identifier and client nodes use this identifier 19 - to specify the clock which they consume. 20 - 21 - All these identifiers could be found in <dt-bindings/clock/marvell,mmp2.h>.
+72
Documentation/devicetree/bindings/clock/qcom,gcc-sm8250.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,gcc-sm8250.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Global Clock & Reset Controller Binding for SM8250 8 + 9 + maintainers: 10 + - Stephen Boyd <sboyd@kernel.org> 11 + - Taniya Das <tdas@codeaurora.org> 12 + 13 + description: | 14 + Qualcomm global clock control module which supports the clocks, resets and 15 + power domains on SM8250. 16 + 17 + See also: 18 + - dt-bindings/clock/qcom,gcc-sm8250.h 19 + 20 + properties: 21 + compatible: 22 + const: qcom,gcc-sm8250 23 + 24 + clocks: 25 + items: 26 + - description: Board XO source 27 + - description: Sleep clock source 28 + 29 + clock-names: 30 + items: 31 + - const: bi_tcxo 32 + - const: sleep_clk 33 + 34 + '#clock-cells': 35 + const: 1 36 + 37 + '#reset-cells': 38 + const: 1 39 + 40 + '#power-domain-cells': 41 + const: 1 42 + 43 + reg: 44 + maxItems: 1 45 + 46 + protected-clocks: 47 + description: 48 + Protected clock specifier list as per common clock binding. 49 + 50 + required: 51 + - compatible 52 + - clocks 53 + - clock-names 54 + - reg 55 + - '#clock-cells' 56 + - '#reset-cells' 57 + - '#power-domain-cells' 58 + 59 + examples: 60 + - | 61 + #include <dt-bindings/clock/qcom,rpmh.h> 62 + clock-controller@100000 { 63 + compatible = "qcom,gcc-sm8250"; 64 + reg = <0 0x00100000 0 0x1f0000>; 65 + clocks = <&rpmhcc RPMH_CXO_CLK>, 66 + <&sleep_clk>; 67 + clock-names = "bi_tcxo", "sleep_clk"; 68 + #clock-cells = <1>; 69 + #reset-cells = <1>; 70 + #power-domain-cells = <1>; 71 + }; 72 + ...
+2
Documentation/devicetree/bindings/clock/qcom,rpmcc.txt
··· 14 14 "qcom,rpmcc-apq8060", "qcom,rpmcc" 15 15 "qcom,rpmcc-msm8916", "qcom,rpmcc" 16 16 "qcom,rpmcc-msm8974", "qcom,rpmcc" 17 + "qcom,rpmcc-msm8976", "qcom,rpmcc" 17 18 "qcom,rpmcc-apq8064", "qcom,rpmcc" 19 + "qcom,rpmcc-ipq806x", "qcom,rpmcc" 18 20 "qcom,rpmcc-msm8996", "qcom,rpmcc" 19 21 "qcom,rpmcc-msm8998", "qcom,rpmcc" 20 22 "qcom,rpmcc-qcs404", "qcom,rpmcc"
+1
Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml
··· 20 20 - qcom,sc7180-rpmh-clk 21 21 - qcom,sdm845-rpmh-clk 22 22 - qcom,sm8150-rpmh-clk 23 + - qcom,sm8250-rpmh-clk 23 24 24 25 clocks: 25 26 maxItems: 1
+62
Documentation/devicetree/bindings/clock/qcom,sc7180-mss.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,sc7180-mss.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Modem Clock Controller Binding for SC7180 8 + 9 + maintainers: 10 + - Taniya Das <tdas@codeaurora.org> 11 + 12 + description: | 13 + Qualcomm modem clock control module which supports the clocks on SC7180. 14 + 15 + See also: 16 + - dt-bindings/clock/qcom,mss-sc7180.h 17 + 18 + properties: 19 + compatible: 20 + const: qcom,sc7180-mss 21 + 22 + clocks: 23 + items: 24 + - description: gcc_mss_mfab_axi clock from GCC 25 + - description: gcc_mss_nav_axi clock from GCC 26 + - description: gcc_mss_cfg_ahb clock from GCC 27 + 28 + clock-names: 29 + items: 30 + - const: gcc_mss_mfab_axis 31 + - const: gcc_mss_nav_axi 32 + - const: cfg_ahb 33 + 34 + '#clock-cells': 35 + const: 1 36 + 37 + reg: 38 + maxItems: 1 39 + 40 + required: 41 + - compatible 42 + - reg 43 + - clocks 44 + - '#clock-cells' 45 + 46 + additionalProperties: false 47 + 48 + examples: 49 + - | 50 + #include <dt-bindings/clock/qcom,gcc-sc7180.h> 51 + clock-controller@41a8000 { 52 + compatible = "qcom,sc7180-mss"; 53 + reg = <0 0x041a8000 0 0x8000>; 54 + clocks = <&gcc GCC_MSS_MFAB_AXIS_CLK>, 55 + <&gcc GCC_MSS_NAV_AXI_CLK>, 56 + <&gcc GCC_MSS_CFG_AHB_CLK>; 57 + clock-names = "gcc_mss_mfab_axis", 58 + "gcc_mss_nav_axi", 59 + "cfg_ahb"; 60 + #clock-cells = <1>; 61 + }; 62 + ...
-100
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
··· 1 - * Renesas Clock Pulse Generator / Module Standby and Software Reset 2 - 3 - On Renesas ARM SoCs (SH/R-Mobile, R-Car, RZ), the CPG (Clock Pulse Generator) 4 - and MSSR (Module Standby and Software Reset) blocks are intimately connected, 5 - and share the same register block. 6 - 7 - They provide the following functionalities: 8 - - The CPG block generates various core clocks, 9 - - The MSSR block provides two functions: 10 - 1. Module Standby, providing a Clock Domain to control the clock supply 11 - to individual SoC devices, 12 - 2. Reset Control, to perform a software reset of individual SoC devices. 13 - 14 - Required Properties: 15 - - compatible: Must be one of: 16 - - "renesas,r7s9210-cpg-mssr" for the r7s9210 SoC (RZ/A2) 17 - - "renesas,r8a7743-cpg-mssr" for the r8a7743 SoC (RZ/G1M) 18 - - "renesas,r8a7744-cpg-mssr" for the r8a7744 SoC (RZ/G1N) 19 - - "renesas,r8a7745-cpg-mssr" for the r8a7745 SoC (RZ/G1E) 20 - - "renesas,r8a77470-cpg-mssr" for the r8a77470 SoC (RZ/G1C) 21 - - "renesas,r8a774a1-cpg-mssr" for the r8a774a1 SoC (RZ/G2M) 22 - - "renesas,r8a774b1-cpg-mssr" for the r8a774b1 SoC (RZ/G2N) 23 - - "renesas,r8a774c0-cpg-mssr" for the r8a774c0 SoC (RZ/G2E) 24 - - "renesas,r8a7790-cpg-mssr" for the r8a7790 SoC (R-Car H2) 25 - - "renesas,r8a7791-cpg-mssr" for the r8a7791 SoC (R-Car M2-W) 26 - - "renesas,r8a7792-cpg-mssr" for the r8a7792 SoC (R-Car V2H) 27 - - "renesas,r8a7793-cpg-mssr" for the r8a7793 SoC (R-Car M2-N) 28 - - "renesas,r8a7794-cpg-mssr" for the r8a7794 SoC (R-Car E2) 29 - - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC (R-Car H3) 30 - - "renesas,r8a7796-cpg-mssr" for the r8a77960 SoC (R-Car M3-W) 31 - - "renesas,r8a77961-cpg-mssr" for the r8a77961 SoC (R-Car M3-W+) 32 - - "renesas,r8a77965-cpg-mssr" for the r8a77965 SoC (R-Car M3-N) 33 - - "renesas,r8a77970-cpg-mssr" for the r8a77970 SoC (R-Car V3M) 34 - - "renesas,r8a77980-cpg-mssr" for the r8a77980 SoC (R-Car V3H) 35 - - "renesas,r8a77990-cpg-mssr" for the r8a77990 SoC (R-Car E3) 36 - - "renesas,r8a77995-cpg-mssr" for the r8a77995 SoC (R-Car D3) 37 - 38 - - reg: Base address and length of the memory resource used by the CPG/MSSR 39 - block 40 - 41 - - clocks: References to external parent clocks, one entry for each entry in 42 - clock-names 43 - - clock-names: List of external parent clock names. Valid names are: 44 - - "extal" (r7s9210, r8a7743, r8a7744, r8a7745, r8a77470, r8a774a1, 45 - r8a774b1, r8a774c0, r8a7790, r8a7791, r8a7792, r8a7793, 46 - r8a7794, r8a7795, r8a77960, r8a77961, r8a77965, r8a77970, 47 - r8a77980, r8a77990, r8a77995) 48 - - "extalr" (r8a774a1, r8a774b1, r8a7795, r8a77960, r8a77961, r8a77965, 49 - r8a77970, r8a77980) 50 - - "usb_extal" (r8a7743, r8a7744, r8a7745, r8a77470, r8a7790, r8a7791, 51 - r8a7793, r8a7794) 52 - 53 - - #clock-cells: Must be 2 54 - - For CPG core clocks, the two clock specifier cells must be "CPG_CORE" 55 - and a core clock reference, as defined in 56 - <dt-bindings/clock/*-cpg-mssr.h>. 57 - - For module clocks, the two clock specifier cells must be "CPG_MOD" and 58 - a module number, as defined in the datasheet. 59 - 60 - - #power-domain-cells: Must be 0 61 - - SoC devices that are part of the CPG/MSSR Clock Domain and can be 62 - power-managed through Module Standby should refer to the CPG device 63 - node in their "power-domains" property, as documented by the generic PM 64 - Domain bindings in 65 - Documentation/devicetree/bindings/power/power-domain.yaml. 66 - 67 - - #reset-cells: Must be 1 68 - - The single reset specifier cell must be the module number, as defined 69 - in the datasheet. 70 - 71 - 72 - Examples 73 - -------- 74 - 75 - - CPG device node: 76 - 77 - cpg: clock-controller@e6150000 { 78 - compatible = "renesas,r8a7795-cpg-mssr"; 79 - reg = <0 0xe6150000 0 0x1000>; 80 - clocks = <&extal_clk>, <&extalr_clk>; 81 - clock-names = "extal", "extalr"; 82 - #clock-cells = <2>; 83 - #power-domain-cells = <0>; 84 - #reset-cells = <1>; 85 - }; 86 - 87 - 88 - - CPG/MSSR Clock Domain member device node: 89 - 90 - scif2: serial@e6e88000 { 91 - compatible = "renesas,scif-r8a7795", "renesas,scif"; 92 - reg = <0 0xe6e88000 0 64>; 93 - interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>; 94 - clocks = <&cpg CPG_MOD 310>; 95 - clock-names = "fck"; 96 - dmas = <&dmac1 0x13>, <&dmac1 0x12>; 97 - dma-names = "tx", "rx"; 98 - power-domains = <&cpg>; 99 - resets = <&cpg 310>; 100 - };
+119
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: "http://devicetree.org/schemas/clock/renesas,cpg-mssr.yaml#" 5 + $schema: "http://devicetree.org/meta-schemas/core.yaml#" 6 + 7 + title: Renesas Clock Pulse Generator / Module Standby and Software Reset 8 + 9 + maintainers: 10 + - Geert Uytterhoeven <geert+renesas@glider.be> 11 + 12 + description: | 13 + On Renesas ARM SoCs (SH/R-Mobile, R-Car, RZ), the CPG (Clock Pulse Generator) 14 + and MSSR (Module Standby and Software Reset) blocks are intimately connected, 15 + and share the same register block. 16 + 17 + They provide the following functionalities: 18 + - The CPG block generates various core clocks, 19 + - The MSSR block provides two functions: 20 + 1. Module Standby, providing a Clock Domain to control the clock supply 21 + to individual SoC devices, 22 + 2. Reset Control, to perform a software reset of individual SoC devices. 23 + 24 + properties: 25 + compatible: 26 + enum: 27 + - renesas,r7s9210-cpg-mssr # RZ/A2 28 + - renesas,r8a7743-cpg-mssr # RZ/G1M 29 + - renesas,r8a7744-cpg-mssr # RZ/G1N 30 + - renesas,r8a7745-cpg-mssr # RZ/G1E 31 + - renesas,r8a77470-cpg-mssr # RZ/G1C 32 + - renesas,r8a774a1-cpg-mssr # RZ/G2M 33 + - renesas,r8a774b1-cpg-mssr # RZ/G2N 34 + - renesas,r8a774c0-cpg-mssr # RZ/G2E 35 + - renesas,r8a7790-cpg-mssr # R-Car H2 36 + - renesas,r8a7791-cpg-mssr # R-Car M2-W 37 + - renesas,r8a7792-cpg-mssr # R-Car V2H 38 + - renesas,r8a7793-cpg-mssr # R-Car M2-N 39 + - renesas,r8a7794-cpg-mssr # R-Car E2 40 + - renesas,r8a7795-cpg-mssr # R-Car H3 41 + - renesas,r8a7796-cpg-mssr # R-Car M3-W 42 + - renesas,r8a77961-cpg-mssr # R-Car M3-W+ 43 + - renesas,r8a77965-cpg-mssr # R-Car M3-N 44 + - renesas,r8a77970-cpg-mssr # R-Car V3M 45 + - renesas,r8a77980-cpg-mssr # R-Car V3H 46 + - renesas,r8a77990-cpg-mssr # R-Car E3 47 + - renesas,r8a77995-cpg-mssr # R-Car D3 48 + 49 + reg: 50 + maxItems: 1 51 + 52 + clocks: 53 + minItems: 1 54 + maxItems: 2 55 + 56 + clock-names: 57 + minItems: 1 58 + maxItems: 2 59 + items: 60 + enum: 61 + - extal # All 62 + - extalr # Most R-Car Gen3 and RZ/G2 63 + - usb_extal # Most R-Car Gen2 and RZ/G1 64 + 65 + '#clock-cells': 66 + description: | 67 + - For CPG core clocks, the two clock specifier cells must be "CPG_CORE" 68 + and a core clock reference, as defined in 69 + <dt-bindings/clock/*-cpg-mssr.h> 70 + - For module clocks, the two clock specifier cells must be "CPG_MOD" and 71 + a module number, as defined in the datasheet. 72 + const: 2 73 + 74 + '#power-domain-cells': 75 + description: 76 + SoC devices that are part of the CPG/MSSR Clock Domain and can be 77 + power-managed through Module Standby should refer to the CPG device node 78 + in their "power-domains" property, as documented by the generic PM Domain 79 + bindings in Documentation/devicetree/bindings/power/power-domain.yaml. 80 + const: 0 81 + 82 + '#reset-cells': 83 + description: 84 + The single reset specifier cell must be the module number, as defined in 85 + the datasheet. 86 + const: 1 87 + 88 + if: 89 + not: 90 + properties: 91 + compatible: 92 + items: 93 + enum: 94 + - renesas,r7s9210-cpg-mssr 95 + then: 96 + required: 97 + - '#reset-cells' 98 + 99 + required: 100 + - compatible 101 + - reg 102 + - clocks 103 + - clock-names 104 + - '#clock-cells' 105 + - '#power-domain-cells' 106 + 107 + additionalProperties: false 108 + 109 + examples: 110 + - | 111 + cpg: clock-controller@e6150000 { 112 + compatible = "renesas,r8a7795-cpg-mssr"; 113 + reg = <0xe6150000 0x1000>; 114 + clocks = <&extal_clk>, <&extalr_clk>; 115 + clock-names = "extal", "extalr"; 116 + #clock-cells = <2>; 117 + #power-domain-cells = <0>; 118 + #reset-cells = <1>; 119 + };
+14 -3
Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.txt
··· 38 38 - reg: offset and length of the USB 2.0 clock selector register block. 39 39 - clocks: A list of phandles and specifier pairs. 40 40 - clock-names: Name of the clocks. 41 - - The functional clock must be "ehci_ohci" 41 + - The functional clock of USB 2.0 host side must be "ehci_ohci" 42 + - The functional clock of HS-USB side must be "hs-usb-if" 42 43 - The USB_EXTAL clock pin must be "usb_extal" 43 44 - The USB_XTAL clock pin must be "usb_xtal" 44 45 - #clock-cells: Must be 0 46 + - power-domains: A phandle and symbolic PM domain specifier. 47 + See power/renesas,rcar-sysc.yaml. 48 + - resets: A list of phandles and specifier pairs. 49 + - reset-names: Name of the resets. 50 + - The reset of USB 2.0 host side must be "ehci_ohci" 51 + - The reset of HS-USB side must be "hs-usb-if" 45 52 46 53 Example (R-Car H3): 47 54 ··· 56 49 compatible = "renesas,r8a7795-rcar-usb2-clock-sel", 57 50 "renesas,rcar-gen3-usb2-clock-sel"; 58 51 reg = <0 0xe6590630 0 0x02>; 59 - clocks = <&cpg CPG_MOD 703>, <&usb_extal>, <&usb_xtal>; 60 - clock-names = "ehci_ohci", "usb_extal", "usb_xtal"; 52 + clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>, 53 + <&usb_extal>, <&usb_xtal>; 54 + clock-names = "ehci_ohci", "hs-usb-if", "usb_extal", "usb_xtal"; 61 55 #clock-cells = <0>; 56 + power-domains = <&sysc R8A7795_PD_ALWAYS_ON>; 57 + resets = <&cpg 703>, <&cpg 704>; 58 + reset-names = "ehci_ohci", "hs-usb-if"; 62 59 };
+105
Documentation/devicetree/bindings/clock/sprd,sc9863a-clk.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + # Copyright 2019 Unisoc Inc. 3 + %YAML 1.2 4 + --- 5 + $id: "http://devicetree.org/schemas/clock/sprd,sc9863a-clk.yaml#" 6 + $schema: "http://devicetree.org/meta-schemas/core.yaml#" 7 + 8 + title: SC9863A Clock Control Unit Device Tree Bindings 9 + 10 + maintainers: 11 + - Orson Zhai <orsonzhai@gmail.com> 12 + - Baolin Wang <baolin.wang7@gmail.com> 13 + - Chunyan Zhang <zhang.lyra@gmail.com> 14 + 15 + properties: 16 + "#clock-cells": 17 + const: 1 18 + 19 + compatible : 20 + enum: 21 + - sprd,sc9863a-ap-clk 22 + - sprd,sc9863a-aon-clk 23 + - sprd,sc9863a-apahb-gate 24 + - sprd,sc9863a-pmu-gate 25 + - sprd,sc9863a-aonapb-gate 26 + - sprd,sc9863a-pll 27 + - sprd,sc9863a-mpll 28 + - sprd,sc9863a-rpll 29 + - sprd,sc9863a-dpll 30 + - sprd,sc9863a-mm-gate 31 + - sprd,sc9863a-apapb-gate 32 + 33 + clocks: 34 + minItems: 1 35 + maxItems: 4 36 + description: | 37 + The input parent clock(s) phandle for this clock, only list fixed 38 + clocks which are declared in devicetree. 39 + 40 + clock-names: 41 + minItems: 1 42 + maxItems: 4 43 + items: 44 + - const: ext-26m 45 + - const: ext-32k 46 + - const: ext-4m 47 + - const: rco-100m 48 + 49 + reg: 50 + maxItems: 1 51 + 52 + required: 53 + - compatible 54 + - '#clock-cells' 55 + 56 + if: 57 + properties: 58 + compatible: 59 + enum: 60 + - sprd,sc9863a-ap-clk 61 + - sprd,sc9863a-aon-clk 62 + then: 63 + required: 64 + - reg 65 + 66 + else: 67 + description: | 68 + Other SC9863a clock nodes should be the child of a syscon node in 69 + which compatible string shoule be: 70 + "sprd,sc9863a-glbregs", "syscon", "simple-mfd" 71 + 72 + The 'reg' property for the clock node is also required if there is a sub 73 + range of registers for the clocks. 74 + 75 + examples: 76 + - | 77 + ap_clk: clock-controller@21500000 { 78 + compatible = "sprd,sc9863a-ap-clk"; 79 + reg = <0 0x21500000 0 0x1000>; 80 + clocks = <&ext_26m>, <&ext_32k>; 81 + clock-names = "ext-26m", "ext-32k"; 82 + #clock-cells = <1>; 83 + }; 84 + 85 + - | 86 + soc { 87 + #address-cells = <2>; 88 + #size-cells = <2>; 89 + 90 + ap_ahb_regs: syscon@20e00000 { 91 + compatible = "sprd,sc9863a-glbregs", "syscon", "simple-mfd"; 92 + reg = <0 0x20e00000 0 0x4000>; 93 + #address-cells = <1>; 94 + #size-cells = <1>; 95 + ranges = <0 0 0x20e00000 0x4000>; 96 + 97 + apahb_gate: apahb-gate@0 { 98 + compatible = "sprd,sc9863a-apahb-gate"; 99 + reg = <0x0 0x1020>; 100 + #clock-cells = <1>; 101 + }; 102 + }; 103 + }; 104 + 105 + ...
+1 -1
Documentation/devicetree/bindings/clock/sprd.txt Documentation/devicetree/bindings/clock/sprd,sc9860-clk.txt
··· 1 - Spreadtrum Clock Binding 1 + Spreadtrum SC9860 Clock Binding 2 2 ------------------------ 3 3 4 4 Required properties:
+35
Documentation/devicetree/bindings/clock/ti,am654-ehrpwm-tbclk.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/ti,am654-ehrpwm-tbclk.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: TI EHRPWM Time Base Clock 8 + 9 + maintainers: 10 + - Vignesh Raghavendra <vigneshr@ti.com> 11 + 12 + properties: 13 + compatible: 14 + items: 15 + - const: ti,am654-ehrpwm-tbclk 16 + - const: syscon 17 + 18 + "#clock-cells": 19 + const: 1 20 + 21 + reg: 22 + maxItems: 1 23 + 24 + required: 25 + - compatible 26 + - "#clock-cells" 27 + - reg 28 + 29 + examples: 30 + - | 31 + ehrpwm_tbclk: syscon@4140 { 32 + compatible = "ti,am654-ehrpwm-tbclk", "syscon"; 33 + reg = <0x4140 0x18>; 34 + #clock-cells = <1>; 35 + };
+1 -1
MAINTAINERS
··· 1297 1297 S: Maintained 1298 1298 F: Documentation/devicetree/bindings/arm/arm-boards 1299 1299 F: Documentation/devicetree/bindings/auxdisplay/arm-charlcd.txt 1300 - F: Documentation/devicetree/bindings/clock/arm-integrator.txt 1300 + F: Documentation/devicetree/bindings/clock/arm,syscon-icst.yaml 1301 1301 F: Documentation/devicetree/bindings/i2c/i2c-versatile.txt 1302 1302 F: Documentation/devicetree/bindings/interrupt-controller/arm,versatile-fpga-irq.txt 1303 1303 F: Documentation/devicetree/bindings/mtd/arm-versatile.txt
+4
drivers/clk/at91/Makefile
··· 15 15 obj-$(CONFIG_HAVE_AT91_GENERATED_CLK) += clk-generated.o 16 16 obj-$(CONFIG_HAVE_AT91_I2S_MUX_CLK) += clk-i2s-mux.o 17 17 obj-$(CONFIG_HAVE_AT91_SAM9X60_PLL) += clk-sam9x60-pll.o 18 + obj-$(CONFIG_SOC_AT91RM9200) += at91rm9200.o 18 19 obj-$(CONFIG_SOC_AT91SAM9) += at91sam9260.o at91sam9rl.o at91sam9x5.o 20 + obj-$(CONFIG_SOC_AT91SAM9) += at91sam9g45.o 21 + obj-$(CONFIG_SOC_AT91SAM9) += at91sam9n12.o at91sam9x5.o 19 22 obj-$(CONFIG_SOC_SAM9X60) += sam9x60.o 23 + obj-$(CONFIG_SOC_SAMA5D3) += sama5d3.o 20 24 obj-$(CONFIG_SOC_SAMA5D4) += sama5d4.o 21 25 obj-$(CONFIG_SOC_SAMA5D2) += sama5d2.o
+199
drivers/clk/at91/at91rm9200.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <linux/clk-provider.h> 3 + #include <linux/mfd/syscon.h> 4 + #include <linux/slab.h> 5 + 6 + #include <dt-bindings/clock/at91.h> 7 + 8 + #include "pmc.h" 9 + 10 + struct sck { 11 + char *n; 12 + char *p; 13 + u8 id; 14 + }; 15 + 16 + struct pck { 17 + char *n; 18 + u8 id; 19 + }; 20 + 21 + static const struct clk_master_characteristics rm9200_mck_characteristics = { 22 + .output = { .min = 0, .max = 80000000 }, 23 + .divisors = { 1, 2, 3, 4 }, 24 + }; 25 + 26 + static u8 rm9200_pll_out[] = { 0, 2 }; 27 + 28 + static const struct clk_range rm9200_pll_outputs[] = { 29 + { .min = 80000000, .max = 160000000 }, 30 + { .min = 150000000, .max = 180000000 }, 31 + }; 32 + 33 + static const struct clk_pll_characteristics rm9200_pll_characteristics = { 34 + .input = { .min = 1000000, .max = 32000000 }, 35 + .num_output = ARRAY_SIZE(rm9200_pll_outputs), 36 + .output = rm9200_pll_outputs, 37 + .out = rm9200_pll_out, 38 + }; 39 + 40 + static const struct sck at91rm9200_systemck[] = { 41 + { .n = "udpck", .p = "usbck", .id = 2 }, 42 + { .n = "uhpck", .p = "usbck", .id = 4 }, 43 + { .n = "pck0", .p = "prog0", .id = 8 }, 44 + { .n = "pck1", .p = "prog1", .id = 9 }, 45 + { .n = "pck2", .p = "prog2", .id = 10 }, 46 + { .n = "pck3", .p = "prog3", .id = 11 }, 47 + }; 48 + 49 + static const struct pck at91rm9200_periphck[] = { 50 + { .n = "pioA_clk", .id = 2 }, 51 + { .n = "pioB_clk", .id = 3 }, 52 + { .n = "pioC_clk", .id = 4 }, 53 + { .n = "pioD_clk", .id = 5 }, 54 + { .n = "usart0_clk", .id = 6 }, 55 + { .n = "usart1_clk", .id = 7 }, 56 + { .n = "usart2_clk", .id = 8 }, 57 + { .n = "usart3_clk", .id = 9 }, 58 + { .n = "mci0_clk", .id = 10 }, 59 + { .n = "udc_clk", .id = 11 }, 60 + { .n = "twi0_clk", .id = 12 }, 61 + { .n = "spi0_clk", .id = 13 }, 62 + { .n = "ssc0_clk", .id = 14 }, 63 + { .n = "ssc1_clk", .id = 15 }, 64 + { .n = "ssc2_clk", .id = 16 }, 65 + { .n = "tc0_clk", .id = 17 }, 66 + { .n = "tc1_clk", .id = 18 }, 67 + { .n = "tc2_clk", .id = 19 }, 68 + { .n = "tc3_clk", .id = 20 }, 69 + { .n = "tc4_clk", .id = 21 }, 70 + { .n = "tc5_clk", .id = 22 }, 71 + { .n = "ohci_clk", .id = 23 }, 72 + { .n = "macb0_clk", .id = 24 }, 73 + }; 74 + 75 + static void __init at91rm9200_pmc_setup(struct device_node *np) 76 + { 77 + const char *slowxtal_name, *mainxtal_name; 78 + struct pmc_data *at91rm9200_pmc; 79 + u32 usb_div[] = { 1, 2, 0, 0 }; 80 + const char *parent_names[6]; 81 + struct regmap *regmap; 82 + struct clk_hw *hw; 83 + int i; 84 + bool bypass; 85 + 86 + i = of_property_match_string(np, "clock-names", "slow_xtal"); 87 + if (i < 0) 88 + return; 89 + 90 + slowxtal_name = of_clk_get_parent_name(np, i); 91 + 92 + i = of_property_match_string(np, "clock-names", "main_xtal"); 93 + if (i < 0) 94 + return; 95 + mainxtal_name = of_clk_get_parent_name(np, i); 96 + 97 + regmap = device_node_to_regmap(np); 98 + if (IS_ERR(regmap)) 99 + return; 100 + 101 + at91rm9200_pmc = pmc_data_allocate(PMC_MAIN + 1, 102 + nck(at91rm9200_systemck), 103 + nck(at91rm9200_periphck), 0); 104 + if (!at91rm9200_pmc) 105 + return; 106 + 107 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 108 + 109 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 110 + bypass); 111 + if (IS_ERR(hw)) 112 + goto err_free; 113 + 114 + hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc"); 115 + if (IS_ERR(hw)) 116 + goto err_free; 117 + 118 + at91rm9200_pmc->chws[PMC_MAIN] = hw; 119 + 120 + hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0, 121 + &at91rm9200_pll_layout, 122 + &rm9200_pll_characteristics); 123 + if (IS_ERR(hw)) 124 + goto err_free; 125 + 126 + hw = at91_clk_register_pll(regmap, "pllbck", "mainck", 1, 127 + &at91rm9200_pll_layout, 128 + &rm9200_pll_characteristics); 129 + if (IS_ERR(hw)) 130 + goto err_free; 131 + 132 + parent_names[0] = slowxtal_name; 133 + parent_names[1] = "mainck"; 134 + parent_names[2] = "pllack"; 135 + parent_names[3] = "pllbck"; 136 + hw = at91_clk_register_master(regmap, "masterck", 4, parent_names, 137 + &at91rm9200_master_layout, 138 + &rm9200_mck_characteristics); 139 + if (IS_ERR(hw)) 140 + goto err_free; 141 + 142 + at91rm9200_pmc->chws[PMC_MCK] = hw; 143 + 144 + hw = at91rm9200_clk_register_usb(regmap, "usbck", "pllbck", usb_div); 145 + if (IS_ERR(hw)) 146 + goto err_free; 147 + 148 + parent_names[0] = slowxtal_name; 149 + parent_names[1] = "mainck"; 150 + parent_names[2] = "pllack"; 151 + parent_names[3] = "pllbck"; 152 + for (i = 0; i < 4; i++) { 153 + char name[6]; 154 + 155 + snprintf(name, sizeof(name), "prog%d", i); 156 + 157 + hw = at91_clk_register_programmable(regmap, name, 158 + parent_names, 4, i, 159 + &at91rm9200_programmable_layout); 160 + if (IS_ERR(hw)) 161 + goto err_free; 162 + } 163 + 164 + for (i = 0; i < ARRAY_SIZE(at91rm9200_systemck); i++) { 165 + hw = at91_clk_register_system(regmap, at91rm9200_systemck[i].n, 166 + at91rm9200_systemck[i].p, 167 + at91rm9200_systemck[i].id); 168 + if (IS_ERR(hw)) 169 + goto err_free; 170 + 171 + at91rm9200_pmc->shws[at91rm9200_systemck[i].id] = hw; 172 + } 173 + 174 + for (i = 0; i < ARRAY_SIZE(at91rm9200_periphck); i++) { 175 + hw = at91_clk_register_peripheral(regmap, 176 + at91rm9200_periphck[i].n, 177 + "masterck", 178 + at91rm9200_periphck[i].id); 179 + if (IS_ERR(hw)) 180 + goto err_free; 181 + 182 + at91rm9200_pmc->phws[at91rm9200_periphck[i].id] = hw; 183 + } 184 + 185 + of_clk_add_hw_provider(np, of_clk_hw_pmc_get, at91rm9200_pmc); 186 + 187 + return; 188 + 189 + err_free: 190 + pmc_data_free(at91rm9200_pmc); 191 + } 192 + /* 193 + * While the TCB can be used as the clocksource, the system timer is most likely 194 + * to be used instead. However, the pinctrl driver doesn't support probe 195 + * deferring properly. Once this is fixed, this can be switched to a platform 196 + * driver. 197 + */ 198 + CLK_OF_DECLARE_DRIVER(at91rm9200_pmc, "atmel,at91rm9200-pmc", 199 + at91rm9200_pmc_setup);
+220
drivers/clk/at91/at91sam9g45.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <linux/clk-provider.h> 3 + #include <linux/mfd/syscon.h> 4 + #include <linux/slab.h> 5 + 6 + #include <dt-bindings/clock/at91.h> 7 + 8 + #include "pmc.h" 9 + 10 + static const struct clk_master_characteristics mck_characteristics = { 11 + .output = { .min = 0, .max = 133333333 }, 12 + .divisors = { 1, 2, 4, 3 }, 13 + }; 14 + 15 + static u8 plla_out[] = { 0, 1, 2, 3, 0, 1, 2, 3 }; 16 + 17 + static u16 plla_icpll[] = { 0, 0, 0, 0, 1, 1, 1, 1 }; 18 + 19 + static const struct clk_range plla_outputs[] = { 20 + { .min = 745000000, .max = 800000000 }, 21 + { .min = 695000000, .max = 750000000 }, 22 + { .min = 645000000, .max = 700000000 }, 23 + { .min = 595000000, .max = 650000000 }, 24 + { .min = 545000000, .max = 600000000 }, 25 + { .min = 495000000, .max = 555000000 }, 26 + { .min = 445000000, .max = 500000000 }, 27 + { .min = 400000000, .max = 450000000 }, 28 + }; 29 + 30 + static const struct clk_pll_characteristics plla_characteristics = { 31 + .input = { .min = 2000000, .max = 32000000 }, 32 + .num_output = ARRAY_SIZE(plla_outputs), 33 + .output = plla_outputs, 34 + .icpll = plla_icpll, 35 + .out = plla_out, 36 + }; 37 + 38 + static const struct { 39 + char *n; 40 + char *p; 41 + u8 id; 42 + } at91sam9g45_systemck[] = { 43 + { .n = "ddrck", .p = "masterck", .id = 2 }, 44 + { .n = "uhpck", .p = "usbck", .id = 6 }, 45 + { .n = "pck0", .p = "prog0", .id = 8 }, 46 + { .n = "pck1", .p = "prog1", .id = 9 }, 47 + }; 48 + 49 + static const struct clk_pcr_layout at91sam9g45_pcr_layout = { 50 + .offset = 0x10c, 51 + .cmd = BIT(12), 52 + .pid_mask = GENMASK(5, 0), 53 + .div_mask = GENMASK(17, 16), 54 + }; 55 + 56 + struct pck { 57 + char *n; 58 + u8 id; 59 + }; 60 + 61 + static const struct pck at91sam9g45_periphck[] = { 62 + { .n = "pioA_clk", .id = 2, }, 63 + { .n = "pioB_clk", .id = 3, }, 64 + { .n = "pioC_clk", .id = 4, }, 65 + { .n = "pioDE_clk", .id = 5, }, 66 + { .n = "trng_clk", .id = 6, }, 67 + { .n = "usart0_clk", .id = 7, }, 68 + { .n = "usart1_clk", .id = 8, }, 69 + { .n = "usart2_clk", .id = 9, }, 70 + { .n = "usart3_clk", .id = 10, }, 71 + { .n = "mci0_clk", .id = 11, }, 72 + { .n = "twi0_clk", .id = 12, }, 73 + { .n = "twi1_clk", .id = 13, }, 74 + { .n = "spi0_clk", .id = 14, }, 75 + { .n = "spi1_clk", .id = 15, }, 76 + { .n = "ssc0_clk", .id = 16, }, 77 + { .n = "ssc1_clk", .id = 17, }, 78 + { .n = "tcb0_clk", .id = 18, }, 79 + { .n = "pwm_clk", .id = 19, }, 80 + { .n = "adc_clk", .id = 20, }, 81 + { .n = "dma0_clk", .id = 21, }, 82 + { .n = "uhphs_clk", .id = 22, }, 83 + { .n = "lcd_clk", .id = 23, }, 84 + { .n = "ac97_clk", .id = 24, }, 85 + { .n = "macb0_clk", .id = 25, }, 86 + { .n = "isi_clk", .id = 26, }, 87 + { .n = "udphs_clk", .id = 27, }, 88 + { .n = "aestdessha_clk", .id = 28, }, 89 + { .n = "mci1_clk", .id = 29, }, 90 + { .n = "vdec_clk", .id = 30, }, 91 + }; 92 + 93 + static void __init at91sam9g45_pmc_setup(struct device_node *np) 94 + { 95 + const char *slck_name, *mainxtal_name; 96 + struct pmc_data *at91sam9g45_pmc; 97 + const char *parent_names[6]; 98 + struct regmap *regmap; 99 + struct clk_hw *hw; 100 + int i; 101 + bool bypass; 102 + 103 + i = of_property_match_string(np, "clock-names", "slow_clk"); 104 + if (i < 0) 105 + return; 106 + 107 + slck_name = of_clk_get_parent_name(np, i); 108 + 109 + i = of_property_match_string(np, "clock-names", "main_xtal"); 110 + if (i < 0) 111 + return; 112 + mainxtal_name = of_clk_get_parent_name(np, i); 113 + 114 + regmap = syscon_node_to_regmap(np); 115 + if (IS_ERR(regmap)) 116 + return; 117 + 118 + at91sam9g45_pmc = pmc_data_allocate(PMC_MAIN + 1, 119 + nck(at91sam9g45_systemck), 120 + nck(at91sam9g45_periphck), 0); 121 + if (!at91sam9g45_pmc) 122 + return; 123 + 124 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 125 + 126 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 127 + bypass); 128 + if (IS_ERR(hw)) 129 + goto err_free; 130 + 131 + hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc"); 132 + if (IS_ERR(hw)) 133 + goto err_free; 134 + 135 + at91sam9g45_pmc->chws[PMC_MAIN] = hw; 136 + 137 + hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0, 138 + &at91rm9200_pll_layout, &plla_characteristics); 139 + if (IS_ERR(hw)) 140 + goto err_free; 141 + 142 + hw = at91_clk_register_plldiv(regmap, "plladivck", "pllack"); 143 + if (IS_ERR(hw)) 144 + goto err_free; 145 + 146 + hw = at91_clk_register_utmi(regmap, NULL, "utmick", "mainck"); 147 + if (IS_ERR(hw)) 148 + goto err_free; 149 + 150 + at91sam9g45_pmc->chws[PMC_UTMI] = hw; 151 + 152 + parent_names[0] = slck_name; 153 + parent_names[1] = "mainck"; 154 + parent_names[2] = "plladivck"; 155 + parent_names[3] = "utmick"; 156 + hw = at91_clk_register_master(regmap, "masterck", 4, parent_names, 157 + &at91rm9200_master_layout, 158 + &mck_characteristics); 159 + if (IS_ERR(hw)) 160 + goto err_free; 161 + 162 + at91sam9g45_pmc->chws[PMC_MCK] = hw; 163 + 164 + parent_names[0] = "plladivck"; 165 + parent_names[1] = "utmick"; 166 + hw = at91sam9x5_clk_register_usb(regmap, "usbck", parent_names, 2); 167 + if (IS_ERR(hw)) 168 + goto err_free; 169 + 170 + parent_names[0] = slck_name; 171 + parent_names[1] = "mainck"; 172 + parent_names[2] = "plladivck"; 173 + parent_names[3] = "utmick"; 174 + parent_names[4] = "masterck"; 175 + for (i = 0; i < 2; i++) { 176 + char name[6]; 177 + 178 + snprintf(name, sizeof(name), "prog%d", i); 179 + 180 + hw = at91_clk_register_programmable(regmap, name, 181 + parent_names, 5, i, 182 + &at91sam9g45_programmable_layout); 183 + if (IS_ERR(hw)) 184 + goto err_free; 185 + } 186 + 187 + for (i = 0; i < ARRAY_SIZE(at91sam9g45_systemck); i++) { 188 + hw = at91_clk_register_system(regmap, at91sam9g45_systemck[i].n, 189 + at91sam9g45_systemck[i].p, 190 + at91sam9g45_systemck[i].id); 191 + if (IS_ERR(hw)) 192 + goto err_free; 193 + 194 + at91sam9g45_pmc->shws[at91sam9g45_systemck[i].id] = hw; 195 + } 196 + 197 + for (i = 0; i < ARRAY_SIZE(at91sam9g45_periphck); i++) { 198 + hw = at91_clk_register_peripheral(regmap, 199 + at91sam9g45_periphck[i].n, 200 + "masterck", 201 + at91sam9g45_periphck[i].id); 202 + if (IS_ERR(hw)) 203 + goto err_free; 204 + 205 + at91sam9g45_pmc->phws[at91sam9g45_periphck[i].id] = hw; 206 + } 207 + 208 + of_clk_add_hw_provider(np, of_clk_hw_pmc_get, at91sam9g45_pmc); 209 + 210 + return; 211 + 212 + err_free: 213 + pmc_data_free(at91sam9g45_pmc); 214 + } 215 + /* 216 + * The TCB is used as the clocksource so its clock is needed early. This means 217 + * this can't be a platform driver. 218 + */ 219 + CLK_OF_DECLARE_DRIVER(at91sam9g45_pmc, "atmel,at91sam9g45-pmc", 220 + at91sam9g45_pmc_setup);
+238
drivers/clk/at91/at91sam9n12.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <linux/clk-provider.h> 3 + #include <linux/mfd/syscon.h> 4 + #include <linux/slab.h> 5 + 6 + #include <dt-bindings/clock/at91.h> 7 + 8 + #include "pmc.h" 9 + 10 + static const struct clk_master_characteristics mck_characteristics = { 11 + .output = { .min = 0, .max = 133333333 }, 12 + .divisors = { 1, 2, 4, 3 }, 13 + .have_div3_pres = 1, 14 + }; 15 + 16 + static u8 plla_out[] = { 0, 1, 2, 3, 0, 1, 2, 3 }; 17 + 18 + static u16 plla_icpll[] = { 0, 0, 0, 0, 1, 1, 1, 1 }; 19 + 20 + static const struct clk_range plla_outputs[] = { 21 + { .min = 745000000, .max = 800000000 }, 22 + { .min = 695000000, .max = 750000000 }, 23 + { .min = 645000000, .max = 700000000 }, 24 + { .min = 595000000, .max = 650000000 }, 25 + { .min = 545000000, .max = 600000000 }, 26 + { .min = 495000000, .max = 555000000 }, 27 + { .min = 445000000, .max = 500000000 }, 28 + { .min = 400000000, .max = 450000000 }, 29 + }; 30 + 31 + static const struct clk_pll_characteristics plla_characteristics = { 32 + .input = { .min = 2000000, .max = 32000000 }, 33 + .num_output = ARRAY_SIZE(plla_outputs), 34 + .output = plla_outputs, 35 + .icpll = plla_icpll, 36 + .out = plla_out, 37 + }; 38 + 39 + static u8 pllb_out[] = { 0 }; 40 + 41 + static const struct clk_range pllb_outputs[] = { 42 + { .min = 30000000, .max = 100000000 }, 43 + }; 44 + 45 + static const struct clk_pll_characteristics pllb_characteristics = { 46 + .input = { .min = 2000000, .max = 32000000 }, 47 + .num_output = ARRAY_SIZE(pllb_outputs), 48 + .output = pllb_outputs, 49 + .out = pllb_out, 50 + }; 51 + 52 + static const struct { 53 + char *n; 54 + char *p; 55 + u8 id; 56 + } at91sam9n12_systemck[] = { 57 + { .n = "ddrck", .p = "masterck", .id = 2 }, 58 + { .n = "lcdck", .p = "masterck", .id = 3 }, 59 + { .n = "uhpck", .p = "usbck", .id = 6 }, 60 + { .n = "udpck", .p = "usbck", .id = 7 }, 61 + { .n = "pck0", .p = "prog0", .id = 8 }, 62 + { .n = "pck1", .p = "prog1", .id = 9 }, 63 + }; 64 + 65 + static const struct clk_pcr_layout at91sam9n12_pcr_layout = { 66 + .offset = 0x10c, 67 + .cmd = BIT(12), 68 + .pid_mask = GENMASK(5, 0), 69 + .div_mask = GENMASK(17, 16), 70 + }; 71 + 72 + struct pck { 73 + char *n; 74 + u8 id; 75 + }; 76 + 77 + static const struct pck at91sam9n12_periphck[] = { 78 + { .n = "pioAB_clk", .id = 2, }, 79 + { .n = "pioCD_clk", .id = 3, }, 80 + { .n = "fuse_clk", .id = 4, }, 81 + { .n = "usart0_clk", .id = 5, }, 82 + { .n = "usart1_clk", .id = 6, }, 83 + { .n = "usart2_clk", .id = 7, }, 84 + { .n = "usart3_clk", .id = 8, }, 85 + { .n = "twi0_clk", .id = 9, }, 86 + { .n = "twi1_clk", .id = 10, }, 87 + { .n = "mci0_clk", .id = 12, }, 88 + { .n = "spi0_clk", .id = 13, }, 89 + { .n = "spi1_clk", .id = 14, }, 90 + { .n = "uart0_clk", .id = 15, }, 91 + { .n = "uart1_clk", .id = 16, }, 92 + { .n = "tcb_clk", .id = 17, }, 93 + { .n = "pwm_clk", .id = 18, }, 94 + { .n = "adc_clk", .id = 19, }, 95 + { .n = "dma0_clk", .id = 20, }, 96 + { .n = "uhphs_clk", .id = 22, }, 97 + { .n = "udphs_clk", .id = 23, }, 98 + { .n = "lcdc_clk", .id = 25, }, 99 + { .n = "sha_clk", .id = 27, }, 100 + { .n = "ssc0_clk", .id = 28, }, 101 + { .n = "aes_clk", .id = 29, }, 102 + { .n = "trng_clk", .id = 30, }, 103 + }; 104 + 105 + static void __init at91sam9n12_pmc_setup(struct device_node *np) 106 + { 107 + struct clk_range range = CLK_RANGE(0, 0); 108 + const char *slck_name, *mainxtal_name; 109 + struct pmc_data *at91sam9n12_pmc; 110 + const char *parent_names[6]; 111 + struct regmap *regmap; 112 + struct clk_hw *hw; 113 + int i; 114 + bool bypass; 115 + 116 + i = of_property_match_string(np, "clock-names", "slow_clk"); 117 + if (i < 0) 118 + return; 119 + 120 + slck_name = of_clk_get_parent_name(np, i); 121 + 122 + i = of_property_match_string(np, "clock-names", "main_xtal"); 123 + if (i < 0) 124 + return; 125 + mainxtal_name = of_clk_get_parent_name(np, i); 126 + 127 + regmap = syscon_node_to_regmap(np); 128 + if (IS_ERR(regmap)) 129 + return; 130 + 131 + at91sam9n12_pmc = pmc_data_allocate(PMC_MAIN + 1, 132 + nck(at91sam9n12_systemck), 31, 0); 133 + if (!at91sam9n12_pmc) 134 + return; 135 + 136 + hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000, 137 + 50000000); 138 + if (IS_ERR(hw)) 139 + goto err_free; 140 + 141 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 142 + 143 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 144 + bypass); 145 + if (IS_ERR(hw)) 146 + goto err_free; 147 + 148 + parent_names[0] = "main_rc_osc"; 149 + parent_names[1] = "main_osc"; 150 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 151 + if (IS_ERR(hw)) 152 + goto err_free; 153 + 154 + at91sam9n12_pmc->chws[PMC_MAIN] = hw; 155 + 156 + hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0, 157 + &at91rm9200_pll_layout, &plla_characteristics); 158 + if (IS_ERR(hw)) 159 + goto err_free; 160 + 161 + hw = at91_clk_register_plldiv(regmap, "plladivck", "pllack"); 162 + if (IS_ERR(hw)) 163 + goto err_free; 164 + 165 + hw = at91_clk_register_pll(regmap, "pllbck", "mainck", 1, 166 + &at91rm9200_pll_layout, &pllb_characteristics); 167 + if (IS_ERR(hw)) 168 + goto err_free; 169 + 170 + parent_names[0] = slck_name; 171 + parent_names[1] = "mainck"; 172 + parent_names[2] = "plladivck"; 173 + parent_names[3] = "pllbck"; 174 + hw = at91_clk_register_master(regmap, "masterck", 4, parent_names, 175 + &at91sam9x5_master_layout, 176 + &mck_characteristics); 177 + if (IS_ERR(hw)) 178 + goto err_free; 179 + 180 + at91sam9n12_pmc->chws[PMC_MCK] = hw; 181 + 182 + hw = at91sam9n12_clk_register_usb(regmap, "usbck", "pllbck"); 183 + if (IS_ERR(hw)) 184 + goto err_free; 185 + 186 + parent_names[0] = slck_name; 187 + parent_names[1] = "mainck"; 188 + parent_names[2] = "plladivck"; 189 + parent_names[3] = "pllbck"; 190 + parent_names[4] = "masterck"; 191 + for (i = 0; i < 2; i++) { 192 + char name[6]; 193 + 194 + snprintf(name, sizeof(name), "prog%d", i); 195 + 196 + hw = at91_clk_register_programmable(regmap, name, 197 + parent_names, 5, i, 198 + &at91sam9x5_programmable_layout); 199 + if (IS_ERR(hw)) 200 + goto err_free; 201 + } 202 + 203 + for (i = 0; i < ARRAY_SIZE(at91sam9n12_systemck); i++) { 204 + hw = at91_clk_register_system(regmap, at91sam9n12_systemck[i].n, 205 + at91sam9n12_systemck[i].p, 206 + at91sam9n12_systemck[i].id); 207 + if (IS_ERR(hw)) 208 + goto err_free; 209 + 210 + at91sam9n12_pmc->shws[at91sam9n12_systemck[i].id] = hw; 211 + } 212 + 213 + for (i = 0; i < ARRAY_SIZE(at91sam9n12_periphck); i++) { 214 + hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock, 215 + &at91sam9n12_pcr_layout, 216 + at91sam9n12_periphck[i].n, 217 + "masterck", 218 + at91sam9n12_periphck[i].id, 219 + &range); 220 + if (IS_ERR(hw)) 221 + goto err_free; 222 + 223 + at91sam9n12_pmc->phws[at91sam9n12_periphck[i].id] = hw; 224 + } 225 + 226 + of_clk_add_hw_provider(np, of_clk_hw_pmc_get, at91sam9n12_pmc); 227 + 228 + return; 229 + 230 + err_free: 231 + pmc_data_free(at91sam9n12_pmc); 232 + } 233 + /* 234 + * The TCB is used as the clocksource so its clock is needed early. This means 235 + * this can't be a platform driver. 236 + */ 237 + CLK_OF_DECLARE_DRIVER(at91sam9n12_pmc, "atmel,at91sam9n12-pmc", 238 + at91sam9n12_pmc_setup);
+7 -2
drivers/clk/at91/clk-usb.c
··· 25 25 struct clk_hw hw; 26 26 struct regmap *regmap; 27 27 u32 usbs_mask; 28 + u8 num_parents; 28 29 }; 29 30 30 31 #define to_at91sam9x5_clk_usb(hw) \ ··· 76 75 tmp_parent_rate = req->rate * div; 77 76 tmp_parent_rate = clk_hw_round_rate(parent, 78 77 tmp_parent_rate); 78 + if (!tmp_parent_rate) 79 + continue; 80 + 79 81 tmp_rate = DIV_ROUND_CLOSEST(tmp_parent_rate, div); 80 82 if (tmp_rate < req->rate) 81 83 tmp_diff = req->rate - tmp_rate; ··· 111 107 { 112 108 struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw); 113 109 114 - if (index > 1) 110 + if (index >= usb->num_parents) 115 111 return -EINVAL; 116 112 117 113 regmap_update_bits(usb->regmap, AT91_PMC_USB, usb->usbs_mask, index); ··· 215 211 216 212 usb->hw.init = &init; 217 213 usb->regmap = regmap; 218 - usb->usbs_mask = SAM9X5_USBS_MASK; 214 + usb->usbs_mask = usbs_mask; 215 + usb->num_parents = num_parents; 219 216 220 217 hw = &usb->hw; 221 218 ret = clk_hw_register(NULL, &usb->hw);
+5 -9
drivers/clk/at91/sam9x60.c
··· 124 124 char *n; 125 125 u8 id; 126 126 struct clk_range r; 127 - bool pll; 128 127 } sam9x60_gck[] = { 129 128 { .n = "flex0_gclk", .id = 5, }, 130 129 { .n = "flex1_gclk", .id = 6, }, ··· 143 144 { .n = "sdmmc1_gclk", .id = 26, .r = { .min = 0, .max = 105000000 }, }, 144 145 { .n = "flex11_gclk", .id = 32, }, 145 146 { .n = "flex12_gclk", .id = 33, }, 146 - { .n = "i2s_gclk", .id = 34, .r = { .min = 0, .max = 105000000 }, 147 - .pll = true, }, 147 + { .n = "i2s_gclk", .id = 34, .r = { .min = 0, .max = 105000000 }, }, 148 148 { .n = "pit64b_gclk", .id = 37, }, 149 - { .n = "classd_gclk", .id = 42, .r = { .min = 0, .max = 100000000 }, 150 - .pll = true, }, 149 + { .n = "classd_gclk", .id = 42, .r = { .min = 0, .max = 100000000 }, }, 151 150 { .n = "tcb1_gclk", .id = 45, }, 152 151 { .n = "dbgu_gclk", .id = 47, }, 153 152 }; ··· 234 237 235 238 parent_names[0] = "pllack"; 236 239 parent_names[1] = "upllck"; 237 - parent_names[2] = "mainck"; 238 - parent_names[3] = "mainck"; 239 - hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 4); 240 + parent_names[2] = "main_osc"; 241 + hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 3); 240 242 if (IS_ERR(hw)) 241 243 goto err_free; 242 244 ··· 286 290 sam9x60_gck[i].n, 287 291 parent_names, 6, 288 292 sam9x60_gck[i].id, 289 - sam9x60_gck[i].pll, 293 + false, 290 294 &sam9x60_gck[i].r); 291 295 if (IS_ERR(hw)) 292 296 goto err_free;
+240
drivers/clk/at91/sama5d3.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <linux/clk-provider.h> 3 + #include <linux/mfd/syscon.h> 4 + #include <linux/slab.h> 5 + 6 + #include <dt-bindings/clock/at91.h> 7 + 8 + #include "pmc.h" 9 + 10 + static const struct clk_master_characteristics mck_characteristics = { 11 + .output = { .min = 0, .max = 166000000 }, 12 + .divisors = { 1, 2, 4, 3 }, 13 + }; 14 + 15 + static u8 plla_out[] = { 0 }; 16 + 17 + static u16 plla_icpll[] = { 0 }; 18 + 19 + static const struct clk_range plla_outputs[] = { 20 + { .min = 400000000, .max = 1000000000 }, 21 + }; 22 + 23 + static const struct clk_pll_characteristics plla_characteristics = { 24 + .input = { .min = 8000000, .max = 50000000 }, 25 + .num_output = ARRAY_SIZE(plla_outputs), 26 + .output = plla_outputs, 27 + .icpll = plla_icpll, 28 + .out = plla_out, 29 + }; 30 + 31 + static const struct clk_pcr_layout sama5d3_pcr_layout = { 32 + .offset = 0x10c, 33 + .cmd = BIT(12), 34 + .pid_mask = GENMASK(6, 0), 35 + .div_mask = GENMASK(17, 16), 36 + }; 37 + 38 + static const struct { 39 + char *n; 40 + char *p; 41 + u8 id; 42 + } sama5d3_systemck[] = { 43 + { .n = "ddrck", .p = "masterck", .id = 2 }, 44 + { .n = "lcdck", .p = "masterck", .id = 3 }, 45 + { .n = "smdck", .p = "smdclk", .id = 4 }, 46 + { .n = "uhpck", .p = "usbck", .id = 6 }, 47 + { .n = "udpck", .p = "usbck", .id = 7 }, 48 + { .n = "pck0", .p = "prog0", .id = 8 }, 49 + { .n = "pck1", .p = "prog1", .id = 9 }, 50 + { .n = "pck2", .p = "prog2", .id = 10 }, 51 + }; 52 + 53 + static const struct { 54 + char *n; 55 + u8 id; 56 + struct clk_range r; 57 + } sama5d3_periphck[] = { 58 + { .n = "dbgu_clk", .id = 2, }, 59 + { .n = "hsmc_clk", .id = 5, }, 60 + { .n = "pioA_clk", .id = 6, }, 61 + { .n = "pioB_clk", .id = 7, }, 62 + { .n = "pioC_clk", .id = 8, }, 63 + { .n = "pioD_clk", .id = 9, }, 64 + { .n = "pioE_clk", .id = 10, }, 65 + { .n = "usart0_clk", .id = 12, .r = { .min = 0, .max = 83000000 }, }, 66 + { .n = "usart1_clk", .id = 13, .r = { .min = 0, .max = 83000000 }, }, 67 + { .n = "usart2_clk", .id = 14, .r = { .min = 0, .max = 83000000 }, }, 68 + { .n = "usart3_clk", .id = 15, .r = { .min = 0, .max = 83000000 }, }, 69 + { .n = "uart0_clk", .id = 16, .r = { .min = 0, .max = 83000000 }, }, 70 + { .n = "uart1_clk", .id = 17, .r = { .min = 0, .max = 83000000 }, }, 71 + { .n = "twi0_clk", .id = 18, .r = { .min = 0, .max = 41500000 }, }, 72 + { .n = "twi1_clk", .id = 19, .r = { .min = 0, .max = 41500000 }, }, 73 + { .n = "twi2_clk", .id = 20, .r = { .min = 0, .max = 41500000 }, }, 74 + { .n = "mci0_clk", .id = 21, }, 75 + { .n = "mci1_clk", .id = 22, }, 76 + { .n = "mci2_clk", .id = 23, }, 77 + { .n = "spi0_clk", .id = 24, .r = { .min = 0, .max = 166000000 }, }, 78 + { .n = "spi1_clk", .id = 25, .r = { .min = 0, .max = 166000000 }, }, 79 + { .n = "tcb0_clk", .id = 26, .r = { .min = 0, .max = 166000000 }, }, 80 + { .n = "tcb1_clk", .id = 27, .r = { .min = 0, .max = 166000000 }, }, 81 + { .n = "pwm_clk", .id = 28, }, 82 + { .n = "adc_clk", .id = 29, .r = { .min = 0, .max = 83000000 }, }, 83 + { .n = "dma0_clk", .id = 30, }, 84 + { .n = "dma1_clk", .id = 31, }, 85 + { .n = "uhphs_clk", .id = 32, }, 86 + { .n = "udphs_clk", .id = 33, }, 87 + { .n = "macb0_clk", .id = 34, }, 88 + { .n = "macb1_clk", .id = 35, }, 89 + { .n = "lcdc_clk", .id = 36, }, 90 + { .n = "isi_clk", .id = 37, }, 91 + { .n = "ssc0_clk", .id = 38, .r = { .min = 0, .max = 83000000 }, }, 92 + { .n = "ssc1_clk", .id = 39, .r = { .min = 0, .max = 83000000 }, }, 93 + { .n = "can0_clk", .id = 40, .r = { .min = 0, .max = 83000000 }, }, 94 + { .n = "can1_clk", .id = 41, .r = { .min = 0, .max = 83000000 }, }, 95 + { .n = "sha_clk", .id = 42, }, 96 + { .n = "aes_clk", .id = 43, }, 97 + { .n = "tdes_clk", .id = 44, }, 98 + { .n = "trng_clk", .id = 45, }, 99 + { .n = "fuse_clk", .id = 48, }, 100 + { .n = "mpddr_clk", .id = 49, }, 101 + }; 102 + 103 + static void __init sama5d3_pmc_setup(struct device_node *np) 104 + { 105 + const char *slck_name, *mainxtal_name; 106 + struct pmc_data *sama5d3_pmc; 107 + const char *parent_names[5]; 108 + struct regmap *regmap; 109 + struct clk_hw *hw; 110 + int i; 111 + bool bypass; 112 + 113 + i = of_property_match_string(np, "clock-names", "slow_clk"); 114 + if (i < 0) 115 + return; 116 + 117 + slck_name = of_clk_get_parent_name(np, i); 118 + 119 + i = of_property_match_string(np, "clock-names", "main_xtal"); 120 + if (i < 0) 121 + return; 122 + mainxtal_name = of_clk_get_parent_name(np, i); 123 + 124 + regmap = syscon_node_to_regmap(np); 125 + if (IS_ERR(regmap)) 126 + return; 127 + 128 + sama5d3_pmc = pmc_data_allocate(PMC_MAIN + 1, 129 + nck(sama5d3_systemck), 130 + nck(sama5d3_periphck), 0); 131 + if (!sama5d3_pmc) 132 + return; 133 + 134 + hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000, 135 + 50000000); 136 + if (IS_ERR(hw)) 137 + goto err_free; 138 + 139 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 140 + 141 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 142 + bypass); 143 + if (IS_ERR(hw)) 144 + goto err_free; 145 + 146 + parent_names[0] = "main_rc_osc"; 147 + parent_names[1] = "main_osc"; 148 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 149 + if (IS_ERR(hw)) 150 + goto err_free; 151 + 152 + hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0, 153 + &sama5d3_pll_layout, &plla_characteristics); 154 + if (IS_ERR(hw)) 155 + goto err_free; 156 + 157 + hw = at91_clk_register_plldiv(regmap, "plladivck", "pllack"); 158 + if (IS_ERR(hw)) 159 + goto err_free; 160 + 161 + hw = at91_clk_register_utmi(regmap, NULL, "utmick", "mainck"); 162 + if (IS_ERR(hw)) 163 + goto err_free; 164 + 165 + sama5d3_pmc->chws[PMC_UTMI] = hw; 166 + 167 + parent_names[0] = slck_name; 168 + parent_names[1] = "mainck"; 169 + parent_names[2] = "plladivck"; 170 + parent_names[3] = "utmick"; 171 + hw = at91_clk_register_master(regmap, "masterck", 4, parent_names, 172 + &at91sam9x5_master_layout, 173 + &mck_characteristics); 174 + if (IS_ERR(hw)) 175 + goto err_free; 176 + 177 + sama5d3_pmc->chws[PMC_MCK] = hw; 178 + 179 + parent_names[0] = "plladivck"; 180 + parent_names[1] = "utmick"; 181 + hw = at91sam9x5_clk_register_usb(regmap, "usbck", parent_names, 2); 182 + if (IS_ERR(hw)) 183 + goto err_free; 184 + 185 + hw = at91sam9x5_clk_register_smd(regmap, "smdclk", parent_names, 2); 186 + if (IS_ERR(hw)) 187 + goto err_free; 188 + 189 + parent_names[0] = slck_name; 190 + parent_names[1] = "mainck"; 191 + parent_names[2] = "plladivck"; 192 + parent_names[3] = "utmick"; 193 + parent_names[4] = "masterck"; 194 + for (i = 0; i < 3; i++) { 195 + char name[6]; 196 + 197 + snprintf(name, sizeof(name), "prog%d", i); 198 + 199 + hw = at91_clk_register_programmable(regmap, name, 200 + parent_names, 5, i, 201 + &at91sam9x5_programmable_layout); 202 + if (IS_ERR(hw)) 203 + goto err_free; 204 + } 205 + 206 + for (i = 0; i < ARRAY_SIZE(sama5d3_systemck); i++) { 207 + hw = at91_clk_register_system(regmap, sama5d3_systemck[i].n, 208 + sama5d3_systemck[i].p, 209 + sama5d3_systemck[i].id); 210 + if (IS_ERR(hw)) 211 + goto err_free; 212 + 213 + sama5d3_pmc->shws[sama5d3_systemck[i].id] = hw; 214 + } 215 + 216 + for (i = 0; i < ARRAY_SIZE(sama5d3_periphck); i++) { 217 + hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock, 218 + &sama5d3_pcr_layout, 219 + sama5d3_periphck[i].n, 220 + "masterck", 221 + sama5d3_periphck[i].id, 222 + &sama5d3_periphck[i].r); 223 + if (IS_ERR(hw)) 224 + goto err_free; 225 + 226 + sama5d3_pmc->phws[sama5d3_periphck[i].id] = hw; 227 + } 228 + 229 + of_clk_add_hw_provider(np, of_clk_hw_pmc_get, sama5d3_pmc); 230 + 231 + return; 232 + 233 + err_free: 234 + pmc_data_free(sama5d3_pmc); 235 + } 236 + /* 237 + * The TCB is used as the clocksource so its clock is needed early. This means 238 + * this can't be a platform driver. 239 + */ 240 + CLK_OF_DECLARE_DRIVER(sama5d3_pmc, "atmel,sama5d3-pmc", sama5d3_pmc_setup);
+196 -16
drivers/clk/clk-si5341.c
··· 16 16 #include <linux/slab.h> 17 17 #include <asm/unaligned.h> 18 18 19 + #define SI5341_NUM_INPUTS 4 20 + 19 21 #define SI5341_MAX_NUM_OUTPUTS 10 20 22 #define SI5340_MAX_NUM_OUTPUTS 4 21 23 ··· 58 56 struct i2c_client *i2c_client; 59 57 struct clk_si5341_synth synth[SI5341_NUM_SYNTH]; 60 58 struct clk_si5341_output clk[SI5341_MAX_NUM_OUTPUTS]; 61 - struct clk *pxtal; 62 - const char *pxtal_name; 59 + struct clk *input_clk[SI5341_NUM_INPUTS]; 60 + const char *input_clk_name[SI5341_NUM_INPUTS]; 63 61 const u16 *reg_output_offset; 64 62 const u16 *reg_rdiv_offset; 65 63 u64 freq_vco; /* 13500–14256 MHz */ ··· 80 78 #define SI5341_DEVICE_REV 0x0005 81 79 #define SI5341_STATUS 0x000C 82 80 #define SI5341_SOFT_RST 0x001C 81 + #define SI5341_IN_SEL 0x0021 82 + #define SI5341_XAXB_CFG 0x090E 83 + #define SI5341_IN_EN 0x0949 84 + #define SI5341_INX_TO_PFD_EN 0x094A 85 + 86 + /* Input selection */ 87 + #define SI5341_IN_SEL_MASK 0x06 88 + #define SI5341_IN_SEL_SHIFT 1 89 + #define SI5341_IN_SEL_REGCTRL 0x01 90 + #define SI5341_INX_TO_PFD_SHIFT 4 91 + 92 + /* XTAL config bits */ 93 + #define SI5341_XAXB_CFG_EXTCLK_EN BIT(0) 94 + #define SI5341_XAXB_CFG_PDNB BIT(1) 83 95 84 96 /* Input dividers (48-bit) */ 85 97 #define SI5341_IN_PDIV(x) (0x0208 + ((x) * 10)) 86 98 #define SI5341_IN_PSET(x) (0x020E + ((x) * 10)) 99 + #define SI5341_PX_UPD 0x0230 87 100 88 101 /* PLL configuration */ 89 102 #define SI5341_PLL_M_NUM 0x0235 ··· 135 118 struct si5341_reg_default { 136 119 u16 address; 137 120 u8 value; 121 + }; 122 + 123 + static const char * const si5341_input_clock_names[] = { 124 + "in0", "in1", "in2", "xtal" 138 125 }; 139 126 140 127 /* Output configuration registers 0..9 are not quite logically organized */ ··· 411 390 return (unsigned long)res; 412 391 } 413 392 393 + static int si5341_clk_get_selected_input(struct clk_si5341 *data) 394 + { 395 + int err; 396 + u32 val; 397 + 398 + err = regmap_read(data->regmap, SI5341_IN_SEL, &val); 399 + if (err < 0) 400 + return err; 401 + 402 + return (val & SI5341_IN_SEL_MASK) >> SI5341_IN_SEL_SHIFT; 403 + } 404 + 405 + static u8 si5341_clk_get_parent(struct clk_hw *hw) 406 + { 407 + struct clk_si5341 *data = to_clk_si5341(hw); 408 + int res = si5341_clk_get_selected_input(data); 409 + 410 + if (res < 0) 411 + return 0; /* Apparently we cannot report errors */ 412 + 413 + return res; 414 + } 415 + 416 + static int si5341_clk_reparent(struct clk_si5341 *data, u8 index) 417 + { 418 + int err; 419 + u8 val; 420 + 421 + val = (index << SI5341_IN_SEL_SHIFT) & SI5341_IN_SEL_MASK; 422 + /* Enable register-based input selection */ 423 + val |= SI5341_IN_SEL_REGCTRL; 424 + 425 + err = regmap_update_bits(data->regmap, 426 + SI5341_IN_SEL, SI5341_IN_SEL_REGCTRL | SI5341_IN_SEL_MASK, val); 427 + if (err < 0) 428 + return err; 429 + 430 + if (index < 3) { 431 + /* Enable input buffer for selected input */ 432 + err = regmap_update_bits(data->regmap, 433 + SI5341_IN_EN, 0x07, BIT(index)); 434 + if (err < 0) 435 + return err; 436 + 437 + /* Enables the input to phase detector */ 438 + err = regmap_update_bits(data->regmap, SI5341_INX_TO_PFD_EN, 439 + 0x7 << SI5341_INX_TO_PFD_SHIFT, 440 + BIT(index + SI5341_INX_TO_PFD_SHIFT)); 441 + if (err < 0) 442 + return err; 443 + 444 + /* Power down XTAL oscillator and buffer */ 445 + err = regmap_update_bits(data->regmap, SI5341_XAXB_CFG, 446 + SI5341_XAXB_CFG_PDNB, 0); 447 + if (err < 0) 448 + return err; 449 + 450 + /* 451 + * Set the P divider to "1". There's no explanation in the 452 + * datasheet of these registers, but the clockbuilder software 453 + * programs a "1" when the input is being used. 454 + */ 455 + err = regmap_write(data->regmap, SI5341_IN_PDIV(index), 1); 456 + if (err < 0) 457 + return err; 458 + 459 + err = regmap_write(data->regmap, SI5341_IN_PSET(index), 1); 460 + if (err < 0) 461 + return err; 462 + 463 + /* Set update PDIV bit */ 464 + err = regmap_write(data->regmap, SI5341_PX_UPD, BIT(index)); 465 + if (err < 0) 466 + return err; 467 + } else { 468 + /* Disable all input buffers */ 469 + err = regmap_update_bits(data->regmap, SI5341_IN_EN, 0x07, 0); 470 + if (err < 0) 471 + return err; 472 + 473 + /* Disable input to phase detector */ 474 + err = regmap_update_bits(data->regmap, SI5341_INX_TO_PFD_EN, 475 + 0x7 << SI5341_INX_TO_PFD_SHIFT, 0); 476 + if (err < 0) 477 + return err; 478 + 479 + /* Power up XTAL oscillator and buffer */ 480 + err = regmap_update_bits(data->regmap, SI5341_XAXB_CFG, 481 + SI5341_XAXB_CFG_PDNB, SI5341_XAXB_CFG_PDNB); 482 + if (err < 0) 483 + return err; 484 + } 485 + 486 + return 0; 487 + } 488 + 489 + static int si5341_clk_set_parent(struct clk_hw *hw, u8 index) 490 + { 491 + struct clk_si5341 *data = to_clk_si5341(hw); 492 + 493 + return si5341_clk_reparent(data, index); 494 + } 495 + 414 496 static const struct clk_ops si5341_clk_ops = { 497 + .set_parent = si5341_clk_set_parent, 498 + .get_parent = si5341_clk_get_parent, 415 499 .recalc_rate = si5341_clk_recalc_rate, 416 500 }; 417 501 ··· 1111 985 regmap_reg_range(0x000C, 0x0012), /* Status */ 1112 986 regmap_reg_range(0x001C, 0x001E), /* reset, finc/fdec */ 1113 987 regmap_reg_range(0x00E2, 0x00FE), /* NVM, interrupts, device ready */ 1114 - /* Update bits for synth config */ 988 + /* Update bits for P divider and synth config */ 989 + regmap_reg_range(SI5341_PX_UPD, SI5341_PX_UPD), 1115 990 regmap_reg_range(SI5341_SYNTH_N_UPD(0), SI5341_SYNTH_N_UPD(0)), 1116 991 regmap_reg_range(SI5341_SYNTH_N_UPD(1), SI5341_SYNTH_N_UPD(1)), 1117 992 regmap_reg_range(SI5341_SYNTH_N_UPD(2), SI5341_SYNTH_N_UPD(2)), ··· 1249 1122 struct device_node *np = data->i2c_client->dev.of_node; 1250 1123 u32 m_num = 0; 1251 1124 u32 m_den = 0; 1125 + int sel; 1252 1126 1253 1127 if (of_property_read_u32(np, "silabs,pll-m-num", &m_num)) { 1254 1128 dev_err(&data->i2c_client->dev, ··· 1263 1135 if (!m_num || !m_den) { 1264 1136 dev_err(&data->i2c_client->dev, 1265 1137 "PLL configuration invalid, assume 14GHz\n"); 1266 - m_den = clk_get_rate(data->pxtal) / 10; 1138 + sel = si5341_clk_get_selected_input(data); 1139 + if (sel < 0) 1140 + return sel; 1141 + 1142 + m_den = clk_get_rate(data->input_clk[sel]) / 10; 1267 1143 m_num = 1400000000; 1268 1144 } 1269 1145 ··· 1275 1143 SI5341_PLL_M_NUM, m_num, m_den); 1276 1144 } 1277 1145 1146 + static int si5341_clk_select_active_input(struct clk_si5341 *data) 1147 + { 1148 + int res; 1149 + int err; 1150 + int i; 1151 + 1152 + res = si5341_clk_get_selected_input(data); 1153 + if (res < 0) 1154 + return res; 1155 + 1156 + /* If the current register setting is invalid, pick the first input */ 1157 + if (!data->input_clk[res]) { 1158 + dev_dbg(&data->i2c_client->dev, 1159 + "Input %d not connected, rerouting\n", res); 1160 + res = -ENODEV; 1161 + for (i = 0; i < SI5341_NUM_INPUTS; ++i) { 1162 + if (data->input_clk[i]) { 1163 + res = i; 1164 + break; 1165 + } 1166 + } 1167 + if (res < 0) { 1168 + dev_err(&data->i2c_client->dev, 1169 + "No clock input available\n"); 1170 + return res; 1171 + } 1172 + } 1173 + 1174 + /* Make sure the selected clock is also enabled and routed */ 1175 + err = si5341_clk_reparent(data, res); 1176 + if (err < 0) 1177 + return err; 1178 + 1179 + err = clk_prepare_enable(data->input_clk[res]); 1180 + if (err < 0) 1181 + return err; 1182 + 1183 + return res; 1184 + } 1185 + 1278 1186 static int si5341_probe(struct i2c_client *client, 1279 1187 const struct i2c_device_id *id) 1280 1188 { 1281 1189 struct clk_si5341 *data; 1282 1190 struct clk_init_data init; 1191 + struct clk *input; 1283 1192 const char *root_clock_name; 1284 1193 const char *synth_clock_names[SI5341_NUM_SYNTH]; 1285 1194 int err; ··· 1334 1161 1335 1162 data->i2c_client = client; 1336 1163 1337 - data->pxtal = devm_clk_get(&client->dev, "xtal"); 1338 - if (IS_ERR(data->pxtal)) { 1339 - if (PTR_ERR(data->pxtal) == -EPROBE_DEFER) 1340 - return -EPROBE_DEFER; 1341 - 1342 - dev_err(&client->dev, "Missing xtal clock input\n"); 1164 + for (i = 0; i < SI5341_NUM_INPUTS; ++i) { 1165 + input = devm_clk_get(&client->dev, si5341_input_clock_names[i]); 1166 + if (IS_ERR(input)) { 1167 + if (PTR_ERR(input) == -EPROBE_DEFER) 1168 + return -EPROBE_DEFER; 1169 + data->input_clk_name[i] = si5341_input_clock_names[i]; 1170 + } else { 1171 + data->input_clk[i] = input; 1172 + data->input_clk_name[i] = __clk_get_name(input); 1173 + } 1343 1174 } 1344 1175 1345 1176 err = si5341_dt_parse_dt(client, config); ··· 1364 1187 err = si5341_probe_chip_id(data); 1365 1188 if (err < 0) 1366 1189 return err; 1367 - 1368 - /* "Activate" the xtal (usually a fixed clock) */ 1369 - clk_prepare_enable(data->pxtal); 1370 1190 1371 1191 if (of_property_read_bool(client->dev.of_node, "silabs,reprogram")) { 1372 1192 initialization_required = true; ··· 1397 1223 ARRAY_SIZE(si5341_reg_defaults)); 1398 1224 if (err < 0) 1399 1225 return err; 1226 + } 1400 1227 1228 + /* Input must be up and running at this point */ 1229 + err = si5341_clk_select_active_input(data); 1230 + if (err < 0) 1231 + return err; 1232 + 1233 + if (initialization_required) { 1401 1234 /* PLL configuration is required */ 1402 1235 err = si5341_initialize_pll(data); 1403 1236 if (err < 0) ··· 1412 1231 } 1413 1232 1414 1233 /* Register the PLL */ 1415 - data->pxtal_name = __clk_get_name(data->pxtal); 1416 - init.parent_names = &data->pxtal_name; 1417 - init.num_parents = 1; /* For now, only XTAL input supported */ 1234 + init.parent_names = data->input_clk_name; 1235 + init.num_parents = SI5341_NUM_INPUTS; 1418 1236 init.ops = &si5341_clk_ops; 1419 1237 init.flags = 0; 1420 1238 data->hw.init = &init;
+75 -52
drivers/clk/clk.c
··· 488 488 } 489 489 EXPORT_SYMBOL_GPL(clk_hw_get_rate); 490 490 491 - static unsigned long __clk_get_accuracy(struct clk_core *core) 491 + static unsigned long clk_core_get_accuracy_no_lock(struct clk_core *core) 492 492 { 493 493 if (!core) 494 494 return 0; ··· 774 774 * clk_rate_exclusive_get - get exclusivity over the clk rate control 775 775 * @clk: the clk over which the exclusity of rate control is requested 776 776 * 777 - * clk_rate_exlusive_get() begins a critical section during which a clock 777 + * clk_rate_exclusive_get() begins a critical section during which a clock 778 778 * consumer cannot tolerate any other consumer making any operation on the 779 779 * clock which could result in a rate change or rate glitch. Exclusive clocks 780 780 * cannot have their rate changed, either directly or indirectly due to changes ··· 1517 1517 __clk_recalc_accuracies(child); 1518 1518 } 1519 1519 1520 - static long clk_core_get_accuracy(struct clk_core *core) 1520 + static long clk_core_get_accuracy_recalc(struct clk_core *core) 1521 1521 { 1522 - unsigned long accuracy; 1523 - 1524 - clk_prepare_lock(); 1525 1522 if (core && (core->flags & CLK_GET_ACCURACY_NOCACHE)) 1526 1523 __clk_recalc_accuracies(core); 1527 1524 1528 - accuracy = __clk_get_accuracy(core); 1529 - clk_prepare_unlock(); 1530 - 1531 - return accuracy; 1525 + return clk_core_get_accuracy_no_lock(core); 1532 1526 } 1533 1527 1534 1528 /** ··· 1536 1542 */ 1537 1543 long clk_get_accuracy(struct clk *clk) 1538 1544 { 1545 + long accuracy; 1546 + 1539 1547 if (!clk) 1540 1548 return 0; 1541 1549 1542 - return clk_core_get_accuracy(clk->core); 1550 + clk_prepare_lock(); 1551 + accuracy = clk_core_get_accuracy_recalc(clk->core); 1552 + clk_prepare_unlock(); 1553 + 1554 + return accuracy; 1543 1555 } 1544 1556 EXPORT_SYMBOL_GPL(clk_get_accuracy); 1545 1557 ··· 1599 1599 __clk_recalc_rates(child, msg); 1600 1600 } 1601 1601 1602 - static unsigned long clk_core_get_rate(struct clk_core *core) 1602 + static unsigned long clk_core_get_rate_recalc(struct clk_core *core) 1603 1603 { 1604 - unsigned long rate; 1605 - 1606 - clk_prepare_lock(); 1607 - 1608 1604 if (core && (core->flags & CLK_GET_RATE_NOCACHE)) 1609 1605 __clk_recalc_rates(core, 0); 1610 1606 1611 - rate = clk_core_get_rate_nolock(core); 1612 - clk_prepare_unlock(); 1613 - 1614 - return rate; 1607 + return clk_core_get_rate_nolock(core); 1615 1608 } 1616 1609 1617 1610 /** ··· 1617 1624 */ 1618 1625 unsigned long clk_get_rate(struct clk *clk) 1619 1626 { 1627 + unsigned long rate; 1628 + 1620 1629 if (!clk) 1621 1630 return 0; 1622 1631 1623 - return clk_core_get_rate(clk->core); 1632 + clk_prepare_lock(); 1633 + rate = clk_core_get_rate_recalc(clk->core); 1634 + clk_prepare_unlock(); 1635 + 1636 + return rate; 1624 1637 } 1625 1638 EXPORT_SYMBOL_GPL(clk_get_rate); 1626 1639 ··· 2659 2660 { 2660 2661 int ret; 2661 2662 2662 - clk_prepare_lock(); 2663 + lockdep_assert_held(&prepare_lock); 2664 + if (!core->ops->get_phase) 2665 + return 0; 2666 + 2663 2667 /* Always try to update cached phase if possible */ 2664 - if (core->ops->get_phase) 2665 - core->phase = core->ops->get_phase(core->hw); 2666 - ret = core->phase; 2667 - clk_prepare_unlock(); 2668 + ret = core->ops->get_phase(core->hw); 2669 + if (ret >= 0) 2670 + core->phase = ret; 2668 2671 2669 2672 return ret; 2670 2673 } ··· 2680 2679 */ 2681 2680 int clk_get_phase(struct clk *clk) 2682 2681 { 2682 + int ret; 2683 + 2683 2684 if (!clk) 2684 2685 return 0; 2685 2686 2686 - return clk_core_get_phase(clk->core); 2687 + clk_prepare_lock(); 2688 + ret = clk_core_get_phase(clk->core); 2689 + clk_prepare_unlock(); 2690 + 2691 + return ret; 2687 2692 } 2688 2693 EXPORT_SYMBOL_GPL(clk_get_phase); 2689 2694 ··· 2903 2896 static void clk_summary_show_one(struct seq_file *s, struct clk_core *c, 2904 2897 int level) 2905 2898 { 2906 - seq_printf(s, "%*s%-*s %7d %8d %8d %11lu %10lu %5d %6d\n", 2899 + int phase; 2900 + 2901 + seq_printf(s, "%*s%-*s %7d %8d %8d %11lu %10lu ", 2907 2902 level * 3 + 1, "", 2908 2903 30 - level * 3, c->name, 2909 2904 c->enable_count, c->prepare_count, c->protect_count, 2910 - clk_core_get_rate(c), clk_core_get_accuracy(c), 2911 - clk_core_get_phase(c), 2912 - clk_core_get_scaled_duty_cycle(c, 100000)); 2905 + clk_core_get_rate_recalc(c), 2906 + clk_core_get_accuracy_recalc(c)); 2907 + 2908 + phase = clk_core_get_phase(c); 2909 + if (phase >= 0) 2910 + seq_printf(s, "%5d", phase); 2911 + else 2912 + seq_puts(s, "-----"); 2913 + 2914 + seq_printf(s, " %6d\n", clk_core_get_scaled_duty_cycle(c, 100000)); 2913 2915 } 2914 2916 2915 2917 static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c, ··· 2955 2939 2956 2940 static void clk_dump_one(struct seq_file *s, struct clk_core *c, int level) 2957 2941 { 2942 + int phase; 2958 2943 unsigned long min_rate, max_rate; 2959 2944 2960 2945 clk_core_get_boundaries(c, &min_rate, &max_rate); ··· 2965 2948 seq_printf(s, "\"enable_count\": %d,", c->enable_count); 2966 2949 seq_printf(s, "\"prepare_count\": %d,", c->prepare_count); 2967 2950 seq_printf(s, "\"protect_count\": %d,", c->protect_count); 2968 - seq_printf(s, "\"rate\": %lu,", clk_core_get_rate(c)); 2951 + seq_printf(s, "\"rate\": %lu,", clk_core_get_rate_recalc(c)); 2969 2952 seq_printf(s, "\"min_rate\": %lu,", min_rate); 2970 2953 seq_printf(s, "\"max_rate\": %lu,", max_rate); 2971 - seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy(c)); 2972 - seq_printf(s, "\"phase\": %d,", clk_core_get_phase(c)); 2954 + seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy_recalc(c)); 2955 + phase = clk_core_get_phase(c); 2956 + if (phase >= 0) 2957 + seq_printf(s, "\"phase\": %d,", phase); 2973 2958 seq_printf(s, "\"duty_cycle\": %u", 2974 2959 clk_core_get_scaled_duty_cycle(c, 100000)); 2975 2960 } ··· 3342 3323 static int __clk_core_init(struct clk_core *core) 3343 3324 { 3344 3325 int ret; 3326 + struct clk_core *parent; 3345 3327 unsigned long rate; 3328 + int phase; 3346 3329 3347 3330 if (!core) 3348 3331 return -EINVAL; ··· 3415 3394 goto out; 3416 3395 } 3417 3396 3418 - core->parent = __clk_init_parent(core); 3397 + parent = core->parent = __clk_init_parent(core); 3419 3398 3420 3399 /* 3421 3400 * Populate core->parent if parent has already been clk_core_init'd. If ··· 3427 3406 * clocks and re-parent any that are children of the clock currently 3428 3407 * being clk_init'd. 3429 3408 */ 3430 - if (core->parent) { 3431 - hlist_add_head(&core->child_node, 3432 - &core->parent->children); 3433 - core->orphan = core->parent->orphan; 3409 + if (parent) { 3410 + hlist_add_head(&core->child_node, &parent->children); 3411 + core->orphan = parent->orphan; 3434 3412 } else if (!core->num_parents) { 3435 3413 hlist_add_head(&core->child_node, &clk_root_list); 3436 3414 core->orphan = false; ··· 3447 3427 */ 3448 3428 if (core->ops->recalc_accuracy) 3449 3429 core->accuracy = core->ops->recalc_accuracy(core->hw, 3450 - __clk_get_accuracy(core->parent)); 3451 - else if (core->parent) 3452 - core->accuracy = core->parent->accuracy; 3430 + clk_core_get_accuracy_no_lock(parent)); 3431 + else if (parent) 3432 + core->accuracy = parent->accuracy; 3453 3433 else 3454 3434 core->accuracy = 0; 3455 3435 3456 3436 /* 3457 - * Set clk's phase. 3437 + * Set clk's phase by clk_core_get_phase() caching the phase. 3458 3438 * Since a phase is by definition relative to its parent, just 3459 3439 * query the current clock phase, or just assume it's in phase. 3460 3440 */ 3461 - if (core->ops->get_phase) 3462 - core->phase = core->ops->get_phase(core->hw); 3463 - else 3464 - core->phase = 0; 3441 + phase = clk_core_get_phase(core); 3442 + if (phase < 0) { 3443 + ret = phase; 3444 + pr_warn("%s: Failed to get phase for clk '%s'\n", __func__, 3445 + core->name); 3446 + goto out; 3447 + } 3465 3448 3466 3449 /* 3467 3450 * Set clk's duty cycle. ··· 3479 3456 */ 3480 3457 if (core->ops->recalc_rate) 3481 3458 rate = core->ops->recalc_rate(core->hw, 3482 - clk_core_get_rate_nolock(core->parent)); 3483 - else if (core->parent) 3484 - rate = core->parent->rate; 3459 + clk_core_get_rate_nolock(parent)); 3460 + else if (parent) 3461 + rate = parent->rate; 3485 3462 else 3486 3463 rate = 0; 3487 3464 core->rate = core->req_rate = rate; ··· 4888 4865 * 4889 4866 * Return: error code or zero on success 4890 4867 */ 4891 - int of_clk_detect_critical(struct device_node *np, 4892 - int index, unsigned long *flags) 4868 + int of_clk_detect_critical(struct device_node *np, int index, 4869 + unsigned long *flags) 4893 4870 { 4894 4871 struct property *prop; 4895 4872 const __be32 *cur;
+15 -5
drivers/clk/imx/clk-composite-8m.c
··· 15 15 #define PCG_PREDIV_MAX 8 16 16 17 17 #define PCG_DIV_SHIFT 0 18 + #define PCG_CORE_DIV_WIDTH 3 18 19 #define PCG_DIV_WIDTH 6 19 20 #define PCG_DIV_MAX 64 20 21 ··· 92 91 unsigned long parent_rate) 93 92 { 94 93 struct clk_divider *divider = to_clk_divider(hw); 95 - unsigned long flags = 0; 94 + unsigned long flags; 96 95 int prediv_value; 97 96 int div_value; 98 97 int ret; ··· 127 126 struct clk_hw *imx8m_clk_hw_composite_flags(const char *name, 128 127 const char * const *parent_names, 129 128 int num_parents, void __iomem *reg, 129 + u32 composite_flags, 130 130 unsigned long flags) 131 131 { 132 132 struct clk_hw *hw = ERR_PTR(-ENOMEM), *mux_hw; ··· 135 133 struct clk_divider *div = NULL; 136 134 struct clk_gate *gate = NULL; 137 135 struct clk_mux *mux = NULL; 136 + const struct clk_ops *divider_ops; 138 137 139 138 mux = kzalloc(sizeof(*mux), GFP_KERNEL); 140 139 if (!mux) ··· 153 150 154 151 div_hw = &div->hw; 155 152 div->reg = reg; 156 - div->shift = PCG_PREDIV_SHIFT; 157 - div->width = PCG_PREDIV_WIDTH; 153 + if (composite_flags & IMX_COMPOSITE_CORE) { 154 + div->shift = PCG_DIV_SHIFT; 155 + div->width = PCG_CORE_DIV_WIDTH; 156 + divider_ops = &clk_divider_ops; 157 + } else { 158 + div->shift = PCG_PREDIV_SHIFT; 159 + div->width = PCG_PREDIV_WIDTH; 160 + divider_ops = &imx8m_clk_composite_divider_ops; 161 + } 162 + 158 163 div->lock = &imx_ccm_lock; 159 164 div->flags = CLK_DIVIDER_ROUND_CLOSEST; 160 165 ··· 177 166 178 167 hw = clk_hw_register_composite(NULL, name, parent_names, num_parents, 179 168 mux_hw, &clk_mux_ops, div_hw, 180 - &imx8m_clk_composite_divider_ops, 181 - gate_hw, &clk_gate_ops, flags); 169 + divider_ops, gate_hw, &clk_gate_ops, flags); 182 170 if (IS_ERR(hw)) 183 171 goto fail; 184 172
+1 -1
drivers/clk/imx/clk-fixup-div.c
··· 55 55 struct clk_fixup_div *fixup_div = to_clk_fixup_div(hw); 56 56 struct clk_divider *div = to_clk_divider(hw); 57 57 unsigned int divider, value; 58 - unsigned long flags = 0; 58 + unsigned long flags; 59 59 u32 val; 60 60 61 61 divider = parent_rate / rate;
+1 -1
drivers/clk/imx/clk-fixup-mux.c
··· 42 42 { 43 43 struct clk_fixup_mux *fixup_mux = to_clk_fixup_mux(hw); 44 44 struct clk_mux *mux = to_clk_mux(hw); 45 - unsigned long flags = 0; 45 + unsigned long flags; 46 46 u32 val; 47 47 48 48 spin_lock_irqsave(mux->lock, flags);
+4 -4
drivers/clk/imx/clk-gate2.c
··· 40 40 { 41 41 struct clk_gate2 *gate = to_clk_gate2(hw); 42 42 u32 reg; 43 - unsigned long flags = 0; 43 + unsigned long flags; 44 44 45 45 spin_lock_irqsave(gate->lock, flags); 46 46 ··· 62 62 { 63 63 struct clk_gate2 *gate = to_clk_gate2(hw); 64 64 u32 reg; 65 - unsigned long flags = 0; 65 + unsigned long flags; 66 66 67 67 spin_lock_irqsave(gate->lock, flags); 68 68 ··· 101 101 static void clk_gate2_disable_unused(struct clk_hw *hw) 102 102 { 103 103 struct clk_gate2 *gate = to_clk_gate2(hw); 104 - unsigned long flags = 0; 104 + unsigned long flags; 105 105 u32 reg; 106 106 107 107 spin_lock_irqsave(gate->lock, flags); ··· 154 154 gate->hw.init = &init; 155 155 hw = &gate->hw; 156 156 157 - ret = clk_hw_register(NULL, hw); 157 + ret = clk_hw_register(dev, hw); 158 158 if (ret) { 159 159 kfree(gate); 160 160 return ERR_PTR(ret);
+1
drivers/clk/imx/clk-imx6sl.c
··· 208 208 np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-anatop"); 209 209 base = of_iomap(np, 0); 210 210 WARN_ON(!base); 211 + of_node_put(np); 211 212 anatop_base = base; 212 213 213 214 hws[IMX6SL_PLL1_BYPASS_SRC] = imx_clk_hw_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+1
drivers/clk/imx/clk-imx7d.c
··· 802 802 hws[IMX7D_PCIE_PHY_ROOT_CLK] = imx_clk_hw_gate4("pcie_phy_root_clk", "pcie_phy_post_div", base + 0x4600, 0); 803 803 hws[IMX7D_EPDC_PIXEL_ROOT_CLK] = imx_clk_hw_gate4("epdc_pixel_root_clk", "epdc_pixel_post_div", base + 0x44a0, 0); 804 804 hws[IMX7D_LCDIF_PIXEL_ROOT_CLK] = imx_clk_hw_gate4("lcdif_pixel_root_clk", "lcdif_pixel_post_div", base + 0x44b0, 0); 805 + hws[IMX7D_PXP_CLK] = imx_clk_hw_gate4("pxp_clk", "main_axi_root_clk", base + 0x44c0, 0); 805 806 hws[IMX7D_MIPI_DSI_ROOT_CLK] = imx_clk_hw_gate4("mipi_dsi_root_clk", "mipi_dsi_post_div", base + 0x4650, 0); 806 807 hws[IMX7D_MIPI_CSI_ROOT_CLK] = imx_clk_hw_gate4("mipi_csi_root_clk", "mipi_csi_post_div", base + 0x4640, 0); 807 808 hws[IMX7D_MIPI_DPHY_ROOT_CLK] = imx_clk_hw_gate4("mipi_dphy_root_clk", "mipi_dphy_post_div", base + 0x4660, 0);
+1 -1
drivers/clk/imx/clk-imx7ulp.c
··· 8 8 */ 9 9 10 10 #include <dt-bindings/clock/imx7ulp-clock.h> 11 - #include <linux/clk.h> 11 + #include <linux/clk-provider.h> 12 12 #include <linux/err.h> 13 13 #include <linux/init.h> 14 14 #include <linux/io.h>
+40 -23
drivers/clk/imx/clk-imx8mm.c
··· 4 4 */ 5 5 6 6 #include <dt-bindings/clock/imx8mm-clock.h> 7 - #include <linux/clk.h> 7 + #include <linux/clk-provider.h> 8 8 #include <linux/err.h> 9 - #include <linux/init.h> 10 9 #include <linux/io.h> 11 10 #include <linux/module.h> 12 - #include <linux/of.h> 13 11 #include <linux/of_address.h> 14 12 #include <linux/platform_device.h> 15 13 #include <linux/slab.h> ··· 38 40 /* CCM ROOT */ 39 41 static const char *imx8mm_a53_sels[] = {"osc_24m", "arm_pll_out", "sys_pll2_500m", "sys_pll2_1000m", 40 42 "sys_pll1_800m", "sys_pll1_400m", "audio_pll1_out", "sys_pll3_out", }; 43 + 44 + static const char * const imx8mm_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", }; 41 45 42 46 static const char *imx8mm_m4_sels[] = {"osc_24m", "sys_pll2_200m", "sys_pll2_250m", "sys_pll1_266m", 43 47 "sys_pll1_800m", "audio_pll1_out", "video_pll1_out", "sys_pll3_out", }; ··· 283 283 284 284 static const char *imx8mm_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", }; 285 285 286 - static const char *imx8mm_clko1_sels[] = {"osc_24m", "sys_pll1_800m", "osc_27m", "sys_pll1_200m", "audio_pll2_out", 287 - "vpu_pll", "sys_pll1_80m", }; 286 + static const char *imx8mm_clko1_sels[] = {"osc_24m", "sys_pll1_800m", "dummy", "sys_pll1_200m", 287 + "audio_pll2_out", "sys_pll2_500m", "vpu_pll", "sys_pll1_80m", }; 288 + static const char *imx8mm_clko2_sels[] = {"osc_24m", "sys_pll2_200m", "sys_pll1_400m", "sys_pll2_166m", 289 + "sys_pll3_out", "audio_pll1_out", "video_pll1_out", "osc_32k", }; 288 290 289 291 static struct clk_hw_onecell_data *clk_hw_data; 290 292 static struct clk_hw **hws; ··· 324 322 325 323 np = of_find_compatible_node(NULL, NULL, "fsl,imx8mm-anatop"); 326 324 base = of_iomap(np, 0); 325 + of_node_put(np); 327 326 if (WARN_ON(!base)) 328 327 return -ENOMEM; 329 328 ··· 417 414 418 415 /* Core Slice */ 419 416 hws[IMX8MM_CLK_A53_SRC] = imx_clk_hw_mux2("arm_a53_src", base + 0x8000, 24, 3, imx8mm_a53_sels, ARRAY_SIZE(imx8mm_a53_sels)); 420 - hws[IMX8MM_CLK_M4_SRC] = imx_clk_hw_mux2("arm_m4_src", base + 0x8080, 24, 3, imx8mm_m4_sels, ARRAY_SIZE(imx8mm_m4_sels)); 421 - hws[IMX8MM_CLK_VPU_SRC] = imx_clk_hw_mux2("vpu_src", base + 0x8100, 24, 3, imx8mm_vpu_sels, ARRAY_SIZE(imx8mm_vpu_sels)); 422 - hws[IMX8MM_CLK_GPU3D_SRC] = imx_clk_hw_mux2("gpu3d_src", base + 0x8180, 24, 3, imx8mm_gpu3d_sels, ARRAY_SIZE(imx8mm_gpu3d_sels)); 423 - hws[IMX8MM_CLK_GPU2D_SRC] = imx_clk_hw_mux2("gpu2d_src", base + 0x8200, 24, 3, imx8mm_gpu2d_sels, ARRAY_SIZE(imx8mm_gpu2d_sels)); 424 417 hws[IMX8MM_CLK_A53_CG] = imx_clk_hw_gate3("arm_a53_cg", "arm_a53_src", base + 0x8000, 28); 425 - hws[IMX8MM_CLK_M4_CG] = imx_clk_hw_gate3("arm_m4_cg", "arm_m4_src", base + 0x8080, 28); 426 - hws[IMX8MM_CLK_VPU_CG] = imx_clk_hw_gate3("vpu_cg", "vpu_src", base + 0x8100, 28); 427 - hws[IMX8MM_CLK_GPU3D_CG] = imx_clk_hw_gate3("gpu3d_cg", "gpu3d_src", base + 0x8180, 28); 428 - hws[IMX8MM_CLK_GPU2D_CG] = imx_clk_hw_gate3("gpu2d_cg", "gpu2d_src", base + 0x8200, 28); 429 418 hws[IMX8MM_CLK_A53_DIV] = imx_clk_hw_divider2("arm_a53_div", "arm_a53_cg", base + 0x8000, 0, 3); 430 - hws[IMX8MM_CLK_M4_DIV] = imx_clk_hw_divider2("arm_m4_div", "arm_m4_cg", base + 0x8080, 0, 3); 431 - hws[IMX8MM_CLK_VPU_DIV] = imx_clk_hw_divider2("vpu_div", "vpu_cg", base + 0x8100, 0, 3); 432 - hws[IMX8MM_CLK_GPU3D_DIV] = imx_clk_hw_divider2("gpu3d_div", "gpu3d_cg", base + 0x8180, 0, 3); 433 - hws[IMX8MM_CLK_GPU2D_DIV] = imx_clk_hw_divider2("gpu2d_div", "gpu2d_cg", base + 0x8200, 0, 3); 419 + 420 + hws[IMX8MM_CLK_M4_CORE] = imx8m_clk_hw_composite_core("arm_m4_core", imx8mm_m4_sels, base + 0x8080); 421 + hws[IMX8MM_CLK_VPU_CORE] = imx8m_clk_hw_composite_core("vpu_core", imx8mm_vpu_sels, base + 0x8100); 422 + hws[IMX8MM_CLK_GPU3D_CORE] = imx8m_clk_hw_composite_core("gpu3d_core", imx8mm_gpu3d_sels, base + 0x8180); 423 + hws[IMX8MM_CLK_GPU2D_CORE] = imx8m_clk_hw_composite_core("gpu2d_core", imx8mm_gpu2d_sels, base + 0x8200); 424 + 425 + /* For backwards compatibility */ 426 + hws[IMX8MM_CLK_M4_SRC] = hws[IMX8MM_CLK_M4_CORE]; 427 + hws[IMX8MM_CLK_M4_CG] = hws[IMX8MM_CLK_M4_CORE]; 428 + hws[IMX8MM_CLK_M4_DIV] = hws[IMX8MM_CLK_M4_CORE]; 429 + hws[IMX8MM_CLK_VPU_SRC] = hws[IMX8MM_CLK_VPU_CORE]; 430 + hws[IMX8MM_CLK_VPU_CG] = hws[IMX8MM_CLK_VPU_CORE]; 431 + hws[IMX8MM_CLK_VPU_DIV] = hws[IMX8MM_CLK_VPU_CORE]; 432 + hws[IMX8MM_CLK_GPU3D_SRC] = hws[IMX8MM_CLK_GPU3D_CORE]; 433 + hws[IMX8MM_CLK_GPU3D_CG] = hws[IMX8MM_CLK_GPU3D_CORE]; 434 + hws[IMX8MM_CLK_GPU3D_DIV] = hws[IMX8MM_CLK_GPU3D_CORE]; 435 + hws[IMX8MM_CLK_GPU2D_SRC] = hws[IMX8MM_CLK_GPU2D_CORE]; 436 + hws[IMX8MM_CLK_GPU2D_CG] = hws[IMX8MM_CLK_GPU2D_CORE]; 437 + hws[IMX8MM_CLK_GPU2D_DIV] = hws[IMX8MM_CLK_GPU2D_CORE]; 438 + 439 + /* CORE SEL */ 440 + hws[IMX8MM_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", base + 0x9880, 24, 1, imx8mm_a53_core_sels, ARRAY_SIZE(imx8mm_a53_core_sels)); 434 441 435 442 /* BUS */ 436 443 hws[IMX8MM_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mm_main_axi_sels, base + 0x8800); ··· 517 504 hws[IMX8MM_CLK_WDOG] = imx8m_clk_hw_composite("wdog", imx8mm_wdog_sels, base + 0xb900); 518 505 hws[IMX8MM_CLK_WRCLK] = imx8m_clk_hw_composite("wrclk", imx8mm_wrclk_sels, base + 0xb980); 519 506 hws[IMX8MM_CLK_CLKO1] = imx8m_clk_hw_composite("clko1", imx8mm_clko1_sels, base + 0xba00); 507 + hws[IMX8MM_CLK_CLKO2] = imx8m_clk_hw_composite("clko2", imx8mm_clko2_sels, base + 0xba80); 520 508 hws[IMX8MM_CLK_DSI_CORE] = imx8m_clk_hw_composite("dsi_core", imx8mm_dsi_core_sels, base + 0xbb00); 521 509 hws[IMX8MM_CLK_DSI_PHY_REF] = imx8m_clk_hw_composite("dsi_phy_ref", imx8mm_dsi_phy_sels, base + 0xbb80); 522 510 hws[IMX8MM_CLK_DSI_DBI] = imx8m_clk_hw_composite("dsi_dbi", imx8mm_dsi_dbi_sels, base + 0xbc00); ··· 578 564 hws[IMX8MM_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", base + 0x44b0, 0); 579 565 hws[IMX8MM_CLK_UART4_ROOT] = imx_clk_hw_gate4("uart4_root_clk", "uart4", base + 0x44c0, 0); 580 566 hws[IMX8MM_CLK_USB1_CTRL_ROOT] = imx_clk_hw_gate4("usb1_ctrl_root_clk", "usb_bus", base + 0x44d0, 0); 581 - hws[IMX8MM_CLK_GPU3D_ROOT] = imx_clk_hw_gate4("gpu3d_root_clk", "gpu3d_div", base + 0x44f0, 0); 567 + hws[IMX8MM_CLK_GPU3D_ROOT] = imx_clk_hw_gate4("gpu3d_root_clk", "gpu3d_core", base + 0x44f0, 0); 582 568 hws[IMX8MM_CLK_USDHC1_ROOT] = imx_clk_hw_gate4("usdhc1_root_clk", "usdhc1", base + 0x4510, 0); 583 569 hws[IMX8MM_CLK_USDHC2_ROOT] = imx_clk_hw_gate4("usdhc2_root_clk", "usdhc2", base + 0x4520, 0); 584 570 hws[IMX8MM_CLK_WDOG1_ROOT] = imx_clk_hw_gate4("wdog1_root_clk", "wdog", base + 0x4530, 0); ··· 600 586 hws[IMX8MM_CLK_SDMA1_ROOT] = imx_clk_hw_gate4("sdma1_clk", "ipg_root", base + 0x43a0, 0); 601 587 hws[IMX8MM_CLK_SDMA2_ROOT] = imx_clk_hw_gate4("sdma2_clk", "ipg_audio_root", base + 0x43b0, 0); 602 588 hws[IMX8MM_CLK_SDMA3_ROOT] = imx_clk_hw_gate4("sdma3_clk", "ipg_audio_root", base + 0x45f0, 0); 603 - hws[IMX8MM_CLK_GPU2D_ROOT] = imx_clk_hw_gate4("gpu2d_root_clk", "gpu2d_div", base + 0x4660, 0); 589 + hws[IMX8MM_CLK_GPU2D_ROOT] = imx_clk_hw_gate4("gpu2d_root_clk", "gpu2d_core", base + 0x4660, 0); 604 590 hws[IMX8MM_CLK_CSI1_ROOT] = imx_clk_hw_gate4("csi1_root_clk", "csi1_core", base + 0x4650, 0); 605 591 606 592 hws[IMX8MM_CLK_GPT_3M] = imx_clk_hw_fixed_factor("gpt_3m", "osc_24m", 1, 8); ··· 608 594 hws[IMX8MM_CLK_DRAM_ALT_ROOT] = imx_clk_hw_fixed_factor("dram_alt_root", "dram_alt", 1, 4); 609 595 hws[IMX8MM_CLK_DRAM_CORE] = imx_clk_hw_mux2_flags("dram_core_clk", base + 0x9800, 24, 1, imx8mm_dram_core_sels, ARRAY_SIZE(imx8mm_dram_core_sels), CLK_IS_CRITICAL); 610 596 611 - hws[IMX8MM_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_div", 612 - hws[IMX8MM_CLK_A53_DIV]->clk, 613 - hws[IMX8MM_CLK_A53_SRC]->clk, 597 + hws[IMX8MM_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_core", 598 + hws[IMX8MM_CLK_A53_CORE]->clk, 599 + hws[IMX8MM_CLK_A53_CORE]->clk, 614 600 hws[IMX8MM_ARM_PLL_OUT]->clk, 615 - hws[IMX8MM_SYS_PLL1_800M]->clk); 601 + hws[IMX8MM_CLK_A53_DIV]->clk); 602 + 603 + clk_hw_set_parent(hws[IMX8MM_CLK_A53_SRC], hws[IMX8MM_SYS_PLL1_800M]); 604 + clk_hw_set_parent(hws[IMX8MM_CLK_A53_CORE], hws[IMX8MM_ARM_PLL_OUT]); 616 605 617 606 imx_check_clk_hws(hws, IMX8MM_CLK_END); 618 607
+25 -15
drivers/clk/imx/clk-imx8mn.c
··· 4 4 */ 5 5 6 6 #include <dt-bindings/clock/imx8mn-clock.h> 7 - #include <linux/clk.h> 7 + #include <linux/clk-provider.h> 8 8 #include <linux/err.h> 9 - #include <linux/init.h> 10 9 #include <linux/io.h> 11 10 #include <linux/module.h> 12 - #include <linux/of.h> 13 11 #include <linux/of_address.h> 14 12 #include <linux/platform_device.h> 15 13 #include <linux/slab.h> ··· 37 39 static const char * const imx8mn_a53_sels[] = {"osc_24m", "arm_pll_out", "sys_pll2_500m", 38 40 "sys_pll2_1000m", "sys_pll1_800m", "sys_pll1_400m", 39 41 "audio_pll1_out", "sys_pll3_out", }; 42 + 43 + static const char * const imx8mn_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", }; 40 44 41 45 static const char * const imx8mn_gpu_core_sels[] = {"osc_24m", "gpu_pll_out", "sys_pll1_800m", 42 46 "sys_pll3_out", "sys_pll2_1000m", "audio_pll1_out", ··· 317 317 318 318 np = of_find_compatible_node(NULL, NULL, "fsl,imx8mn-anatop"); 319 319 base = of_iomap(np, 0); 320 + of_node_put(np); 320 321 if (WARN_ON(!base)) { 321 322 ret = -ENOMEM; 322 323 goto unregister_hws; ··· 414 413 415 414 /* CORE */ 416 415 hws[IMX8MN_CLK_A53_SRC] = imx_clk_hw_mux2("arm_a53_src", base + 0x8000, 24, 3, imx8mn_a53_sels, ARRAY_SIZE(imx8mn_a53_sels)); 417 - hws[IMX8MN_CLK_GPU_CORE_SRC] = imx_clk_hw_mux2("gpu_core_src", base + 0x8180, 24, 3, imx8mn_gpu_core_sels, ARRAY_SIZE(imx8mn_gpu_core_sels)); 418 - hws[IMX8MN_CLK_GPU_SHADER_SRC] = imx_clk_hw_mux2("gpu_shader_src", base + 0x8200, 24, 3, imx8mn_gpu_shader_sels, ARRAY_SIZE(imx8mn_gpu_shader_sels)); 419 416 hws[IMX8MN_CLK_A53_CG] = imx_clk_hw_gate3("arm_a53_cg", "arm_a53_src", base + 0x8000, 28); 420 - hws[IMX8MN_CLK_GPU_CORE_CG] = imx_clk_hw_gate3("gpu_core_cg", "gpu_core_src", base + 0x8180, 28); 421 - hws[IMX8MN_CLK_GPU_SHADER_CG] = imx_clk_hw_gate3("gpu_shader_cg", "gpu_shader_src", base + 0x8200, 28); 422 - 423 417 hws[IMX8MN_CLK_A53_DIV] = imx_clk_hw_divider2("arm_a53_div", "arm_a53_cg", base + 0x8000, 0, 3); 424 - hws[IMX8MN_CLK_GPU_CORE_DIV] = imx_clk_hw_divider2("gpu_core_div", "gpu_core_cg", base + 0x8180, 0, 3); 425 - hws[IMX8MN_CLK_GPU_SHADER_DIV] = imx_clk_hw_divider2("gpu_shader_div", "gpu_shader_cg", base + 0x8200, 0, 3); 418 + 419 + hws[IMX8MN_CLK_GPU_CORE] = imx8m_clk_hw_composite_core("gpu_core", imx8mn_gpu_core_sels, base + 0x8180); 420 + hws[IMX8MN_CLK_GPU_SHADER] = imx8m_clk_hw_composite_core("gpu_shader", imx8mn_gpu_shader_sels, base + 0x8200); 421 + 422 + hws[IMX8MN_CLK_GPU_CORE_SRC] = hws[IMX8MN_CLK_GPU_CORE]; 423 + hws[IMX8MN_CLK_GPU_CORE_CG] = hws[IMX8MN_CLK_GPU_CORE]; 424 + hws[IMX8MN_CLK_GPU_CORE_DIV] = hws[IMX8MN_CLK_GPU_CORE]; 425 + hws[IMX8MN_CLK_GPU_SHADER_SRC] = hws[IMX8MN_CLK_GPU_SHADER]; 426 + hws[IMX8MN_CLK_GPU_SHADER_CG] = hws[IMX8MN_CLK_GPU_SHADER]; 427 + hws[IMX8MN_CLK_GPU_SHADER_DIV] = hws[IMX8MN_CLK_GPU_SHADER]; 428 + 429 + /* CORE SEL */ 430 + hws[IMX8MN_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", base + 0x9880, 24, 1, imx8mn_a53_core_sels, ARRAY_SIZE(imx8mn_a53_core_sels)); 426 431 427 432 /* BUS */ 428 433 hws[IMX8MN_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mn_main_axi_sels, base + 0x8800); ··· 536 529 hws[IMX8MN_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", base + 0x44b0, 0); 537 530 hws[IMX8MN_CLK_UART4_ROOT] = imx_clk_hw_gate4("uart4_root_clk", "uart4", base + 0x44c0, 0); 538 531 hws[IMX8MN_CLK_USB1_CTRL_ROOT] = imx_clk_hw_gate4("usb1_ctrl_root_clk", "usb_bus", base + 0x44d0, 0); 539 - hws[IMX8MN_CLK_GPU_CORE_ROOT] = imx_clk_hw_gate4("gpu_core_root_clk", "gpu_core_div", base + 0x44f0, 0); 532 + hws[IMX8MN_CLK_GPU_CORE_ROOT] = imx_clk_hw_gate4("gpu_core_root_clk", "gpu_core", base + 0x44f0, 0); 540 533 hws[IMX8MN_CLK_USDHC1_ROOT] = imx_clk_hw_gate4("usdhc1_root_clk", "usdhc1", base + 0x4510, 0); 541 534 hws[IMX8MN_CLK_USDHC2_ROOT] = imx_clk_hw_gate4("usdhc2_root_clk", "usdhc2", base + 0x4520, 0); 542 535 hws[IMX8MN_CLK_WDOG1_ROOT] = imx_clk_hw_gate4("wdog1_root_clk", "wdog", base + 0x4530, 0); ··· 559 552 560 553 hws[IMX8MN_CLK_DRAM_ALT_ROOT] = imx_clk_hw_fixed_factor("dram_alt_root", "dram_alt", 1, 4); 561 554 562 - hws[IMX8MN_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_div", 563 - hws[IMX8MN_CLK_A53_DIV]->clk, 564 - hws[IMX8MN_CLK_A53_SRC]->clk, 555 + hws[IMX8MN_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_core", 556 + hws[IMX8MN_CLK_A53_CORE]->clk, 557 + hws[IMX8MN_CLK_A53_CORE]->clk, 565 558 hws[IMX8MN_ARM_PLL_OUT]->clk, 566 - hws[IMX8MN_SYS_PLL1_800M]->clk); 559 + hws[IMX8MN_CLK_A53_DIV]->clk); 560 + 561 + clk_hw_set_parent(hws[IMX8MN_CLK_A53_SRC], hws[IMX8MN_SYS_PLL1_800M]); 562 + clk_hw_set_parent(hws[IMX8MN_CLK_A53_CORE], hws[IMX8MN_ARM_PLL_OUT]); 567 563 568 564 imx_check_clk_hws(hws, IMX8MN_CLK_END); 569 565
+17 -7
drivers/clk/imx/clk-imx8mp.c
··· 4 4 */ 5 5 6 6 #include <dt-bindings/clock/imx8mp-clock.h> 7 - #include <linux/clkdev.h> 8 7 #include <linux/clk-provider.h> 9 8 #include <linux/err.h> 10 9 #include <linux/io.h> 11 10 #include <linux/module.h> 12 11 #include <linux/of_address.h> 13 12 #include <linux/platform_device.h> 13 + #include <linux/slab.h> 14 14 #include <linux/types.h> 15 15 16 16 #include "clk.h" ··· 33 33 static const char * const imx8mp_a53_sels[] = {"osc_24m", "arm_pll_out", "sys_pll2_500m", 34 34 "sys_pll2_1000m", "sys_pll1_800m", "sys_pll1_400m", 35 35 "audio_pll1_out", "sys_pll3_out", }; 36 + 37 + static const char * const imx8mp_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", }; 36 38 37 39 static const char * const imx8mp_m7_sels[] = {"osc_24m", "sys_pll2_200m", "sys_pll2_250m", 38 40 "vpu_pll_out", "sys_pll1_800m", "audio_pll1_out", ··· 344 342 "sys_pll1_800m", "sys_pll2_1000m", "sys_pll3_out", 345 343 "audio_pll2_out", "video_pll1_out", }; 346 344 347 - static const char * const imx8mp_hdmi_27m_sels[] = {"osc_24m", "sys_pll1_160m", "sys_pll2_50m", 345 + static const char * const imx8mp_hdmi_24m_sels[] = {"osc_24m", "sys_pll1_160m", "sys_pll2_50m", 348 346 "sys_pll3_out", "audio_pll1_out", "video_pll1_out", 349 347 "audio_pll2_out", "sys_pll1_133m", }; 350 348 ··· 436 434 437 435 np = of_find_compatible_node(NULL, NULL, "fsl,imx8mp-anatop"); 438 436 anatop_base = of_iomap(np, 0); 437 + of_node_put(np); 439 438 if (WARN_ON(!anatop_base)) 440 439 return -ENOMEM; 441 440 ··· 556 553 hws[IMX8MP_CLK_HSIO_AXI_DIV] = imx_clk_hw_divider2("hsio_axi_div", "hsio_axi_cg", ccm_base + 0x8380, 0, 3); 557 554 hws[IMX8MP_CLK_MEDIA_ISP_DIV] = imx_clk_hw_divider2("media_isp_div", "media_isp_cg", ccm_base + 0x8400, 0, 3); 558 555 556 + /* CORE SEL */ 557 + hws[IMX8MP_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", ccm_base + 0x9880, 24, 1, imx8mp_a53_core_sels, ARRAY_SIZE(imx8mp_a53_core_sels)); 558 + 559 559 hws[IMX8MP_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mp_main_axi_sels, ccm_base + 0x8800); 560 560 hws[IMX8MP_CLK_ENET_AXI] = imx8m_clk_hw_composite("enet_axi", imx8mp_enet_axi_sels, ccm_base + 0x8880); 561 561 hws[IMX8MP_CLK_NAND_USDHC_BUS] = imx8m_clk_hw_composite_critical("nand_usdhc_bus", imx8mp_nand_usdhc_sels, ccm_base + 0x8900); ··· 637 631 hws[IMX8MP_CLK_IPP_DO_CLKO1] = imx8m_clk_hw_composite("ipp_do_clko1", imx8mp_ipp_do_clko1_sels, ccm_base + 0xba00); 638 632 hws[IMX8MP_CLK_IPP_DO_CLKO2] = imx8m_clk_hw_composite("ipp_do_clko2", imx8mp_ipp_do_clko2_sels, ccm_base + 0xba80); 639 633 hws[IMX8MP_CLK_HDMI_FDCC_TST] = imx8m_clk_hw_composite("hdmi_fdcc_tst", imx8mp_hdmi_fdcc_tst_sels, ccm_base + 0xbb00); 640 - hws[IMX8MP_CLK_HDMI_27M] = imx8m_clk_hw_composite("hdmi_27m", imx8mp_hdmi_27m_sels, ccm_base + 0xbb80); 634 + hws[IMX8MP_CLK_HDMI_24M] = imx8m_clk_hw_composite("hdmi_24m", imx8mp_hdmi_24m_sels, ccm_base + 0xbb80); 641 635 hws[IMX8MP_CLK_HDMI_REF_266M] = imx8m_clk_hw_composite("hdmi_ref_266m", imx8mp_hdmi_ref_266m_sels, ccm_base + 0xbc00); 642 636 hws[IMX8MP_CLK_USDHC3] = imx8m_clk_hw_composite("usdhc3", imx8mp_usdhc3_sels, ccm_base + 0xbc80); 643 637 hws[IMX8MP_CLK_MEDIA_CAM1_PIX] = imx8m_clk_hw_composite("media_cam1_pix", imx8mp_media_cam1_pix_sels, ccm_base + 0xbd00); ··· 677 671 hws[IMX8MP_CLK_I2C2_ROOT] = imx_clk_hw_gate4("i2c2_root_clk", "i2c2", ccm_base + 0x4180, 0); 678 672 hws[IMX8MP_CLK_I2C3_ROOT] = imx_clk_hw_gate4("i2c3_root_clk", "i2c3", ccm_base + 0x4190, 0); 679 673 hws[IMX8MP_CLK_I2C4_ROOT] = imx_clk_hw_gate4("i2c4_root_clk", "i2c4", ccm_base + 0x41a0, 0); 674 + hws[IMX8MP_CLK_OCOTP_ROOT] = imx_clk_hw_gate4("ocotp_root_clk", "ipg_root", ccm_base + 0x4220, 0); 680 675 hws[IMX8MP_CLK_PCIE_ROOT] = imx_clk_hw_gate4("pcie_root_clk", "pcie_aux", ccm_base + 0x4250, 0); 681 676 hws[IMX8MP_CLK_PWM1_ROOT] = imx_clk_hw_gate4("pwm1_root_clk", "pwm1", ccm_base + 0x4280, 0); 682 677 hws[IMX8MP_CLK_PWM2_ROOT] = imx_clk_hw_gate4("pwm2_root_clk", "pwm2", ccm_base + 0x4290, 0); ··· 729 722 hws[IMX8MP_CLK_VPU_ROOT] = imx_clk_hw_gate4("vpu_root_clk", "vpu_bus", ccm_base + 0x4630, 0); 730 723 hws[IMX8MP_CLK_AUDIO_ROOT] = imx_clk_hw_gate4("audio_root_clk", "ipg_root", ccm_base + 0x4650, 0); 731 724 732 - hws[IMX8MP_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_div", 733 - hws[IMX8MP_CLK_A53_DIV]->clk, 734 - hws[IMX8MP_CLK_A53_SRC]->clk, 725 + hws[IMX8MP_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_core", 726 + hws[IMX8MP_CLK_A53_CORE]->clk, 727 + hws[IMX8MP_CLK_A53_CORE]->clk, 735 728 hws[IMX8MP_ARM_PLL_OUT]->clk, 736 - hws[IMX8MP_SYS_PLL1_800M]->clk); 729 + hws[IMX8MP_CLK_A53_DIV]->clk); 730 + 731 + clk_hw_set_parent(hws[IMX8MP_CLK_A53_SRC], hws[IMX8MP_SYS_PLL1_800M]); 732 + clk_hw_set_parent(hws[IMX8MP_CLK_A53_CORE], hws[IMX8MP_ARM_PLL_OUT]); 737 733 738 734 imx_check_clk_hws(hws, IMX8MP_CLK_END); 739 735
+33 -20
drivers/clk/imx/clk-imx8mq.c
··· 5 5 */ 6 6 7 7 #include <dt-bindings/clock/imx8mq-clock.h> 8 - #include <linux/clk.h> 8 + #include <linux/clk-provider.h> 9 9 #include <linux/err.h> 10 10 #include <linux/io.h> 11 11 #include <linux/module.h> ··· 40 40 /* CCM ROOT */ 41 41 static const char * const imx8mq_a53_sels[] = {"osc_25m", "arm_pll_out", "sys2_pll_500m", "sys2_pll_1000m", 42 42 "sys1_pll_800m", "sys1_pll_400m", "audio_pll1_out", "sys3_pll_out", }; 43 + 44 + static const char * const imx8mq_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", }; 43 45 44 46 static const char * const imx8mq_arm_m4_sels[] = {"osc_25m", "sys2_pll_200m", "sys2_pll_250m", "sys1_pll_266m", 45 47 "sys1_pll_800m", "audio_pll1_out", "video_pll1_out", "sys3_pll_out", }; ··· 307 305 308 306 np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-anatop"); 309 307 base = of_iomap(np, 0); 308 + of_node_put(np); 310 309 if (WARN_ON(!base)) 311 310 return -ENOMEM; 312 311 ··· 406 403 407 404 /* CORE */ 408 405 hws[IMX8MQ_CLK_A53_SRC] = imx_clk_hw_mux2("arm_a53_src", base + 0x8000, 24, 3, imx8mq_a53_sels, ARRAY_SIZE(imx8mq_a53_sels)); 409 - hws[IMX8MQ_CLK_M4_SRC] = imx_clk_hw_mux2("arm_m4_src", base + 0x8080, 24, 3, imx8mq_arm_m4_sels, ARRAY_SIZE(imx8mq_arm_m4_sels)); 410 - hws[IMX8MQ_CLK_VPU_SRC] = imx_clk_hw_mux2("vpu_src", base + 0x8100, 24, 3, imx8mq_vpu_sels, ARRAY_SIZE(imx8mq_vpu_sels)); 411 - hws[IMX8MQ_CLK_GPU_CORE_SRC] = imx_clk_hw_mux2("gpu_core_src", base + 0x8180, 24, 3, imx8mq_gpu_core_sels, ARRAY_SIZE(imx8mq_gpu_core_sels)); 412 - hws[IMX8MQ_CLK_GPU_SHADER_SRC] = imx_clk_hw_mux2("gpu_shader_src", base + 0x8200, 24, 3, imx8mq_gpu_shader_sels, ARRAY_SIZE(imx8mq_gpu_shader_sels)); 413 - 414 406 hws[IMX8MQ_CLK_A53_CG] = imx_clk_hw_gate3_flags("arm_a53_cg", "arm_a53_src", base + 0x8000, 28, CLK_IS_CRITICAL); 415 - hws[IMX8MQ_CLK_M4_CG] = imx_clk_hw_gate3("arm_m4_cg", "arm_m4_src", base + 0x8080, 28); 416 - hws[IMX8MQ_CLK_VPU_CG] = imx_clk_hw_gate3("vpu_cg", "vpu_src", base + 0x8100, 28); 417 - hws[IMX8MQ_CLK_GPU_CORE_CG] = imx_clk_hw_gate3("gpu_core_cg", "gpu_core_src", base + 0x8180, 28); 418 - hws[IMX8MQ_CLK_GPU_SHADER_CG] = imx_clk_hw_gate3("gpu_shader_cg", "gpu_shader_src", base + 0x8200, 28); 419 - 420 407 hws[IMX8MQ_CLK_A53_DIV] = imx_clk_hw_divider2("arm_a53_div", "arm_a53_cg", base + 0x8000, 0, 3); 421 - hws[IMX8MQ_CLK_M4_DIV] = imx_clk_hw_divider2("arm_m4_div", "arm_m4_cg", base + 0x8080, 0, 3); 422 - hws[IMX8MQ_CLK_VPU_DIV] = imx_clk_hw_divider2("vpu_div", "vpu_cg", base + 0x8100, 0, 3); 423 - hws[IMX8MQ_CLK_GPU_CORE_DIV] = imx_clk_hw_divider2("gpu_core_div", "gpu_core_cg", base + 0x8180, 0, 3); 424 - hws[IMX8MQ_CLK_GPU_SHADER_DIV] = imx_clk_hw_divider2("gpu_shader_div", "gpu_shader_cg", base + 0x8200, 0, 3); 408 + 409 + hws[IMX8MQ_CLK_M4_CORE] = imx8m_clk_hw_composite_core("arm_m4_core", imx8mq_arm_m4_sels, base + 0x8080); 410 + hws[IMX8MQ_CLK_VPU_CORE] = imx8m_clk_hw_composite_core("vpu_core", imx8mq_vpu_sels, base + 0x8100); 411 + hws[IMX8MQ_CLK_GPU_CORE] = imx8m_clk_hw_composite_core("gpu_core", imx8mq_gpu_core_sels, base + 0x8180); 412 + hws[IMX8MQ_CLK_GPU_SHADER] = imx8m_clk_hw_composite("gpu_shader", imx8mq_gpu_shader_sels, base + 0x8200); 413 + /* For backwards compatibility */ 414 + hws[IMX8MQ_CLK_M4_SRC] = hws[IMX8MQ_CLK_M4_CORE]; 415 + hws[IMX8MQ_CLK_M4_CG] = hws[IMX8MQ_CLK_M4_CORE]; 416 + hws[IMX8MQ_CLK_M4_DIV] = hws[IMX8MQ_CLK_M4_CORE]; 417 + hws[IMX8MQ_CLK_VPU_SRC] = hws[IMX8MQ_CLK_VPU_CORE]; 418 + hws[IMX8MQ_CLK_VPU_CG] = hws[IMX8MQ_CLK_VPU_CORE]; 419 + hws[IMX8MQ_CLK_VPU_DIV] = hws[IMX8MQ_CLK_VPU_CORE]; 420 + hws[IMX8MQ_CLK_GPU_CORE_SRC] = hws[IMX8MQ_CLK_GPU_CORE]; 421 + hws[IMX8MQ_CLK_GPU_CORE_CG] = hws[IMX8MQ_CLK_GPU_CORE]; 422 + hws[IMX8MQ_CLK_GPU_CORE_DIV] = hws[IMX8MQ_CLK_GPU_CORE]; 423 + hws[IMX8MQ_CLK_GPU_SHADER_SRC] = hws[IMX8MQ_CLK_GPU_SHADER]; 424 + hws[IMX8MQ_CLK_GPU_SHADER_CG] = hws[IMX8MQ_CLK_GPU_SHADER]; 425 + hws[IMX8MQ_CLK_GPU_SHADER_DIV] = hws[IMX8MQ_CLK_GPU_SHADER]; 426 + 427 + /* CORE SEL */ 428 + hws[IMX8MQ_CLK_A53_CORE] = imx_clk_hw_mux2("arm_a53_core", base + 0x9880, 24, 1, imx8mq_a53_core_sels, ARRAY_SIZE(imx8mq_a53_core_sels)); 425 429 426 430 /* BUS */ 427 431 hws[IMX8MQ_CLK_MAIN_AXI] = imx8m_clk_hw_composite_critical("main_axi", imx8mq_main_axi_sels, base + 0x8800); ··· 577 567 hws[IMX8MQ_CLK_WDOG2_ROOT] = imx_clk_hw_gate4("wdog2_root_clk", "wdog", base + 0x4540, 0); 578 568 hws[IMX8MQ_CLK_WDOG3_ROOT] = imx_clk_hw_gate4("wdog3_root_clk", "wdog", base + 0x4550, 0); 579 569 hws[IMX8MQ_CLK_VPU_G1_ROOT] = imx_clk_hw_gate2_flags("vpu_g1_root_clk", "vpu_g1", base + 0x4560, 0, CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE); 580 - hws[IMX8MQ_CLK_GPU_ROOT] = imx_clk_hw_gate4("gpu_root_clk", "gpu_core_div", base + 0x4570, 0); 570 + hws[IMX8MQ_CLK_GPU_ROOT] = imx_clk_hw_gate4("gpu_root_clk", "gpu_core", base + 0x4570, 0); 581 571 hws[IMX8MQ_CLK_VPU_G2_ROOT] = imx_clk_hw_gate2_flags("vpu_g2_root_clk", "vpu_g2", base + 0x45a0, 0, CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE); 582 572 hws[IMX8MQ_CLK_DISP_ROOT] = imx_clk_hw_gate2_shared2("disp_root_clk", "disp_dc8000", base + 0x45d0, 0, &share_count_dcss); 583 573 hws[IMX8MQ_CLK_DISP_AXI_ROOT] = imx_clk_hw_gate2_shared2("disp_axi_root_clk", "disp_axi", base + 0x45d0, 0, &share_count_dcss); ··· 593 583 hws[IMX8MQ_GPT_3M_CLK] = imx_clk_hw_fixed_factor("gpt_3m", "osc_25m", 1, 8); 594 584 hws[IMX8MQ_CLK_DRAM_ALT_ROOT] = imx_clk_hw_fixed_factor("dram_alt_root", "dram_alt", 1, 4); 595 585 596 - hws[IMX8MQ_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_div", 597 - hws[IMX8MQ_CLK_A53_DIV]->clk, 598 - hws[IMX8MQ_CLK_A53_SRC]->clk, 586 + hws[IMX8MQ_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_core", 587 + hws[IMX8MQ_CLK_A53_CORE]->clk, 588 + hws[IMX8MQ_CLK_A53_CORE]->clk, 599 589 hws[IMX8MQ_ARM_PLL_OUT]->clk, 600 - hws[IMX8MQ_SYS1_PLL_800M]->clk); 590 + hws[IMX8MQ_CLK_A53_DIV]->clk); 591 + 592 + clk_hw_set_parent(hws[IMX8MQ_CLK_A53_SRC], hws[IMX8MQ_SYS1_PLL_800M]); 593 + clk_hw_set_parent(hws[IMX8MQ_CLK_A53_CORE], hws[IMX8MQ_ARM_PLL_OUT]); 601 594 602 595 imx_check_clk_hws(hws, IMX8MQ_CLK_END); 603 596
+41 -16
drivers/clk/imx/clk-pfdv2.c
··· 98 98 return tmp; 99 99 } 100 100 101 - static long clk_pfdv2_round_rate(struct clk_hw *hw, unsigned long rate, 102 - unsigned long *prate) 101 + static int clk_pfdv2_determine_rate(struct clk_hw *hw, 102 + struct clk_rate_request *req) 103 103 { 104 - u64 tmp = *prate; 104 + unsigned long parent_rates[] = { 105 + 480000000, 106 + 528000000, 107 + req->best_parent_rate 108 + }; 109 + unsigned long best_rate = -1UL, rate = req->rate; 110 + unsigned long best_parent_rate = req->best_parent_rate; 111 + u64 tmp; 105 112 u8 frac; 113 + int i; 106 114 107 - tmp = tmp * 18 + rate / 2; 108 - do_div(tmp, rate); 109 - frac = tmp; 115 + for (i = 0; i < ARRAY_SIZE(parent_rates); i++) { 116 + tmp = parent_rates[i]; 117 + tmp = tmp * 18 + rate / 2; 118 + do_div(tmp, rate); 119 + frac = tmp; 110 120 111 - if (frac < 12) 112 - frac = 12; 113 - else if (frac > 35) 114 - frac = 35; 121 + if (frac < 12) 122 + frac = 12; 123 + else if (frac > 35) 124 + frac = 35; 115 125 116 - tmp = *prate; 117 - tmp *= 18; 118 - do_div(tmp, frac); 126 + tmp = parent_rates[i]; 127 + tmp *= 18; 128 + do_div(tmp, frac); 119 129 120 - return tmp; 130 + if (abs(tmp - req->rate) < abs(best_rate - req->rate)) { 131 + best_rate = tmp; 132 + best_parent_rate = parent_rates[i]; 133 + } 134 + } 135 + 136 + req->best_parent_rate = best_parent_rate; 137 + req->rate = best_rate; 138 + 139 + return 0; 121 140 } 122 141 123 142 static int clk_pfdv2_is_enabled(struct clk_hw *hw) ··· 157 138 u64 tmp = parent_rate; 158 139 u32 val; 159 140 u8 frac; 141 + 142 + if (!rate) 143 + return -EINVAL; 144 + 145 + /* PFD can NOT change rate without gating */ 146 + WARN_ON(clk_pfdv2_is_enabled(hw)); 160 147 161 148 tmp = tmp * 18 + rate / 2; 162 149 do_div(tmp, rate); ··· 186 161 .enable = clk_pfdv2_enable, 187 162 .disable = clk_pfdv2_disable, 188 163 .recalc_rate = clk_pfdv2_recalc_rate, 189 - .round_rate = clk_pfdv2_round_rate, 164 + .determine_rate = clk_pfdv2_determine_rate, 190 165 .set_rate = clk_pfdv2_set_rate, 191 166 .is_enabled = clk_pfdv2_is_enabled, 192 167 }; ··· 214 189 init.ops = &clk_pfdv2_ops; 215 190 init.parent_names = &parent_name; 216 191 init.num_parents = 1; 217 - init.flags = CLK_SET_RATE_GATE; 192 + init.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT; 218 193 219 194 pfd->hw.init = &init; 220 195
+4
drivers/clk/imx/clk-pll14xx.c
··· 55 55 }; 56 56 57 57 static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = { 58 + PLL_1443X_RATE(1039500000U, 173, 2, 1, 16384), 58 59 PLL_1443X_RATE(650000000U, 325, 3, 2, 0), 59 60 PLL_1443X_RATE(594000000U, 198, 2, 2, 0), 61 + PLL_1443X_RATE(519750000U, 173, 2, 2, 16384), 60 62 PLL_1443X_RATE(393216000U, 262, 2, 3, 9437), 61 63 PLL_1443X_RATE(361267200U, 361, 3, 3, 17511), 62 64 }; ··· 410 408 default: 411 409 pr_err("%s: Unknown pll type for pll clk %s\n", 412 410 __func__, name); 411 + kfree(pll); 412 + return ERR_PTR(-EINVAL); 413 413 }; 414 414 415 415 pll->base = base;
+6 -6
drivers/clk/imx/clk-pllv4.c
··· 54 54 csr, csr & PLL_VLD, 0, LOCK_TIMEOUT_US); 55 55 } 56 56 57 - static int clk_pllv4_is_enabled(struct clk_hw *hw) 57 + static int clk_pllv4_is_prepared(struct clk_hw *hw) 58 58 { 59 59 struct clk_pllv4 *pll = to_clk_pllv4(hw); 60 60 ··· 175 175 return 0; 176 176 } 177 177 178 - static int clk_pllv4_enable(struct clk_hw *hw) 178 + static int clk_pllv4_prepare(struct clk_hw *hw) 179 179 { 180 180 u32 val; 181 181 struct clk_pllv4 *pll = to_clk_pllv4(hw); ··· 187 187 return clk_pllv4_wait_lock(pll); 188 188 } 189 189 190 - static void clk_pllv4_disable(struct clk_hw *hw) 190 + static void clk_pllv4_unprepare(struct clk_hw *hw) 191 191 { 192 192 u32 val; 193 193 struct clk_pllv4 *pll = to_clk_pllv4(hw); ··· 201 201 .recalc_rate = clk_pllv4_recalc_rate, 202 202 .round_rate = clk_pllv4_round_rate, 203 203 .set_rate = clk_pllv4_set_rate, 204 - .enable = clk_pllv4_enable, 205 - .disable = clk_pllv4_disable, 206 - .is_enabled = clk_pllv4_is_enabled, 204 + .prepare = clk_pllv4_prepare, 205 + .unprepare = clk_pllv4_unprepare, 206 + .is_prepared = clk_pllv4_is_prepared, 207 207 }; 208 208 209 209 struct clk_hw *imx_clk_hw_pllv4(const char *name, const char *parent_name,
+7 -7
drivers/clk/imx/clk-sscg-pll.c
··· 195 195 uint64_t ref) 196 196 { 197 197 198 - int ret = -EINVAL; 198 + int ret; 199 199 200 200 if (ref < PLL_STAGE1_MIN_FREQ || ref > PLL_STAGE1_MAX_FREQ) 201 - return ret; 201 + return -EINVAL; 202 202 203 203 temp_setup->vco1 = ref; 204 204 ··· 254 254 uint64_t ref) 255 255 { 256 256 257 - int ret = -EINVAL; 257 + int ret; 258 258 259 259 if (ref < PLL_REF_MIN_FREQ || ref > PLL_REF_MAX_FREQ) 260 - return ret; 260 + return -EINVAL; 261 261 262 262 temp_setup->ref = ref; 263 263 ··· 428 428 struct clk_sscg_pll_setup *setup = &pll->setup; 429 429 struct clk_hw *parent_hw = NULL; 430 430 int bypass_parent_index; 431 - int ret = -EINVAL; 431 + int ret; 432 432 433 433 req->max_rate = max; 434 434 req->min_rate = min; ··· 467 467 uint64_t rate = req->rate; 468 468 uint64_t min = req->min_rate; 469 469 uint64_t max = req->max_rate; 470 - int ret = -EINVAL; 470 + int ret; 471 471 472 472 if (rate < PLL_OUT_MIN_FREQ || rate > PLL_OUT_MAX_FREQ) 473 - return ret; 473 + return -EINVAL; 474 474 475 475 ret = __clk_sscg_pll_determine_rate(hw, req, req->rate, req->rate, 476 476 rate, PLL_BYPASS2);
+11 -2
drivers/clk/imx/clk.h
··· 477 477 struct clk *div, struct clk *mux, struct clk *pll, 478 478 struct clk *step); 479 479 480 + #define IMX_COMPOSITE_CORE BIT(0) 481 + 480 482 struct clk_hw *imx8m_clk_hw_composite_flags(const char *name, 481 483 const char * const *parent_names, 482 484 int num_parents, 483 485 void __iomem *reg, 486 + u32 composite_flags, 484 487 unsigned long flags); 488 + 489 + #define imx8m_clk_hw_composite_core(name, parent_names, reg) \ 490 + imx8m_clk_hw_composite_flags(name, parent_names, \ 491 + ARRAY_SIZE(parent_names), reg, \ 492 + IMX_COMPOSITE_CORE, \ 493 + CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE) 485 494 486 495 #define imx8m_clk_composite_flags(name, parent_names, num_parents, reg, \ 487 496 flags) \ 488 497 to_clk(imx8m_clk_hw_composite_flags(name, parent_names, \ 489 - num_parents, reg, flags)) 498 + num_parents, reg, 0, flags)) 490 499 491 500 #define __imx8m_clk_hw_composite(name, parent_names, reg, flags) \ 492 501 imx8m_clk_hw_composite_flags(name, parent_names, \ 493 - ARRAY_SIZE(parent_names), reg, \ 502 + ARRAY_SIZE(parent_names), reg, 0, \ 494 503 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE) 495 504 496 505 #define __imx8m_clk_composite(name, parent_names, reg, flags) \
+3 -1
drivers/clk/ingenic/jz4770-cgu.c
··· 432 432 433 433 cgu = ingenic_cgu_new(jz4770_cgu_clocks, 434 434 ARRAY_SIZE(jz4770_cgu_clocks), np); 435 - if (!cgu) 435 + if (!cgu) { 436 436 pr_err("%s: failed to initialise CGU\n", __func__); 437 + return; 438 + } 437 439 438 440 retval = ingenic_cgu_register_clocks(cgu); 439 441 if (retval)
+50 -5
drivers/clk/ingenic/jz4780-cgu.c
··· 9 9 #include <linux/clk-provider.h> 10 10 #include <linux/delay.h> 11 11 #include <linux/io.h> 12 + #include <linux/iopoll.h> 12 13 #include <linux/of.h> 14 + 13 15 #include <dt-bindings/clock/jz4780-cgu.h> 14 16 #include "cgu.h" 15 17 #include "pm.h" 16 18 17 19 /* CGU register offsets */ 18 20 #define CGU_REG_CLOCKCONTROL 0x00 19 - #define CGU_REG_PLLCONTROL 0x0c 21 + #define CGU_REG_LCR 0x04 20 22 #define CGU_REG_APLL 0x10 21 23 #define CGU_REG_MPLL 0x14 22 24 #define CGU_REG_EPLL 0x18 ··· 48 46 #define CGU_REG_CLOCKSTATUS 0xd4 49 47 50 48 /* bits within the OPCR register */ 51 - #define OPCR_SPENDN0 (1 << 7) 52 - #define OPCR_SPENDN1 (1 << 6) 49 + #define OPCR_SPENDN0 BIT(7) 50 + #define OPCR_SPENDN1 BIT(6) 53 51 54 52 /* bits within the USBPCR register */ 55 53 #define USBPCR_USB_MODE BIT(31) ··· 89 87 #define USBVBFIL_IDDIGFIL_SHIFT 16 90 88 #define USBVBFIL_IDDIGFIL_MASK (0xffff << USBVBFIL_IDDIGFIL_SHIFT) 91 89 #define USBVBFIL_USBVBFIL_MASK (0xffff) 90 + 91 + /* bits within the LCR register */ 92 + #define LCR_PD_SCPU BIT(31) 93 + #define LCR_SCPUS BIT(27) 94 + 95 + /* bits within the CLKGR1 register */ 96 + #define CLKGR1_CORE1 BIT(15) 92 97 93 98 static struct ingenic_cgu *cgu; 94 99 ··· 212 203 .recalc_rate = jz4780_otg_phy_recalc_rate, 213 204 .round_rate = jz4780_otg_phy_round_rate, 214 205 .set_rate = jz4780_otg_phy_set_rate, 206 + }; 207 + 208 + static int jz4780_core1_enable(struct clk_hw *hw) 209 + { 210 + struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw); 211 + struct ingenic_cgu *cgu = ingenic_clk->cgu; 212 + const unsigned int timeout = 5000; 213 + unsigned long flags; 214 + int retval; 215 + u32 lcr, clkgr1; 216 + 217 + spin_lock_irqsave(&cgu->lock, flags); 218 + 219 + lcr = readl(cgu->base + CGU_REG_LCR); 220 + lcr &= ~LCR_PD_SCPU; 221 + writel(lcr, cgu->base + CGU_REG_LCR); 222 + 223 + clkgr1 = readl(cgu->base + CGU_REG_CLKGR1); 224 + clkgr1 &= ~CLKGR1_CORE1; 225 + writel(clkgr1, cgu->base + CGU_REG_CLKGR1); 226 + 227 + spin_unlock_irqrestore(&cgu->lock, flags); 228 + 229 + /* wait for the CPU to be powered up */ 230 + retval = readl_poll_timeout(cgu->base + CGU_REG_LCR, lcr, 231 + !(lcr & LCR_SCPUS), 10, timeout); 232 + if (retval == -ETIMEDOUT) { 233 + pr_err("%s: Wait for power up core1 timeout\n", __func__); 234 + return retval; 235 + } 236 + 237 + return 0; 238 + } 239 + 240 + static const struct clk_ops jz4780_core1_ops = { 241 + .enable = jz4780_core1_enable, 215 242 }; 216 243 217 244 static const s8 pll_od_encoding[16] = { ··· 744 699 }, 745 700 746 701 [JZ4780_CLK_CORE1] = { 747 - "core1", CGU_CLK_GATE, 702 + "core1", CGU_CLK_CUSTOM, 748 703 .parents = { JZ4780_CLK_CPU, -1, -1, -1 }, 749 - .gate = { CGU_REG_CLKGR1, 15 }, 704 + .custom = { &jz4780_core1_ops }, 750 705 }, 751 706 752 707 };
+9 -1
drivers/clk/ingenic/tcu.c
··· 189 189 u8 prescale; 190 190 191 191 if (req_rate > rate) 192 - return -EINVAL; 192 + return rate; 193 193 194 194 prescale = ingenic_tcu_get_prescale(rate, req_rate); 195 195 ··· 317 317 .has_tcu_clk = false, 318 318 }; 319 319 320 + static const struct ingenic_soc_info x1000_soc_info = { 321 + .num_channels = 8, 322 + .has_ost = false, /* X1000 has OST, but it not belong TCU */ 323 + .has_tcu_clk = false, 324 + }; 325 + 320 326 static const struct of_device_id ingenic_tcu_of_match[] __initconst = { 321 327 { .compatible = "ingenic,jz4740-tcu", .data = &jz4740_soc_info, }, 322 328 { .compatible = "ingenic,jz4725b-tcu", .data = &jz4725b_soc_info, }, 323 329 { .compatible = "ingenic,jz4770-tcu", .data = &jz4770_soc_info, }, 330 + { .compatible = "ingenic,x1000-tcu", .data = &x1000_soc_info, }, 324 331 { /* sentinel */ } 325 332 }; 326 333 ··· 478 471 CLK_OF_DECLARE_DRIVER(jz4740_cgu, "ingenic,jz4740-tcu", ingenic_tcu_init); 479 472 CLK_OF_DECLARE_DRIVER(jz4725b_cgu, "ingenic,jz4725b-tcu", ingenic_tcu_init); 480 473 CLK_OF_DECLARE_DRIVER(jz4770_cgu, "ingenic,jz4770-tcu", ingenic_tcu_init); 474 + CLK_OF_DECLARE_DRIVER(x1000_cgu, "ingenic,x1000-tcu", ingenic_tcu_init);
+8
drivers/clk/keystone/Kconfig
··· 26 26 This is mostly only useful for debugging purposes, and will 27 27 increase the boot time of the device. If you want the clocks probed 28 28 from firmware, say Y. Otherwise, say N. 29 + 30 + config TI_SYSCON_CLK 31 + tristate "Syscon based clock driver for K2/K3 SoCs" 32 + depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST 33 + default ARCH_KEYSTONE || ARCH_K3 34 + help 35 + This adds clock driver support for syscon based gate 36 + clocks on TI's K2 and K3 SoCs.
+1
drivers/clk/keystone/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 obj-$(CONFIG_COMMON_CLK_KEYSTONE) += pll.o gate.o 3 3 obj-$(CONFIG_TI_SCI_CLK) += sci-clk.o 4 + obj-$(CONFIG_TI_SYSCON_CLK) += syscon-clk.o
+172
drivers/clk/keystone/syscon-clk.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/mfd/syscon.h> 8 + #include <linux/module.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/regmap.h> 11 + 12 + struct ti_syscon_gate_clk_priv { 13 + struct clk_hw hw; 14 + struct regmap *regmap; 15 + u32 reg; 16 + u32 idx; 17 + }; 18 + 19 + struct ti_syscon_gate_clk_data { 20 + char *name; 21 + u32 offset; 22 + u32 bit_idx; 23 + }; 24 + 25 + static struct 26 + ti_syscon_gate_clk_priv *to_ti_syscon_gate_clk_priv(struct clk_hw *hw) 27 + { 28 + return container_of(hw, struct ti_syscon_gate_clk_priv, hw); 29 + } 30 + 31 + static int ti_syscon_gate_clk_enable(struct clk_hw *hw) 32 + { 33 + struct ti_syscon_gate_clk_priv *priv = to_ti_syscon_gate_clk_priv(hw); 34 + 35 + return regmap_write_bits(priv->regmap, priv->reg, priv->idx, 36 + priv->idx); 37 + } 38 + 39 + static void ti_syscon_gate_clk_disable(struct clk_hw *hw) 40 + { 41 + struct ti_syscon_gate_clk_priv *priv = to_ti_syscon_gate_clk_priv(hw); 42 + 43 + regmap_write_bits(priv->regmap, priv->reg, priv->idx, 0); 44 + } 45 + 46 + static int ti_syscon_gate_clk_is_enabled(struct clk_hw *hw) 47 + { 48 + unsigned int val; 49 + struct ti_syscon_gate_clk_priv *priv = to_ti_syscon_gate_clk_priv(hw); 50 + 51 + regmap_read(priv->regmap, priv->reg, &val); 52 + 53 + return !!(val & priv->idx); 54 + } 55 + 56 + static const struct clk_ops ti_syscon_gate_clk_ops = { 57 + .enable = ti_syscon_gate_clk_enable, 58 + .disable = ti_syscon_gate_clk_disable, 59 + .is_enabled = ti_syscon_gate_clk_is_enabled, 60 + }; 61 + 62 + static struct clk_hw 63 + *ti_syscon_gate_clk_register(struct device *dev, struct regmap *regmap, 64 + const struct ti_syscon_gate_clk_data *data) 65 + { 66 + struct ti_syscon_gate_clk_priv *priv; 67 + struct clk_init_data init; 68 + int ret; 69 + 70 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 71 + if (!priv) 72 + return ERR_PTR(-ENOMEM); 73 + 74 + init.name = data->name; 75 + init.ops = &ti_syscon_gate_clk_ops; 76 + init.parent_names = NULL; 77 + init.num_parents = 0; 78 + init.flags = 0; 79 + 80 + priv->regmap = regmap; 81 + priv->reg = data->offset; 82 + priv->idx = BIT(data->bit_idx); 83 + priv->hw.init = &init; 84 + 85 + ret = devm_clk_hw_register(dev, &priv->hw); 86 + if (ret) 87 + return ERR_PTR(ret); 88 + 89 + return &priv->hw; 90 + } 91 + 92 + static int ti_syscon_gate_clk_probe(struct platform_device *pdev) 93 + { 94 + const struct ti_syscon_gate_clk_data *data, *p; 95 + struct clk_hw_onecell_data *hw_data; 96 + struct device *dev = &pdev->dev; 97 + struct regmap *regmap; 98 + int num_clks, i; 99 + 100 + data = device_get_match_data(dev); 101 + if (!data) 102 + return -EINVAL; 103 + 104 + regmap = syscon_node_to_regmap(dev->of_node); 105 + if (IS_ERR(regmap)) { 106 + if (PTR_ERR(regmap) == -EPROBE_DEFER) 107 + return -EPROBE_DEFER; 108 + dev_err(dev, "failed to find parent regmap\n"); 109 + return PTR_ERR(regmap); 110 + } 111 + 112 + num_clks = 0; 113 + for (p = data; p->name; p++) 114 + num_clks++; 115 + 116 + hw_data = devm_kzalloc(dev, struct_size(hw_data, hws, num_clks), 117 + GFP_KERNEL); 118 + if (!hw_data) 119 + return -ENOMEM; 120 + 121 + hw_data->num = num_clks; 122 + 123 + for (i = 0; i < num_clks; i++) { 124 + hw_data->hws[i] = ti_syscon_gate_clk_register(dev, regmap, 125 + &data[i]); 126 + if (IS_ERR(hw_data->hws[i])) 127 + dev_warn(dev, "failed to register %s\n", 128 + data[i].name); 129 + } 130 + 131 + return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, 132 + hw_data); 133 + } 134 + 135 + #define TI_SYSCON_CLK_GATE(_name, _offset, _bit_idx) \ 136 + { \ 137 + .name = _name, \ 138 + .offset = (_offset), \ 139 + .bit_idx = (_bit_idx), \ 140 + } 141 + 142 + static const struct ti_syscon_gate_clk_data am654_clk_data[] = { 143 + TI_SYSCON_CLK_GATE("ehrpwm_tbclk0", 0x0, 0), 144 + TI_SYSCON_CLK_GATE("ehrpwm_tbclk1", 0x4, 0), 145 + TI_SYSCON_CLK_GATE("ehrpwm_tbclk2", 0x8, 0), 146 + TI_SYSCON_CLK_GATE("ehrpwm_tbclk3", 0xc, 0), 147 + TI_SYSCON_CLK_GATE("ehrpwm_tbclk4", 0x10, 0), 148 + TI_SYSCON_CLK_GATE("ehrpwm_tbclk5", 0x14, 0), 149 + { /* Sentinel */ }, 150 + }; 151 + 152 + static const struct of_device_id ti_syscon_gate_clk_ids[] = { 153 + { 154 + .compatible = "ti,am654-ehrpwm-tbclk", 155 + .data = &am654_clk_data, 156 + }, 157 + { } 158 + }; 159 + MODULE_DEVICE_TABLE(of, ti_syscon_gate_clk_ids); 160 + 161 + static struct platform_driver ti_syscon_gate_clk_driver = { 162 + .probe = ti_syscon_gate_clk_probe, 163 + .driver = { 164 + .name = "ti-syscon-gate-clk", 165 + .of_match_table = ti_syscon_gate_clk_ids, 166 + }, 167 + }; 168 + module_platform_driver(ti_syscon_gate_clk_driver); 169 + 170 + MODULE_AUTHOR("Vignesh Raghavendra <vigneshr@ti.com>"); 171 + MODULE_DESCRIPTION("Syscon backed gate-clock driver"); 172 + MODULE_LICENSE("GPL");
+129
drivers/clk/meson/g12a.c
··· 3862 3862 }, 3863 3863 }; 3864 3864 3865 + /* SPICC SCLK source clock */ 3866 + 3867 + static const struct clk_parent_data spicc_sclk_parent_data[] = { 3868 + { .fw_name = "xtal", }, 3869 + { .hw = &g12a_clk81.hw }, 3870 + { .hw = &g12a_fclk_div4.hw }, 3871 + { .hw = &g12a_fclk_div3.hw }, 3872 + { .hw = &g12a_fclk_div5.hw }, 3873 + { .hw = &g12a_fclk_div7.hw }, 3874 + }; 3875 + 3876 + static struct clk_regmap g12a_spicc0_sclk_sel = { 3877 + .data = &(struct clk_regmap_mux_data){ 3878 + .offset = HHI_SPICC_CLK_CNTL, 3879 + .mask = 7, 3880 + .shift = 7, 3881 + }, 3882 + .hw.init = &(struct clk_init_data){ 3883 + .name = "spicc0_sclk_sel", 3884 + .ops = &clk_regmap_mux_ops, 3885 + .parent_data = spicc_sclk_parent_data, 3886 + .num_parents = ARRAY_SIZE(spicc_sclk_parent_data), 3887 + }, 3888 + }; 3889 + 3890 + static struct clk_regmap g12a_spicc0_sclk_div = { 3891 + .data = &(struct clk_regmap_div_data){ 3892 + .offset = HHI_SPICC_CLK_CNTL, 3893 + .shift = 0, 3894 + .width = 6, 3895 + }, 3896 + .hw.init = &(struct clk_init_data){ 3897 + .name = "spicc0_sclk_div", 3898 + .ops = &clk_regmap_divider_ops, 3899 + .parent_hws = (const struct clk_hw *[]) { 3900 + &g12a_spicc0_sclk_sel.hw 3901 + }, 3902 + .num_parents = 1, 3903 + .flags = CLK_SET_RATE_PARENT, 3904 + }, 3905 + }; 3906 + 3907 + static struct clk_regmap g12a_spicc0_sclk = { 3908 + .data = &(struct clk_regmap_gate_data){ 3909 + .offset = HHI_SPICC_CLK_CNTL, 3910 + .bit_idx = 6, 3911 + }, 3912 + .hw.init = &(struct clk_init_data){ 3913 + .name = "spicc0_sclk", 3914 + .ops = &clk_regmap_gate_ops, 3915 + .parent_hws = (const struct clk_hw *[]) { 3916 + &g12a_spicc0_sclk_div.hw 3917 + }, 3918 + .num_parents = 1, 3919 + .flags = CLK_SET_RATE_PARENT, 3920 + }, 3921 + }; 3922 + 3923 + static struct clk_regmap g12a_spicc1_sclk_sel = { 3924 + .data = &(struct clk_regmap_mux_data){ 3925 + .offset = HHI_SPICC_CLK_CNTL, 3926 + .mask = 7, 3927 + .shift = 23, 3928 + }, 3929 + .hw.init = &(struct clk_init_data){ 3930 + .name = "spicc1_sclk_sel", 3931 + .ops = &clk_regmap_mux_ops, 3932 + .parent_data = spicc_sclk_parent_data, 3933 + .num_parents = ARRAY_SIZE(spicc_sclk_parent_data), 3934 + }, 3935 + }; 3936 + 3937 + static struct clk_regmap g12a_spicc1_sclk_div = { 3938 + .data = &(struct clk_regmap_div_data){ 3939 + .offset = HHI_SPICC_CLK_CNTL, 3940 + .shift = 16, 3941 + .width = 6, 3942 + }, 3943 + .hw.init = &(struct clk_init_data){ 3944 + .name = "spicc1_sclk_div", 3945 + .ops = &clk_regmap_divider_ops, 3946 + .parent_hws = (const struct clk_hw *[]) { 3947 + &g12a_spicc1_sclk_sel.hw 3948 + }, 3949 + .num_parents = 1, 3950 + .flags = CLK_SET_RATE_PARENT, 3951 + }, 3952 + }; 3953 + 3954 + static struct clk_regmap g12a_spicc1_sclk = { 3955 + .data = &(struct clk_regmap_gate_data){ 3956 + .offset = HHI_SPICC_CLK_CNTL, 3957 + .bit_idx = 22, 3958 + }, 3959 + .hw.init = &(struct clk_init_data){ 3960 + .name = "spicc1_sclk", 3961 + .ops = &clk_regmap_gate_ops, 3962 + .parent_hws = (const struct clk_hw *[]) { 3963 + &g12a_spicc1_sclk_div.hw 3964 + }, 3965 + .num_parents = 1, 3966 + .flags = CLK_SET_RATE_PARENT, 3967 + }, 3968 + }; 3969 + 3865 3970 #define MESON_GATE(_name, _reg, _bit) \ 3866 3971 MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw) 3867 3972 ··· 4264 4159 [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw, 4265 4160 [CLKID_TS_DIV] = &g12a_ts_div.hw, 4266 4161 [CLKID_TS] = &g12a_ts.hw, 4162 + [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw, 4163 + [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw, 4164 + [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw, 4165 + [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw, 4166 + [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw, 4167 + [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw, 4267 4168 [NR_CLKS] = NULL, 4268 4169 }, 4269 4170 .num = NR_CLKS, ··· 4519 4408 [CLKID_CPUB_CLK_AXI] = &g12b_cpub_clk_axi.hw, 4520 4409 [CLKID_CPUB_CLK_TRACE_SEL] = &g12b_cpub_clk_trace_sel.hw, 4521 4410 [CLKID_CPUB_CLK_TRACE] = &g12b_cpub_clk_trace.hw, 4411 + [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw, 4412 + [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw, 4413 + [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw, 4414 + [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw, 4415 + [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw, 4416 + [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw, 4522 4417 [NR_CLKS] = NULL, 4523 4418 }, 4524 4419 .num = NR_CLKS, ··· 4759 4642 [CLKID_CPU1_CLK] = &sm1_cpu1_clk.hw, 4760 4643 [CLKID_CPU2_CLK] = &sm1_cpu2_clk.hw, 4761 4644 [CLKID_CPU3_CLK] = &sm1_cpu3_clk.hw, 4645 + [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw, 4646 + [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw, 4647 + [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw, 4648 + [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw, 4649 + [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw, 4650 + [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw, 4762 4651 [NR_CLKS] = NULL, 4763 4652 }, 4764 4653 .num = NR_CLKS, ··· 5000 4877 &sm1_cpu1_clk, 5001 4878 &sm1_cpu2_clk, 5002 4879 &sm1_cpu3_clk, 4880 + &g12a_spicc0_sclk_sel, 4881 + &g12a_spicc0_sclk_div, 4882 + &g12a_spicc0_sclk, 4883 + &g12a_spicc1_sclk_sel, 4884 + &g12a_spicc1_sclk_div, 4885 + &g12a_spicc1_sclk, 5003 4886 }; 5004 4887 5005 4888 static const struct reg_sequence g12a_init_regs[] = {
+5 -1
drivers/clk/meson/g12a.h
··· 255 255 #define CLKID_DSU_CLK_DYN1 249 256 256 #define CLKID_DSU_CLK_DYN 250 257 257 #define CLKID_DSU_CLK_FINAL 251 258 + #define CLKID_SPICC0_SCLK_SEL 256 259 + #define CLKID_SPICC0_SCLK_DIV 257 260 + #define CLKID_SPICC1_SCLK_SEL 259 261 + #define CLKID_SPICC1_SCLK_DIV 260 258 262 259 - #define NR_CLKS 256 263 + #define NR_CLKS 262 260 264 261 265 /* include the CLKIDs that have been made part of the DT binding */ 262 266 #include <dt-bindings/clock/g12a-clkc.h>
+13 -8
drivers/clk/meson/gxbb.c
··· 2613 2613 static MESON_GATE(gxbb_emmc_a, HHI_GCLK_MPEG0, 24); 2614 2614 static MESON_GATE(gxbb_emmc_b, HHI_GCLK_MPEG0, 25); 2615 2615 static MESON_GATE(gxbb_emmc_c, HHI_GCLK_MPEG0, 26); 2616 + static MESON_GATE(gxl_acodec, HHI_GCLK_MPEG0, 28); 2616 2617 static MESON_GATE(gxbb_spi, HHI_GCLK_MPEG0, 30); 2617 2618 2618 2619 static MESON_GATE(gxbb_i2s_spdif, HHI_GCLK_MPEG1, 2); 2619 2620 static MESON_GATE(gxbb_eth, HHI_GCLK_MPEG1, 3); 2620 2621 static MESON_GATE(gxbb_demux, HHI_GCLK_MPEG1, 4); 2621 - static MESON_GATE(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6); 2622 - static MESON_GATE(gxbb_iec958, HHI_GCLK_MPEG1, 7); 2623 - static MESON_GATE(gxbb_i2s_out, HHI_GCLK_MPEG1, 8); 2624 - static MESON_GATE(gxbb_amclk, HHI_GCLK_MPEG1, 9); 2625 - static MESON_GATE(gxbb_aififo2, HHI_GCLK_MPEG1, 10); 2626 - static MESON_GATE(gxbb_mixer, HHI_GCLK_MPEG1, 11); 2627 - static MESON_GATE(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12); 2628 - static MESON_GATE(gxbb_adc, HHI_GCLK_MPEG1, 13); 2629 2622 static MESON_GATE(gxbb_blkmv, HHI_GCLK_MPEG1, 14); 2630 2623 static MESON_GATE(gxbb_aiu, HHI_GCLK_MPEG1, 15); 2631 2624 static MESON_GATE(gxbb_uart1, HHI_GCLK_MPEG1, 16); ··· 2672 2679 static MESON_GATE(gxbb_ao_ahb_bus, HHI_GCLK_AO, 2); 2673 2680 static MESON_GATE(gxbb_ao_iface, HHI_GCLK_AO, 3); 2674 2681 static MESON_GATE(gxbb_ao_i2c, HHI_GCLK_AO, 4); 2682 + 2683 + /* AIU gates */ 2684 + static MESON_PCLK(gxbb_aiu_glue, HHI_GCLK_MPEG1, 6, &gxbb_aiu.hw); 2685 + static MESON_PCLK(gxbb_iec958, HHI_GCLK_MPEG1, 7, &gxbb_aiu_glue.hw); 2686 + static MESON_PCLK(gxbb_i2s_out, HHI_GCLK_MPEG1, 8, &gxbb_aiu_glue.hw); 2687 + static MESON_PCLK(gxbb_amclk, HHI_GCLK_MPEG1, 9, &gxbb_aiu_glue.hw); 2688 + static MESON_PCLK(gxbb_aififo2, HHI_GCLK_MPEG1, 10, &gxbb_aiu_glue.hw); 2689 + static MESON_PCLK(gxbb_mixer, HHI_GCLK_MPEG1, 11, &gxbb_aiu_glue.hw); 2690 + static MESON_PCLK(gxbb_mixer_iface, HHI_GCLK_MPEG1, 12, &gxbb_aiu_glue.hw); 2691 + static MESON_PCLK(gxbb_adc, HHI_GCLK_MPEG1, 13, &gxbb_aiu_glue.hw); 2675 2692 2676 2693 /* Array of all clocks provided by this provider */ 2677 2694 ··· 3103 3100 [CLKID_HDMI_SEL] = &gxbb_hdmi_sel.hw, 3104 3101 [CLKID_HDMI_DIV] = &gxbb_hdmi_div.hw, 3105 3102 [CLKID_HDMI] = &gxbb_hdmi.hw, 3103 + [CLKID_ACODEC] = &gxl_acodec.hw, 3106 3104 [NR_CLKS] = NULL, 3107 3105 }, 3108 3106 .num = NR_CLKS, ··· 3495 3491 &gxl_hdmi_pll_od, 3496 3492 &gxl_hdmi_pll_od2, 3497 3493 &gxl_hdmi_pll_dco, 3494 + &gxl_acodec, 3498 3495 }; 3499 3496 3500 3497 static const struct meson_eeclkc_data gxbb_clkc_data = {
+1 -1
drivers/clk/meson/gxbb.h
··· 188 188 #define CLKID_HDMI_SEL 203 189 189 #define CLKID_HDMI_DIV 204 190 190 191 - #define NR_CLKS 206 191 + #define NR_CLKS 207 192 192 193 193 /* include the CLKIDs that have been made part of the DT binding */ 194 194 #include <dt-bindings/clock/gxbb-clkc.h>
+13 -8
drivers/clk/meson/meson8b.c
··· 2605 2605 static MESON_GATE(meson8b_i2s_spdif, HHI_GCLK_MPEG1, 2); 2606 2606 static MESON_GATE(meson8b_eth, HHI_GCLK_MPEG1, 3); 2607 2607 static MESON_GATE(meson8b_demux, HHI_GCLK_MPEG1, 4); 2608 - static MESON_GATE(meson8b_aiu_glue, HHI_GCLK_MPEG1, 6); 2609 - static MESON_GATE(meson8b_iec958, HHI_GCLK_MPEG1, 7); 2610 - static MESON_GATE(meson8b_i2s_out, HHI_GCLK_MPEG1, 8); 2611 - static MESON_GATE(meson8b_amclk, HHI_GCLK_MPEG1, 9); 2612 - static MESON_GATE(meson8b_aififo2, HHI_GCLK_MPEG1, 10); 2613 - static MESON_GATE(meson8b_mixer, HHI_GCLK_MPEG1, 11); 2614 - static MESON_GATE(meson8b_mixer_iface, HHI_GCLK_MPEG1, 12); 2615 - static MESON_GATE(meson8b_adc, HHI_GCLK_MPEG1, 13); 2616 2608 static MESON_GATE(meson8b_blkmv, HHI_GCLK_MPEG1, 14); 2617 2609 static MESON_GATE(meson8b_aiu, HHI_GCLK_MPEG1, 15); 2618 2610 static MESON_GATE(meson8b_uart1, HHI_GCLK_MPEG1, 16); ··· 2650 2658 static MESON_GATE(meson8b_vclk2_vencl, HHI_GCLK_OTHER, 25); 2651 2659 static MESON_GATE(meson8b_vclk2_other, HHI_GCLK_OTHER, 26); 2652 2660 static MESON_GATE(meson8b_edp, HHI_GCLK_OTHER, 31); 2661 + 2662 + /* AIU gates */ 2663 + #define MESON_AIU_GLUE_GATE(_name, _reg, _bit) \ 2664 + MESON_PCLK(_name, _reg, _bit, &meson8b_aiu_glue.hw) 2665 + 2666 + static MESON_PCLK(meson8b_aiu_glue, HHI_GCLK_MPEG1, 6, &meson8b_aiu.hw); 2667 + static MESON_AIU_GLUE_GATE(meson8b_iec958, HHI_GCLK_MPEG1, 7); 2668 + static MESON_AIU_GLUE_GATE(meson8b_i2s_out, HHI_GCLK_MPEG1, 8); 2669 + static MESON_AIU_GLUE_GATE(meson8b_amclk, HHI_GCLK_MPEG1, 9); 2670 + static MESON_AIU_GLUE_GATE(meson8b_aififo2, HHI_GCLK_MPEG1, 10); 2671 + static MESON_AIU_GLUE_GATE(meson8b_mixer, HHI_GCLK_MPEG1, 11); 2672 + static MESON_AIU_GLUE_GATE(meson8b_mixer_iface, HHI_GCLK_MPEG1, 12); 2673 + static MESON_AIU_GLUE_GATE(meson8b_adc, HHI_GCLK_MPEG1, 13); 2653 2674 2654 2675 /* Always On (AO) domain gates */ 2655 2676
+1 -1
drivers/clk/mmp/Makefile
··· 8 8 obj-$(CONFIG_RESET_CONTROLLER) += reset.o 9 9 10 10 obj-$(CONFIG_MACH_MMP_DT) += clk-of-pxa168.o clk-of-pxa910.o 11 - obj-$(CONFIG_COMMON_CLK_MMP2) += clk-of-mmp2.o 11 + obj-$(CONFIG_COMMON_CLK_MMP2) += clk-of-mmp2.o clk-pll.o 12 12 13 13 obj-$(CONFIG_CPU_PXA168) += clk-pxa168.o 14 14 obj-$(CONFIG_CPU_PXA910) += clk-pxa910.o
+1 -1
drivers/clk/mmp/clk-mix.c
··· 441 441 442 442 struct clk *mmp_clk_register_mix(struct device *dev, 443 443 const char *name, 444 - const char **parent_names, 444 + const char * const *parent_names, 445 445 u8 num_parents, 446 446 unsigned long flags, 447 447 struct mmp_clk_mix_config *config,
+135 -11
drivers/clk/mmp/clk-of-mmp2.c
··· 3 3 * 4 4 * Copyright (C) 2012 Marvell 5 5 * Chao Xie <xiechao.mail@gmail.com> 6 + * Copyright (C) 2020 Lubomir Rintel <lkundrak@v3.sk> 6 7 * 7 8 * This file is licensed under the terms of the GNU General Public 8 9 * License version 2. This program is licensed "as is" without any ··· 49 48 #define APMU_SDH1 0x58 50 49 #define APMU_SDH2 0xe8 51 50 #define APMU_SDH3 0xec 51 + #define APMU_SDH4 0x15c 52 52 #define APMU_USB 0x5c 53 53 #define APMU_DISP0 0x4c 54 54 #define APMU_DISP1 0x110 55 55 #define APMU_CCIC0 0x50 56 56 #define APMU_CCIC1 0xf4 57 + #define APBC_THERMAL0 0x90 58 + #define APBC_THERMAL1 0x98 59 + #define APBC_THERMAL2 0x9c 60 + #define APBC_THERMAL3 0xa0 57 61 #define APMU_USBHSIC0 0xf8 58 62 #define APMU_USBHSIC1 0xfc 59 - #define MPMU_UART_PLL 0x14 63 + #define APMU_GPU 0xcc 64 + 65 + #define MPMU_FCCR 0x8 66 + #define MPMU_POSR 0x10 67 + #define MPMU_UART_PLL 0x14 68 + #define MPMU_PLL2_CR 0x34 69 + /* MMP3 specific below */ 70 + #define MPMU_PLL3_CR 0x50 71 + #define MPMU_PLL3_CTRL1 0x58 72 + #define MPMU_PLL1_CTRL 0x5c 73 + #define MPMU_PLL_DIFF_CTRL 0x68 74 + #define MPMU_PLL2_CTRL1 0x414 75 + 76 + enum mmp2_clk_model { 77 + CLK_MODEL_MMP2, 78 + CLK_MODEL_MMP3, 79 + }; 60 80 61 81 struct mmp2_clk_unit { 62 82 struct mmp_clk_unit unit; 83 + enum mmp2_clk_model model; 63 84 void __iomem *mpmu_base; 64 85 void __iomem *apmu_base; 65 86 void __iomem *apbc_base; ··· 90 67 static struct mmp_param_fixed_rate_clk fixed_rate_clks[] = { 91 68 {MMP2_CLK_CLK32, "clk32", NULL, 0, 32768}, 92 69 {MMP2_CLK_VCTCXO, "vctcxo", NULL, 0, 26000000}, 93 - {MMP2_CLK_PLL1, "pll1", NULL, 0, 800000000}, 94 - {MMP2_CLK_PLL2, "pll2", NULL, 0, 960000000}, 95 70 {MMP2_CLK_USB_PLL, "usb_pll", NULL, 0, 480000000}, 71 + }; 72 + 73 + static struct mmp_param_pll_clk pll_clks[] = { 74 + {MMP2_CLK_PLL1, "pll1", 797330000, MPMU_FCCR, 0x4000, MPMU_POSR, 0}, 75 + {MMP2_CLK_PLL2, "pll2", 0, MPMU_PLL2_CR, 0x0300, MPMU_PLL2_CR, 10}, 76 + }; 77 + 78 + static struct mmp_param_pll_clk mmp3_pll_clks[] = { 79 + {MMP2_CLK_PLL2, "pll1", 797330000, MPMU_FCCR, 0x4000, MPMU_POSR, 0, 26000000, MPMU_PLL1_CTRL, 25}, 80 + {MMP2_CLK_PLL2, "pll2", 0, MPMU_PLL2_CR, 0x0300, MPMU_PLL2_CR, 10, 26000000, MPMU_PLL2_CTRL1, 25}, 81 + {MMP3_CLK_PLL1_P, "pll1_p", 0, MPMU_PLL_DIFF_CTRL, 0x0010, 0, 0, 797330000, MPMU_PLL_DIFF_CTRL, 0}, 82 + {MMP3_CLK_PLL2_P, "pll2_p", 0, MPMU_PLL_DIFF_CTRL, 0x0100, MPMU_PLL2_CR, 10, 26000000, MPMU_PLL_DIFF_CTRL, 5}, 83 + {MMP3_CLK_PLL3, "pll3", 0, MPMU_PLL3_CR, 0x0300, MPMU_PLL3_CR, 10, 26000000, MPMU_PLL3_CTRL1, 25}, 96 84 }; 97 85 98 86 static struct mmp_param_fixed_factor_clk fixed_factor_clks[] = { ··· 147 113 mmp_register_fixed_rate_clks(unit, fixed_rate_clks, 148 114 ARRAY_SIZE(fixed_rate_clks)); 149 115 116 + if (pxa_unit->model == CLK_MODEL_MMP3) { 117 + mmp_register_pll_clks(unit, mmp3_pll_clks, 118 + pxa_unit->mpmu_base, 119 + ARRAY_SIZE(mmp3_pll_clks)); 120 + } else { 121 + mmp_register_pll_clks(unit, pll_clks, 122 + pxa_unit->mpmu_base, 123 + ARRAY_SIZE(pll_clks)); 124 + } 125 + 150 126 mmp_register_fixed_factor_clks(unit, fixed_factor_clks, 151 127 ARRAY_SIZE(fixed_factor_clks)); 152 128 ··· 171 127 static DEFINE_SPINLOCK(uart0_lock); 172 128 static DEFINE_SPINLOCK(uart1_lock); 173 129 static DEFINE_SPINLOCK(uart2_lock); 174 - static const char *uart_parent_names[] = {"uart_pll", "vctcxo"}; 130 + static const char * const uart_parent_names[] = {"uart_pll", "vctcxo"}; 175 131 176 132 static DEFINE_SPINLOCK(ssp0_lock); 177 133 static DEFINE_SPINLOCK(ssp1_lock); 178 134 static DEFINE_SPINLOCK(ssp2_lock); 179 135 static DEFINE_SPINLOCK(ssp3_lock); 180 - static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; 136 + static const char * const ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; 181 137 182 138 static DEFINE_SPINLOCK(timer_lock); 183 - static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; 139 + static const char * const timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; 184 140 185 141 static DEFINE_SPINLOCK(reset_lock); 186 142 ··· 220 176 {MMP2_CLK_SSP2, "ssp2_clk", "ssp2_mux", CLK_SET_RATE_PARENT, APBC_SSP2, 0x7, 0x3, 0x0, 0, &ssp2_lock}, 221 177 {MMP2_CLK_SSP3, "ssp3_clk", "ssp3_mux", CLK_SET_RATE_PARENT, APBC_SSP3, 0x7, 0x3, 0x0, 0, &ssp3_lock}, 222 178 {MMP2_CLK_TIMER, "timer_clk", "timer_mux", CLK_SET_RATE_PARENT, APBC_TIMER, 0x7, 0x3, 0x0, 0, &timer_lock}, 179 + {MMP2_CLK_THERMAL0, "thermal0_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_THERMAL0, 0x7, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, &reset_lock}, 180 + }; 181 + 182 + static struct mmp_param_gate_clk mmp3_apbc_gate_clks[] = { 183 + {MMP3_CLK_THERMAL1, "thermal1_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_THERMAL1, 0x7, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, &reset_lock}, 184 + {MMP3_CLK_THERMAL2, "thermal2_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_THERMAL2, 0x7, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, &reset_lock}, 185 + {MMP3_CLK_THERMAL3, "thermal3_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_THERMAL3, 0x7, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, &reset_lock}, 223 186 }; 224 187 225 188 static void mmp2_apb_periph_clk_init(struct mmp2_clk_unit *pxa_unit) ··· 238 187 239 188 mmp_register_gate_clks(unit, apbc_gate_clks, pxa_unit->apbc_base, 240 189 ARRAY_SIZE(apbc_gate_clks)); 190 + 191 + if (pxa_unit->model == CLK_MODEL_MMP3) { 192 + mmp_register_gate_clks(unit, mmp3_apbc_gate_clks, pxa_unit->apbc_base, 193 + ARRAY_SIZE(mmp3_apbc_gate_clks)); 194 + } 241 195 } 242 196 243 197 static DEFINE_SPINLOCK(sdh_lock); 244 - static const char *sdh_parent_names[] = {"pll1_4", "pll2", "usb_pll", "pll1"}; 198 + static const char * const sdh_parent_names[] = {"pll1_4", "pll2", "usb_pll", "pll1"}; 245 199 static struct mmp_clk_mix_config sdh_mix_config = { 246 200 .reg_info = DEFINE_MIX_REG_INFO(4, 10, 2, 8, 32), 247 201 }; ··· 257 201 258 202 static DEFINE_SPINLOCK(disp0_lock); 259 203 static DEFINE_SPINLOCK(disp1_lock); 260 - static const char *disp_parent_names[] = {"pll1", "pll1_16", "pll2", "vctcxo"}; 204 + static const char * const disp_parent_names[] = {"pll1", "pll1_16", "pll2", "vctcxo"}; 261 205 262 206 static DEFINE_SPINLOCK(ccic0_lock); 263 207 static DEFINE_SPINLOCK(ccic1_lock); 264 - static const char *ccic_parent_names[] = {"pll1_2", "pll1_16", "vctcxo"}; 208 + static const char * const ccic_parent_names[] = {"pll1_2", "pll1_16", "vctcxo"}; 209 + 210 + static DEFINE_SPINLOCK(gpu_lock); 211 + static const char * const mmp2_gpu_gc_parent_names[] = {"pll1_2", "pll1_3", "pll2_2", "pll2_3", "pll2", "usb_pll"}; 212 + static u32 mmp2_gpu_gc_parent_table[] = { 0x0000, 0x0040, 0x0080, 0x00c0, 0x1000, 0x1040 }; 213 + static const char * const mmp2_gpu_bus_parent_names[] = {"pll1_4", "pll2", "pll2_2", "usb_pll"}; 214 + static u32 mmp2_gpu_bus_parent_table[] = { 0x0000, 0x0020, 0x0030, 0x4020 }; 215 + static const char * const mmp3_gpu_bus_parent_names[] = {"pll1_4", "pll1_6", "pll1_2", "pll2_2"}; 216 + static const char * const mmp3_gpu_gc_parent_names[] = {"pll1", "pll2", "pll1_p", "pll2_p"}; 217 + 265 218 static struct mmp_clk_mix_config ccic0_mix_config = { 266 219 .reg_info = DEFINE_MIX_REG_INFO(4, 17, 2, 6, 32), 267 220 }; ··· 283 218 {MMP2_CLK_DISP1_MUX, "disp1_mux", disp_parent_names, ARRAY_SIZE(disp_parent_names), CLK_SET_RATE_PARENT, APMU_DISP1, 6, 2, 0, &disp1_lock}, 284 219 }; 285 220 221 + static struct mmp_param_mux_clk mmp3_apmu_mux_clks[] = { 222 + {0, "gpu_bus_mux", mmp3_gpu_bus_parent_names, ARRAY_SIZE(mmp3_gpu_bus_parent_names), 223 + CLK_SET_RATE_PARENT, APMU_GPU, 4, 2, 0, &gpu_lock}, 224 + {0, "gpu_3d_mux", mmp3_gpu_gc_parent_names, ARRAY_SIZE(mmp3_gpu_gc_parent_names), 225 + CLK_SET_RATE_PARENT, APMU_GPU, 6, 2, 0, &gpu_lock}, 226 + {0, "gpu_2d_mux", mmp3_gpu_gc_parent_names, ARRAY_SIZE(mmp3_gpu_gc_parent_names), 227 + CLK_SET_RATE_PARENT, APMU_GPU, 12, 2, 0, &gpu_lock}, 228 + }; 229 + 286 230 static struct mmp_param_div_clk apmu_div_clks[] = { 287 231 {0, "disp0_div", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 8, 4, 0, &disp0_lock}, 288 232 {0, "disp0_sphy_div", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 15, 5, 0, &disp0_lock}, 289 233 {0, "disp1_div", "disp1_mux", CLK_SET_RATE_PARENT, APMU_DISP1, 8, 4, 0, &disp1_lock}, 290 234 {0, "ccic0_sphy_div", "ccic0_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC0, 10, 5, 0, &ccic0_lock}, 291 235 {0, "ccic1_sphy_div", "ccic1_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC1, 10, 5, 0, &ccic1_lock}, 236 + }; 237 + 238 + static struct mmp_param_div_clk mmp3_apmu_div_clks[] = { 239 + {0, "gpu_3d_div", "gpu_3d_mux", CLK_SET_RATE_PARENT, APMU_GPU, 24, 4, 0, &gpu_lock}, 240 + {0, "gpu_2d_div", "gpu_2d_mux", CLK_SET_RATE_PARENT, APMU_GPU, 28, 4, 0, &gpu_lock}, 292 241 }; 293 242 294 243 static struct mmp_param_gate_clk apmu_gate_clks[] = { ··· 314 235 {MMP2_CLK_SDH1, "sdh1_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, 315 236 {MMP2_CLK_SDH2, "sdh2_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH2, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, 316 237 {MMP2_CLK_SDH3, "sdh3_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH3, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, 317 - {MMP2_CLK_DISP0, "disp0_clk", "disp0_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x09, 0x09, 0x0, 0, &disp0_lock}, 318 - {MMP2_CLK_DISP0_LCDC, "disp0_lcdc_clk", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 0x12, 0x12, 0x0, 0, &disp0_lock}, 238 + {MMP2_CLK_DISP0, "disp0_clk", "disp0_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x12, 0x12, 0x0, 0, &disp0_lock}, 239 + {MMP2_CLK_DISP0_LCDC, "disp0_lcdc_clk", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 0x09, 0x09, 0x0, 0, &disp0_lock}, 319 240 {MMP2_CLK_DISP0_SPHY, "disp0_sphy_clk", "disp0_sphy_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1024, 0x1024, 0x0, 0, &disp0_lock}, 320 241 {MMP2_CLK_DISP1, "disp1_clk", "disp1_div", CLK_SET_RATE_PARENT, APMU_DISP1, 0x09, 0x09, 0x0, 0, &disp1_lock}, 321 242 {MMP2_CLK_CCIC_ARBITER, "ccic_arbiter", "vctcxo", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x1800, 0x1800, 0x0, 0, &ccic0_lock}, ··· 325 246 {MMP2_CLK_CCIC1, "ccic1_clk", "ccic1_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC1, 0x1b, 0x1b, 0x0, 0, &ccic1_lock}, 326 247 {MMP2_CLK_CCIC1_PHY, "ccic1_phy_clk", "ccic1_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC1, 0x24, 0x24, 0x0, 0, &ccic1_lock}, 327 248 {MMP2_CLK_CCIC1_SPHY, "ccic1_sphy_clk", "ccic1_sphy_div", CLK_SET_RATE_PARENT, APMU_CCIC1, 0x300, 0x300, 0x0, 0, &ccic1_lock}, 249 + {MMP2_CLK_GPU_BUS, "gpu_bus_clk", "gpu_bus_mux", CLK_SET_RATE_PARENT, APMU_GPU, 0xa, 0xa, 0x0, MMP_CLK_GATE_NEED_DELAY, &gpu_lock}, 250 + }; 251 + 252 + static struct mmp_param_gate_clk mmp2_apmu_gate_clks[] = { 253 + {MMP2_CLK_GPU_3D, "gpu_3d_clk", "gpu_3d_mux", CLK_SET_RATE_PARENT, APMU_GPU, 0x5, 0x5, 0x0, MMP_CLK_GATE_NEED_DELAY, &gpu_lock}, 254 + }; 255 + 256 + static struct mmp_param_gate_clk mmp3_apmu_gate_clks[] = { 257 + {MMP3_CLK_SDH4, "sdh4_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH4, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, 258 + {MMP3_CLK_GPU_3D, "gpu_3d_clk", "gpu_3d_div", CLK_SET_RATE_PARENT, APMU_GPU, 0x5, 0x5, 0x0, MMP_CLK_GATE_NEED_DELAY, &gpu_lock}, 259 + {MMP3_CLK_GPU_2D, "gpu_2d_clk", "gpu_2d_div", CLK_SET_RATE_PARENT, APMU_GPU, 0x1c0000, 0x1c0000, 0x0, MMP_CLK_GATE_NEED_DELAY, &gpu_lock}, 328 260 }; 329 261 330 262 static void mmp2_axi_periph_clk_init(struct mmp2_clk_unit *pxa_unit) ··· 371 281 372 282 mmp_register_gate_clks(unit, apmu_gate_clks, pxa_unit->apmu_base, 373 283 ARRAY_SIZE(apmu_gate_clks)); 284 + 285 + if (pxa_unit->model == CLK_MODEL_MMP3) { 286 + mmp_register_mux_clks(unit, mmp3_apmu_mux_clks, pxa_unit->apmu_base, 287 + ARRAY_SIZE(mmp3_apmu_mux_clks)); 288 + 289 + mmp_register_div_clks(unit, mmp3_apmu_div_clks, pxa_unit->apmu_base, 290 + ARRAY_SIZE(mmp3_apmu_div_clks)); 291 + 292 + mmp_register_gate_clks(unit, mmp3_apmu_gate_clks, pxa_unit->apmu_base, 293 + ARRAY_SIZE(mmp3_apmu_gate_clks)); 294 + } else { 295 + clk_register_mux_table(NULL, "gpu_3d_mux", mmp2_gpu_gc_parent_names, 296 + ARRAY_SIZE(mmp2_gpu_gc_parent_names), 297 + CLK_SET_RATE_PARENT, 298 + pxa_unit->apmu_base + APMU_GPU, 299 + 0, 0x10c0, 0, 300 + mmp2_gpu_gc_parent_table, &gpu_lock); 301 + 302 + clk_register_mux_table(NULL, "gpu_bus_mux", mmp2_gpu_bus_parent_names, 303 + ARRAY_SIZE(mmp2_gpu_bus_parent_names), 304 + CLK_SET_RATE_PARENT, 305 + pxa_unit->apmu_base + APMU_GPU, 306 + 0, 0x4030, 0, 307 + mmp2_gpu_bus_parent_table, &gpu_lock); 308 + 309 + mmp_register_gate_clks(unit, mmp2_apmu_gate_clks, pxa_unit->apmu_base, 310 + ARRAY_SIZE(mmp2_apmu_gate_clks)); 311 + } 374 312 } 375 313 376 314 static void mmp2_clk_reset_init(struct device_node *np, ··· 430 312 pxa_unit = kzalloc(sizeof(*pxa_unit), GFP_KERNEL); 431 313 if (!pxa_unit) 432 314 return; 315 + 316 + if (of_device_is_compatible(np, "marvell,mmp3-clock")) 317 + pxa_unit->model = CLK_MODEL_MMP3; 318 + else 319 + pxa_unit->model = CLK_MODEL_MMP2; 433 320 434 321 pxa_unit->mpmu_base = of_iomap(np, 0); 435 322 if (!pxa_unit->mpmu_base) { ··· 475 352 } 476 353 477 354 CLK_OF_DECLARE(mmp2_clk, "marvell,mmp2-clock", mmp2_clk_init); 355 + CLK_OF_DECLARE(mmp3_clk, "marvell,mmp3-clock", mmp2_clk_init);
+139
drivers/clk/mmp/clk-pll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * MMP PLL clock rate calculation 4 + * 5 + * Copyright (C) 2020 Lubomir Rintel <lkundrak@v3.sk> 6 + */ 7 + 8 + #include <linux/clk-provider.h> 9 + #include <linux/slab.h> 10 + #include <linux/io.h> 11 + 12 + #include "clk.h" 13 + 14 + #define to_clk_mmp_pll(hw) container_of(hw, struct mmp_clk_pll, hw) 15 + 16 + struct mmp_clk_pll { 17 + struct clk_hw hw; 18 + unsigned long default_rate; 19 + void __iomem *enable_reg; 20 + u32 enable; 21 + void __iomem *reg; 22 + u8 shift; 23 + 24 + unsigned long input_rate; 25 + void __iomem *postdiv_reg; 26 + u8 postdiv_shift; 27 + }; 28 + 29 + static int mmp_clk_pll_is_enabled(struct clk_hw *hw) 30 + { 31 + struct mmp_clk_pll *pll = to_clk_mmp_pll(hw); 32 + u32 val; 33 + 34 + val = readl_relaxed(pll->enable_reg); 35 + if ((val & pll->enable) == pll->enable) 36 + return 1; 37 + 38 + /* Some PLLs, if not software controlled, output default clock. */ 39 + if (pll->default_rate > 0) 40 + return 1; 41 + 42 + return 0; 43 + } 44 + 45 + static unsigned long mmp_clk_pll_recalc_rate(struct clk_hw *hw, 46 + unsigned long parent_rate) 47 + { 48 + struct mmp_clk_pll *pll = to_clk_mmp_pll(hw); 49 + u32 fbdiv, refdiv, postdiv; 50 + u64 rate; 51 + u32 val; 52 + 53 + val = readl_relaxed(pll->enable_reg); 54 + if ((val & pll->enable) != pll->enable) 55 + return pll->default_rate; 56 + 57 + if (pll->reg) { 58 + val = readl_relaxed(pll->reg); 59 + fbdiv = (val >> pll->shift) & 0x1ff; 60 + refdiv = (val >> (pll->shift + 9)) & 0x1f; 61 + } else { 62 + fbdiv = 2; 63 + refdiv = 1; 64 + } 65 + 66 + if (pll->postdiv_reg) { 67 + /* MMP3 clock rate calculation */ 68 + static const u8 postdivs[] = {2, 3, 4, 5, 6, 8, 10, 12, 16}; 69 + 70 + val = readl_relaxed(pll->postdiv_reg); 71 + postdiv = (val >> pll->postdiv_shift) & 0x7; 72 + 73 + rate = pll->input_rate; 74 + rate *= 2 * fbdiv; 75 + do_div(rate, refdiv); 76 + do_div(rate, postdivs[postdiv]); 77 + } else { 78 + /* MMP2 clock rate calculation */ 79 + if (refdiv == 3) { 80 + rate = 19200000; 81 + } else if (refdiv == 4) { 82 + rate = 26000000; 83 + } else { 84 + pr_err("bad refdiv: %d (0x%08x)\n", refdiv, val); 85 + return 0; 86 + } 87 + 88 + rate *= fbdiv + 2; 89 + do_div(rate, refdiv + 2); 90 + } 91 + 92 + return (unsigned long)rate; 93 + } 94 + 95 + static const struct clk_ops mmp_clk_pll_ops = { 96 + .is_enabled = mmp_clk_pll_is_enabled, 97 + .recalc_rate = mmp_clk_pll_recalc_rate, 98 + }; 99 + 100 + struct clk *mmp_clk_register_pll(char *name, 101 + unsigned long default_rate, 102 + void __iomem *enable_reg, u32 enable, 103 + void __iomem *reg, u8 shift, 104 + unsigned long input_rate, 105 + void __iomem *postdiv_reg, u8 postdiv_shift) 106 + { 107 + struct mmp_clk_pll *pll; 108 + struct clk *clk; 109 + struct clk_init_data init; 110 + 111 + pll = kzalloc(sizeof(*pll), GFP_KERNEL); 112 + if (!pll) 113 + return ERR_PTR(-ENOMEM); 114 + 115 + init.name = name; 116 + init.ops = &mmp_clk_pll_ops; 117 + init.flags = 0; 118 + init.parent_names = NULL; 119 + init.num_parents = 0; 120 + 121 + pll->default_rate = default_rate; 122 + pll->enable_reg = enable_reg; 123 + pll->enable = enable; 124 + pll->reg = reg; 125 + pll->shift = shift; 126 + 127 + pll->input_rate = input_rate; 128 + pll->postdiv_reg = postdiv_reg; 129 + pll->postdiv_shift = postdiv_shift; 130 + 131 + pll->hw.init = &init; 132 + 133 + clk = clk_register(NULL, &pll->hw); 134 + 135 + if (IS_ERR(clk)) 136 + kfree(pll); 137 + 138 + return clk; 139 + }
+31
drivers/clk/mmp/clk.c
··· 176 176 } 177 177 } 178 178 179 + void mmp_register_pll_clks(struct mmp_clk_unit *unit, 180 + struct mmp_param_pll_clk *clks, 181 + void __iomem *base, int size) 182 + { 183 + struct clk *clk; 184 + int i; 185 + 186 + for (i = 0; i < size; i++) { 187 + void __iomem *reg = NULL; 188 + 189 + if (clks[i].offset) 190 + reg = base + clks[i].offset; 191 + 192 + clk = mmp_clk_register_pll(clks[i].name, 193 + clks[i].default_rate, 194 + base + clks[i].enable_offset, 195 + clks[i].enable, 196 + reg, clks[i].shift, 197 + clks[i].input_rate, 198 + base + clks[i].postdiv_offset, 199 + clks[i].postdiv_shift); 200 + if (IS_ERR(clk)) { 201 + pr_err("%s: failed to register clock %s\n", 202 + __func__, clks[i].name); 203 + continue; 204 + } 205 + if (clks[i].id) 206 + unit->clk_table[clks[i].id] = clk; 207 + } 208 + } 209 + 179 210 void mmp_clk_add(struct mmp_clk_unit *unit, unsigned int id, 180 211 struct clk *clk) 181 212 {
+26 -5
drivers/clk/mmp/clk.h
··· 97 97 extern const struct clk_ops mmp_clk_mix_ops; 98 98 extern struct clk *mmp_clk_register_mix(struct device *dev, 99 99 const char *name, 100 - const char **parent_names, 100 + const char * const *parent_names, 101 101 u8 num_parents, 102 102 unsigned long flags, 103 103 struct mmp_clk_mix_config *config, ··· 124 124 u32 val_disable, unsigned int gate_flags, 125 125 spinlock_t *lock); 126 126 127 - 128 - extern struct clk *mmp_clk_register_pll2(const char *name, 129 - const char *parent_name, unsigned long flags); 130 127 extern struct clk *mmp_clk_register_apbc(const char *name, 131 128 const char *parent_name, void __iomem *base, 132 129 unsigned int delay, unsigned int apbc_flags, spinlock_t *lock); ··· 193 196 struct mmp_param_mux_clk { 194 197 unsigned int id; 195 198 char *name; 196 - const char **parent_name; 199 + const char * const *parent_name; 197 200 u8 num_parents; 198 201 unsigned long flags; 199 202 unsigned long offset; ··· 220 223 void mmp_register_div_clks(struct mmp_clk_unit *unit, 221 224 struct mmp_param_div_clk *clks, 222 225 void __iomem *base, int size); 226 + 227 + struct mmp_param_pll_clk { 228 + unsigned int id; 229 + char *name; 230 + unsigned long default_rate; 231 + unsigned long enable_offset; 232 + u32 enable; 233 + unsigned long offset; 234 + u8 shift; 235 + /* MMP3 specific: */ 236 + unsigned long input_rate; 237 + unsigned long postdiv_offset; 238 + unsigned long postdiv_shift; 239 + }; 240 + void mmp_register_pll_clks(struct mmp_clk_unit *unit, 241 + struct mmp_param_pll_clk *clks, 242 + void __iomem *base, int size); 243 + 244 + extern struct clk *mmp_clk_register_pll(char *name, 245 + unsigned long default_rate, 246 + void __iomem *enable_reg, u32 enable, 247 + void __iomem *reg, u8 shift, 248 + unsigned long input_rate, 249 + void __iomem *postdiv_reg, u8 postdiv_shift); 223 250 224 251 #define DEFINE_MIX_REG_INFO(w_d, s_d, w_m, s_m, fc) \ 225 252 { \
+16
drivers/clk/qcom/Kconfig
··· 280 280 Say Y if you want to support graphics controller devices and 281 281 functionality such as 3D graphics. 282 282 283 + config SC_MSS_7180 284 + tristate "SC7180 Modem Clock Controller" 285 + select SC_GCC_7180 286 + help 287 + Support for the Modem Subsystem clock controller on Qualcomm 288 + Technologies, Inc on SC7180 devices. 289 + Say Y if you want to use the Modem branch clocks of the Modem 290 + subsystem clock controller to reset the MSS subsystem. 291 + 283 292 config SC_VIDEOCC_7180 284 293 tristate "SC7180 Video Clock Controller" 285 294 select SC_GCC_7180 ··· 372 363 tristate "SM8150 Global Clock Controller" 373 364 help 374 365 Support for the global clock controller on SM8150 devices. 366 + Say Y if you want to use peripheral devices such as UART, 367 + SPI, I2C, USB, SD/UFS, PCIe etc. 368 + 369 + config SM_GCC_8250 370 + tristate "SM8250 Global Clock Controller" 371 + help 372 + Support for the global clock controller on SM8250 devices. 375 373 Say Y if you want to use peripheral devices such as UART, 376 374 SPI, I2C, USB, SD/UFS, PCIe etc. 377 375
+2
drivers/clk/qcom/Makefile
··· 50 50 obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o 51 51 obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o 52 52 obj-$(CONFIG_SC_GPUCC_7180) += gpucc-sc7180.o 53 + obj-$(CONFIG_SC_MSS_7180) += mss-sc7180.o 53 54 obj-$(CONFIG_SC_VIDEOCC_7180) += videocc-sc7180.o 54 55 obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o 55 56 obj-$(CONFIG_SDM_DISPCC_845) += dispcc-sdm845.o ··· 60 59 obj-$(CONFIG_SDM_LPASSCC_845) += lpasscc-sdm845.o 61 60 obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o 62 61 obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o 62 + obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o 63 63 obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o 64 64 obj-$(CONFIG_KPSS_XCC) += kpss-xcc.o 65 65 obj-$(CONFIG_QCOM_HFPLL) += hfpll.o
+223 -54
drivers/clk/qcom/clk-alpha-pll.c
··· 52 52 #define PLL_CONFIG_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U1]) 53 53 #define PLL_TEST_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL]) 54 54 #define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U]) 55 + #define PLL_TEST_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1]) 55 56 #define PLL_STATUS(p) ((p)->offset + (p)->regs[PLL_OFF_STATUS]) 56 57 #define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE]) 57 58 #define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC]) ··· 117 116 [PLL_OFF_ALPHA_VAL] = 0x40, 118 117 [PLL_OFF_CAL_VAL] = 0x44, 119 118 }, 119 + [CLK_ALPHA_PLL_TYPE_LUCID] = { 120 + [PLL_OFF_L_VAL] = 0x04, 121 + [PLL_OFF_CAL_L_VAL] = 0x08, 122 + [PLL_OFF_USER_CTL] = 0x0c, 123 + [PLL_OFF_USER_CTL_U] = 0x10, 124 + [PLL_OFF_USER_CTL_U1] = 0x14, 125 + [PLL_OFF_CONFIG_CTL] = 0x18, 126 + [PLL_OFF_CONFIG_CTL_U] = 0x1c, 127 + [PLL_OFF_CONFIG_CTL_U1] = 0x20, 128 + [PLL_OFF_TEST_CTL] = 0x24, 129 + [PLL_OFF_TEST_CTL_U] = 0x28, 130 + [PLL_OFF_TEST_CTL_U1] = 0x2c, 131 + [PLL_OFF_STATUS] = 0x30, 132 + [PLL_OFF_OPMODE] = 0x38, 133 + [PLL_OFF_ALPHA_VAL] = 0x40, 134 + }, 120 135 }; 121 136 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); 122 137 ··· 151 134 #define PLL_HUAYRA_N_MASK 0xff 152 135 #define PLL_HUAYRA_ALPHA_WIDTH 16 153 136 154 - #define FABIA_OPMODE_STANDBY 0x0 155 - #define FABIA_OPMODE_RUN 0x1 137 + #define PLL_STANDBY 0x0 138 + #define PLL_RUN 0x1 139 + #define PLL_OUT_MASK 0x7 140 + #define PLL_RATE_MARGIN 500 156 141 157 - #define FABIA_PLL_OUT_MASK 0x7 158 - #define FABIA_PLL_RATE_MARGIN 500 159 - 160 - #define TRION_PLL_STANDBY 0x0 161 - #define TRION_PLL_RUN 0x1 162 - #define TRION_PLL_OUT_MASK 0x7 142 + /* LUCID PLL specific settings and offsets */ 143 + #define LUCID_PLL_CAL_VAL 0x44 144 + #define LUCID_PCAL_DONE BIT(26) 163 145 164 146 #define pll_alpha_width(p) \ 165 147 ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ··· 560 544 rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 561 545 vco = alpha_pll_find_vco(pll, rate); 562 546 if (pll->vco_table && !vco) { 563 - pr_err("alpha pll not in a valid vco range\n"); 547 + pr_err("%s: alpha pll not in a valid vco range\n", 548 + clk_hw_get_name(hw)); 564 549 return -EINVAL; 565 550 } 566 551 ··· 739 722 */ 740 723 if (clk_alpha_pll_is_enabled(hw)) { 741 724 if (cur_alpha != a) { 742 - pr_err("clock needs to be gated %s\n", 725 + pr_err("%s: clock needs to be gated\n", 743 726 clk_hw_get_name(hw)); 744 727 return -EBUSY; 745 728 } ··· 782 765 if (ret) 783 766 return 0; 784 767 785 - return ((opmode_regval & TRION_PLL_RUN) && (mode_regval & PLL_OUTCTRL)); 768 + return ((opmode_regval & PLL_RUN) && (mode_regval & PLL_OUTCTRL)); 786 769 } 787 770 788 771 static int clk_trion_pll_is_enabled(struct clk_hw *hw) ··· 812 795 } 813 796 814 797 /* Set operation mode to RUN */ 815 - regmap_write(regmap, PLL_OPMODE(pll), TRION_PLL_RUN); 798 + regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 816 799 817 800 ret = wait_for_pll_enable_lock(pll); 818 801 if (ret) ··· 820 803 821 804 /* Enable the PLL outputs */ 822 805 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 823 - TRION_PLL_OUT_MASK, TRION_PLL_OUT_MASK); 806 + PLL_OUT_MASK, PLL_OUT_MASK); 824 807 if (ret) 825 808 return ret; 826 809 ··· 853 836 854 837 /* Disable the PLL outputs */ 855 838 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 856 - TRION_PLL_OUT_MASK, 0); 839 + PLL_OUT_MASK, 0); 857 840 if (ret) 858 841 return; 859 842 860 843 /* Place the PLL mode in STANDBY */ 861 - regmap_write(regmap, PLL_OPMODE(pll), TRION_PLL_STANDBY); 844 + regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 862 845 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 863 846 } 864 847 ··· 866 849 clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 867 850 { 868 851 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 869 - struct regmap *regmap = pll->clkr.regmap; 870 - u32 l, frac; 871 - u64 prate = parent_rate; 852 + u32 l, frac, alpha_width = pll_alpha_width(pll); 872 853 873 - regmap_read(regmap, PLL_L_VAL(pll), &l); 874 - regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac); 854 + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 855 + regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac); 875 856 876 - return alpha_pll_calc_rate(prate, l, frac, ALPHA_REG_16BIT_WIDTH); 877 - } 878 - 879 - static long clk_trion_pll_round_rate(struct clk_hw *hw, unsigned long rate, 880 - unsigned long *prate) 881 - { 882 - struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 883 - unsigned long min_freq, max_freq; 884 - u32 l; 885 - u64 a; 886 - 887 - rate = alpha_pll_round_rate(rate, *prate, 888 - &l, &a, ALPHA_REG_16BIT_WIDTH); 889 - if (!pll->vco_table || alpha_pll_find_vco(pll, rate)) 890 - return rate; 891 - 892 - min_freq = pll->vco_table[0].min_freq; 893 - max_freq = pll->vco_table[pll->num_vco - 1].max_freq; 894 - 895 - return clamp(rate, min_freq, max_freq); 857 + return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); 896 858 } 897 859 898 860 const struct clk_ops clk_alpha_pll_fixed_ops = { ··· 917 921 .disable = clk_trion_pll_disable, 918 922 .is_enabled = clk_trion_pll_is_enabled, 919 923 .recalc_rate = clk_trion_pll_recalc_rate, 920 - .round_rate = clk_trion_pll_round_rate, 924 + .round_rate = clk_alpha_pll_round_rate, 921 925 }; 922 926 EXPORT_SYMBOL_GPL(clk_trion_fixed_pll_ops); 923 927 ··· 1084 1088 return ret; 1085 1089 1086 1090 /* Skip If PLL is already running */ 1087 - if ((opmode_val & FABIA_OPMODE_RUN) && (val & PLL_OUTCTRL)) 1091 + if ((opmode_val & PLL_RUN) && (val & PLL_OUTCTRL)) 1088 1092 return 0; 1089 1093 1090 1094 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1091 1095 if (ret) 1092 1096 return ret; 1093 1097 1094 - ret = regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_STANDBY); 1098 + ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1095 1099 if (ret) 1096 1100 return ret; 1097 1101 ··· 1100 1104 if (ret) 1101 1105 return ret; 1102 1106 1103 - ret = regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_RUN); 1107 + ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 1104 1108 if (ret) 1105 1109 return ret; 1106 1110 ··· 1109 1113 return ret; 1110 1114 1111 1115 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 1112 - FABIA_PLL_OUT_MASK, FABIA_PLL_OUT_MASK); 1116 + PLL_OUT_MASK, PLL_OUT_MASK); 1113 1117 if (ret) 1114 1118 return ret; 1115 1119 ··· 1139 1143 return; 1140 1144 1141 1145 /* Disable main outputs */ 1142 - ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), FABIA_PLL_OUT_MASK, 1143 - 0); 1146 + ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0); 1144 1147 if (ret) 1145 1148 return; 1146 1149 1147 1150 /* Place the PLL in STANDBY */ 1148 - regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_STANDBY); 1151 + regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1149 1152 } 1150 1153 1151 1154 static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw, ··· 1165 1170 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1166 1171 u32 l, alpha_width = pll_alpha_width(pll); 1167 1172 u64 a; 1168 - unsigned long rrate; 1173 + unsigned long rrate, max = rate + PLL_RATE_MARGIN; 1169 1174 1170 1175 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 1171 1176 ··· 1173 1178 * Due to limited number of bits for fractional rate programming, the 1174 1179 * rounded up rate could be marginally higher than the requested rate. 1175 1180 */ 1176 - if (rrate > (rate + FABIA_PLL_RATE_MARGIN) || rrate < rate) { 1177 - pr_err("Call set rate on the PLL with rounded rates!\n"); 1181 + if (rrate > (rate + PLL_RATE_MARGIN) || rrate < rate) { 1182 + pr_err("%s: Rounded rate %lu not within range [%lu, %lu)\n", 1183 + clk_hw_get_name(hw), rrate, rate, max); 1178 1184 return -EINVAL; 1179 1185 } 1180 1186 ··· 1192 1196 struct clk_hw *parent_hw; 1193 1197 unsigned long cal_freq, rrate; 1194 1198 u32 cal_l, val, alpha_width = pll_alpha_width(pll); 1199 + const char *name = clk_hw_get_name(hw); 1195 1200 u64 a; 1196 1201 int ret; 1197 1202 ··· 1207 1210 1208 1211 vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw)); 1209 1212 if (!vco) { 1210 - pr_err("alpha pll: not in a valid vco range\n"); 1213 + pr_err("%s: alpha pll not in a valid vco range\n", name); 1211 1214 return -EINVAL; 1212 1215 } 1213 1216 ··· 1224 1227 * Due to a limited number of bits for fractional rate programming, the 1225 1228 * rounded up rate could be marginally higher than the requested rate. 1226 1229 */ 1227 - if (rrate > (cal_freq + FABIA_PLL_RATE_MARGIN) || rrate < cal_freq) 1230 + if (rrate > (cal_freq + PLL_RATE_MARGIN) || rrate < cal_freq) 1228 1231 return -EINVAL; 1229 1232 1230 1233 /* Setup PLL for calibration frequency */ ··· 1233 1236 /* Bringup the PLL at calibration frequency */ 1234 1237 ret = clk_alpha_pll_enable(hw); 1235 1238 if (ret) { 1236 - pr_err("alpha pll calibration failed\n"); 1239 + pr_err("%s: alpha pll calibration failed\n", name); 1237 1240 return ret; 1238 1241 } 1239 1242 ··· 1391 1394 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, 1392 1395 }; 1393 1396 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops); 1397 + 1398 + /** 1399 + * clk_lucid_pll_configure - configure the lucid pll 1400 + * 1401 + * @pll: clk alpha pll 1402 + * @regmap: register map 1403 + * @config: configuration to apply for pll 1404 + */ 1405 + void clk_lucid_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 1406 + const struct alpha_pll_config *config) 1407 + { 1408 + if (config->l) 1409 + regmap_write(regmap, PLL_L_VAL(pll), config->l); 1410 + 1411 + regmap_write(regmap, PLL_CAL_L_VAL(pll), LUCID_PLL_CAL_VAL); 1412 + 1413 + if (config->alpha) 1414 + regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha); 1415 + 1416 + if (config->config_ctl_val) 1417 + regmap_write(regmap, PLL_CONFIG_CTL(pll), 1418 + config->config_ctl_val); 1419 + 1420 + if (config->config_ctl_hi_val) 1421 + regmap_write(regmap, PLL_CONFIG_CTL_U(pll), 1422 + config->config_ctl_hi_val); 1423 + 1424 + if (config->config_ctl_hi1_val) 1425 + regmap_write(regmap, PLL_CONFIG_CTL_U1(pll), 1426 + config->config_ctl_hi1_val); 1427 + 1428 + if (config->user_ctl_val) 1429 + regmap_write(regmap, PLL_USER_CTL(pll), 1430 + config->user_ctl_val); 1431 + 1432 + if (config->user_ctl_hi_val) 1433 + regmap_write(regmap, PLL_USER_CTL_U(pll), 1434 + config->user_ctl_hi_val); 1435 + 1436 + if (config->user_ctl_hi1_val) 1437 + regmap_write(regmap, PLL_USER_CTL_U1(pll), 1438 + config->user_ctl_hi1_val); 1439 + 1440 + if (config->test_ctl_val) 1441 + regmap_write(regmap, PLL_TEST_CTL(pll), 1442 + config->test_ctl_val); 1443 + 1444 + if (config->test_ctl_hi_val) 1445 + regmap_write(regmap, PLL_TEST_CTL_U(pll), 1446 + config->test_ctl_hi_val); 1447 + 1448 + if (config->test_ctl_hi1_val) 1449 + regmap_write(regmap, PLL_TEST_CTL_U1(pll), 1450 + config->test_ctl_hi1_val); 1451 + 1452 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS, 1453 + PLL_UPDATE_BYPASS); 1454 + 1455 + /* Disable PLL output */ 1456 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1457 + 1458 + /* Set operation mode to OFF */ 1459 + regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1460 + 1461 + /* Place the PLL in STANDBY mode */ 1462 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1463 + } 1464 + EXPORT_SYMBOL_GPL(clk_lucid_pll_configure); 1465 + 1466 + /* 1467 + * The Lucid PLL requires a power-on self-calibration which happens when the 1468 + * PLL comes out of reset. Calibrate in case it is not completed. 1469 + */ 1470 + static int alpha_pll_lucid_prepare(struct clk_hw *hw) 1471 + { 1472 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1473 + u32 regval; 1474 + int ret; 1475 + 1476 + /* Return early if calibration is not needed. */ 1477 + regmap_read(pll->clkr.regmap, PLL_STATUS(pll), &regval); 1478 + if (regval & LUCID_PCAL_DONE) 1479 + return 0; 1480 + 1481 + /* On/off to calibrate */ 1482 + ret = clk_trion_pll_enable(hw); 1483 + if (!ret) 1484 + clk_trion_pll_disable(hw); 1485 + 1486 + return ret; 1487 + } 1488 + 1489 + static int alpha_pll_lucid_set_rate(struct clk_hw *hw, unsigned long rate, 1490 + unsigned long prate) 1491 + { 1492 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1493 + unsigned long rrate; 1494 + u32 regval, l, alpha_width = pll_alpha_width(pll); 1495 + u64 a; 1496 + int ret; 1497 + 1498 + rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 1499 + 1500 + /* 1501 + * Due to a limited number of bits for fractional rate programming, the 1502 + * rounded up rate could be marginally higher than the requested rate. 1503 + */ 1504 + if (rrate > (rate + PLL_RATE_MARGIN) || rrate < rate) { 1505 + pr_err("Call set rate on the PLL with rounded rates!\n"); 1506 + return -EINVAL; 1507 + } 1508 + 1509 + regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 1510 + regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 1511 + 1512 + /* Latch the PLL input */ 1513 + ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 1514 + PLL_UPDATE, PLL_UPDATE); 1515 + if (ret) 1516 + return ret; 1517 + 1518 + /* Wait for 2 reference cycles before checking the ACK bit. */ 1519 + udelay(1); 1520 + regmap_read(pll->clkr.regmap, PLL_MODE(pll), &regval); 1521 + if (!(regval & ALPHA_PLL_ACK_LATCH)) { 1522 + pr_err("Lucid PLL latch failed. Output may be unstable!\n"); 1523 + return -EINVAL; 1524 + } 1525 + 1526 + /* Return the latch input to 0 */ 1527 + ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 1528 + PLL_UPDATE, 0); 1529 + if (ret) 1530 + return ret; 1531 + 1532 + if (clk_hw_is_enabled(hw)) { 1533 + ret = wait_for_pll_enable_lock(pll); 1534 + if (ret) 1535 + return ret; 1536 + } 1537 + 1538 + /* Wait for PLL output to stabilize */ 1539 + udelay(100); 1540 + return 0; 1541 + } 1542 + 1543 + const struct clk_ops clk_alpha_pll_lucid_ops = { 1544 + .prepare = alpha_pll_lucid_prepare, 1545 + .enable = clk_trion_pll_enable, 1546 + .disable = clk_trion_pll_disable, 1547 + .is_enabled = clk_trion_pll_is_enabled, 1548 + .recalc_rate = clk_trion_pll_recalc_rate, 1549 + .round_rate = clk_alpha_pll_round_rate, 1550 + .set_rate = alpha_pll_lucid_set_rate, 1551 + }; 1552 + EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_ops); 1553 + 1554 + const struct clk_ops clk_alpha_pll_fixed_lucid_ops = { 1555 + .enable = clk_trion_pll_enable, 1556 + .disable = clk_trion_pll_disable, 1557 + .is_enabled = clk_trion_pll_is_enabled, 1558 + .recalc_rate = clk_trion_pll_recalc_rate, 1559 + .round_rate = clk_alpha_pll_round_rate, 1560 + }; 1561 + EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_lucid_ops); 1562 + 1563 + const struct clk_ops clk_alpha_pll_postdiv_lucid_ops = { 1564 + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, 1565 + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, 1566 + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, 1567 + }; 1568 + EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_ops);
+12
drivers/clk/qcom/clk-alpha-pll.h
··· 14 14 CLK_ALPHA_PLL_TYPE_BRAMMO, 15 15 CLK_ALPHA_PLL_TYPE_FABIA, 16 16 CLK_ALPHA_PLL_TYPE_TRION, 17 + CLK_ALPHA_PLL_TYPE_LUCID, 17 18 CLK_ALPHA_PLL_TYPE_MAX, 18 19 }; 19 20 ··· 31 30 PLL_OFF_CONFIG_CTL_U1, 32 31 PLL_OFF_TEST_CTL, 33 32 PLL_OFF_TEST_CTL_U, 33 + PLL_OFF_TEST_CTL_U1, 34 34 PLL_OFF_STATUS, 35 35 PLL_OFF_OPMODE, 36 36 PLL_OFF_FRAC, ··· 96 94 u32 alpha_hi; 97 95 u32 config_ctl_val; 98 96 u32 config_ctl_hi_val; 97 + u32 config_ctl_hi1_val; 99 98 u32 user_ctl_val; 100 99 u32 user_ctl_hi_val; 100 + u32 user_ctl_hi1_val; 101 101 u32 test_ctl_val; 102 102 u32 test_ctl_hi_val; 103 + u32 test_ctl_hi1_val; 103 104 u32 main_output_mask; 104 105 u32 aux_output_mask; 105 106 u32 aux2_output_mask; ··· 128 123 extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; 129 124 extern const struct clk_ops clk_alpha_pll_postdiv_fabia_ops; 130 125 126 + extern const struct clk_ops clk_alpha_pll_lucid_ops; 127 + extern const struct clk_ops clk_alpha_pll_fixed_lucid_ops; 128 + extern const struct clk_ops clk_alpha_pll_postdiv_lucid_ops; 129 + 131 130 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 132 131 const struct alpha_pll_config *config); 133 132 void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 134 133 const struct alpha_pll_config *config); 134 + void clk_lucid_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 135 + const struct alpha_pll_config *config); 136 + 135 137 extern const struct clk_ops clk_trion_fixed_pll_ops; 136 138 extern const struct clk_ops clk_trion_pll_postdiv_ops; 137 139
+35
drivers/clk/qcom/clk-rpm.c
··· 543 543 .num_clks = ARRAY_SIZE(apq8064_clks), 544 544 }; 545 545 546 + /* ipq806x */ 547 + DEFINE_CLK_RPM(ipq806x, afab_clk, afab_a_clk, QCOM_RPM_APPS_FABRIC_CLK); 548 + DEFINE_CLK_RPM(ipq806x, cfpb_clk, cfpb_a_clk, QCOM_RPM_CFPB_CLK); 549 + DEFINE_CLK_RPM(ipq806x, daytona_clk, daytona_a_clk, QCOM_RPM_DAYTONA_FABRIC_CLK); 550 + DEFINE_CLK_RPM(ipq806x, ebi1_clk, ebi1_a_clk, QCOM_RPM_EBI1_CLK); 551 + DEFINE_CLK_RPM(ipq806x, sfab_clk, sfab_a_clk, QCOM_RPM_SYS_FABRIC_CLK); 552 + DEFINE_CLK_RPM(ipq806x, sfpb_clk, sfpb_a_clk, QCOM_RPM_SFPB_CLK); 553 + DEFINE_CLK_RPM(ipq806x, nss_fabric_0_clk, nss_fabric_0_a_clk, QCOM_RPM_NSS_FABRIC_0_CLK); 554 + DEFINE_CLK_RPM(ipq806x, nss_fabric_1_clk, nss_fabric_1_a_clk, QCOM_RPM_NSS_FABRIC_1_CLK); 555 + 556 + static struct clk_rpm *ipq806x_clks[] = { 557 + [RPM_APPS_FABRIC_CLK] = &ipq806x_afab_clk, 558 + [RPM_APPS_FABRIC_A_CLK] = &ipq806x_afab_a_clk, 559 + [RPM_CFPB_CLK] = &ipq806x_cfpb_clk, 560 + [RPM_CFPB_A_CLK] = &ipq806x_cfpb_a_clk, 561 + [RPM_DAYTONA_FABRIC_CLK] = &ipq806x_daytona_clk, 562 + [RPM_DAYTONA_FABRIC_A_CLK] = &ipq806x_daytona_a_clk, 563 + [RPM_EBI1_CLK] = &ipq806x_ebi1_clk, 564 + [RPM_EBI1_A_CLK] = &ipq806x_ebi1_a_clk, 565 + [RPM_SYS_FABRIC_CLK] = &ipq806x_sfab_clk, 566 + [RPM_SYS_FABRIC_A_CLK] = &ipq806x_sfab_a_clk, 567 + [RPM_SFPB_CLK] = &ipq806x_sfpb_clk, 568 + [RPM_SFPB_A_CLK] = &ipq806x_sfpb_a_clk, 569 + [RPM_NSS_FABRIC_0_CLK] = &ipq806x_nss_fabric_0_clk, 570 + [RPM_NSS_FABRIC_0_A_CLK] = &ipq806x_nss_fabric_0_a_clk, 571 + [RPM_NSS_FABRIC_1_CLK] = &ipq806x_nss_fabric_1_clk, 572 + [RPM_NSS_FABRIC_1_A_CLK] = &ipq806x_nss_fabric_1_a_clk, 573 + }; 574 + 575 + static const struct rpm_clk_desc rpm_clk_ipq806x = { 576 + .clks = ipq806x_clks, 577 + .num_clks = ARRAY_SIZE(ipq806x_clks), 578 + }; 579 + 546 580 static const struct of_device_id rpm_clk_match_table[] = { 547 581 { .compatible = "qcom,rpmcc-msm8660", .data = &rpm_clk_msm8660 }, 548 582 { .compatible = "qcom,rpmcc-apq8060", .data = &rpm_clk_msm8660 }, 549 583 { .compatible = "qcom,rpmcc-apq8064", .data = &rpm_clk_apq8064 }, 584 + { .compatible = "qcom,rpmcc-ipq806x", .data = &rpm_clk_ipq806x }, 550 585 { } 551 586 }; 552 587 MODULE_DEVICE_TABLE(of, rpm_clk_match_table);
+55 -26
drivers/clk/qcom/clk-rpmh.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 /* 3 - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. 3 + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. 4 4 */ 5 5 6 6 #include <linux/clk-provider.h> ··· 143 143 != (c->aggr_state & BIT(state)); 144 144 } 145 145 146 + static int clk_rpmh_send(struct clk_rpmh *c, enum rpmh_state state, 147 + struct tcs_cmd *cmd, bool wait) 148 + { 149 + if (wait) 150 + return rpmh_write(c->dev, state, cmd, 1); 151 + 152 + return rpmh_write_async(c->dev, state, cmd, 1); 153 + } 154 + 146 155 static int clk_rpmh_send_aggregate_command(struct clk_rpmh *c) 147 156 { 148 157 struct tcs_cmd cmd = { 0 }; 149 158 u32 cmd_state, on_val; 150 159 enum rpmh_state state = RPMH_SLEEP_STATE; 151 160 int ret; 161 + bool wait; 152 162 153 163 cmd.addr = c->res_addr; 154 164 cmd_state = c->aggr_state; ··· 169 159 if (cmd_state & BIT(state)) 170 160 cmd.data = on_val; 171 161 172 - ret = rpmh_write_async(c->dev, state, &cmd, 1); 162 + wait = cmd_state && state == RPMH_ACTIVE_ONLY_STATE; 163 + ret = clk_rpmh_send(c, state, &cmd, wait); 173 164 if (ret) { 174 165 dev_err(c->dev, "set %s state of %s failed: (%d)\n", 175 166 !state ? "sleep" : ··· 227 216 mutex_unlock(&rpmh_clk_lock); 228 217 229 218 return ret; 230 - }; 219 + } 231 220 232 221 static void clk_rpmh_unprepare(struct clk_hw *hw) 233 222 { ··· 259 248 { 260 249 struct tcs_cmd cmd = { 0 }; 261 250 u32 cmd_state; 262 - int ret; 251 + int ret = 0; 263 252 264 253 mutex_lock(&rpmh_clk_lock); 265 - 266 - cmd_state = 0; 267 254 if (enable) { 268 255 cmd_state = 1; 269 256 if (c->aggr_state) 270 257 cmd_state = c->aggr_state; 258 + } else { 259 + cmd_state = 0; 271 260 } 272 261 273 - if (c->last_sent_aggr_state == cmd_state) { 274 - mutex_unlock(&rpmh_clk_lock); 275 - return 0; 262 + if (c->last_sent_aggr_state != cmd_state) { 263 + cmd.addr = c->res_addr; 264 + cmd.data = BCM_TCS_CMD(1, enable, 0, cmd_state); 265 + 266 + ret = clk_rpmh_send(c, RPMH_ACTIVE_ONLY_STATE, &cmd, enable); 267 + if (ret) { 268 + dev_err(c->dev, "set active state of %s failed: (%d)\n", 269 + c->res_name, ret); 270 + } else { 271 + c->last_sent_aggr_state = cmd_state; 272 + } 276 273 } 277 - 278 - cmd.addr = c->res_addr; 279 - cmd.data = BCM_TCS_CMD(1, enable, 0, cmd_state); 280 - 281 - ret = rpmh_write_async(c->dev, RPMH_ACTIVE_ONLY_STATE, &cmd, 1); 282 - if (ret) { 283 - dev_err(c->dev, "set active state of %s failed: (%d)\n", 284 - c->res_name, ret); 285 - mutex_unlock(&rpmh_clk_lock); 286 - return ret; 287 - } 288 - 289 - c->last_sent_aggr_state = cmd_state; 290 274 291 275 mutex_unlock(&rpmh_clk_lock); 292 276 293 - return 0; 277 + return ret; 294 278 } 295 279 296 280 static int clk_rpmh_bcm_prepare(struct clk_hw *hw) ··· 293 287 struct clk_rpmh *c = to_clk_rpmh(hw); 294 288 295 289 return clk_rpmh_bcm_send_cmd(c, true); 296 - }; 290 + } 297 291 298 292 static void clk_rpmh_bcm_unprepare(struct clk_hw *hw) 299 293 { 300 294 struct clk_rpmh *c = to_clk_rpmh(hw); 301 295 302 296 clk_rpmh_bcm_send_cmd(c, false); 303 - }; 297 + } 304 298 305 299 static int clk_rpmh_bcm_set_rate(struct clk_hw *hw, unsigned long rate, 306 300 unsigned long parent_rate) ··· 316 310 clk_rpmh_bcm_send_cmd(c, true); 317 311 318 312 return 0; 319 - }; 313 + } 320 314 321 315 static long clk_rpmh_round_rate(struct clk_hw *hw, unsigned long rate, 322 316 unsigned long *parent_rate) ··· 410 404 .num_clks = ARRAY_SIZE(sc7180_rpmh_clocks), 411 405 }; 412 406 407 + DEFINE_CLK_RPMH_VRM(sm8250, ln_bb_clk1, ln_bb_clk1_ao, "lnbclka1", 2); 408 + 409 + static struct clk_hw *sm8250_rpmh_clocks[] = { 410 + [RPMH_CXO_CLK] = &sdm845_bi_tcxo.hw, 411 + [RPMH_CXO_CLK_A] = &sdm845_bi_tcxo_ao.hw, 412 + [RPMH_LN_BB_CLK1] = &sm8250_ln_bb_clk1.hw, 413 + [RPMH_LN_BB_CLK1_A] = &sm8250_ln_bb_clk1_ao.hw, 414 + [RPMH_LN_BB_CLK2] = &sdm845_ln_bb_clk2.hw, 415 + [RPMH_LN_BB_CLK2_A] = &sdm845_ln_bb_clk2_ao.hw, 416 + [RPMH_LN_BB_CLK3] = &sdm845_ln_bb_clk3.hw, 417 + [RPMH_LN_BB_CLK3_A] = &sdm845_ln_bb_clk3_ao.hw, 418 + [RPMH_RF_CLK1] = &sdm845_rf_clk1.hw, 419 + [RPMH_RF_CLK1_A] = &sdm845_rf_clk1_ao.hw, 420 + [RPMH_RF_CLK3] = &sdm845_rf_clk3.hw, 421 + [RPMH_RF_CLK3_A] = &sdm845_rf_clk3_ao.hw, 422 + }; 423 + 424 + static const struct clk_rpmh_desc clk_rpmh_sm8250 = { 425 + .clks = sm8250_rpmh_clocks, 426 + .num_clks = ARRAY_SIZE(sm8250_rpmh_clocks), 427 + }; 428 + 413 429 static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec, 414 430 void *data) 415 431 { ··· 518 490 { .compatible = "qcom,sc7180-rpmh-clk", .data = &clk_rpmh_sc7180}, 519 491 { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, 520 492 { .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150}, 493 + { .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250}, 521 494 { } 522 495 }; 523 496 MODULE_DEVICE_TABLE(of, clk_rpmh_match_table);
+50
drivers/clk/qcom/clk-smd-rpm.c
··· 525 525 .num_clks = ARRAY_SIZE(msm8974_clks), 526 526 }; 527 527 528 + 529 + /* msm8976 */ 530 + DEFINE_CLK_SMD_RPM(msm8976, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 531 + DEFINE_CLK_SMD_RPM(msm8976, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 532 + DEFINE_CLK_SMD_RPM(msm8976, mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, 533 + QCOM_SMD_RPM_BUS_CLK, 2); 534 + DEFINE_CLK_SMD_RPM(msm8976, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 535 + DEFINE_CLK_SMD_RPM(msm8976, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 536 + DEFINE_CLK_SMD_RPM_QDSS(msm8976, qdss_clk, qdss_a_clk, 537 + QCOM_SMD_RPM_MISC_CLK, 1); 538 + DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, bb_clk1, bb_clk1_a, 1); 539 + DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, bb_clk2, bb_clk2_a, 2); 540 + DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, rf_clk2, rf_clk2_a, 5); 541 + DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, div_clk2, div_clk2_a, 12); 542 + DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8976, bb_clk1_pin, bb_clk1_a_pin, 1); 543 + DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8976, bb_clk2_pin, bb_clk2_a_pin, 2); 544 + 545 + static struct clk_smd_rpm *msm8976_clks[] = { 546 + [RPM_SMD_PCNOC_CLK] = &msm8976_pcnoc_clk, 547 + [RPM_SMD_PCNOC_A_CLK] = &msm8976_pcnoc_a_clk, 548 + [RPM_SMD_SNOC_CLK] = &msm8976_snoc_clk, 549 + [RPM_SMD_SNOC_A_CLK] = &msm8976_snoc_a_clk, 550 + [RPM_SMD_BIMC_CLK] = &msm8976_bimc_clk, 551 + [RPM_SMD_BIMC_A_CLK] = &msm8976_bimc_a_clk, 552 + [RPM_SMD_QDSS_CLK] = &msm8976_qdss_clk, 553 + [RPM_SMD_QDSS_A_CLK] = &msm8976_qdss_a_clk, 554 + [RPM_SMD_BB_CLK1] = &msm8976_bb_clk1, 555 + [RPM_SMD_BB_CLK1_A] = &msm8976_bb_clk1_a, 556 + [RPM_SMD_BB_CLK2] = &msm8976_bb_clk2, 557 + [RPM_SMD_BB_CLK2_A] = &msm8976_bb_clk2_a, 558 + [RPM_SMD_RF_CLK2] = &msm8976_rf_clk2, 559 + [RPM_SMD_RF_CLK2_A] = &msm8976_rf_clk2_a, 560 + [RPM_SMD_BB_CLK1_PIN] = &msm8976_bb_clk1_pin, 561 + [RPM_SMD_BB_CLK1_A_PIN] = &msm8976_bb_clk1_a_pin, 562 + [RPM_SMD_BB_CLK2_PIN] = &msm8976_bb_clk2_pin, 563 + [RPM_SMD_BB_CLK2_A_PIN] = &msm8976_bb_clk2_a_pin, 564 + [RPM_SMD_MMSSNOC_AHB_CLK] = &msm8976_mmssnoc_ahb_clk, 565 + [RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8976_mmssnoc_ahb_a_clk, 566 + [RPM_SMD_DIV_CLK2] = &msm8976_div_clk2, 567 + [RPM_SMD_DIV_A_CLK2] = &msm8976_div_clk2_a, 568 + [RPM_SMD_IPA_CLK] = &msm8976_ipa_clk, 569 + [RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk, 570 + }; 571 + 572 + static const struct rpm_smd_clk_desc rpm_clk_msm8976 = { 573 + .clks = msm8976_clks, 574 + .num_clks = ARRAY_SIZE(msm8976_clks), 575 + }; 576 + 528 577 /* msm8996 */ 529 578 DEFINE_CLK_SMD_RPM(msm8996, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 530 579 DEFINE_CLK_SMD_RPM(msm8996, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); ··· 769 720 static const struct of_device_id rpm_smd_clk_match_table[] = { 770 721 { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 }, 771 722 { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 }, 723 + { .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 }, 772 724 { .compatible = "qcom,rpmcc-msm8996", .data = &rpm_clk_msm8996 }, 773 725 { .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 }, 774 726 { .compatible = "qcom,rpmcc-qcs404", .data = &rpm_clk_qcs404 },
+2
drivers/clk/qcom/gcc-ipq806x.c
··· 1224 1224 .parent_map = gcc_pxo_pll8_map, 1225 1225 }, 1226 1226 .clkr = { 1227 + .enable_reg = 0x2e80, 1228 + .enable_mask = BIT(11), 1227 1229 .hw.init = &(struct clk_init_data){ 1228 1230 .name = "prng_src", 1229 1231 .parent_names = gcc_pxo_pll8,
+71 -1
drivers/clk/qcom/gcc-sc7180.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 /* 3 - * Copyright (c) 2019, The Linux Foundation. All rights reserved. 3 + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. 4 4 */ 5 5 6 6 #include <linux/clk-provider.h> ··· 2165 2165 }, 2166 2166 }; 2167 2167 2168 + static struct clk_branch gcc_mss_cfg_ahb_clk = { 2169 + .halt_reg = 0x8a000, 2170 + .halt_check = BRANCH_HALT, 2171 + .clkr = { 2172 + .enable_reg = 0x8a000, 2173 + .enable_mask = BIT(0), 2174 + .hw.init = &(struct clk_init_data){ 2175 + .name = "gcc_mss_cfg_ahb_clk", 2176 + .ops = &clk_branch2_ops, 2177 + }, 2178 + }, 2179 + }; 2180 + 2181 + static struct clk_branch gcc_mss_mfab_axis_clk = { 2182 + .halt_reg = 0x8a004, 2183 + .halt_check = BRANCH_HALT_VOTED, 2184 + .clkr = { 2185 + .enable_reg = 0x8a004, 2186 + .enable_mask = BIT(0), 2187 + .hw.init = &(struct clk_init_data){ 2188 + .name = "gcc_mss_mfab_axis_clk", 2189 + .ops = &clk_branch2_ops, 2190 + }, 2191 + }, 2192 + }; 2193 + 2194 + static struct clk_branch gcc_mss_nav_axi_clk = { 2195 + .halt_reg = 0x8a00c, 2196 + .halt_check = BRANCH_HALT_VOTED, 2197 + .clkr = { 2198 + .enable_reg = 0x8a00c, 2199 + .enable_mask = BIT(0), 2200 + .hw.init = &(struct clk_init_data){ 2201 + .name = "gcc_mss_nav_axi_clk", 2202 + .ops = &clk_branch2_ops, 2203 + }, 2204 + }, 2205 + }; 2206 + 2207 + static struct clk_branch gcc_mss_snoc_axi_clk = { 2208 + .halt_reg = 0x8a150, 2209 + .halt_check = BRANCH_HALT, 2210 + .clkr = { 2211 + .enable_reg = 0x8a150, 2212 + .enable_mask = BIT(0), 2213 + .hw.init = &(struct clk_init_data){ 2214 + .name = "gcc_mss_snoc_axi_clk", 2215 + .ops = &clk_branch2_ops, 2216 + }, 2217 + }, 2218 + }; 2219 + 2220 + static struct clk_branch gcc_mss_q6_memnoc_axi_clk = { 2221 + .halt_reg = 0x8a154, 2222 + .halt_check = BRANCH_HALT, 2223 + .clkr = { 2224 + .enable_reg = 0x8a154, 2225 + .enable_mask = BIT(0), 2226 + .hw.init = &(struct clk_init_data){ 2227 + .name = "gcc_mss_q6_memnoc_axi_clk", 2228 + .ops = &clk_branch2_ops, 2229 + }, 2230 + }, 2231 + }; 2232 + 2168 2233 static struct gdsc ufs_phy_gdsc = { 2169 2234 .gdscr = 0x77004, 2170 2235 .pd = { ··· 2401 2336 [GPLL7] = &gpll7.clkr, 2402 2337 [GPLL4] = &gpll4.clkr, 2403 2338 [GPLL1] = &gpll1.clkr, 2339 + [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr, 2340 + [GCC_MSS_MFAB_AXIS_CLK] = &gcc_mss_mfab_axis_clk.clkr, 2341 + [GCC_MSS_NAV_AXI_CLK] = &gcc_mss_nav_axi_clk.clkr, 2342 + [GCC_MSS_Q6_MEMNOC_AXI_CLK] = &gcc_mss_q6_memnoc_axi_clk.clkr, 2343 + [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr, 2404 2344 }; 2405 2345 2406 2346 static const struct qcom_reset_map gcc_sc7180_resets[] = {
+52
drivers/clk/qcom/gcc-sm8150.c
··· 21 21 #include "clk-rcg.h" 22 22 #include "clk-regmap.h" 23 23 #include "reset.h" 24 + #include "gdsc.h" 24 25 25 26 enum { 26 27 P_BI_TCXO, ··· 3172 3171 }, 3173 3172 }; 3174 3173 3174 + static struct clk_branch gcc_usb3_prim_phy_pipe_clk = { 3175 + .halt_check = BRANCH_HALT_SKIP, 3176 + .clkr = { 3177 + .enable_reg = 0xf058, 3178 + .enable_mask = BIT(0), 3179 + .hw.init = &(struct clk_init_data){ 3180 + .name = "gcc_usb3_prim_phy_pipe_clk", 3181 + .ops = &clk_branch2_ops, 3182 + }, 3183 + }, 3184 + }; 3185 + 3175 3186 static struct clk_branch gcc_usb3_sec_clkref_clk = { 3176 3187 .halt_reg = 0x8c028, 3177 3188 .halt_check = BRANCH_HALT, ··· 3226 3213 &gcc_usb3_sec_phy_aux_clk_src.clkr.hw }, 3227 3214 .num_parents = 1, 3228 3215 .flags = CLK_SET_RATE_PARENT, 3216 + .ops = &clk_branch2_ops, 3217 + }, 3218 + }, 3219 + }; 3220 + 3221 + static struct clk_branch gcc_usb3_sec_phy_pipe_clk = { 3222 + .halt_check = BRANCH_HALT_SKIP, 3223 + .clkr = { 3224 + .enable_reg = 0x10058, 3225 + .enable_mask = BIT(0), 3226 + .hw.init = &(struct clk_init_data){ 3227 + .name = "gcc_usb3_sec_phy_pipe_clk", 3229 3228 .ops = &clk_branch2_ops, 3230 3229 }, 3231 3230 }, ··· 3315 3290 .ops = &clk_branch2_ops, 3316 3291 }, 3317 3292 }, 3293 + }; 3294 + 3295 + static struct gdsc usb30_prim_gdsc = { 3296 + .gdscr = 0xf004, 3297 + .pd = { 3298 + .name = "usb30_prim_gdsc", 3299 + }, 3300 + .pwrsts = PWRSTS_OFF_ON, 3301 + .flags = POLL_CFG_GDSCR, 3302 + }; 3303 + 3304 + static struct gdsc usb30_sec_gdsc = { 3305 + .gdscr = 0x10004, 3306 + .pd = { 3307 + .name = "usb30_sec_gdsc", 3308 + }, 3309 + .pwrsts = PWRSTS_OFF_ON, 3310 + .flags = POLL_CFG_GDSCR, 3318 3311 }; 3319 3312 3320 3313 static struct clk_regmap *gcc_sm8150_clocks[] = { ··· 3523 3480 [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr, 3524 3481 [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr, 3525 3482 [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr, 3483 + [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr, 3526 3484 [GCC_USB3_SEC_CLKREF_CLK] = &gcc_usb3_sec_clkref_clk.clkr, 3527 3485 [GCC_USB3_SEC_PHY_AUX_CLK] = &gcc_usb3_sec_phy_aux_clk.clkr, 3528 3486 [GCC_USB3_SEC_PHY_AUX_CLK_SRC] = &gcc_usb3_sec_phy_aux_clk_src.clkr, 3529 3487 [GCC_USB3_SEC_PHY_COM_AUX_CLK] = &gcc_usb3_sec_phy_com_aux_clk.clkr, 3488 + [GCC_USB3_SEC_PHY_PIPE_CLK] = &gcc_usb3_sec_phy_pipe_clk.clkr, 3530 3489 [GCC_VIDEO_AHB_CLK] = &gcc_video_ahb_clk.clkr, 3531 3490 [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr, 3532 3491 [GCC_VIDEO_AXI1_CLK] = &gcc_video_axi1_clk.clkr, ··· 3572 3527 [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, 3573 3528 }; 3574 3529 3530 + static struct gdsc *gcc_sm8150_gdscs[] = { 3531 + [USB30_PRIM_GDSC] = &usb30_prim_gdsc, 3532 + [USB30_SEC_GDSC] = &usb30_sec_gdsc, 3533 + }; 3534 + 3575 3535 static const struct regmap_config gcc_sm8150_regmap_config = { 3576 3536 .reg_bits = 32, 3577 3537 .reg_stride = 4, ··· 3591 3541 .num_clks = ARRAY_SIZE(gcc_sm8150_clocks), 3592 3542 .resets = gcc_sm8150_resets, 3593 3543 .num_resets = ARRAY_SIZE(gcc_sm8150_resets), 3544 + .gdscs = gcc_sm8150_gdscs, 3545 + .num_gdscs = ARRAY_SIZE(gcc_sm8150_gdscs), 3594 3546 }; 3595 3547 3596 3548 static const struct of_device_id gcc_sm8150_match_table[] = {
+3690
drivers/clk/qcom/gcc-sm8250.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2020, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/err.h> 8 + #include <linux/kernel.h> 9 + #include <linux/module.h> 10 + #include <linux/of_device.h> 11 + #include <linux/of.h> 12 + #include <linux/regmap.h> 13 + 14 + #include <dt-bindings/clock/qcom,gcc-sm8250.h> 15 + 16 + #include "clk-alpha-pll.h" 17 + #include "clk-branch.h" 18 + #include "clk-rcg.h" 19 + #include "clk-regmap.h" 20 + #include "clk-regmap-divider.h" 21 + #include "common.h" 22 + #include "gdsc.h" 23 + #include "reset.h" 24 + 25 + enum { 26 + P_BI_TCXO, 27 + P_AUD_REF_CLK, 28 + P_CORE_BI_PLL_TEST_SE, 29 + P_GPLL0_OUT_EVEN, 30 + P_GPLL0_OUT_MAIN, 31 + P_GPLL4_OUT_MAIN, 32 + P_GPLL9_OUT_MAIN, 33 + P_SLEEP_CLK, 34 + }; 35 + 36 + static struct clk_alpha_pll gpll0 = { 37 + .offset = 0x0, 38 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 39 + .clkr = { 40 + .enable_reg = 0x52018, 41 + .enable_mask = BIT(0), 42 + .hw.init = &(struct clk_init_data){ 43 + .name = "gpll0", 44 + .parent_data = &(const struct clk_parent_data){ 45 + .fw_name = "bi_tcxo", 46 + }, 47 + .num_parents = 1, 48 + .ops = &clk_alpha_pll_fixed_lucid_ops, 49 + }, 50 + }, 51 + }; 52 + 53 + static const struct clk_div_table post_div_table_gpll0_out_even[] = { 54 + { 0x1, 2 }, 55 + { } 56 + }; 57 + 58 + static struct clk_alpha_pll_postdiv gpll0_out_even = { 59 + .offset = 0x0, 60 + .post_div_shift = 8, 61 + .post_div_table = post_div_table_gpll0_out_even, 62 + .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even), 63 + .width = 4, 64 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 65 + .clkr.hw.init = &(struct clk_init_data){ 66 + .name = "gpll0_out_even", 67 + .parent_data = &(const struct clk_parent_data){ 68 + .hw = &gpll0.clkr.hw, 69 + }, 70 + .num_parents = 1, 71 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 72 + }, 73 + }; 74 + 75 + static struct clk_alpha_pll gpll4 = { 76 + .offset = 0x76000, 77 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 78 + .clkr = { 79 + .enable_reg = 0x52018, 80 + .enable_mask = BIT(4), 81 + .hw.init = &(struct clk_init_data){ 82 + .name = "gpll4", 83 + .parent_data = &(const struct clk_parent_data){ 84 + .fw_name = "bi_tcxo", 85 + }, 86 + .num_parents = 1, 87 + .ops = &clk_alpha_pll_fixed_lucid_ops, 88 + }, 89 + }, 90 + }; 91 + 92 + static struct clk_alpha_pll gpll9 = { 93 + .offset = 0x1c000, 94 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 95 + .clkr = { 96 + .enable_reg = 0x52018, 97 + .enable_mask = BIT(9), 98 + .hw.init = &(struct clk_init_data){ 99 + .name = "gpll9", 100 + .parent_data = &(const struct clk_parent_data){ 101 + .fw_name = "bi_tcxo", 102 + }, 103 + .num_parents = 1, 104 + .ops = &clk_alpha_pll_fixed_lucid_ops, 105 + }, 106 + }, 107 + }; 108 + 109 + static const struct parent_map gcc_parent_map_0[] = { 110 + { P_BI_TCXO, 0 }, 111 + { P_GPLL0_OUT_MAIN, 1 }, 112 + { P_GPLL0_OUT_EVEN, 6 }, 113 + }; 114 + 115 + static const struct clk_parent_data gcc_parent_data_0[] = { 116 + { .fw_name = "bi_tcxo" }, 117 + { .hw = &gpll0.clkr.hw }, 118 + { .hw = &gpll0_out_even.clkr.hw }, 119 + }; 120 + 121 + static const struct clk_parent_data gcc_parent_data_0_ao[] = { 122 + { .fw_name = "bi_tcxo_ao" }, 123 + { .hw = &gpll0.clkr.hw }, 124 + { .hw = &gpll0_out_even.clkr.hw }, 125 + }; 126 + 127 + static const struct parent_map gcc_parent_map_1[] = { 128 + { P_BI_TCXO, 0 }, 129 + { P_GPLL0_OUT_MAIN, 1 }, 130 + { P_SLEEP_CLK, 5 }, 131 + { P_GPLL0_OUT_EVEN, 6 }, 132 + }; 133 + 134 + static const struct clk_parent_data gcc_parent_data_1[] = { 135 + { .fw_name = "bi_tcxo" }, 136 + { .hw = &gpll0.clkr.hw }, 137 + { .fw_name = "sleep_clk" }, 138 + { .hw = &gpll0_out_even.clkr.hw }, 139 + }; 140 + 141 + static const struct parent_map gcc_parent_map_2[] = { 142 + { P_BI_TCXO, 0 }, 143 + { P_SLEEP_CLK, 5 }, 144 + }; 145 + 146 + static const struct clk_parent_data gcc_parent_data_2[] = { 147 + { .fw_name = "bi_tcxo" }, 148 + { .fw_name = "sleep_clk" }, 149 + }; 150 + 151 + static const struct parent_map gcc_parent_map_3[] = { 152 + { P_BI_TCXO, 0 }, 153 + }; 154 + 155 + static const struct clk_parent_data gcc_parent_data_3[] = { 156 + { .fw_name = "bi_tcxo" }, 157 + }; 158 + 159 + static const struct parent_map gcc_parent_map_4[] = { 160 + { P_BI_TCXO, 0 }, 161 + { P_GPLL0_OUT_MAIN, 1 }, 162 + { P_GPLL9_OUT_MAIN, 2 }, 163 + { P_GPLL4_OUT_MAIN, 5 }, 164 + { P_GPLL0_OUT_EVEN, 6 }, 165 + }; 166 + 167 + static const struct clk_parent_data gcc_parent_data_4[] = { 168 + { .fw_name = "bi_tcxo" }, 169 + { .hw = &gpll0.clkr.hw }, 170 + { .hw = &gpll9.clkr.hw }, 171 + { .hw = &gpll4.clkr.hw }, 172 + { .hw = &gpll0_out_even.clkr.hw }, 173 + }; 174 + 175 + static const struct parent_map gcc_parent_map_5[] = { 176 + { P_BI_TCXO, 0 }, 177 + { P_GPLL0_OUT_MAIN, 1 }, 178 + { P_AUD_REF_CLK, 2 }, 179 + { P_GPLL0_OUT_EVEN, 6 }, 180 + }; 181 + 182 + static const struct clk_parent_data gcc_parent_data_5[] = { 183 + { .fw_name = "bi_tcxo" }, 184 + { .hw = &gpll0.clkr.hw }, 185 + { .fw_name = "aud_ref_clk" }, 186 + { .hw = &gpll0_out_even.clkr.hw }, 187 + }; 188 + 189 + static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = { 190 + F(19200000, P_BI_TCXO, 1, 0, 0), 191 + { } 192 + }; 193 + 194 + static struct clk_rcg2 gcc_cpuss_ahb_clk_src = { 195 + .cmd_rcgr = 0x48010, 196 + .mnd_width = 0, 197 + .hid_width = 5, 198 + .parent_map = gcc_parent_map_0, 199 + .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src, 200 + .clkr.hw.init = &(struct clk_init_data){ 201 + .name = "gcc_cpuss_ahb_clk_src", 202 + .parent_data = gcc_parent_data_0_ao, 203 + .num_parents = 3, 204 + .flags = CLK_SET_RATE_PARENT, 205 + .ops = &clk_rcg2_ops, 206 + }, 207 + }; 208 + 209 + static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 210 + F(19200000, P_BI_TCXO, 1, 0, 0), 211 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 212 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 213 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 214 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 215 + { } 216 + }; 217 + 218 + static struct clk_rcg2 gcc_gp1_clk_src = { 219 + .cmd_rcgr = 0x64004, 220 + .mnd_width = 8, 221 + .hid_width = 5, 222 + .parent_map = gcc_parent_map_1, 223 + .freq_tbl = ftbl_gcc_gp1_clk_src, 224 + .clkr.hw.init = &(struct clk_init_data){ 225 + .name = "gcc_gp1_clk_src", 226 + .parent_data = gcc_parent_data_1, 227 + .num_parents = 4, 228 + .ops = &clk_rcg2_ops, 229 + }, 230 + }; 231 + 232 + static struct clk_rcg2 gcc_gp2_clk_src = { 233 + .cmd_rcgr = 0x65004, 234 + .mnd_width = 8, 235 + .hid_width = 5, 236 + .parent_map = gcc_parent_map_1, 237 + .freq_tbl = ftbl_gcc_gp1_clk_src, 238 + .clkr.hw.init = &(struct clk_init_data){ 239 + .name = "gcc_gp2_clk_src", 240 + .parent_data = gcc_parent_data_1, 241 + .num_parents = 4, 242 + .ops = &clk_rcg2_ops, 243 + }, 244 + }; 245 + 246 + static struct clk_rcg2 gcc_gp3_clk_src = { 247 + .cmd_rcgr = 0x66004, 248 + .mnd_width = 8, 249 + .hid_width = 5, 250 + .parent_map = gcc_parent_map_1, 251 + .freq_tbl = ftbl_gcc_gp1_clk_src, 252 + .clkr.hw.init = &(struct clk_init_data){ 253 + .name = "gcc_gp3_clk_src", 254 + .parent_data = gcc_parent_data_1, 255 + .num_parents = 4, 256 + .ops = &clk_rcg2_ops, 257 + }, 258 + }; 259 + 260 + static const struct freq_tbl ftbl_gcc_pcie_0_aux_clk_src[] = { 261 + F(9600000, P_BI_TCXO, 2, 0, 0), 262 + F(19200000, P_BI_TCXO, 1, 0, 0), 263 + { } 264 + }; 265 + 266 + static struct clk_rcg2 gcc_pcie_0_aux_clk_src = { 267 + .cmd_rcgr = 0x6b038, 268 + .mnd_width = 16, 269 + .hid_width = 5, 270 + .parent_map = gcc_parent_map_2, 271 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 272 + .clkr.hw.init = &(struct clk_init_data){ 273 + .name = "gcc_pcie_0_aux_clk_src", 274 + .parent_data = gcc_parent_data_2, 275 + .num_parents = 2, 276 + .ops = &clk_rcg2_ops, 277 + }, 278 + }; 279 + 280 + static struct clk_rcg2 gcc_pcie_1_aux_clk_src = { 281 + .cmd_rcgr = 0x8d038, 282 + .mnd_width = 16, 283 + .hid_width = 5, 284 + .parent_map = gcc_parent_map_2, 285 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 286 + .clkr.hw.init = &(struct clk_init_data){ 287 + .name = "gcc_pcie_1_aux_clk_src", 288 + .parent_data = gcc_parent_data_2, 289 + .num_parents = 2, 290 + .ops = &clk_rcg2_ops, 291 + }, 292 + }; 293 + 294 + static struct clk_rcg2 gcc_pcie_2_aux_clk_src = { 295 + .cmd_rcgr = 0x6038, 296 + .mnd_width = 16, 297 + .hid_width = 5, 298 + .parent_map = gcc_parent_map_2, 299 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 300 + .clkr.hw.init = &(struct clk_init_data){ 301 + .name = "gcc_pcie_2_aux_clk_src", 302 + .parent_data = gcc_parent_data_2, 303 + .num_parents = 2, 304 + .ops = &clk_rcg2_ops, 305 + }, 306 + }; 307 + 308 + static const struct freq_tbl ftbl_gcc_pcie_phy_refgen_clk_src[] = { 309 + F(19200000, P_BI_TCXO, 1, 0, 0), 310 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 311 + { } 312 + }; 313 + 314 + static struct clk_rcg2 gcc_pcie_phy_refgen_clk_src = { 315 + .cmd_rcgr = 0x6f014, 316 + .mnd_width = 0, 317 + .hid_width = 5, 318 + .parent_map = gcc_parent_map_0, 319 + .freq_tbl = ftbl_gcc_pcie_phy_refgen_clk_src, 320 + .clkr.hw.init = &(struct clk_init_data){ 321 + .name = "gcc_pcie_phy_refgen_clk_src", 322 + .parent_data = gcc_parent_data_0_ao, 323 + .num_parents = 3, 324 + .ops = &clk_rcg2_ops, 325 + }, 326 + }; 327 + 328 + static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = { 329 + F(9600000, P_BI_TCXO, 2, 0, 0), 330 + F(19200000, P_BI_TCXO, 1, 0, 0), 331 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 332 + { } 333 + }; 334 + 335 + static struct clk_rcg2 gcc_pdm2_clk_src = { 336 + .cmd_rcgr = 0x33010, 337 + .mnd_width = 0, 338 + .hid_width = 5, 339 + .parent_map = gcc_parent_map_0, 340 + .freq_tbl = ftbl_gcc_pdm2_clk_src, 341 + .clkr.hw.init = &(struct clk_init_data){ 342 + .name = "gcc_pdm2_clk_src", 343 + .parent_data = gcc_parent_data_0, 344 + .num_parents = 3, 345 + .ops = &clk_rcg2_ops, 346 + }, 347 + }; 348 + 349 + static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = { 350 + F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625), 351 + F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625), 352 + F(19200000, P_BI_TCXO, 1, 0, 0), 353 + F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625), 354 + F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75), 355 + F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25), 356 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 357 + F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75), 358 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 359 + F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15), 360 + F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25), 361 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 362 + F(102400000, P_GPLL0_OUT_EVEN, 1, 128, 375), 363 + F(112000000, P_GPLL0_OUT_EVEN, 1, 28, 75), 364 + F(117964800, P_GPLL0_OUT_EVEN, 1, 6144, 15625), 365 + F(120000000, P_GPLL0_OUT_EVEN, 2.5, 0, 0), 366 + { } 367 + }; 368 + 369 + static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = { 370 + .name = "gcc_qupv3_wrap0_s0_clk_src", 371 + .parent_data = gcc_parent_data_0, 372 + .num_parents = 3, 373 + .ops = &clk_rcg2_ops, 374 + }; 375 + 376 + static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = { 377 + .cmd_rcgr = 0x17010, 378 + .mnd_width = 16, 379 + .hid_width = 5, 380 + .parent_map = gcc_parent_map_0, 381 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 382 + .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init, 383 + }; 384 + 385 + static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = { 386 + .name = "gcc_qupv3_wrap0_s1_clk_src", 387 + .parent_data = gcc_parent_data_0, 388 + .num_parents = 3, 389 + .ops = &clk_rcg2_ops, 390 + }; 391 + 392 + static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = { 393 + .cmd_rcgr = 0x17140, 394 + .mnd_width = 16, 395 + .hid_width = 5, 396 + .parent_map = gcc_parent_map_0, 397 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 398 + .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init, 399 + }; 400 + 401 + static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s2_clk_src[] = { 402 + F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625), 403 + F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625), 404 + F(19200000, P_BI_TCXO, 1, 0, 0), 405 + F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625), 406 + F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75), 407 + F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25), 408 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 409 + F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75), 410 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 411 + F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15), 412 + F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25), 413 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 414 + { } 415 + }; 416 + 417 + static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = { 418 + .name = "gcc_qupv3_wrap0_s2_clk_src", 419 + .parent_data = gcc_parent_data_0, 420 + .num_parents = 3, 421 + .ops = &clk_rcg2_ops, 422 + }; 423 + 424 + static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = { 425 + .cmd_rcgr = 0x17270, 426 + .mnd_width = 16, 427 + .hid_width = 5, 428 + .parent_map = gcc_parent_map_0, 429 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 430 + .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init, 431 + }; 432 + 433 + static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = { 434 + .name = "gcc_qupv3_wrap0_s3_clk_src", 435 + .parent_data = gcc_parent_data_0, 436 + .num_parents = 3, 437 + .ops = &clk_rcg2_ops, 438 + }; 439 + 440 + static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = { 441 + .cmd_rcgr = 0x173a0, 442 + .mnd_width = 16, 443 + .hid_width = 5, 444 + .parent_map = gcc_parent_map_0, 445 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 446 + .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init, 447 + }; 448 + 449 + static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = { 450 + .name = "gcc_qupv3_wrap0_s4_clk_src", 451 + .parent_data = gcc_parent_data_0, 452 + .num_parents = 3, 453 + .ops = &clk_rcg2_ops, 454 + }; 455 + 456 + static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = { 457 + .cmd_rcgr = 0x174d0, 458 + .mnd_width = 16, 459 + .hid_width = 5, 460 + .parent_map = gcc_parent_map_0, 461 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 462 + .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init, 463 + }; 464 + 465 + static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = { 466 + .name = "gcc_qupv3_wrap0_s5_clk_src", 467 + .parent_data = gcc_parent_data_0, 468 + .num_parents = 3, 469 + .ops = &clk_rcg2_ops, 470 + }; 471 + 472 + static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = { 473 + .cmd_rcgr = 0x17600, 474 + .mnd_width = 16, 475 + .hid_width = 5, 476 + .parent_map = gcc_parent_map_0, 477 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 478 + .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init, 479 + }; 480 + 481 + static struct clk_init_data gcc_qupv3_wrap0_s6_clk_src_init = { 482 + .name = "gcc_qupv3_wrap0_s6_clk_src", 483 + .parent_data = gcc_parent_data_0, 484 + .num_parents = 3, 485 + .ops = &clk_rcg2_ops, 486 + }; 487 + 488 + static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = { 489 + .cmd_rcgr = 0x17730, 490 + .mnd_width = 16, 491 + .hid_width = 5, 492 + .parent_map = gcc_parent_map_0, 493 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 494 + .clkr.hw.init = &gcc_qupv3_wrap0_s6_clk_src_init, 495 + }; 496 + 497 + static struct clk_init_data gcc_qupv3_wrap0_s7_clk_src_init = { 498 + .name = "gcc_qupv3_wrap0_s7_clk_src", 499 + .parent_data = gcc_parent_data_0, 500 + .num_parents = 3, 501 + .ops = &clk_rcg2_ops, 502 + }; 503 + 504 + static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = { 505 + .cmd_rcgr = 0x17860, 506 + .mnd_width = 16, 507 + .hid_width = 5, 508 + .parent_map = gcc_parent_map_0, 509 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 510 + .clkr.hw.init = &gcc_qupv3_wrap0_s7_clk_src_init, 511 + }; 512 + 513 + static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { 514 + .name = "gcc_qupv3_wrap1_s0_clk_src", 515 + .parent_data = gcc_parent_data_0, 516 + .num_parents = 3, 517 + .ops = &clk_rcg2_ops, 518 + }; 519 + 520 + static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { 521 + .cmd_rcgr = 0x18010, 522 + .mnd_width = 16, 523 + .hid_width = 5, 524 + .parent_map = gcc_parent_map_0, 525 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 526 + .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init, 527 + }; 528 + 529 + static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { 530 + .name = "gcc_qupv3_wrap1_s1_clk_src", 531 + .parent_data = gcc_parent_data_0, 532 + .num_parents = 3, 533 + .ops = &clk_rcg2_ops, 534 + }; 535 + 536 + static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { 537 + .cmd_rcgr = 0x18140, 538 + .mnd_width = 16, 539 + .hid_width = 5, 540 + .parent_map = gcc_parent_map_0, 541 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 542 + .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init, 543 + }; 544 + 545 + static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = { 546 + .name = "gcc_qupv3_wrap1_s2_clk_src", 547 + .parent_data = gcc_parent_data_0, 548 + .num_parents = 3, 549 + .ops = &clk_rcg2_ops, 550 + }; 551 + 552 + static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = { 553 + .cmd_rcgr = 0x18270, 554 + .mnd_width = 16, 555 + .hid_width = 5, 556 + .parent_map = gcc_parent_map_0, 557 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 558 + .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init, 559 + }; 560 + 561 + static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { 562 + .name = "gcc_qupv3_wrap1_s3_clk_src", 563 + .parent_data = gcc_parent_data_0, 564 + .num_parents = 3, 565 + .ops = &clk_rcg2_ops, 566 + }; 567 + 568 + static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { 569 + .cmd_rcgr = 0x183a0, 570 + .mnd_width = 16, 571 + .hid_width = 5, 572 + .parent_map = gcc_parent_map_0, 573 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 574 + .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init, 575 + }; 576 + 577 + static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { 578 + .name = "gcc_qupv3_wrap1_s4_clk_src", 579 + .parent_data = gcc_parent_data_0, 580 + .num_parents = 3, 581 + .ops = &clk_rcg2_ops, 582 + }; 583 + 584 + static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { 585 + .cmd_rcgr = 0x184d0, 586 + .mnd_width = 16, 587 + .hid_width = 5, 588 + .parent_map = gcc_parent_map_0, 589 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 590 + .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init, 591 + }; 592 + 593 + static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { 594 + .name = "gcc_qupv3_wrap1_s5_clk_src", 595 + .parent_data = gcc_parent_data_0, 596 + .num_parents = 3, 597 + .ops = &clk_rcg2_ops, 598 + }; 599 + 600 + static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { 601 + .cmd_rcgr = 0x18600, 602 + .mnd_width = 16, 603 + .hid_width = 5, 604 + .parent_map = gcc_parent_map_0, 605 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 606 + .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init, 607 + }; 608 + 609 + static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = { 610 + .name = "gcc_qupv3_wrap2_s0_clk_src", 611 + .parent_data = gcc_parent_data_0, 612 + .num_parents = 3, 613 + .ops = &clk_rcg2_ops, 614 + }; 615 + 616 + static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = { 617 + .cmd_rcgr = 0x1e010, 618 + .mnd_width = 16, 619 + .hid_width = 5, 620 + .parent_map = gcc_parent_map_0, 621 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 622 + .clkr.hw.init = &gcc_qupv3_wrap2_s0_clk_src_init, 623 + }; 624 + 625 + static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = { 626 + .name = "gcc_qupv3_wrap2_s1_clk_src", 627 + .parent_data = gcc_parent_data_0, 628 + .num_parents = 3, 629 + .ops = &clk_rcg2_ops, 630 + }; 631 + 632 + static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = { 633 + .cmd_rcgr = 0x1e140, 634 + .mnd_width = 16, 635 + .hid_width = 5, 636 + .parent_map = gcc_parent_map_0, 637 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 638 + .clkr.hw.init = &gcc_qupv3_wrap2_s1_clk_src_init, 639 + }; 640 + 641 + static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = { 642 + .name = "gcc_qupv3_wrap2_s2_clk_src", 643 + .parent_data = gcc_parent_data_0, 644 + .num_parents = 3, 645 + .ops = &clk_rcg2_ops, 646 + }; 647 + 648 + static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = { 649 + .cmd_rcgr = 0x1e270, 650 + .mnd_width = 16, 651 + .hid_width = 5, 652 + .parent_map = gcc_parent_map_0, 653 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 654 + .clkr.hw.init = &gcc_qupv3_wrap2_s2_clk_src_init, 655 + }; 656 + 657 + static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = { 658 + .name = "gcc_qupv3_wrap2_s3_clk_src", 659 + .parent_data = gcc_parent_data_0, 660 + .num_parents = 3, 661 + .ops = &clk_rcg2_ops, 662 + }; 663 + 664 + static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = { 665 + .cmd_rcgr = 0x1e3a0, 666 + .mnd_width = 16, 667 + .hid_width = 5, 668 + .parent_map = gcc_parent_map_0, 669 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 670 + .clkr.hw.init = &gcc_qupv3_wrap2_s3_clk_src_init, 671 + }; 672 + 673 + static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = { 674 + .name = "gcc_qupv3_wrap2_s4_clk_src", 675 + .parent_data = gcc_parent_data_0, 676 + .num_parents = 3, 677 + .ops = &clk_rcg2_ops, 678 + }; 679 + 680 + static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = { 681 + .cmd_rcgr = 0x1e4d0, 682 + .mnd_width = 16, 683 + .hid_width = 5, 684 + .parent_map = gcc_parent_map_0, 685 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 686 + .clkr.hw.init = &gcc_qupv3_wrap2_s4_clk_src_init, 687 + }; 688 + 689 + static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = { 690 + .name = "gcc_qupv3_wrap2_s5_clk_src", 691 + .parent_data = gcc_parent_data_0, 692 + .num_parents = 3, 693 + .ops = &clk_rcg2_ops, 694 + }; 695 + 696 + static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = { 697 + .cmd_rcgr = 0x1e600, 698 + .mnd_width = 16, 699 + .hid_width = 5, 700 + .parent_map = gcc_parent_map_0, 701 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s2_clk_src, 702 + .clkr.hw.init = &gcc_qupv3_wrap2_s5_clk_src_init, 703 + }; 704 + 705 + static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 706 + F(400000, P_BI_TCXO, 12, 1, 4), 707 + F(19200000, P_BI_TCXO, 1, 0, 0), 708 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 709 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 710 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 711 + F(202000000, P_GPLL9_OUT_MAIN, 4, 0, 0), 712 + { } 713 + }; 714 + 715 + static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { 716 + .cmd_rcgr = 0x1400c, 717 + .mnd_width = 8, 718 + .hid_width = 5, 719 + .parent_map = gcc_parent_map_4, 720 + .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src, 721 + .clkr.hw.init = &(struct clk_init_data){ 722 + .name = "gcc_sdcc2_apps_clk_src", 723 + .parent_data = gcc_parent_data_4, 724 + .num_parents = 5, 725 + .ops = &clk_rcg2_ops, 726 + }, 727 + }; 728 + 729 + static const struct freq_tbl ftbl_gcc_sdcc4_apps_clk_src[] = { 730 + F(400000, P_BI_TCXO, 12, 1, 4), 731 + F(19200000, P_BI_TCXO, 1, 0, 0), 732 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 733 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 734 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 735 + { } 736 + }; 737 + 738 + static struct clk_rcg2 gcc_sdcc4_apps_clk_src = { 739 + .cmd_rcgr = 0x1600c, 740 + .mnd_width = 8, 741 + .hid_width = 5, 742 + .parent_map = gcc_parent_map_0, 743 + .freq_tbl = ftbl_gcc_sdcc4_apps_clk_src, 744 + .clkr.hw.init = &(struct clk_init_data){ 745 + .name = "gcc_sdcc4_apps_clk_src", 746 + .parent_data = gcc_parent_data_0, 747 + .num_parents = 3, 748 + .ops = &clk_rcg2_ops, 749 + }, 750 + }; 751 + 752 + static const struct freq_tbl ftbl_gcc_tsif_ref_clk_src[] = { 753 + F(105495, P_BI_TCXO, 2, 1, 91), 754 + { } 755 + }; 756 + 757 + static struct clk_rcg2 gcc_tsif_ref_clk_src = { 758 + .cmd_rcgr = 0x36010, 759 + .mnd_width = 8, 760 + .hid_width = 5, 761 + .parent_map = gcc_parent_map_5, 762 + .freq_tbl = ftbl_gcc_tsif_ref_clk_src, 763 + .clkr.hw.init = &(struct clk_init_data){ 764 + .name = "gcc_tsif_ref_clk_src", 765 + .parent_data = gcc_parent_data_5, 766 + .num_parents = 4, 767 + .ops = &clk_rcg2_ops, 768 + }, 769 + }; 770 + 771 + static const struct freq_tbl ftbl_gcc_ufs_card_axi_clk_src[] = { 772 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 773 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 774 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 775 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 776 + { } 777 + }; 778 + 779 + static struct clk_rcg2 gcc_ufs_card_axi_clk_src = { 780 + .cmd_rcgr = 0x75024, 781 + .mnd_width = 8, 782 + .hid_width = 5, 783 + .parent_map = gcc_parent_map_0, 784 + .freq_tbl = ftbl_gcc_ufs_card_axi_clk_src, 785 + .clkr.hw.init = &(struct clk_init_data){ 786 + .name = "gcc_ufs_card_axi_clk_src", 787 + .parent_data = gcc_parent_data_0, 788 + .num_parents = 3, 789 + .ops = &clk_rcg2_ops, 790 + }, 791 + }; 792 + 793 + static const struct freq_tbl ftbl_gcc_ufs_card_ice_core_clk_src[] = { 794 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 795 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 796 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 797 + F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 798 + { } 799 + }; 800 + 801 + static struct clk_rcg2 gcc_ufs_card_ice_core_clk_src = { 802 + .cmd_rcgr = 0x7506c, 803 + .mnd_width = 0, 804 + .hid_width = 5, 805 + .parent_map = gcc_parent_map_0, 806 + .freq_tbl = ftbl_gcc_ufs_card_ice_core_clk_src, 807 + .clkr.hw.init = &(struct clk_init_data){ 808 + .name = "gcc_ufs_card_ice_core_clk_src", 809 + .parent_data = gcc_parent_data_0, 810 + .num_parents = 3, 811 + .ops = &clk_rcg2_ops, 812 + }, 813 + }; 814 + 815 + static const struct freq_tbl ftbl_gcc_ufs_card_phy_aux_clk_src[] = { 816 + F(19200000, P_BI_TCXO, 1, 0, 0), 817 + { } 818 + }; 819 + 820 + static struct clk_rcg2 gcc_ufs_card_phy_aux_clk_src = { 821 + .cmd_rcgr = 0x750a0, 822 + .mnd_width = 0, 823 + .hid_width = 5, 824 + .parent_map = gcc_parent_map_3, 825 + .freq_tbl = ftbl_gcc_ufs_card_phy_aux_clk_src, 826 + .clkr.hw.init = &(struct clk_init_data){ 827 + .name = "gcc_ufs_card_phy_aux_clk_src", 828 + .parent_data = gcc_parent_data_3, 829 + .num_parents = 1, 830 + .ops = &clk_rcg2_ops, 831 + }, 832 + }; 833 + 834 + static const struct freq_tbl ftbl_gcc_ufs_card_unipro_core_clk_src[] = { 835 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 836 + F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0), 837 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 838 + { } 839 + }; 840 + 841 + static struct clk_rcg2 gcc_ufs_card_unipro_core_clk_src = { 842 + .cmd_rcgr = 0x75084, 843 + .mnd_width = 0, 844 + .hid_width = 5, 845 + .parent_map = gcc_parent_map_0, 846 + .freq_tbl = ftbl_gcc_ufs_card_unipro_core_clk_src, 847 + .clkr.hw.init = &(struct clk_init_data){ 848 + .name = "gcc_ufs_card_unipro_core_clk_src", 849 + .parent_data = gcc_parent_data_0, 850 + .num_parents = 3, 851 + .ops = &clk_rcg2_ops, 852 + }, 853 + }; 854 + 855 + static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = { 856 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 857 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 858 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 859 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 860 + F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 861 + { } 862 + }; 863 + 864 + static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = { 865 + .cmd_rcgr = 0x77024, 866 + .mnd_width = 8, 867 + .hid_width = 5, 868 + .parent_map = gcc_parent_map_0, 869 + .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src, 870 + .clkr.hw.init = &(struct clk_init_data){ 871 + .name = "gcc_ufs_phy_axi_clk_src", 872 + .parent_data = gcc_parent_data_0, 873 + .num_parents = 3, 874 + .ops = &clk_rcg2_ops, 875 + }, 876 + }; 877 + 878 + static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = { 879 + .cmd_rcgr = 0x7706c, 880 + .mnd_width = 0, 881 + .hid_width = 5, 882 + .parent_map = gcc_parent_map_0, 883 + .freq_tbl = ftbl_gcc_ufs_card_ice_core_clk_src, 884 + .clkr.hw.init = &(struct clk_init_data){ 885 + .name = "gcc_ufs_phy_ice_core_clk_src", 886 + .parent_data = gcc_parent_data_0, 887 + .num_parents = 3, 888 + .ops = &clk_rcg2_ops, 889 + }, 890 + }; 891 + 892 + static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = { 893 + .cmd_rcgr = 0x770a0, 894 + .mnd_width = 0, 895 + .hid_width = 5, 896 + .parent_map = gcc_parent_map_3, 897 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 898 + .clkr.hw.init = &(struct clk_init_data){ 899 + .name = "gcc_ufs_phy_phy_aux_clk_src", 900 + .parent_data = gcc_parent_data_3, 901 + .num_parents = 1, 902 + .ops = &clk_rcg2_ops, 903 + }, 904 + }; 905 + 906 + static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { 907 + .cmd_rcgr = 0x77084, 908 + .mnd_width = 0, 909 + .hid_width = 5, 910 + .parent_map = gcc_parent_map_0, 911 + .freq_tbl = ftbl_gcc_ufs_card_ice_core_clk_src, 912 + .clkr.hw.init = &(struct clk_init_data){ 913 + .name = "gcc_ufs_phy_unipro_core_clk_src", 914 + .parent_data = gcc_parent_data_0, 915 + .num_parents = 3, 916 + .ops = &clk_rcg2_ops, 917 + }, 918 + }; 919 + 920 + static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = { 921 + F(33333333, P_GPLL0_OUT_EVEN, 9, 0, 0), 922 + F(66666667, P_GPLL0_OUT_EVEN, 4.5, 0, 0), 923 + F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0), 924 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 925 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 926 + { } 927 + }; 928 + 929 + static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { 930 + .cmd_rcgr = 0xf020, 931 + .mnd_width = 8, 932 + .hid_width = 5, 933 + .parent_map = gcc_parent_map_0, 934 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 935 + .clkr.hw.init = &(struct clk_init_data){ 936 + .name = "gcc_usb30_prim_master_clk_src", 937 + .parent_data = gcc_parent_data_0, 938 + .num_parents = 3, 939 + .ops = &clk_rcg2_ops, 940 + }, 941 + }; 942 + 943 + static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = { 944 + .cmd_rcgr = 0xf038, 945 + .mnd_width = 0, 946 + .hid_width = 5, 947 + .parent_map = gcc_parent_map_0, 948 + .freq_tbl = ftbl_gcc_ufs_card_phy_aux_clk_src, 949 + .clkr.hw.init = &(struct clk_init_data){ 950 + .name = "gcc_usb30_prim_mock_utmi_clk_src", 951 + .parent_data = gcc_parent_data_0, 952 + .num_parents = 3, 953 + .ops = &clk_rcg2_ops, 954 + }, 955 + }; 956 + 957 + static struct clk_rcg2 gcc_usb30_sec_master_clk_src = { 958 + .cmd_rcgr = 0x10020, 959 + .mnd_width = 8, 960 + .hid_width = 5, 961 + .parent_map = gcc_parent_map_0, 962 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 963 + .clkr.hw.init = &(struct clk_init_data){ 964 + .name = "gcc_usb30_sec_master_clk_src", 965 + .parent_data = gcc_parent_data_0, 966 + .num_parents = 3, 967 + .ops = &clk_rcg2_ops, 968 + }, 969 + }; 970 + 971 + static struct clk_rcg2 gcc_usb30_sec_mock_utmi_clk_src = { 972 + .cmd_rcgr = 0x10038, 973 + .mnd_width = 0, 974 + .hid_width = 5, 975 + .parent_map = gcc_parent_map_0, 976 + .freq_tbl = ftbl_gcc_ufs_card_phy_aux_clk_src, 977 + .clkr.hw.init = &(struct clk_init_data){ 978 + .name = "gcc_usb30_sec_mock_utmi_clk_src", 979 + .parent_data = gcc_parent_data_0, 980 + .num_parents = 3, 981 + .ops = &clk_rcg2_ops, 982 + }, 983 + }; 984 + 985 + static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = { 986 + .cmd_rcgr = 0xf064, 987 + .mnd_width = 0, 988 + .hid_width = 5, 989 + .parent_map = gcc_parent_map_2, 990 + .freq_tbl = ftbl_gcc_ufs_card_phy_aux_clk_src, 991 + .clkr.hw.init = &(struct clk_init_data){ 992 + .name = "gcc_usb3_prim_phy_aux_clk_src", 993 + .parent_data = gcc_parent_data_2, 994 + .num_parents = 2, 995 + .ops = &clk_rcg2_ops, 996 + }, 997 + }; 998 + 999 + static struct clk_rcg2 gcc_usb3_sec_phy_aux_clk_src = { 1000 + .cmd_rcgr = 0x10064, 1001 + .mnd_width = 0, 1002 + .hid_width = 5, 1003 + .parent_map = gcc_parent_map_2, 1004 + .freq_tbl = ftbl_gcc_ufs_card_phy_aux_clk_src, 1005 + .clkr.hw.init = &(struct clk_init_data){ 1006 + .name = "gcc_usb3_sec_phy_aux_clk_src", 1007 + .parent_data = gcc_parent_data_2, 1008 + .num_parents = 2, 1009 + .ops = &clk_rcg2_ops, 1010 + }, 1011 + }; 1012 + 1013 + static struct clk_regmap_div gcc_cpuss_ahb_postdiv_clk_src = { 1014 + .reg = 0x48028, 1015 + .shift = 0, 1016 + .width = 4, 1017 + .clkr.hw.init = &(struct clk_init_data) { 1018 + .name = "gcc_cpuss_ahb_postdiv_clk_src", 1019 + .parent_data = &(const struct clk_parent_data){ 1020 + .hw = &gcc_cpuss_ahb_clk_src.clkr.hw, 1021 + }, 1022 + .num_parents = 1, 1023 + .flags = CLK_SET_RATE_PARENT, 1024 + .ops = &clk_regmap_div_ro_ops, 1025 + }, 1026 + }; 1027 + 1028 + static struct clk_regmap_div gcc_usb30_prim_mock_utmi_postdiv_clk_src = { 1029 + .reg = 0xf050, 1030 + .shift = 0, 1031 + .width = 2, 1032 + .clkr.hw.init = &(struct clk_init_data) { 1033 + .name = "gcc_usb30_prim_mock_utmi_postdiv_clk_src", 1034 + .parent_data = &(const struct clk_parent_data){ 1035 + .hw = &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw, 1036 + }, 1037 + .num_parents = 1, 1038 + .flags = CLK_SET_RATE_PARENT, 1039 + .ops = &clk_regmap_div_ro_ops, 1040 + }, 1041 + }; 1042 + 1043 + static struct clk_regmap_div gcc_usb30_sec_mock_utmi_postdiv_clk_src = { 1044 + .reg = 0x10050, 1045 + .shift = 0, 1046 + .width = 2, 1047 + .clkr.hw.init = &(struct clk_init_data) { 1048 + .name = "gcc_usb30_sec_mock_utmi_postdiv_clk_src", 1049 + .parent_data = &(const struct clk_parent_data){ 1050 + .hw = &gcc_usb30_sec_mock_utmi_clk_src.clkr.hw, 1051 + }, 1052 + .num_parents = 1, 1053 + .flags = CLK_SET_RATE_PARENT, 1054 + .ops = &clk_regmap_div_ro_ops, 1055 + }, 1056 + }; 1057 + 1058 + static struct clk_branch gcc_aggre_noc_pcie_tbu_clk = { 1059 + .halt_reg = 0x9000c, 1060 + .halt_check = BRANCH_HALT_VOTED, 1061 + .clkr = { 1062 + .enable_reg = 0x9000c, 1063 + .enable_mask = BIT(0), 1064 + .hw.init = &(struct clk_init_data){ 1065 + .name = "gcc_aggre_noc_pcie_tbu_clk", 1066 + .ops = &clk_branch2_ops, 1067 + }, 1068 + }, 1069 + }; 1070 + 1071 + static struct clk_branch gcc_aggre_ufs_card_axi_clk = { 1072 + .halt_reg = 0x750cc, 1073 + .halt_check = BRANCH_HALT_VOTED, 1074 + .hwcg_reg = 0x750cc, 1075 + .hwcg_bit = 1, 1076 + .clkr = { 1077 + .enable_reg = 0x750cc, 1078 + .enable_mask = BIT(0), 1079 + .hw.init = &(struct clk_init_data){ 1080 + .name = "gcc_aggre_ufs_card_axi_clk", 1081 + .parent_data = &(const struct clk_parent_data){ 1082 + .hw = &gcc_ufs_card_axi_clk_src.clkr.hw, 1083 + }, 1084 + .num_parents = 1, 1085 + .flags = CLK_SET_RATE_PARENT, 1086 + .ops = &clk_branch2_ops, 1087 + }, 1088 + }, 1089 + }; 1090 + 1091 + static struct clk_branch gcc_aggre_ufs_phy_axi_clk = { 1092 + .halt_reg = 0x770cc, 1093 + .halt_check = BRANCH_HALT_VOTED, 1094 + .hwcg_reg = 0x770cc, 1095 + .hwcg_bit = 1, 1096 + .clkr = { 1097 + .enable_reg = 0x770cc, 1098 + .enable_mask = BIT(0), 1099 + .hw.init = &(struct clk_init_data){ 1100 + .name = "gcc_aggre_ufs_phy_axi_clk", 1101 + .parent_data = &(const struct clk_parent_data){ 1102 + .hw = &gcc_ufs_phy_axi_clk_src.clkr.hw, 1103 + }, 1104 + .num_parents = 1, 1105 + .flags = CLK_SET_RATE_PARENT, 1106 + .ops = &clk_branch2_ops, 1107 + }, 1108 + }, 1109 + }; 1110 + 1111 + static struct clk_branch gcc_aggre_usb3_prim_axi_clk = { 1112 + .halt_reg = 0xf080, 1113 + .halt_check = BRANCH_HALT_VOTED, 1114 + .clkr = { 1115 + .enable_reg = 0xf080, 1116 + .enable_mask = BIT(0), 1117 + .hw.init = &(struct clk_init_data){ 1118 + .name = "gcc_aggre_usb3_prim_axi_clk", 1119 + .parent_data = &(const struct clk_parent_data){ 1120 + .hw = &gcc_usb30_prim_master_clk_src.clkr.hw, 1121 + }, 1122 + .num_parents = 1, 1123 + .flags = CLK_SET_RATE_PARENT, 1124 + .ops = &clk_branch2_ops, 1125 + }, 1126 + }, 1127 + }; 1128 + 1129 + static struct clk_branch gcc_aggre_usb3_sec_axi_clk = { 1130 + .halt_reg = 0x10080, 1131 + .halt_check = BRANCH_HALT_VOTED, 1132 + .clkr = { 1133 + .enable_reg = 0x10080, 1134 + .enable_mask = BIT(0), 1135 + .hw.init = &(struct clk_init_data){ 1136 + .name = "gcc_aggre_usb3_sec_axi_clk", 1137 + .parent_data = &(const struct clk_parent_data){ 1138 + .hw = &gcc_usb30_sec_master_clk_src.clkr.hw, 1139 + }, 1140 + .num_parents = 1, 1141 + .flags = CLK_SET_RATE_PARENT, 1142 + .ops = &clk_branch2_ops, 1143 + }, 1144 + }, 1145 + }; 1146 + 1147 + static struct clk_branch gcc_boot_rom_ahb_clk = { 1148 + .halt_reg = 0x38004, 1149 + .halt_check = BRANCH_HALT_VOTED, 1150 + .hwcg_reg = 0x38004, 1151 + .hwcg_bit = 1, 1152 + .clkr = { 1153 + .enable_reg = 0x52000, 1154 + .enable_mask = BIT(10), 1155 + .hw.init = &(struct clk_init_data){ 1156 + .name = "gcc_boot_rom_ahb_clk", 1157 + .ops = &clk_branch2_ops, 1158 + }, 1159 + }, 1160 + }; 1161 + 1162 + static struct clk_branch gcc_camera_hf_axi_clk = { 1163 + .halt_reg = 0xb02c, 1164 + .halt_check = BRANCH_HALT_VOTED, 1165 + .clkr = { 1166 + .enable_reg = 0xb02c, 1167 + .enable_mask = BIT(0), 1168 + .hw.init = &(struct clk_init_data){ 1169 + .name = "gcc_camera_hf_axi_clk", 1170 + .ops = &clk_branch2_ops, 1171 + }, 1172 + }, 1173 + }; 1174 + 1175 + static struct clk_branch gcc_camera_sf_axi_clk = { 1176 + .halt_reg = 0xb030, 1177 + .halt_check = BRANCH_HALT_VOTED, 1178 + .clkr = { 1179 + .enable_reg = 0xb030, 1180 + .enable_mask = BIT(0), 1181 + .hw.init = &(struct clk_init_data){ 1182 + .name = "gcc_camera_sf_axi_clk", 1183 + .ops = &clk_branch2_ops, 1184 + }, 1185 + }, 1186 + }; 1187 + 1188 + static struct clk_branch gcc_camera_xo_clk = { 1189 + .halt_reg = 0xb040, 1190 + .halt_check = BRANCH_HALT, 1191 + .clkr = { 1192 + .enable_reg = 0xb040, 1193 + .enable_mask = BIT(0), 1194 + .hw.init = &(struct clk_init_data){ 1195 + .name = "gcc_camera_xo_clk", 1196 + .ops = &clk_branch2_ops, 1197 + }, 1198 + }, 1199 + }; 1200 + 1201 + static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = { 1202 + .halt_reg = 0xf07c, 1203 + .halt_check = BRANCH_HALT_VOTED, 1204 + .clkr = { 1205 + .enable_reg = 0xf07c, 1206 + .enable_mask = BIT(0), 1207 + .hw.init = &(struct clk_init_data){ 1208 + .name = "gcc_cfg_noc_usb3_prim_axi_clk", 1209 + .parent_data = &(const struct clk_parent_data){ 1210 + .hw = &gcc_usb30_prim_master_clk_src.clkr.hw, 1211 + }, 1212 + .num_parents = 1, 1213 + .flags = CLK_SET_RATE_PARENT, 1214 + .ops = &clk_branch2_ops, 1215 + }, 1216 + }, 1217 + }; 1218 + 1219 + static struct clk_branch gcc_cfg_noc_usb3_sec_axi_clk = { 1220 + .halt_reg = 0x1007c, 1221 + .halt_check = BRANCH_HALT_VOTED, 1222 + .clkr = { 1223 + .enable_reg = 0x1007c, 1224 + .enable_mask = BIT(0), 1225 + .hw.init = &(struct clk_init_data){ 1226 + .name = "gcc_cfg_noc_usb3_sec_axi_clk", 1227 + .parent_data = &(const struct clk_parent_data){ 1228 + .hw = &gcc_usb30_sec_master_clk_src.clkr.hw, 1229 + }, 1230 + .num_parents = 1, 1231 + .flags = CLK_SET_RATE_PARENT, 1232 + .ops = &clk_branch2_ops, 1233 + }, 1234 + }, 1235 + }; 1236 + 1237 + static struct clk_branch gcc_cpuss_ahb_clk = { 1238 + .halt_reg = 0x48000, 1239 + .halt_check = BRANCH_HALT_VOTED, 1240 + .clkr = { 1241 + .enable_reg = 0x52000, 1242 + .enable_mask = BIT(21), 1243 + .hw.init = &(struct clk_init_data){ 1244 + .name = "gcc_cpuss_ahb_clk", 1245 + .parent_data = &(const struct clk_parent_data){ 1246 + .hw = &gcc_cpuss_ahb_postdiv_clk_src.clkr.hw, 1247 + }, 1248 + .num_parents = 1, 1249 + .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 1250 + .ops = &clk_branch2_ops, 1251 + }, 1252 + }, 1253 + }; 1254 + 1255 + static struct clk_branch gcc_cpuss_rbcpr_clk = { 1256 + .halt_reg = 0x48004, 1257 + .halt_check = BRANCH_HALT, 1258 + .clkr = { 1259 + .enable_reg = 0x48004, 1260 + .enable_mask = BIT(0), 1261 + .hw.init = &(struct clk_init_data){ 1262 + .name = "gcc_cpuss_rbcpr_clk", 1263 + .ops = &clk_branch2_ops, 1264 + }, 1265 + }, 1266 + }; 1267 + 1268 + static struct clk_branch gcc_ddrss_gpu_axi_clk = { 1269 + .halt_reg = 0x71154, 1270 + .halt_check = BRANCH_HALT_VOTED, 1271 + .clkr = { 1272 + .enable_reg = 0x71154, 1273 + .enable_mask = BIT(0), 1274 + .hw.init = &(struct clk_init_data){ 1275 + .name = "gcc_ddrss_gpu_axi_clk", 1276 + .ops = &clk_branch2_ops, 1277 + }, 1278 + }, 1279 + }; 1280 + 1281 + static struct clk_branch gcc_ddrss_pcie_sf_tbu_clk = { 1282 + .halt_reg = 0x8d058, 1283 + .halt_check = BRANCH_HALT_VOTED, 1284 + .clkr = { 1285 + .enable_reg = 0x8d058, 1286 + .enable_mask = BIT(0), 1287 + .hw.init = &(struct clk_init_data){ 1288 + .name = "gcc_ddrss_pcie_sf_tbu_clk", 1289 + .ops = &clk_branch2_ops, 1290 + }, 1291 + }, 1292 + }; 1293 + 1294 + static struct clk_branch gcc_disp_hf_axi_clk = { 1295 + .halt_reg = 0xb034, 1296 + .halt_check = BRANCH_HALT_VOTED, 1297 + .clkr = { 1298 + .enable_reg = 0xb034, 1299 + .enable_mask = BIT(0), 1300 + .hw.init = &(struct clk_init_data){ 1301 + .name = "gcc_disp_hf_axi_clk", 1302 + .ops = &clk_branch2_ops, 1303 + }, 1304 + }, 1305 + }; 1306 + 1307 + static struct clk_branch gcc_disp_sf_axi_clk = { 1308 + .halt_reg = 0xb038, 1309 + .halt_check = BRANCH_HALT_VOTED, 1310 + .clkr = { 1311 + .enable_reg = 0xb038, 1312 + .enable_mask = BIT(0), 1313 + .hw.init = &(struct clk_init_data){ 1314 + .name = "gcc_disp_sf_axi_clk", 1315 + .ops = &clk_branch2_ops, 1316 + }, 1317 + }, 1318 + }; 1319 + 1320 + static struct clk_branch gcc_disp_xo_clk = { 1321 + .halt_reg = 0xb044, 1322 + .halt_check = BRANCH_HALT, 1323 + .clkr = { 1324 + .enable_reg = 0xb044, 1325 + .enable_mask = BIT(0), 1326 + .hw.init = &(struct clk_init_data){ 1327 + .name = "gcc_disp_xo_clk", 1328 + .ops = &clk_branch2_ops, 1329 + }, 1330 + }, 1331 + }; 1332 + 1333 + static struct clk_branch gcc_gp1_clk = { 1334 + .halt_reg = 0x64000, 1335 + .halt_check = BRANCH_HALT, 1336 + .clkr = { 1337 + .enable_reg = 0x64000, 1338 + .enable_mask = BIT(0), 1339 + .hw.init = &(struct clk_init_data){ 1340 + .name = "gcc_gp1_clk", 1341 + .parent_data = &(const struct clk_parent_data){ 1342 + .hw = &gcc_gp1_clk_src.clkr.hw, 1343 + }, 1344 + .num_parents = 1, 1345 + .flags = CLK_SET_RATE_PARENT, 1346 + .ops = &clk_branch2_ops, 1347 + }, 1348 + }, 1349 + }; 1350 + 1351 + static struct clk_branch gcc_gp2_clk = { 1352 + .halt_reg = 0x65000, 1353 + .halt_check = BRANCH_HALT, 1354 + .clkr = { 1355 + .enable_reg = 0x65000, 1356 + .enable_mask = BIT(0), 1357 + .hw.init = &(struct clk_init_data){ 1358 + .name = "gcc_gp2_clk", 1359 + .parent_data = &(const struct clk_parent_data){ 1360 + .hw = &gcc_gp2_clk_src.clkr.hw, 1361 + }, 1362 + .num_parents = 1, 1363 + .flags = CLK_SET_RATE_PARENT, 1364 + .ops = &clk_branch2_ops, 1365 + }, 1366 + }, 1367 + }; 1368 + 1369 + static struct clk_branch gcc_gp3_clk = { 1370 + .halt_reg = 0x66000, 1371 + .halt_check = BRANCH_HALT, 1372 + .clkr = { 1373 + .enable_reg = 0x66000, 1374 + .enable_mask = BIT(0), 1375 + .hw.init = &(struct clk_init_data){ 1376 + .name = "gcc_gp3_clk", 1377 + .parent_data = &(const struct clk_parent_data){ 1378 + .hw = &gcc_gp3_clk_src.clkr.hw, 1379 + }, 1380 + .num_parents = 1, 1381 + .flags = CLK_SET_RATE_PARENT, 1382 + .ops = &clk_branch2_ops, 1383 + }, 1384 + }, 1385 + }; 1386 + 1387 + static struct clk_branch gcc_gpu_gpll0_clk_src = { 1388 + .halt_check = BRANCH_HALT_DELAY, 1389 + .clkr = { 1390 + .enable_reg = 0x52000, 1391 + .enable_mask = BIT(15), 1392 + .hw.init = &(struct clk_init_data){ 1393 + .name = "gcc_gpu_gpll0_clk_src", 1394 + .parent_data = &(const struct clk_parent_data){ 1395 + .hw = &gpll0.clkr.hw, 1396 + }, 1397 + .num_parents = 1, 1398 + .flags = CLK_SET_RATE_PARENT, 1399 + .ops = &clk_branch2_ops, 1400 + }, 1401 + }, 1402 + }; 1403 + 1404 + static struct clk_branch gcc_gpu_gpll0_div_clk_src = { 1405 + .halt_check = BRANCH_HALT_DELAY, 1406 + .clkr = { 1407 + .enable_reg = 0x52000, 1408 + .enable_mask = BIT(16), 1409 + .hw.init = &(struct clk_init_data){ 1410 + .name = "gcc_gpu_gpll0_div_clk_src", 1411 + .parent_data = &(const struct clk_parent_data){ 1412 + .hw = &gpll0_out_even.clkr.hw, 1413 + }, 1414 + .num_parents = 1, 1415 + .flags = CLK_SET_RATE_PARENT, 1416 + .ops = &clk_branch2_ops, 1417 + }, 1418 + }, 1419 + }; 1420 + 1421 + static struct clk_branch gcc_gpu_iref_en = { 1422 + .halt_reg = 0x8c014, 1423 + .halt_check = BRANCH_HALT, 1424 + .clkr = { 1425 + .enable_reg = 0x8c014, 1426 + .enable_mask = BIT(0), 1427 + .hw.init = &(struct clk_init_data){ 1428 + .name = "gcc_gpu_iref_en", 1429 + .ops = &clk_branch2_ops, 1430 + }, 1431 + }, 1432 + }; 1433 + 1434 + static struct clk_branch gcc_gpu_memnoc_gfx_clk = { 1435 + .halt_reg = 0x7100c, 1436 + .halt_check = BRANCH_HALT_VOTED, 1437 + .clkr = { 1438 + .enable_reg = 0x7100c, 1439 + .enable_mask = BIT(0), 1440 + .hw.init = &(struct clk_init_data){ 1441 + .name = "gcc_gpu_memnoc_gfx_clk", 1442 + .ops = &clk_branch2_ops, 1443 + }, 1444 + }, 1445 + }; 1446 + 1447 + static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = { 1448 + .halt_reg = 0x71018, 1449 + .halt_check = BRANCH_HALT, 1450 + .clkr = { 1451 + .enable_reg = 0x71018, 1452 + .enable_mask = BIT(0), 1453 + .hw.init = &(struct clk_init_data){ 1454 + .name = "gcc_gpu_snoc_dvm_gfx_clk", 1455 + .ops = &clk_branch2_ops, 1456 + }, 1457 + }, 1458 + }; 1459 + 1460 + static struct clk_branch gcc_npu_axi_clk = { 1461 + .halt_reg = 0x4d008, 1462 + .halt_check = BRANCH_HALT_VOTED, 1463 + .clkr = { 1464 + .enable_reg = 0x4d008, 1465 + .enable_mask = BIT(0), 1466 + .hw.init = &(struct clk_init_data){ 1467 + .name = "gcc_npu_axi_clk", 1468 + .ops = &clk_branch2_ops, 1469 + }, 1470 + }, 1471 + }; 1472 + 1473 + static struct clk_branch gcc_npu_bwmon_axi_clk = { 1474 + .halt_reg = 0x73008, 1475 + .halt_check = BRANCH_HALT_VOTED, 1476 + .clkr = { 1477 + .enable_reg = 0x73008, 1478 + .enable_mask = BIT(0), 1479 + .hw.init = &(struct clk_init_data){ 1480 + .name = "gcc_npu_bwmon_axi_clk", 1481 + .ops = &clk_branch2_ops, 1482 + }, 1483 + }, 1484 + }; 1485 + 1486 + static struct clk_branch gcc_npu_bwmon_cfg_ahb_clk = { 1487 + .halt_reg = 0x73004, 1488 + .halt_check = BRANCH_HALT, 1489 + .clkr = { 1490 + .enable_reg = 0x73004, 1491 + .enable_mask = BIT(0), 1492 + .hw.init = &(struct clk_init_data){ 1493 + .name = "gcc_npu_bwmon_cfg_ahb_clk", 1494 + .ops = &clk_branch2_ops, 1495 + }, 1496 + }, 1497 + }; 1498 + 1499 + static struct clk_branch gcc_npu_cfg_ahb_clk = { 1500 + .halt_reg = 0x4d004, 1501 + .halt_check = BRANCH_HALT, 1502 + .hwcg_reg = 0x4d004, 1503 + .hwcg_bit = 1, 1504 + .clkr = { 1505 + .enable_reg = 0x4d004, 1506 + .enable_mask = BIT(0), 1507 + .hw.init = &(struct clk_init_data){ 1508 + .name = "gcc_npu_cfg_ahb_clk", 1509 + .ops = &clk_branch2_ops, 1510 + }, 1511 + }, 1512 + }; 1513 + 1514 + static struct clk_branch gcc_npu_dma_clk = { 1515 + .halt_reg = 0x4d00c, 1516 + .halt_check = BRANCH_HALT_VOTED, 1517 + .clkr = { 1518 + .enable_reg = 0x4d00c, 1519 + .enable_mask = BIT(0), 1520 + .hw.init = &(struct clk_init_data){ 1521 + .name = "gcc_npu_dma_clk", 1522 + .ops = &clk_branch2_ops, 1523 + }, 1524 + }, 1525 + }; 1526 + 1527 + static struct clk_branch gcc_npu_gpll0_clk_src = { 1528 + .halt_check = BRANCH_HALT_DELAY, 1529 + .clkr = { 1530 + .enable_reg = 0x52000, 1531 + .enable_mask = BIT(18), 1532 + .hw.init = &(struct clk_init_data){ 1533 + .name = "gcc_npu_gpll0_clk_src", 1534 + .parent_data = &(const struct clk_parent_data){ 1535 + .hw = &gpll0.clkr.hw, 1536 + }, 1537 + .num_parents = 1, 1538 + .flags = CLK_SET_RATE_PARENT, 1539 + .ops = &clk_branch2_ops, 1540 + }, 1541 + }, 1542 + }; 1543 + 1544 + static struct clk_branch gcc_npu_gpll0_div_clk_src = { 1545 + .halt_check = BRANCH_HALT_DELAY, 1546 + .clkr = { 1547 + .enable_reg = 0x52000, 1548 + .enable_mask = BIT(19), 1549 + .hw.init = &(struct clk_init_data){ 1550 + .name = "gcc_npu_gpll0_div_clk_src", 1551 + .parent_data = &(const struct clk_parent_data){ 1552 + .hw = &gpll0_out_even.clkr.hw, 1553 + }, 1554 + .num_parents = 1, 1555 + .flags = CLK_SET_RATE_PARENT, 1556 + .ops = &clk_branch2_ops, 1557 + }, 1558 + }, 1559 + }; 1560 + 1561 + static struct clk_branch gcc_pcie0_phy_refgen_clk = { 1562 + .halt_reg = 0x6f02c, 1563 + .halt_check = BRANCH_HALT, 1564 + .clkr = { 1565 + .enable_reg = 0x6f02c, 1566 + .enable_mask = BIT(0), 1567 + .hw.init = &(struct clk_init_data){ 1568 + .name = "gcc_pcie0_phy_refgen_clk", 1569 + .parent_data = &(const struct clk_parent_data){ 1570 + .hw = &gcc_pcie_phy_refgen_clk_src.clkr.hw, 1571 + }, 1572 + .num_parents = 1, 1573 + .flags = CLK_SET_RATE_PARENT, 1574 + .ops = &clk_branch2_ops, 1575 + }, 1576 + }, 1577 + }; 1578 + 1579 + static struct clk_branch gcc_pcie1_phy_refgen_clk = { 1580 + .halt_reg = 0x6f030, 1581 + .halt_check = BRANCH_HALT, 1582 + .clkr = { 1583 + .enable_reg = 0x6f030, 1584 + .enable_mask = BIT(0), 1585 + .hw.init = &(struct clk_init_data){ 1586 + .name = "gcc_pcie1_phy_refgen_clk", 1587 + .parent_data = &(const struct clk_parent_data){ 1588 + .hw = &gcc_pcie_phy_refgen_clk_src.clkr.hw, 1589 + }, 1590 + .num_parents = 1, 1591 + .flags = CLK_SET_RATE_PARENT, 1592 + .ops = &clk_branch2_ops, 1593 + }, 1594 + }, 1595 + }; 1596 + 1597 + static struct clk_branch gcc_pcie2_phy_refgen_clk = { 1598 + .halt_reg = 0x6f034, 1599 + .halt_check = BRANCH_HALT, 1600 + .clkr = { 1601 + .enable_reg = 0x6f034, 1602 + .enable_mask = BIT(0), 1603 + .hw.init = &(struct clk_init_data){ 1604 + .name = "gcc_pcie2_phy_refgen_clk", 1605 + .parent_data = &(const struct clk_parent_data){ 1606 + .hw = &gcc_pcie_phy_refgen_clk_src.clkr.hw, 1607 + }, 1608 + .num_parents = 1, 1609 + .flags = CLK_SET_RATE_PARENT, 1610 + .ops = &clk_branch2_ops, 1611 + }, 1612 + }, 1613 + }; 1614 + 1615 + static struct clk_branch gcc_pcie_0_aux_clk = { 1616 + .halt_reg = 0x6b028, 1617 + .halt_check = BRANCH_HALT_VOTED, 1618 + .clkr = { 1619 + .enable_reg = 0x52008, 1620 + .enable_mask = BIT(3), 1621 + .hw.init = &(struct clk_init_data){ 1622 + .name = "gcc_pcie_0_aux_clk", 1623 + .parent_data = &(const struct clk_parent_data){ 1624 + .hw = &gcc_pcie_0_aux_clk_src.clkr.hw, 1625 + }, 1626 + .num_parents = 1, 1627 + .flags = CLK_SET_RATE_PARENT, 1628 + .ops = &clk_branch2_ops, 1629 + }, 1630 + }, 1631 + }; 1632 + 1633 + static struct clk_branch gcc_pcie_0_cfg_ahb_clk = { 1634 + .halt_reg = 0x6b024, 1635 + .halt_check = BRANCH_HALT_VOTED, 1636 + .hwcg_reg = 0x6b024, 1637 + .hwcg_bit = 1, 1638 + .clkr = { 1639 + .enable_reg = 0x52008, 1640 + .enable_mask = BIT(2), 1641 + .hw.init = &(struct clk_init_data){ 1642 + .name = "gcc_pcie_0_cfg_ahb_clk", 1643 + .ops = &clk_branch2_ops, 1644 + }, 1645 + }, 1646 + }; 1647 + 1648 + static struct clk_branch gcc_pcie_0_mstr_axi_clk = { 1649 + .halt_reg = 0x6b01c, 1650 + .halt_check = BRANCH_HALT_VOTED, 1651 + .clkr = { 1652 + .enable_reg = 0x52008, 1653 + .enable_mask = BIT(1), 1654 + .hw.init = &(struct clk_init_data){ 1655 + .name = "gcc_pcie_0_mstr_axi_clk", 1656 + .ops = &clk_branch2_ops, 1657 + }, 1658 + }, 1659 + }; 1660 + 1661 + static struct clk_branch gcc_pcie_0_pipe_clk = { 1662 + .halt_reg = 0x6b02c, 1663 + .halt_check = BRANCH_HALT_SKIP, 1664 + .clkr = { 1665 + .enable_reg = 0x52008, 1666 + .enable_mask = BIT(4), 1667 + .hw.init = &(struct clk_init_data){ 1668 + .name = "gcc_pcie_0_pipe_clk", 1669 + .ops = &clk_branch2_ops, 1670 + }, 1671 + }, 1672 + }; 1673 + 1674 + static struct clk_branch gcc_pcie_0_slv_axi_clk = { 1675 + .halt_reg = 0x6b014, 1676 + .halt_check = BRANCH_HALT_VOTED, 1677 + .hwcg_reg = 0x6b014, 1678 + .hwcg_bit = 1, 1679 + .clkr = { 1680 + .enable_reg = 0x52008, 1681 + .enable_mask = BIT(0), 1682 + .hw.init = &(struct clk_init_data){ 1683 + .name = "gcc_pcie_0_slv_axi_clk", 1684 + .ops = &clk_branch2_ops, 1685 + }, 1686 + }, 1687 + }; 1688 + 1689 + static struct clk_branch gcc_pcie_0_slv_q2a_axi_clk = { 1690 + .halt_reg = 0x6b010, 1691 + .halt_check = BRANCH_HALT_VOTED, 1692 + .clkr = { 1693 + .enable_reg = 0x52008, 1694 + .enable_mask = BIT(5), 1695 + .hw.init = &(struct clk_init_data){ 1696 + .name = "gcc_pcie_0_slv_q2a_axi_clk", 1697 + .ops = &clk_branch2_ops, 1698 + }, 1699 + }, 1700 + }; 1701 + 1702 + static struct clk_branch gcc_pcie_1_aux_clk = { 1703 + .halt_reg = 0x8d028, 1704 + .halt_check = BRANCH_HALT_VOTED, 1705 + .clkr = { 1706 + .enable_reg = 0x52000, 1707 + .enable_mask = BIT(29), 1708 + .hw.init = &(struct clk_init_data){ 1709 + .name = "gcc_pcie_1_aux_clk", 1710 + .parent_data = &(const struct clk_parent_data){ 1711 + .hw = &gcc_pcie_1_aux_clk_src.clkr.hw, 1712 + }, 1713 + .num_parents = 1, 1714 + .flags = CLK_SET_RATE_PARENT, 1715 + .ops = &clk_branch2_ops, 1716 + }, 1717 + }, 1718 + }; 1719 + 1720 + static struct clk_branch gcc_pcie_1_cfg_ahb_clk = { 1721 + .halt_reg = 0x8d024, 1722 + .halt_check = BRANCH_HALT_VOTED, 1723 + .hwcg_reg = 0x8d024, 1724 + .hwcg_bit = 1, 1725 + .clkr = { 1726 + .enable_reg = 0x52000, 1727 + .enable_mask = BIT(28), 1728 + .hw.init = &(struct clk_init_data){ 1729 + .name = "gcc_pcie_1_cfg_ahb_clk", 1730 + .ops = &clk_branch2_ops, 1731 + }, 1732 + }, 1733 + }; 1734 + 1735 + static struct clk_branch gcc_pcie_1_mstr_axi_clk = { 1736 + .halt_reg = 0x8d01c, 1737 + .halt_check = BRANCH_HALT_VOTED, 1738 + .clkr = { 1739 + .enable_reg = 0x52000, 1740 + .enable_mask = BIT(27), 1741 + .hw.init = &(struct clk_init_data){ 1742 + .name = "gcc_pcie_1_mstr_axi_clk", 1743 + .ops = &clk_branch2_ops, 1744 + }, 1745 + }, 1746 + }; 1747 + 1748 + static struct clk_branch gcc_pcie_1_pipe_clk = { 1749 + .halt_reg = 0x8d02c, 1750 + .halt_check = BRANCH_HALT_SKIP, 1751 + .clkr = { 1752 + .enable_reg = 0x52000, 1753 + .enable_mask = BIT(30), 1754 + .hw.init = &(struct clk_init_data){ 1755 + .name = "gcc_pcie_1_pipe_clk", 1756 + .ops = &clk_branch2_ops, 1757 + }, 1758 + }, 1759 + }; 1760 + 1761 + static struct clk_branch gcc_pcie_1_slv_axi_clk = { 1762 + .halt_reg = 0x8d014, 1763 + .halt_check = BRANCH_HALT_VOTED, 1764 + .hwcg_reg = 0x8d014, 1765 + .hwcg_bit = 1, 1766 + .clkr = { 1767 + .enable_reg = 0x52000, 1768 + .enable_mask = BIT(26), 1769 + .hw.init = &(struct clk_init_data){ 1770 + .name = "gcc_pcie_1_slv_axi_clk", 1771 + .ops = &clk_branch2_ops, 1772 + }, 1773 + }, 1774 + }; 1775 + 1776 + static struct clk_branch gcc_pcie_1_slv_q2a_axi_clk = { 1777 + .halt_reg = 0x8d010, 1778 + .halt_check = BRANCH_HALT_VOTED, 1779 + .clkr = { 1780 + .enable_reg = 0x52000, 1781 + .enable_mask = BIT(25), 1782 + .hw.init = &(struct clk_init_data){ 1783 + .name = "gcc_pcie_1_slv_q2a_axi_clk", 1784 + .ops = &clk_branch2_ops, 1785 + }, 1786 + }, 1787 + }; 1788 + 1789 + static struct clk_branch gcc_pcie_2_aux_clk = { 1790 + .halt_reg = 0x6028, 1791 + .halt_check = BRANCH_HALT_VOTED, 1792 + .clkr = { 1793 + .enable_reg = 0x52010, 1794 + .enable_mask = BIT(14), 1795 + .hw.init = &(struct clk_init_data){ 1796 + .name = "gcc_pcie_2_aux_clk", 1797 + .parent_data = &(const struct clk_parent_data){ 1798 + .hw = &gcc_pcie_2_aux_clk_src.clkr.hw, 1799 + }, 1800 + .num_parents = 1, 1801 + .flags = CLK_SET_RATE_PARENT, 1802 + .ops = &clk_branch2_ops, 1803 + }, 1804 + }, 1805 + }; 1806 + 1807 + static struct clk_branch gcc_pcie_2_cfg_ahb_clk = { 1808 + .halt_reg = 0x6024, 1809 + .halt_check = BRANCH_HALT_VOTED, 1810 + .hwcg_reg = 0x6024, 1811 + .hwcg_bit = 1, 1812 + .clkr = { 1813 + .enable_reg = 0x52010, 1814 + .enable_mask = BIT(13), 1815 + .hw.init = &(struct clk_init_data){ 1816 + .name = "gcc_pcie_2_cfg_ahb_clk", 1817 + .ops = &clk_branch2_ops, 1818 + }, 1819 + }, 1820 + }; 1821 + 1822 + static struct clk_branch gcc_pcie_2_mstr_axi_clk = { 1823 + .halt_reg = 0x601c, 1824 + .halt_check = BRANCH_HALT_VOTED, 1825 + .clkr = { 1826 + .enable_reg = 0x52010, 1827 + .enable_mask = BIT(12), 1828 + .hw.init = &(struct clk_init_data){ 1829 + .name = "gcc_pcie_2_mstr_axi_clk", 1830 + .ops = &clk_branch2_ops, 1831 + }, 1832 + }, 1833 + }; 1834 + 1835 + static struct clk_branch gcc_pcie_2_pipe_clk = { 1836 + .halt_reg = 0x602c, 1837 + .halt_check = BRANCH_HALT_SKIP, 1838 + .clkr = { 1839 + .enable_reg = 0x52010, 1840 + .enable_mask = BIT(15), 1841 + .hw.init = &(struct clk_init_data){ 1842 + .name = "gcc_pcie_2_pipe_clk", 1843 + .ops = &clk_branch2_ops, 1844 + }, 1845 + }, 1846 + }; 1847 + 1848 + static struct clk_branch gcc_pcie_2_slv_axi_clk = { 1849 + .halt_reg = 0x6014, 1850 + .halt_check = BRANCH_HALT_VOTED, 1851 + .hwcg_reg = 0x6014, 1852 + .hwcg_bit = 1, 1853 + .clkr = { 1854 + .enable_reg = 0x52010, 1855 + .enable_mask = BIT(11), 1856 + .hw.init = &(struct clk_init_data){ 1857 + .name = "gcc_pcie_2_slv_axi_clk", 1858 + .ops = &clk_branch2_ops, 1859 + }, 1860 + }, 1861 + }; 1862 + 1863 + static struct clk_branch gcc_pcie_2_slv_q2a_axi_clk = { 1864 + .halt_reg = 0x6010, 1865 + .halt_check = BRANCH_HALT_VOTED, 1866 + .clkr = { 1867 + .enable_reg = 0x52010, 1868 + .enable_mask = BIT(10), 1869 + .hw.init = &(struct clk_init_data){ 1870 + .name = "gcc_pcie_2_slv_q2a_axi_clk", 1871 + .ops = &clk_branch2_ops, 1872 + }, 1873 + }, 1874 + }; 1875 + 1876 + static struct clk_branch gcc_pcie_mdm_clkref_en = { 1877 + .halt_reg = 0x8c00c, 1878 + .halt_check = BRANCH_HALT, 1879 + .clkr = { 1880 + .enable_reg = 0x8c00c, 1881 + .enable_mask = BIT(0), 1882 + .hw.init = &(struct clk_init_data){ 1883 + .name = "gcc_pcie_mdm_clkref_en", 1884 + .ops = &clk_branch2_ops, 1885 + }, 1886 + }, 1887 + }; 1888 + 1889 + static struct clk_branch gcc_pcie_phy_aux_clk = { 1890 + .halt_reg = 0x6f004, 1891 + .halt_check = BRANCH_HALT, 1892 + .clkr = { 1893 + .enable_reg = 0x6f004, 1894 + .enable_mask = BIT(0), 1895 + .hw.init = &(struct clk_init_data){ 1896 + .name = "gcc_pcie_phy_aux_clk", 1897 + .parent_data = &(const struct clk_parent_data){ 1898 + .hw = &gcc_pcie_0_aux_clk_src.clkr.hw, 1899 + }, 1900 + .num_parents = 1, 1901 + .flags = CLK_SET_RATE_PARENT, 1902 + .ops = &clk_branch2_ops, 1903 + }, 1904 + }, 1905 + }; 1906 + 1907 + static struct clk_branch gcc_pcie_wifi_clkref_en = { 1908 + .halt_reg = 0x8c004, 1909 + .halt_check = BRANCH_HALT, 1910 + .clkr = { 1911 + .enable_reg = 0x8c004, 1912 + .enable_mask = BIT(0), 1913 + .hw.init = &(struct clk_init_data){ 1914 + .name = "gcc_pcie_wifi_clkref_en", 1915 + .ops = &clk_branch2_ops, 1916 + }, 1917 + }, 1918 + }; 1919 + 1920 + static struct clk_branch gcc_pcie_wigig_clkref_en = { 1921 + .halt_reg = 0x8c008, 1922 + .halt_check = BRANCH_HALT, 1923 + .clkr = { 1924 + .enable_reg = 0x8c008, 1925 + .enable_mask = BIT(0), 1926 + .hw.init = &(struct clk_init_data){ 1927 + .name = "gcc_pcie_wigig_clkref_en", 1928 + .ops = &clk_branch2_ops, 1929 + }, 1930 + }, 1931 + }; 1932 + 1933 + static struct clk_branch gcc_pdm2_clk = { 1934 + .halt_reg = 0x3300c, 1935 + .halt_check = BRANCH_HALT, 1936 + .clkr = { 1937 + .enable_reg = 0x3300c, 1938 + .enable_mask = BIT(0), 1939 + .hw.init = &(struct clk_init_data){ 1940 + .name = "gcc_pdm2_clk", 1941 + .parent_data = &(const struct clk_parent_data){ 1942 + .hw = &gcc_pdm2_clk_src.clkr.hw, 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_pdm_ahb_clk = { 1952 + .halt_reg = 0x33004, 1953 + .halt_check = BRANCH_HALT, 1954 + .hwcg_reg = 0x33004, 1955 + .hwcg_bit = 1, 1956 + .clkr = { 1957 + .enable_reg = 0x33004, 1958 + .enable_mask = BIT(0), 1959 + .hw.init = &(struct clk_init_data){ 1960 + .name = "gcc_pdm_ahb_clk", 1961 + .ops = &clk_branch2_ops, 1962 + }, 1963 + }, 1964 + }; 1965 + 1966 + static struct clk_branch gcc_pdm_xo4_clk = { 1967 + .halt_reg = 0x33008, 1968 + .halt_check = BRANCH_HALT, 1969 + .clkr = { 1970 + .enable_reg = 0x33008, 1971 + .enable_mask = BIT(0), 1972 + .hw.init = &(struct clk_init_data){ 1973 + .name = "gcc_pdm_xo4_clk", 1974 + .ops = &clk_branch2_ops, 1975 + }, 1976 + }, 1977 + }; 1978 + 1979 + static struct clk_branch gcc_prng_ahb_clk = { 1980 + .halt_reg = 0x34004, 1981 + .halt_check = BRANCH_HALT_VOTED, 1982 + .clkr = { 1983 + .enable_reg = 0x52000, 1984 + .enable_mask = BIT(13), 1985 + .hw.init = &(struct clk_init_data){ 1986 + .name = "gcc_prng_ahb_clk", 1987 + .ops = &clk_branch2_ops, 1988 + }, 1989 + }, 1990 + }; 1991 + 1992 + static struct clk_branch gcc_qmip_camera_nrt_ahb_clk = { 1993 + .halt_reg = 0xb018, 1994 + .halt_check = BRANCH_HALT_VOTED, 1995 + .hwcg_reg = 0xb018, 1996 + .hwcg_bit = 1, 1997 + .clkr = { 1998 + .enable_reg = 0xb018, 1999 + .enable_mask = BIT(0), 2000 + .hw.init = &(struct clk_init_data){ 2001 + .name = "gcc_qmip_camera_nrt_ahb_clk", 2002 + .ops = &clk_branch2_ops, 2003 + }, 2004 + }, 2005 + }; 2006 + 2007 + static struct clk_branch gcc_qmip_camera_rt_ahb_clk = { 2008 + .halt_reg = 0xb01c, 2009 + .halt_check = BRANCH_HALT_VOTED, 2010 + .hwcg_reg = 0xb01c, 2011 + .hwcg_bit = 1, 2012 + .clkr = { 2013 + .enable_reg = 0xb01c, 2014 + .enable_mask = BIT(0), 2015 + .hw.init = &(struct clk_init_data){ 2016 + .name = "gcc_qmip_camera_rt_ahb_clk", 2017 + .ops = &clk_branch2_ops, 2018 + }, 2019 + }, 2020 + }; 2021 + 2022 + static struct clk_branch gcc_qmip_disp_ahb_clk = { 2023 + .halt_reg = 0xb020, 2024 + .halt_check = BRANCH_HALT_VOTED, 2025 + .hwcg_reg = 0xb020, 2026 + .hwcg_bit = 1, 2027 + .clkr = { 2028 + .enable_reg = 0xb020, 2029 + .enable_mask = BIT(0), 2030 + .hw.init = &(struct clk_init_data){ 2031 + .name = "gcc_qmip_disp_ahb_clk", 2032 + .ops = &clk_branch2_ops, 2033 + }, 2034 + }, 2035 + }; 2036 + 2037 + static struct clk_branch gcc_qmip_video_cvp_ahb_clk = { 2038 + .halt_reg = 0xb010, 2039 + .halt_check = BRANCH_HALT_VOTED, 2040 + .hwcg_reg = 0xb010, 2041 + .hwcg_bit = 1, 2042 + .clkr = { 2043 + .enable_reg = 0xb010, 2044 + .enable_mask = BIT(0), 2045 + .hw.init = &(struct clk_init_data){ 2046 + .name = "gcc_qmip_video_cvp_ahb_clk", 2047 + .ops = &clk_branch2_ops, 2048 + }, 2049 + }, 2050 + }; 2051 + 2052 + static struct clk_branch gcc_qmip_video_vcodec_ahb_clk = { 2053 + .halt_reg = 0xb014, 2054 + .halt_check = BRANCH_HALT_VOTED, 2055 + .hwcg_reg = 0xb014, 2056 + .hwcg_bit = 1, 2057 + .clkr = { 2058 + .enable_reg = 0xb014, 2059 + .enable_mask = BIT(0), 2060 + .hw.init = &(struct clk_init_data){ 2061 + .name = "gcc_qmip_video_vcodec_ahb_clk", 2062 + .ops = &clk_branch2_ops, 2063 + }, 2064 + }, 2065 + }; 2066 + 2067 + static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = { 2068 + .halt_reg = 0x23008, 2069 + .halt_check = BRANCH_HALT_VOTED, 2070 + .clkr = { 2071 + .enable_reg = 0x52008, 2072 + .enable_mask = BIT(9), 2073 + .hw.init = &(struct clk_init_data){ 2074 + .name = "gcc_qupv3_wrap0_core_2x_clk", 2075 + .ops = &clk_branch2_ops, 2076 + }, 2077 + }, 2078 + }; 2079 + 2080 + static struct clk_branch gcc_qupv3_wrap0_core_clk = { 2081 + .halt_reg = 0x23000, 2082 + .halt_check = BRANCH_HALT_VOTED, 2083 + .clkr = { 2084 + .enable_reg = 0x52008, 2085 + .enable_mask = BIT(8), 2086 + .hw.init = &(struct clk_init_data){ 2087 + .name = "gcc_qupv3_wrap0_core_clk", 2088 + .ops = &clk_branch2_ops, 2089 + }, 2090 + }, 2091 + }; 2092 + 2093 + static struct clk_branch gcc_qupv3_wrap0_s0_clk = { 2094 + .halt_reg = 0x1700c, 2095 + .halt_check = BRANCH_HALT_VOTED, 2096 + .clkr = { 2097 + .enable_reg = 0x52008, 2098 + .enable_mask = BIT(10), 2099 + .hw.init = &(struct clk_init_data){ 2100 + .name = "gcc_qupv3_wrap0_s0_clk", 2101 + .parent_data = &(const struct clk_parent_data){ 2102 + .hw = &gcc_qupv3_wrap0_s0_clk_src.clkr.hw, 2103 + }, 2104 + .num_parents = 1, 2105 + .flags = CLK_SET_RATE_PARENT, 2106 + .ops = &clk_branch2_ops, 2107 + }, 2108 + }, 2109 + }; 2110 + 2111 + static struct clk_branch gcc_qupv3_wrap0_s1_clk = { 2112 + .halt_reg = 0x1713c, 2113 + .halt_check = BRANCH_HALT_VOTED, 2114 + .clkr = { 2115 + .enable_reg = 0x52008, 2116 + .enable_mask = BIT(11), 2117 + .hw.init = &(struct clk_init_data){ 2118 + .name = "gcc_qupv3_wrap0_s1_clk", 2119 + .parent_data = &(const struct clk_parent_data){ 2120 + .hw = &gcc_qupv3_wrap0_s1_clk_src.clkr.hw, 2121 + }, 2122 + .num_parents = 1, 2123 + .flags = CLK_SET_RATE_PARENT, 2124 + .ops = &clk_branch2_ops, 2125 + }, 2126 + }, 2127 + }; 2128 + 2129 + static struct clk_branch gcc_qupv3_wrap0_s2_clk = { 2130 + .halt_reg = 0x1726c, 2131 + .halt_check = BRANCH_HALT_VOTED, 2132 + .clkr = { 2133 + .enable_reg = 0x52008, 2134 + .enable_mask = BIT(12), 2135 + .hw.init = &(struct clk_init_data){ 2136 + .name = "gcc_qupv3_wrap0_s2_clk", 2137 + .parent_data = &(const struct clk_parent_data){ 2138 + .hw = &gcc_qupv3_wrap0_s2_clk_src.clkr.hw, 2139 + }, 2140 + .num_parents = 1, 2141 + .flags = CLK_SET_RATE_PARENT, 2142 + .ops = &clk_branch2_ops, 2143 + }, 2144 + }, 2145 + }; 2146 + 2147 + static struct clk_branch gcc_qupv3_wrap0_s3_clk = { 2148 + .halt_reg = 0x1739c, 2149 + .halt_check = BRANCH_HALT_VOTED, 2150 + .clkr = { 2151 + .enable_reg = 0x52008, 2152 + .enable_mask = BIT(13), 2153 + .hw.init = &(struct clk_init_data){ 2154 + .name = "gcc_qupv3_wrap0_s3_clk", 2155 + .parent_data = &(const struct clk_parent_data){ 2156 + .hw = &gcc_qupv3_wrap0_s3_clk_src.clkr.hw, 2157 + }, 2158 + .num_parents = 1, 2159 + .flags = CLK_SET_RATE_PARENT, 2160 + .ops = &clk_branch2_ops, 2161 + }, 2162 + }, 2163 + }; 2164 + 2165 + static struct clk_branch gcc_qupv3_wrap0_s4_clk = { 2166 + .halt_reg = 0x174cc, 2167 + .halt_check = BRANCH_HALT_VOTED, 2168 + .clkr = { 2169 + .enable_reg = 0x52008, 2170 + .enable_mask = BIT(14), 2171 + .hw.init = &(struct clk_init_data){ 2172 + .name = "gcc_qupv3_wrap0_s4_clk", 2173 + .parent_data = &(const struct clk_parent_data){ 2174 + .hw = &gcc_qupv3_wrap0_s4_clk_src.clkr.hw, 2175 + }, 2176 + .num_parents = 1, 2177 + .flags = CLK_SET_RATE_PARENT, 2178 + .ops = &clk_branch2_ops, 2179 + }, 2180 + }, 2181 + }; 2182 + 2183 + static struct clk_branch gcc_qupv3_wrap0_s5_clk = { 2184 + .halt_reg = 0x175fc, 2185 + .halt_check = BRANCH_HALT_VOTED, 2186 + .clkr = { 2187 + .enable_reg = 0x52008, 2188 + .enable_mask = BIT(15), 2189 + .hw.init = &(struct clk_init_data){ 2190 + .name = "gcc_qupv3_wrap0_s5_clk", 2191 + .parent_data = &(const struct clk_parent_data){ 2192 + .hw = &gcc_qupv3_wrap0_s5_clk_src.clkr.hw, 2193 + }, 2194 + .num_parents = 1, 2195 + .flags = CLK_SET_RATE_PARENT, 2196 + .ops = &clk_branch2_ops, 2197 + }, 2198 + }, 2199 + }; 2200 + 2201 + static struct clk_branch gcc_qupv3_wrap0_s6_clk = { 2202 + .halt_reg = 0x1772c, 2203 + .halt_check = BRANCH_HALT_VOTED, 2204 + .clkr = { 2205 + .enable_reg = 0x52008, 2206 + .enable_mask = BIT(16), 2207 + .hw.init = &(struct clk_init_data){ 2208 + .name = "gcc_qupv3_wrap0_s6_clk", 2209 + .parent_data = &(const struct clk_parent_data){ 2210 + .hw = &gcc_qupv3_wrap0_s6_clk_src.clkr.hw, 2211 + }, 2212 + .num_parents = 1, 2213 + .flags = CLK_SET_RATE_PARENT, 2214 + .ops = &clk_branch2_ops, 2215 + }, 2216 + }, 2217 + }; 2218 + 2219 + static struct clk_branch gcc_qupv3_wrap0_s7_clk = { 2220 + .halt_reg = 0x1785c, 2221 + .halt_check = BRANCH_HALT_VOTED, 2222 + .clkr = { 2223 + .enable_reg = 0x52008, 2224 + .enable_mask = BIT(17), 2225 + .hw.init = &(struct clk_init_data){ 2226 + .name = "gcc_qupv3_wrap0_s7_clk", 2227 + .parent_data = &(const struct clk_parent_data){ 2228 + .hw = &gcc_qupv3_wrap0_s7_clk_src.clkr.hw, 2229 + }, 2230 + .num_parents = 1, 2231 + .flags = CLK_SET_RATE_PARENT, 2232 + .ops = &clk_branch2_ops, 2233 + }, 2234 + }, 2235 + }; 2236 + 2237 + static struct clk_branch gcc_qupv3_wrap1_core_2x_clk = { 2238 + .halt_reg = 0x23140, 2239 + .halt_check = BRANCH_HALT_VOTED, 2240 + .clkr = { 2241 + .enable_reg = 0x52008, 2242 + .enable_mask = BIT(18), 2243 + .hw.init = &(struct clk_init_data){ 2244 + .name = "gcc_qupv3_wrap1_core_2x_clk", 2245 + .ops = &clk_branch2_ops, 2246 + }, 2247 + }, 2248 + }; 2249 + 2250 + static struct clk_branch gcc_qupv3_wrap1_core_clk = { 2251 + .halt_reg = 0x23138, 2252 + .halt_check = BRANCH_HALT_VOTED, 2253 + .clkr = { 2254 + .enable_reg = 0x52008, 2255 + .enable_mask = BIT(19), 2256 + .hw.init = &(struct clk_init_data){ 2257 + .name = "gcc_qupv3_wrap1_core_clk", 2258 + .ops = &clk_branch2_ops, 2259 + }, 2260 + }, 2261 + }; 2262 + 2263 + static struct clk_branch gcc_qupv3_wrap1_s0_clk = { 2264 + .halt_reg = 0x1800c, 2265 + .halt_check = BRANCH_HALT_VOTED, 2266 + .clkr = { 2267 + .enable_reg = 0x52008, 2268 + .enable_mask = BIT(22), 2269 + .hw.init = &(struct clk_init_data){ 2270 + .name = "gcc_qupv3_wrap1_s0_clk", 2271 + .parent_data = &(const struct clk_parent_data){ 2272 + .hw = &gcc_qupv3_wrap1_s0_clk_src.clkr.hw, 2273 + }, 2274 + .num_parents = 1, 2275 + .flags = CLK_SET_RATE_PARENT, 2276 + .ops = &clk_branch2_ops, 2277 + }, 2278 + }, 2279 + }; 2280 + 2281 + static struct clk_branch gcc_qupv3_wrap1_s1_clk = { 2282 + .halt_reg = 0x1813c, 2283 + .halt_check = BRANCH_HALT_VOTED, 2284 + .clkr = { 2285 + .enable_reg = 0x52008, 2286 + .enable_mask = BIT(23), 2287 + .hw.init = &(struct clk_init_data){ 2288 + .name = "gcc_qupv3_wrap1_s1_clk", 2289 + .parent_data = &(const struct clk_parent_data){ 2290 + .hw = &gcc_qupv3_wrap1_s1_clk_src.clkr.hw, 2291 + }, 2292 + .num_parents = 1, 2293 + .flags = CLK_SET_RATE_PARENT, 2294 + .ops = &clk_branch2_ops, 2295 + }, 2296 + }, 2297 + }; 2298 + 2299 + static struct clk_branch gcc_qupv3_wrap1_s2_clk = { 2300 + .halt_reg = 0x1826c, 2301 + .halt_check = BRANCH_HALT_VOTED, 2302 + .clkr = { 2303 + .enable_reg = 0x52008, 2304 + .enable_mask = BIT(24), 2305 + .hw.init = &(struct clk_init_data){ 2306 + .name = "gcc_qupv3_wrap1_s2_clk", 2307 + .parent_data = &(const struct clk_parent_data){ 2308 + .hw = &gcc_qupv3_wrap1_s2_clk_src.clkr.hw, 2309 + }, 2310 + .num_parents = 1, 2311 + .flags = CLK_SET_RATE_PARENT, 2312 + .ops = &clk_branch2_ops, 2313 + }, 2314 + }, 2315 + }; 2316 + 2317 + static struct clk_branch gcc_qupv3_wrap1_s3_clk = { 2318 + .halt_reg = 0x1839c, 2319 + .halt_check = BRANCH_HALT_VOTED, 2320 + .clkr = { 2321 + .enable_reg = 0x52008, 2322 + .enable_mask = BIT(25), 2323 + .hw.init = &(struct clk_init_data){ 2324 + .name = "gcc_qupv3_wrap1_s3_clk", 2325 + .parent_data = &(const struct clk_parent_data){ 2326 + .hw = &gcc_qupv3_wrap1_s3_clk_src.clkr.hw, 2327 + }, 2328 + .num_parents = 1, 2329 + .flags = CLK_SET_RATE_PARENT, 2330 + .ops = &clk_branch2_ops, 2331 + }, 2332 + }, 2333 + }; 2334 + 2335 + static struct clk_branch gcc_qupv3_wrap1_s4_clk = { 2336 + .halt_reg = 0x184cc, 2337 + .halt_check = BRANCH_HALT_VOTED, 2338 + .clkr = { 2339 + .enable_reg = 0x52008, 2340 + .enable_mask = BIT(26), 2341 + .hw.init = &(struct clk_init_data){ 2342 + .name = "gcc_qupv3_wrap1_s4_clk", 2343 + .parent_data = &(const struct clk_parent_data){ 2344 + .hw = &gcc_qupv3_wrap1_s4_clk_src.clkr.hw, 2345 + }, 2346 + .num_parents = 1, 2347 + .flags = CLK_SET_RATE_PARENT, 2348 + .ops = &clk_branch2_ops, 2349 + }, 2350 + }, 2351 + }; 2352 + 2353 + static struct clk_branch gcc_qupv3_wrap1_s5_clk = { 2354 + .halt_reg = 0x185fc, 2355 + .halt_check = BRANCH_HALT_VOTED, 2356 + .clkr = { 2357 + .enable_reg = 0x52008, 2358 + .enable_mask = BIT(27), 2359 + .hw.init = &(struct clk_init_data){ 2360 + .name = "gcc_qupv3_wrap1_s5_clk", 2361 + .parent_data = &(const struct clk_parent_data){ 2362 + .hw = &gcc_qupv3_wrap1_s5_clk_src.clkr.hw, 2363 + }, 2364 + .num_parents = 1, 2365 + .flags = CLK_SET_RATE_PARENT, 2366 + .ops = &clk_branch2_ops, 2367 + }, 2368 + }, 2369 + }; 2370 + 2371 + static struct clk_branch gcc_qupv3_wrap2_core_2x_clk = { 2372 + .halt_reg = 0x23278, 2373 + .halt_check = BRANCH_HALT_VOTED, 2374 + .clkr = { 2375 + .enable_reg = 0x52010, 2376 + .enable_mask = BIT(3), 2377 + .hw.init = &(struct clk_init_data){ 2378 + .name = "gcc_qupv3_wrap2_core_2x_clk", 2379 + .ops = &clk_branch2_ops, 2380 + }, 2381 + }, 2382 + }; 2383 + 2384 + static struct clk_branch gcc_qupv3_wrap2_core_clk = { 2385 + .halt_reg = 0x23270, 2386 + .halt_check = BRANCH_HALT_VOTED, 2387 + .clkr = { 2388 + .enable_reg = 0x52010, 2389 + .enable_mask = BIT(0), 2390 + .hw.init = &(struct clk_init_data){ 2391 + .name = "gcc_qupv3_wrap2_core_clk", 2392 + .ops = &clk_branch2_ops, 2393 + }, 2394 + }, 2395 + }; 2396 + 2397 + static struct clk_branch gcc_qupv3_wrap2_s0_clk = { 2398 + .halt_reg = 0x1e00c, 2399 + .halt_check = BRANCH_HALT_VOTED, 2400 + .clkr = { 2401 + .enable_reg = 0x52010, 2402 + .enable_mask = BIT(4), 2403 + .hw.init = &(struct clk_init_data){ 2404 + .name = "gcc_qupv3_wrap2_s0_clk", 2405 + .parent_data = &(const struct clk_parent_data){ 2406 + .hw = &gcc_qupv3_wrap2_s0_clk_src.clkr.hw, 2407 + }, 2408 + .num_parents = 1, 2409 + .flags = CLK_SET_RATE_PARENT, 2410 + .ops = &clk_branch2_ops, 2411 + }, 2412 + }, 2413 + }; 2414 + 2415 + static struct clk_branch gcc_qupv3_wrap2_s1_clk = { 2416 + .halt_reg = 0x1e13c, 2417 + .halt_check = BRANCH_HALT_VOTED, 2418 + .clkr = { 2419 + .enable_reg = 0x52010, 2420 + .enable_mask = BIT(5), 2421 + .hw.init = &(struct clk_init_data){ 2422 + .name = "gcc_qupv3_wrap2_s1_clk", 2423 + .parent_data = &(const struct clk_parent_data){ 2424 + .hw = &gcc_qupv3_wrap2_s1_clk_src.clkr.hw, 2425 + }, 2426 + .num_parents = 1, 2427 + .flags = CLK_SET_RATE_PARENT, 2428 + .ops = &clk_branch2_ops, 2429 + }, 2430 + }, 2431 + }; 2432 + 2433 + static struct clk_branch gcc_qupv3_wrap2_s2_clk = { 2434 + .halt_reg = 0x1e26c, 2435 + .halt_check = BRANCH_HALT_VOTED, 2436 + .clkr = { 2437 + .enable_reg = 0x52010, 2438 + .enable_mask = BIT(6), 2439 + .hw.init = &(struct clk_init_data){ 2440 + .name = "gcc_qupv3_wrap2_s2_clk", 2441 + .parent_data = &(const struct clk_parent_data){ 2442 + .hw = &gcc_qupv3_wrap2_s2_clk_src.clkr.hw, 2443 + }, 2444 + .num_parents = 1, 2445 + .flags = CLK_SET_RATE_PARENT, 2446 + .ops = &clk_branch2_ops, 2447 + }, 2448 + }, 2449 + }; 2450 + 2451 + static struct clk_branch gcc_qupv3_wrap2_s3_clk = { 2452 + .halt_reg = 0x1e39c, 2453 + .halt_check = BRANCH_HALT_VOTED, 2454 + .clkr = { 2455 + .enable_reg = 0x52010, 2456 + .enable_mask = BIT(7), 2457 + .hw.init = &(struct clk_init_data){ 2458 + .name = "gcc_qupv3_wrap2_s3_clk", 2459 + .parent_data = &(const struct clk_parent_data){ 2460 + .hw = &gcc_qupv3_wrap2_s3_clk_src.clkr.hw, 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_qupv3_wrap2_s4_clk = { 2470 + .halt_reg = 0x1e4cc, 2471 + .halt_check = BRANCH_HALT_VOTED, 2472 + .clkr = { 2473 + .enable_reg = 0x52010, 2474 + .enable_mask = BIT(8), 2475 + .hw.init = &(struct clk_init_data){ 2476 + .name = "gcc_qupv3_wrap2_s4_clk", 2477 + .parent_data = &(const struct clk_parent_data){ 2478 + .hw = &gcc_qupv3_wrap2_s4_clk_src.clkr.hw, 2479 + }, 2480 + .num_parents = 1, 2481 + .flags = CLK_SET_RATE_PARENT, 2482 + .ops = &clk_branch2_ops, 2483 + }, 2484 + }, 2485 + }; 2486 + 2487 + static struct clk_branch gcc_qupv3_wrap2_s5_clk = { 2488 + .halt_reg = 0x1e5fc, 2489 + .halt_check = BRANCH_HALT_VOTED, 2490 + .clkr = { 2491 + .enable_reg = 0x52010, 2492 + .enable_mask = BIT(9), 2493 + .hw.init = &(struct clk_init_data){ 2494 + .name = "gcc_qupv3_wrap2_s5_clk", 2495 + .parent_data = &(const struct clk_parent_data){ 2496 + .hw = &gcc_qupv3_wrap2_s5_clk_src.clkr.hw, 2497 + }, 2498 + .num_parents = 1, 2499 + .flags = CLK_SET_RATE_PARENT, 2500 + .ops = &clk_branch2_ops, 2501 + }, 2502 + }, 2503 + }; 2504 + 2505 + static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = { 2506 + .halt_reg = 0x17004, 2507 + .halt_check = BRANCH_HALT_VOTED, 2508 + .clkr = { 2509 + .enable_reg = 0x52008, 2510 + .enable_mask = BIT(6), 2511 + .hw.init = &(struct clk_init_data){ 2512 + .name = "gcc_qupv3_wrap_0_m_ahb_clk", 2513 + .ops = &clk_branch2_ops, 2514 + }, 2515 + }, 2516 + }; 2517 + 2518 + static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = { 2519 + .halt_reg = 0x17008, 2520 + .halt_check = BRANCH_HALT_VOTED, 2521 + .hwcg_reg = 0x17008, 2522 + .hwcg_bit = 1, 2523 + .clkr = { 2524 + .enable_reg = 0x52008, 2525 + .enable_mask = BIT(7), 2526 + .hw.init = &(struct clk_init_data){ 2527 + .name = "gcc_qupv3_wrap_0_s_ahb_clk", 2528 + .ops = &clk_branch2_ops, 2529 + }, 2530 + }, 2531 + }; 2532 + 2533 + static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = { 2534 + .halt_reg = 0x18004, 2535 + .halt_check = BRANCH_HALT_VOTED, 2536 + .clkr = { 2537 + .enable_reg = 0x52008, 2538 + .enable_mask = BIT(20), 2539 + .hw.init = &(struct clk_init_data){ 2540 + .name = "gcc_qupv3_wrap_1_m_ahb_clk", 2541 + .ops = &clk_branch2_ops, 2542 + }, 2543 + }, 2544 + }; 2545 + 2546 + static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = { 2547 + .halt_reg = 0x18008, 2548 + .halt_check = BRANCH_HALT_VOTED, 2549 + .hwcg_reg = 0x18008, 2550 + .hwcg_bit = 1, 2551 + .clkr = { 2552 + .enable_reg = 0x52008, 2553 + .enable_mask = BIT(21), 2554 + .hw.init = &(struct clk_init_data){ 2555 + .name = "gcc_qupv3_wrap_1_s_ahb_clk", 2556 + .ops = &clk_branch2_ops, 2557 + }, 2558 + }, 2559 + }; 2560 + 2561 + static struct clk_branch gcc_qupv3_wrap_2_m_ahb_clk = { 2562 + .halt_reg = 0x1e004, 2563 + .halt_check = BRANCH_HALT_VOTED, 2564 + .clkr = { 2565 + .enable_reg = 0x52010, 2566 + .enable_mask = BIT(2), 2567 + .hw.init = &(struct clk_init_data){ 2568 + .name = "gcc_qupv3_wrap_2_m_ahb_clk", 2569 + .ops = &clk_branch2_ops, 2570 + }, 2571 + }, 2572 + }; 2573 + 2574 + static struct clk_branch gcc_qupv3_wrap_2_s_ahb_clk = { 2575 + .halt_reg = 0x1e008, 2576 + .halt_check = BRANCH_HALT_VOTED, 2577 + .hwcg_reg = 0x1e008, 2578 + .hwcg_bit = 1, 2579 + .clkr = { 2580 + .enable_reg = 0x52010, 2581 + .enable_mask = BIT(1), 2582 + .hw.init = &(struct clk_init_data){ 2583 + .name = "gcc_qupv3_wrap_2_s_ahb_clk", 2584 + .ops = &clk_branch2_ops, 2585 + }, 2586 + }, 2587 + }; 2588 + 2589 + static struct clk_branch gcc_sdcc2_ahb_clk = { 2590 + .halt_reg = 0x14008, 2591 + .halt_check = BRANCH_HALT, 2592 + .clkr = { 2593 + .enable_reg = 0x14008, 2594 + .enable_mask = BIT(0), 2595 + .hw.init = &(struct clk_init_data){ 2596 + .name = "gcc_sdcc2_ahb_clk", 2597 + .ops = &clk_branch2_ops, 2598 + }, 2599 + }, 2600 + }; 2601 + 2602 + static struct clk_branch gcc_sdcc2_apps_clk = { 2603 + .halt_reg = 0x14004, 2604 + .halt_check = BRANCH_HALT, 2605 + .clkr = { 2606 + .enable_reg = 0x14004, 2607 + .enable_mask = BIT(0), 2608 + .hw.init = &(struct clk_init_data){ 2609 + .name = "gcc_sdcc2_apps_clk", 2610 + .parent_data = &(const struct clk_parent_data){ 2611 + .hw = &gcc_sdcc2_apps_clk_src.clkr.hw, 2612 + }, 2613 + .num_parents = 1, 2614 + .flags = CLK_SET_RATE_PARENT, 2615 + .ops = &clk_branch2_ops, 2616 + }, 2617 + }, 2618 + }; 2619 + 2620 + static struct clk_branch gcc_sdcc4_ahb_clk = { 2621 + .halt_reg = 0x16008, 2622 + .halt_check = BRANCH_HALT, 2623 + .clkr = { 2624 + .enable_reg = 0x16008, 2625 + .enable_mask = BIT(0), 2626 + .hw.init = &(struct clk_init_data){ 2627 + .name = "gcc_sdcc4_ahb_clk", 2628 + .ops = &clk_branch2_ops, 2629 + }, 2630 + }, 2631 + }; 2632 + 2633 + static struct clk_branch gcc_sdcc4_apps_clk = { 2634 + .halt_reg = 0x16004, 2635 + .halt_check = BRANCH_HALT, 2636 + .clkr = { 2637 + .enable_reg = 0x16004, 2638 + .enable_mask = BIT(0), 2639 + .hw.init = &(struct clk_init_data){ 2640 + .name = "gcc_sdcc4_apps_clk", 2641 + .parent_data = &(const struct clk_parent_data){ 2642 + .hw = &gcc_sdcc4_apps_clk_src.clkr.hw, 2643 + }, 2644 + .num_parents = 1, 2645 + .flags = CLK_SET_RATE_PARENT, 2646 + .ops = &clk_branch2_ops, 2647 + }, 2648 + }, 2649 + }; 2650 + 2651 + static struct clk_branch gcc_tsif_ahb_clk = { 2652 + .halt_reg = 0x36004, 2653 + .halt_check = BRANCH_HALT_VOTED, 2654 + .clkr = { 2655 + .enable_reg = 0x36004, 2656 + .enable_mask = BIT(0), 2657 + .hw.init = &(struct clk_init_data){ 2658 + .name = "gcc_tsif_ahb_clk", 2659 + .ops = &clk_branch2_ops, 2660 + }, 2661 + }, 2662 + }; 2663 + 2664 + static struct clk_branch gcc_tsif_inactivity_timers_clk = { 2665 + .halt_reg = 0x3600c, 2666 + .halt_check = BRANCH_HALT, 2667 + .clkr = { 2668 + .enable_reg = 0x3600c, 2669 + .enable_mask = BIT(0), 2670 + .hw.init = &(struct clk_init_data){ 2671 + .name = "gcc_tsif_inactivity_timers_clk", 2672 + .ops = &clk_branch2_ops, 2673 + }, 2674 + }, 2675 + }; 2676 + 2677 + static struct clk_branch gcc_tsif_ref_clk = { 2678 + .halt_reg = 0x36008, 2679 + .halt_check = BRANCH_HALT, 2680 + .clkr = { 2681 + .enable_reg = 0x36008, 2682 + .enable_mask = BIT(0), 2683 + .hw.init = &(struct clk_init_data){ 2684 + .name = "gcc_tsif_ref_clk", 2685 + .parent_data = &(const struct clk_parent_data){ 2686 + .hw = &gcc_tsif_ref_clk_src.clkr.hw, 2687 + }, 2688 + .num_parents = 1, 2689 + .flags = CLK_SET_RATE_PARENT, 2690 + .ops = &clk_branch2_ops, 2691 + }, 2692 + }, 2693 + }; 2694 + 2695 + static struct clk_branch gcc_ufs_1x_clkref_en = { 2696 + .halt_reg = 0x8c000, 2697 + .halt_check = BRANCH_HALT, 2698 + .clkr = { 2699 + .enable_reg = 0x8c000, 2700 + .enable_mask = BIT(0), 2701 + .hw.init = &(struct clk_init_data){ 2702 + .name = "gcc_ufs_1x_clkref_en", 2703 + .ops = &clk_branch2_ops, 2704 + }, 2705 + }, 2706 + }; 2707 + 2708 + static struct clk_branch gcc_ufs_card_ahb_clk = { 2709 + .halt_reg = 0x75018, 2710 + .halt_check = BRANCH_HALT_VOTED, 2711 + .hwcg_reg = 0x75018, 2712 + .hwcg_bit = 1, 2713 + .clkr = { 2714 + .enable_reg = 0x75018, 2715 + .enable_mask = BIT(0), 2716 + .hw.init = &(struct clk_init_data){ 2717 + .name = "gcc_ufs_card_ahb_clk", 2718 + .ops = &clk_branch2_ops, 2719 + }, 2720 + }, 2721 + }; 2722 + 2723 + static struct clk_branch gcc_ufs_card_axi_clk = { 2724 + .halt_reg = 0x75010, 2725 + .halt_check = BRANCH_HALT, 2726 + .hwcg_reg = 0x75010, 2727 + .hwcg_bit = 1, 2728 + .clkr = { 2729 + .enable_reg = 0x75010, 2730 + .enable_mask = BIT(0), 2731 + .hw.init = &(struct clk_init_data){ 2732 + .name = "gcc_ufs_card_axi_clk", 2733 + .parent_data = &(const struct clk_parent_data){ 2734 + .hw = &gcc_ufs_card_axi_clk_src.clkr.hw, 2735 + }, 2736 + .num_parents = 1, 2737 + .flags = CLK_SET_RATE_PARENT, 2738 + .ops = &clk_branch2_ops, 2739 + }, 2740 + }, 2741 + }; 2742 + 2743 + static struct clk_branch gcc_ufs_card_ice_core_clk = { 2744 + .halt_reg = 0x75064, 2745 + .halt_check = BRANCH_HALT_VOTED, 2746 + .hwcg_reg = 0x75064, 2747 + .hwcg_bit = 1, 2748 + .clkr = { 2749 + .enable_reg = 0x75064, 2750 + .enable_mask = BIT(0), 2751 + .hw.init = &(struct clk_init_data){ 2752 + .name = "gcc_ufs_card_ice_core_clk", 2753 + .parent_data = &(const struct clk_parent_data){ 2754 + .hw = &gcc_ufs_card_ice_core_clk_src.clkr.hw, 2755 + }, 2756 + .num_parents = 1, 2757 + .flags = CLK_SET_RATE_PARENT, 2758 + .ops = &clk_branch2_ops, 2759 + }, 2760 + }, 2761 + }; 2762 + 2763 + static struct clk_branch gcc_ufs_card_phy_aux_clk = { 2764 + .halt_reg = 0x7509c, 2765 + .halt_check = BRANCH_HALT, 2766 + .hwcg_reg = 0x7509c, 2767 + .hwcg_bit = 1, 2768 + .clkr = { 2769 + .enable_reg = 0x7509c, 2770 + .enable_mask = BIT(0), 2771 + .hw.init = &(struct clk_init_data){ 2772 + .name = "gcc_ufs_card_phy_aux_clk", 2773 + .parent_data = &(const struct clk_parent_data){ 2774 + .hw = &gcc_ufs_card_phy_aux_clk_src.clkr.hw, 2775 + }, 2776 + .num_parents = 1, 2777 + .flags = CLK_SET_RATE_PARENT, 2778 + .ops = &clk_branch2_ops, 2779 + }, 2780 + }, 2781 + }; 2782 + 2783 + static struct clk_branch gcc_ufs_card_rx_symbol_0_clk = { 2784 + .halt_reg = 0x75020, 2785 + .halt_check = BRANCH_HALT_DELAY, 2786 + .clkr = { 2787 + .enable_reg = 0x75020, 2788 + .enable_mask = BIT(0), 2789 + .hw.init = &(struct clk_init_data){ 2790 + .name = "gcc_ufs_card_rx_symbol_0_clk", 2791 + .ops = &clk_branch2_ops, 2792 + }, 2793 + }, 2794 + }; 2795 + 2796 + static struct clk_branch gcc_ufs_card_rx_symbol_1_clk = { 2797 + .halt_reg = 0x750b8, 2798 + .halt_check = BRANCH_HALT_DELAY, 2799 + .clkr = { 2800 + .enable_reg = 0x750b8, 2801 + .enable_mask = BIT(0), 2802 + .hw.init = &(struct clk_init_data){ 2803 + .name = "gcc_ufs_card_rx_symbol_1_clk", 2804 + .ops = &clk_branch2_ops, 2805 + }, 2806 + }, 2807 + }; 2808 + 2809 + static struct clk_branch gcc_ufs_card_tx_symbol_0_clk = { 2810 + .halt_reg = 0x7501c, 2811 + .halt_check = BRANCH_HALT_DELAY, 2812 + .clkr = { 2813 + .enable_reg = 0x7501c, 2814 + .enable_mask = BIT(0), 2815 + .hw.init = &(struct clk_init_data){ 2816 + .name = "gcc_ufs_card_tx_symbol_0_clk", 2817 + .ops = &clk_branch2_ops, 2818 + }, 2819 + }, 2820 + }; 2821 + 2822 + static struct clk_branch gcc_ufs_card_unipro_core_clk = { 2823 + .halt_reg = 0x7505c, 2824 + .halt_check = BRANCH_HALT, 2825 + .hwcg_reg = 0x7505c, 2826 + .hwcg_bit = 1, 2827 + .clkr = { 2828 + .enable_reg = 0x7505c, 2829 + .enable_mask = BIT(0), 2830 + .hw.init = &(struct clk_init_data){ 2831 + .name = "gcc_ufs_card_unipro_core_clk", 2832 + .parent_data = &(const struct clk_parent_data){ 2833 + .hw = &gcc_ufs_card_unipro_core_clk_src.clkr.hw, 2834 + }, 2835 + .num_parents = 1, 2836 + .flags = CLK_SET_RATE_PARENT, 2837 + .ops = &clk_branch2_ops, 2838 + }, 2839 + }, 2840 + }; 2841 + 2842 + static struct clk_branch gcc_ufs_phy_ahb_clk = { 2843 + .halt_reg = 0x77018, 2844 + .halt_check = BRANCH_HALT_VOTED, 2845 + .hwcg_reg = 0x77018, 2846 + .hwcg_bit = 1, 2847 + .clkr = { 2848 + .enable_reg = 0x77018, 2849 + .enable_mask = BIT(0), 2850 + .hw.init = &(struct clk_init_data){ 2851 + .name = "gcc_ufs_phy_ahb_clk", 2852 + .ops = &clk_branch2_ops, 2853 + }, 2854 + }, 2855 + }; 2856 + 2857 + static struct clk_branch gcc_ufs_phy_axi_clk = { 2858 + .halt_reg = 0x77010, 2859 + .halt_check = BRANCH_HALT, 2860 + .hwcg_reg = 0x77010, 2861 + .hwcg_bit = 1, 2862 + .clkr = { 2863 + .enable_reg = 0x77010, 2864 + .enable_mask = BIT(0), 2865 + .hw.init = &(struct clk_init_data){ 2866 + .name = "gcc_ufs_phy_axi_clk", 2867 + .parent_data = &(const struct clk_parent_data){ 2868 + .hw = &gcc_ufs_phy_axi_clk_src.clkr.hw, 2869 + }, 2870 + .num_parents = 1, 2871 + .flags = CLK_SET_RATE_PARENT, 2872 + .ops = &clk_branch2_ops, 2873 + }, 2874 + }, 2875 + }; 2876 + 2877 + static struct clk_branch gcc_ufs_phy_ice_core_clk = { 2878 + .halt_reg = 0x77064, 2879 + .halt_check = BRANCH_HALT_VOTED, 2880 + .hwcg_reg = 0x77064, 2881 + .hwcg_bit = 1, 2882 + .clkr = { 2883 + .enable_reg = 0x77064, 2884 + .enable_mask = BIT(0), 2885 + .hw.init = &(struct clk_init_data){ 2886 + .name = "gcc_ufs_phy_ice_core_clk", 2887 + .parent_data = &(const struct clk_parent_data){ 2888 + .hw = &gcc_ufs_phy_ice_core_clk_src.clkr.hw, 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_ufs_phy_phy_aux_clk = { 2898 + .halt_reg = 0x7709c, 2899 + .halt_check = BRANCH_HALT, 2900 + .hwcg_reg = 0x7709c, 2901 + .hwcg_bit = 1, 2902 + .clkr = { 2903 + .enable_reg = 0x7709c, 2904 + .enable_mask = BIT(0), 2905 + .hw.init = &(struct clk_init_data){ 2906 + .name = "gcc_ufs_phy_phy_aux_clk", 2907 + .parent_data = &(const struct clk_parent_data){ 2908 + .hw = &gcc_ufs_phy_phy_aux_clk_src.clkr.hw, 2909 + }, 2910 + .num_parents = 1, 2911 + .flags = CLK_SET_RATE_PARENT, 2912 + .ops = &clk_branch2_ops, 2913 + }, 2914 + }, 2915 + }; 2916 + 2917 + static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { 2918 + .halt_reg = 0x77020, 2919 + .halt_check = BRANCH_HALT_DELAY, 2920 + .clkr = { 2921 + .enable_reg = 0x77020, 2922 + .enable_mask = BIT(0), 2923 + .hw.init = &(struct clk_init_data){ 2924 + .name = "gcc_ufs_phy_rx_symbol_0_clk", 2925 + .ops = &clk_branch2_ops, 2926 + }, 2927 + }, 2928 + }; 2929 + 2930 + static struct clk_branch gcc_ufs_phy_rx_symbol_1_clk = { 2931 + .halt_reg = 0x770b8, 2932 + .halt_check = BRANCH_HALT_DELAY, 2933 + .clkr = { 2934 + .enable_reg = 0x770b8, 2935 + .enable_mask = BIT(0), 2936 + .hw.init = &(struct clk_init_data){ 2937 + .name = "gcc_ufs_phy_rx_symbol_1_clk", 2938 + .ops = &clk_branch2_ops, 2939 + }, 2940 + }, 2941 + }; 2942 + 2943 + static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { 2944 + .halt_reg = 0x7701c, 2945 + .halt_check = BRANCH_HALT_DELAY, 2946 + .clkr = { 2947 + .enable_reg = 0x7701c, 2948 + .enable_mask = BIT(0), 2949 + .hw.init = &(struct clk_init_data){ 2950 + .name = "gcc_ufs_phy_tx_symbol_0_clk", 2951 + .ops = &clk_branch2_ops, 2952 + }, 2953 + }, 2954 + }; 2955 + 2956 + static struct clk_branch gcc_ufs_phy_unipro_core_clk = { 2957 + .halt_reg = 0x7705c, 2958 + .halt_check = BRANCH_HALT, 2959 + .hwcg_reg = 0x7705c, 2960 + .hwcg_bit = 1, 2961 + .clkr = { 2962 + .enable_reg = 0x7705c, 2963 + .enable_mask = BIT(0), 2964 + .hw.init = &(struct clk_init_data){ 2965 + .name = "gcc_ufs_phy_unipro_core_clk", 2966 + .parent_data = &(const struct clk_parent_data){ 2967 + .hw = &gcc_ufs_phy_unipro_core_clk_src.clkr.hw, 2968 + }, 2969 + .num_parents = 1, 2970 + .flags = CLK_SET_RATE_PARENT, 2971 + .ops = &clk_branch2_ops, 2972 + }, 2973 + }, 2974 + }; 2975 + 2976 + static struct clk_branch gcc_usb30_prim_master_clk = { 2977 + .halt_reg = 0xf010, 2978 + .halt_check = BRANCH_HALT_VOTED, 2979 + .clkr = { 2980 + .enable_reg = 0xf010, 2981 + .enable_mask = BIT(0), 2982 + .hw.init = &(struct clk_init_data){ 2983 + .name = "gcc_usb30_prim_master_clk", 2984 + .parent_data = &(const struct clk_parent_data){ 2985 + .hw = &gcc_usb30_prim_master_clk_src.clkr.hw, 2986 + }, 2987 + .num_parents = 1, 2988 + .flags = CLK_SET_RATE_PARENT, 2989 + .ops = &clk_branch2_ops, 2990 + }, 2991 + }, 2992 + }; 2993 + 2994 + static struct clk_branch gcc_usb30_prim_mock_utmi_clk = { 2995 + .halt_reg = 0xf01c, 2996 + .halt_check = BRANCH_HALT, 2997 + .clkr = { 2998 + .enable_reg = 0xf01c, 2999 + .enable_mask = BIT(0), 3000 + .hw.init = &(struct clk_init_data){ 3001 + .name = "gcc_usb30_prim_mock_utmi_clk", 3002 + .parent_data = &(const struct clk_parent_data){ 3003 + .hw = 3004 + &gcc_usb30_prim_mock_utmi_postdiv_clk_src.clkr.hw, 3005 + }, 3006 + .num_parents = 1, 3007 + .flags = CLK_SET_RATE_PARENT, 3008 + .ops = &clk_branch2_ops, 3009 + }, 3010 + }, 3011 + }; 3012 + 3013 + static struct clk_branch gcc_usb30_prim_sleep_clk = { 3014 + .halt_reg = 0xf018, 3015 + .halt_check = BRANCH_HALT, 3016 + .clkr = { 3017 + .enable_reg = 0xf018, 3018 + .enable_mask = BIT(0), 3019 + .hw.init = &(struct clk_init_data){ 3020 + .name = "gcc_usb30_prim_sleep_clk", 3021 + .ops = &clk_branch2_ops, 3022 + }, 3023 + }, 3024 + }; 3025 + 3026 + static struct clk_branch gcc_usb30_sec_master_clk = { 3027 + .halt_reg = 0x10010, 3028 + .halt_check = BRANCH_HALT_VOTED, 3029 + .clkr = { 3030 + .enable_reg = 0x10010, 3031 + .enable_mask = BIT(0), 3032 + .hw.init = &(struct clk_init_data){ 3033 + .name = "gcc_usb30_sec_master_clk", 3034 + .parent_data = &(const struct clk_parent_data){ 3035 + .hw = &gcc_usb30_sec_master_clk_src.clkr.hw, 3036 + }, 3037 + .num_parents = 1, 3038 + .flags = CLK_SET_RATE_PARENT, 3039 + .ops = &clk_branch2_ops, 3040 + }, 3041 + }, 3042 + }; 3043 + 3044 + static struct clk_branch gcc_usb30_sec_mock_utmi_clk = { 3045 + .halt_reg = 0x1001c, 3046 + .halt_check = BRANCH_HALT, 3047 + .clkr = { 3048 + .enable_reg = 0x1001c, 3049 + .enable_mask = BIT(0), 3050 + .hw.init = &(struct clk_init_data){ 3051 + .name = "gcc_usb30_sec_mock_utmi_clk", 3052 + .parent_data = &(const struct clk_parent_data){ 3053 + .hw = 3054 + &gcc_usb30_sec_mock_utmi_postdiv_clk_src.clkr.hw, 3055 + }, 3056 + .num_parents = 1, 3057 + .flags = CLK_SET_RATE_PARENT, 3058 + .ops = &clk_branch2_ops, 3059 + }, 3060 + }, 3061 + }; 3062 + 3063 + static struct clk_branch gcc_usb30_sec_sleep_clk = { 3064 + .halt_reg = 0x10018, 3065 + .halt_check = BRANCH_HALT, 3066 + .clkr = { 3067 + .enable_reg = 0x10018, 3068 + .enable_mask = BIT(0), 3069 + .hw.init = &(struct clk_init_data){ 3070 + .name = "gcc_usb30_sec_sleep_clk", 3071 + .ops = &clk_branch2_ops, 3072 + }, 3073 + }, 3074 + }; 3075 + 3076 + static struct clk_branch gcc_usb3_prim_phy_aux_clk = { 3077 + .halt_reg = 0xf054, 3078 + .halt_check = BRANCH_HALT, 3079 + .clkr = { 3080 + .enable_reg = 0xf054, 3081 + .enable_mask = BIT(0), 3082 + .hw.init = &(struct clk_init_data){ 3083 + .name = "gcc_usb3_prim_phy_aux_clk", 3084 + .parent_data = &(const struct clk_parent_data){ 3085 + .hw = &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 3086 + }, 3087 + .num_parents = 1, 3088 + .flags = CLK_SET_RATE_PARENT, 3089 + .ops = &clk_branch2_ops, 3090 + }, 3091 + }, 3092 + }; 3093 + 3094 + static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = { 3095 + .halt_reg = 0xf058, 3096 + .halt_check = BRANCH_HALT, 3097 + .clkr = { 3098 + .enable_reg = 0xf058, 3099 + .enable_mask = BIT(0), 3100 + .hw.init = &(struct clk_init_data){ 3101 + .name = "gcc_usb3_prim_phy_com_aux_clk", 3102 + .parent_data = &(const struct clk_parent_data){ 3103 + .hw = &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 3104 + }, 3105 + .num_parents = 1, 3106 + .flags = CLK_SET_RATE_PARENT, 3107 + .ops = &clk_branch2_ops, 3108 + }, 3109 + }, 3110 + }; 3111 + 3112 + static struct clk_branch gcc_usb3_prim_phy_pipe_clk = { 3113 + .halt_reg = 0xf05c, 3114 + .halt_check = BRANCH_HALT_DELAY, 3115 + .clkr = { 3116 + .enable_reg = 0xf05c, 3117 + .enable_mask = BIT(0), 3118 + .hw.init = &(struct clk_init_data){ 3119 + .name = "gcc_usb3_prim_phy_pipe_clk", 3120 + .ops = &clk_branch2_ops, 3121 + }, 3122 + }, 3123 + }; 3124 + 3125 + static struct clk_branch gcc_usb3_sec_clkref_en = { 3126 + .halt_reg = 0x8c010, 3127 + .halt_check = BRANCH_HALT, 3128 + .clkr = { 3129 + .enable_reg = 0x8c010, 3130 + .enable_mask = BIT(0), 3131 + .hw.init = &(struct clk_init_data){ 3132 + .name = "gcc_usb3_sec_clkref_en", 3133 + .ops = &clk_branch2_ops, 3134 + }, 3135 + }, 3136 + }; 3137 + 3138 + static struct clk_branch gcc_usb3_sec_phy_aux_clk = { 3139 + .halt_reg = 0x10054, 3140 + .halt_check = BRANCH_HALT, 3141 + .clkr = { 3142 + .enable_reg = 0x10054, 3143 + .enable_mask = BIT(0), 3144 + .hw.init = &(struct clk_init_data){ 3145 + .name = "gcc_usb3_sec_phy_aux_clk", 3146 + .parent_data = &(const struct clk_parent_data){ 3147 + .hw = &gcc_usb3_sec_phy_aux_clk_src.clkr.hw, 3148 + }, 3149 + .num_parents = 1, 3150 + .flags = CLK_SET_RATE_PARENT, 3151 + .ops = &clk_branch2_ops, 3152 + }, 3153 + }, 3154 + }; 3155 + 3156 + static struct clk_branch gcc_usb3_sec_phy_com_aux_clk = { 3157 + .halt_reg = 0x10058, 3158 + .halt_check = BRANCH_HALT, 3159 + .clkr = { 3160 + .enable_reg = 0x10058, 3161 + .enable_mask = BIT(0), 3162 + .hw.init = &(struct clk_init_data){ 3163 + .name = "gcc_usb3_sec_phy_com_aux_clk", 3164 + .parent_data = &(const struct clk_parent_data){ 3165 + .hw = &gcc_usb3_sec_phy_aux_clk_src.clkr.hw, 3166 + }, 3167 + .num_parents = 1, 3168 + .flags = CLK_SET_RATE_PARENT, 3169 + .ops = &clk_branch2_ops, 3170 + }, 3171 + }, 3172 + }; 3173 + 3174 + static struct clk_branch gcc_usb3_sec_phy_pipe_clk = { 3175 + .halt_reg = 0x1005c, 3176 + .halt_check = BRANCH_HALT_DELAY, 3177 + .clkr = { 3178 + .enable_reg = 0x1005c, 3179 + .enable_mask = BIT(0), 3180 + .hw.init = &(struct clk_init_data){ 3181 + .name = "gcc_usb3_sec_phy_pipe_clk", 3182 + .ops = &clk_branch2_ops, 3183 + }, 3184 + }, 3185 + }; 3186 + 3187 + static struct clk_branch gcc_video_axi0_clk = { 3188 + .halt_reg = 0xb024, 3189 + .halt_check = BRANCH_HALT_VOTED, 3190 + .clkr = { 3191 + .enable_reg = 0xb024, 3192 + .enable_mask = BIT(0), 3193 + .hw.init = &(struct clk_init_data){ 3194 + .name = "gcc_video_axi0_clk", 3195 + .ops = &clk_branch2_ops, 3196 + }, 3197 + }, 3198 + }; 3199 + 3200 + static struct clk_branch gcc_video_axi1_clk = { 3201 + .halt_reg = 0xb028, 3202 + .halt_check = BRANCH_HALT_VOTED, 3203 + .clkr = { 3204 + .enable_reg = 0xb028, 3205 + .enable_mask = BIT(0), 3206 + .hw.init = &(struct clk_init_data){ 3207 + .name = "gcc_video_axi1_clk", 3208 + .ops = &clk_branch2_ops, 3209 + }, 3210 + }, 3211 + }; 3212 + 3213 + static struct clk_branch gcc_video_xo_clk = { 3214 + .halt_reg = 0xb03c, 3215 + .halt_check = BRANCH_HALT, 3216 + .clkr = { 3217 + .enable_reg = 0xb03c, 3218 + .enable_mask = BIT(0), 3219 + .hw.init = &(struct clk_init_data){ 3220 + .name = "gcc_video_xo_clk", 3221 + .ops = &clk_branch2_ops, 3222 + }, 3223 + }, 3224 + }; 3225 + 3226 + static struct gdsc pcie_0_gdsc = { 3227 + .gdscr = 0x6b004, 3228 + .pd = { 3229 + .name = "pcie_0_gdsc", 3230 + }, 3231 + .pwrsts = PWRSTS_OFF_ON, 3232 + }; 3233 + 3234 + static struct gdsc pcie_1_gdsc = { 3235 + .gdscr = 0x8d004, 3236 + .pd = { 3237 + .name = "pcie_1_gdsc", 3238 + }, 3239 + .pwrsts = PWRSTS_OFF_ON, 3240 + }; 3241 + 3242 + static struct gdsc pcie_2_gdsc = { 3243 + .gdscr = 0x6004, 3244 + .pd = { 3245 + .name = "pcie_2_gdsc", 3246 + }, 3247 + .pwrsts = PWRSTS_OFF_ON, 3248 + }; 3249 + 3250 + static struct gdsc ufs_card_gdsc = { 3251 + .gdscr = 0x75004, 3252 + .pd = { 3253 + .name = "ufs_card_gdsc", 3254 + }, 3255 + .pwrsts = PWRSTS_OFF_ON, 3256 + }; 3257 + 3258 + static struct gdsc ufs_phy_gdsc = { 3259 + .gdscr = 0x77004, 3260 + .pd = { 3261 + .name = "ufs_phy_gdsc", 3262 + }, 3263 + .pwrsts = PWRSTS_OFF_ON, 3264 + }; 3265 + 3266 + static struct gdsc usb30_prim_gdsc = { 3267 + .gdscr = 0xf004, 3268 + .pd = { 3269 + .name = "usb30_prim_gdsc", 3270 + }, 3271 + .pwrsts = PWRSTS_OFF_ON, 3272 + }; 3273 + 3274 + static struct gdsc usb30_sec_gdsc = { 3275 + .gdscr = 0x10004, 3276 + .pd = { 3277 + .name = "usb30_sec_gdsc", 3278 + }, 3279 + .pwrsts = PWRSTS_OFF_ON, 3280 + }; 3281 + 3282 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = { 3283 + .gdscr = 0x7d050, 3284 + .pd = { 3285 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc", 3286 + }, 3287 + .pwrsts = PWRSTS_OFF_ON, 3288 + .flags = VOTABLE, 3289 + }; 3290 + 3291 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = { 3292 + .gdscr = 0x7d058, 3293 + .pd = { 3294 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc", 3295 + }, 3296 + .pwrsts = PWRSTS_OFF_ON, 3297 + .flags = VOTABLE, 3298 + }; 3299 + 3300 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf0_gdsc = { 3301 + .gdscr = 0x7d054, 3302 + .pd = { 3303 + .name = "hlos1_vote_mmnoc_mmu_tbu_sf0_gdsc", 3304 + }, 3305 + .pwrsts = PWRSTS_OFF_ON, 3306 + .flags = VOTABLE, 3307 + }; 3308 + 3309 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf1_gdsc = { 3310 + .gdscr = 0x7d06c, 3311 + .pd = { 3312 + .name = "hlos1_vote_mmnoc_mmu_tbu_sf1_gdsc", 3313 + }, 3314 + .pwrsts = PWRSTS_OFF_ON, 3315 + .flags = VOTABLE, 3316 + }; 3317 + 3318 + static struct clk_regmap *gcc_sm8250_clocks[] = { 3319 + [GCC_AGGRE_NOC_PCIE_TBU_CLK] = &gcc_aggre_noc_pcie_tbu_clk.clkr, 3320 + [GCC_AGGRE_UFS_CARD_AXI_CLK] = &gcc_aggre_ufs_card_axi_clk.clkr, 3321 + [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr, 3322 + [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr, 3323 + [GCC_AGGRE_USB3_SEC_AXI_CLK] = &gcc_aggre_usb3_sec_axi_clk.clkr, 3324 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 3325 + [GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr, 3326 + [GCC_CAMERA_SF_AXI_CLK] = &gcc_camera_sf_axi_clk.clkr, 3327 + [GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr, 3328 + [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr, 3329 + [GCC_CFG_NOC_USB3_SEC_AXI_CLK] = &gcc_cfg_noc_usb3_sec_axi_clk.clkr, 3330 + [GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr, 3331 + [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr, 3332 + [GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.clkr, 3333 + [GCC_CPUSS_RBCPR_CLK] = &gcc_cpuss_rbcpr_clk.clkr, 3334 + [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr, 3335 + [GCC_DDRSS_PCIE_SF_TBU_CLK] = &gcc_ddrss_pcie_sf_tbu_clk.clkr, 3336 + [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr, 3337 + [GCC_DISP_SF_AXI_CLK] = &gcc_disp_sf_axi_clk.clkr, 3338 + [GCC_DISP_XO_CLK] = &gcc_disp_xo_clk.clkr, 3339 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 3340 + [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr, 3341 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 3342 + [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr, 3343 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 3344 + [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, 3345 + [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, 3346 + [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, 3347 + [GCC_GPU_IREF_EN] = &gcc_gpu_iref_en.clkr, 3348 + [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr, 3349 + [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, 3350 + [GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr, 3351 + [GCC_NPU_BWMON_AXI_CLK] = &gcc_npu_bwmon_axi_clk.clkr, 3352 + [GCC_NPU_BWMON_CFG_AHB_CLK] = &gcc_npu_bwmon_cfg_ahb_clk.clkr, 3353 + [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr, 3354 + [GCC_NPU_DMA_CLK] = &gcc_npu_dma_clk.clkr, 3355 + [GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr, 3356 + [GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr, 3357 + [GCC_PCIE0_PHY_REFGEN_CLK] = &gcc_pcie0_phy_refgen_clk.clkr, 3358 + [GCC_PCIE1_PHY_REFGEN_CLK] = &gcc_pcie1_phy_refgen_clk.clkr, 3359 + [GCC_PCIE2_PHY_REFGEN_CLK] = &gcc_pcie2_phy_refgen_clk.clkr, 3360 + [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr, 3361 + [GCC_PCIE_0_AUX_CLK_SRC] = &gcc_pcie_0_aux_clk_src.clkr, 3362 + [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr, 3363 + [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr, 3364 + [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr, 3365 + [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr, 3366 + [GCC_PCIE_0_SLV_Q2A_AXI_CLK] = &gcc_pcie_0_slv_q2a_axi_clk.clkr, 3367 + [GCC_PCIE_1_AUX_CLK] = &gcc_pcie_1_aux_clk.clkr, 3368 + [GCC_PCIE_1_AUX_CLK_SRC] = &gcc_pcie_1_aux_clk_src.clkr, 3369 + [GCC_PCIE_1_CFG_AHB_CLK] = &gcc_pcie_1_cfg_ahb_clk.clkr, 3370 + [GCC_PCIE_1_MSTR_AXI_CLK] = &gcc_pcie_1_mstr_axi_clk.clkr, 3371 + [GCC_PCIE_1_PIPE_CLK] = &gcc_pcie_1_pipe_clk.clkr, 3372 + [GCC_PCIE_1_SLV_AXI_CLK] = &gcc_pcie_1_slv_axi_clk.clkr, 3373 + [GCC_PCIE_1_SLV_Q2A_AXI_CLK] = &gcc_pcie_1_slv_q2a_axi_clk.clkr, 3374 + [GCC_PCIE_2_AUX_CLK] = &gcc_pcie_2_aux_clk.clkr, 3375 + [GCC_PCIE_2_AUX_CLK_SRC] = &gcc_pcie_2_aux_clk_src.clkr, 3376 + [GCC_PCIE_2_CFG_AHB_CLK] = &gcc_pcie_2_cfg_ahb_clk.clkr, 3377 + [GCC_PCIE_2_MSTR_AXI_CLK] = &gcc_pcie_2_mstr_axi_clk.clkr, 3378 + [GCC_PCIE_2_PIPE_CLK] = &gcc_pcie_2_pipe_clk.clkr, 3379 + [GCC_PCIE_2_SLV_AXI_CLK] = &gcc_pcie_2_slv_axi_clk.clkr, 3380 + [GCC_PCIE_2_SLV_Q2A_AXI_CLK] = &gcc_pcie_2_slv_q2a_axi_clk.clkr, 3381 + [GCC_PCIE_MDM_CLKREF_EN] = &gcc_pcie_mdm_clkref_en.clkr, 3382 + [GCC_PCIE_PHY_AUX_CLK] = &gcc_pcie_phy_aux_clk.clkr, 3383 + [GCC_PCIE_PHY_REFGEN_CLK_SRC] = &gcc_pcie_phy_refgen_clk_src.clkr, 3384 + [GCC_PCIE_WIFI_CLKREF_EN] = &gcc_pcie_wifi_clkref_en.clkr, 3385 + [GCC_PCIE_WIGIG_CLKREF_EN] = &gcc_pcie_wigig_clkref_en.clkr, 3386 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 3387 + [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr, 3388 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 3389 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 3390 + [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, 3391 + [GCC_QMIP_CAMERA_NRT_AHB_CLK] = &gcc_qmip_camera_nrt_ahb_clk.clkr, 3392 + [GCC_QMIP_CAMERA_RT_AHB_CLK] = &gcc_qmip_camera_rt_ahb_clk.clkr, 3393 + [GCC_QMIP_DISP_AHB_CLK] = &gcc_qmip_disp_ahb_clk.clkr, 3394 + [GCC_QMIP_VIDEO_CVP_AHB_CLK] = &gcc_qmip_video_cvp_ahb_clk.clkr, 3395 + [GCC_QMIP_VIDEO_VCODEC_AHB_CLK] = &gcc_qmip_video_vcodec_ahb_clk.clkr, 3396 + [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr, 3397 + [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr, 3398 + [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr, 3399 + [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr, 3400 + [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr, 3401 + [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr, 3402 + [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr, 3403 + [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr, 3404 + [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr, 3405 + [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr, 3406 + [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr, 3407 + [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr, 3408 + [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr, 3409 + [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr, 3410 + [GCC_QUPV3_WRAP0_S6_CLK] = &gcc_qupv3_wrap0_s6_clk.clkr, 3411 + [GCC_QUPV3_WRAP0_S6_CLK_SRC] = &gcc_qupv3_wrap0_s6_clk_src.clkr, 3412 + [GCC_QUPV3_WRAP0_S7_CLK] = &gcc_qupv3_wrap0_s7_clk.clkr, 3413 + [GCC_QUPV3_WRAP0_S7_CLK_SRC] = &gcc_qupv3_wrap0_s7_clk_src.clkr, 3414 + [GCC_QUPV3_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr, 3415 + [GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr, 3416 + [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr, 3417 + [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr, 3418 + [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr, 3419 + [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr, 3420 + [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr, 3421 + [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr, 3422 + [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr, 3423 + [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr, 3424 + [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr, 3425 + [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr, 3426 + [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr, 3427 + [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr, 3428 + [GCC_QUPV3_WRAP2_CORE_2X_CLK] = &gcc_qupv3_wrap2_core_2x_clk.clkr, 3429 + [GCC_QUPV3_WRAP2_CORE_CLK] = &gcc_qupv3_wrap2_core_clk.clkr, 3430 + [GCC_QUPV3_WRAP2_S0_CLK] = &gcc_qupv3_wrap2_s0_clk.clkr, 3431 + [GCC_QUPV3_WRAP2_S0_CLK_SRC] = &gcc_qupv3_wrap2_s0_clk_src.clkr, 3432 + [GCC_QUPV3_WRAP2_S1_CLK] = &gcc_qupv3_wrap2_s1_clk.clkr, 3433 + [GCC_QUPV3_WRAP2_S1_CLK_SRC] = &gcc_qupv3_wrap2_s1_clk_src.clkr, 3434 + [GCC_QUPV3_WRAP2_S2_CLK] = &gcc_qupv3_wrap2_s2_clk.clkr, 3435 + [GCC_QUPV3_WRAP2_S2_CLK_SRC] = &gcc_qupv3_wrap2_s2_clk_src.clkr, 3436 + [GCC_QUPV3_WRAP2_S3_CLK] = &gcc_qupv3_wrap2_s3_clk.clkr, 3437 + [GCC_QUPV3_WRAP2_S3_CLK_SRC] = &gcc_qupv3_wrap2_s3_clk_src.clkr, 3438 + [GCC_QUPV3_WRAP2_S4_CLK] = &gcc_qupv3_wrap2_s4_clk.clkr, 3439 + [GCC_QUPV3_WRAP2_S4_CLK_SRC] = &gcc_qupv3_wrap2_s4_clk_src.clkr, 3440 + [GCC_QUPV3_WRAP2_S5_CLK] = &gcc_qupv3_wrap2_s5_clk.clkr, 3441 + [GCC_QUPV3_WRAP2_S5_CLK_SRC] = &gcc_qupv3_wrap2_s5_clk_src.clkr, 3442 + [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr, 3443 + [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr, 3444 + [GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr, 3445 + [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr, 3446 + [GCC_QUPV3_WRAP_2_M_AHB_CLK] = &gcc_qupv3_wrap_2_m_ahb_clk.clkr, 3447 + [GCC_QUPV3_WRAP_2_S_AHB_CLK] = &gcc_qupv3_wrap_2_s_ahb_clk.clkr, 3448 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 3449 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 3450 + [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr, 3451 + [GCC_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr, 3452 + [GCC_SDCC4_APPS_CLK] = &gcc_sdcc4_apps_clk.clkr, 3453 + [GCC_SDCC4_APPS_CLK_SRC] = &gcc_sdcc4_apps_clk_src.clkr, 3454 + [GCC_TSIF_AHB_CLK] = &gcc_tsif_ahb_clk.clkr, 3455 + [GCC_TSIF_INACTIVITY_TIMERS_CLK] = &gcc_tsif_inactivity_timers_clk.clkr, 3456 + [GCC_TSIF_REF_CLK] = &gcc_tsif_ref_clk.clkr, 3457 + [GCC_TSIF_REF_CLK_SRC] = &gcc_tsif_ref_clk_src.clkr, 3458 + [GCC_UFS_1X_CLKREF_EN] = &gcc_ufs_1x_clkref_en.clkr, 3459 + [GCC_UFS_CARD_AHB_CLK] = &gcc_ufs_card_ahb_clk.clkr, 3460 + [GCC_UFS_CARD_AXI_CLK] = &gcc_ufs_card_axi_clk.clkr, 3461 + [GCC_UFS_CARD_AXI_CLK_SRC] = &gcc_ufs_card_axi_clk_src.clkr, 3462 + [GCC_UFS_CARD_ICE_CORE_CLK] = &gcc_ufs_card_ice_core_clk.clkr, 3463 + [GCC_UFS_CARD_ICE_CORE_CLK_SRC] = &gcc_ufs_card_ice_core_clk_src.clkr, 3464 + [GCC_UFS_CARD_PHY_AUX_CLK] = &gcc_ufs_card_phy_aux_clk.clkr, 3465 + [GCC_UFS_CARD_PHY_AUX_CLK_SRC] = &gcc_ufs_card_phy_aux_clk_src.clkr, 3466 + [GCC_UFS_CARD_RX_SYMBOL_0_CLK] = &gcc_ufs_card_rx_symbol_0_clk.clkr, 3467 + [GCC_UFS_CARD_RX_SYMBOL_1_CLK] = &gcc_ufs_card_rx_symbol_1_clk.clkr, 3468 + [GCC_UFS_CARD_TX_SYMBOL_0_CLK] = &gcc_ufs_card_tx_symbol_0_clk.clkr, 3469 + [GCC_UFS_CARD_UNIPRO_CORE_CLK] = &gcc_ufs_card_unipro_core_clk.clkr, 3470 + [GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC] = 3471 + &gcc_ufs_card_unipro_core_clk_src.clkr, 3472 + [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr, 3473 + [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr, 3474 + [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr, 3475 + [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr, 3476 + [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr, 3477 + [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, 3478 + [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, 3479 + [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, 3480 + [GCC_UFS_PHY_RX_SYMBOL_1_CLK] = &gcc_ufs_phy_rx_symbol_1_clk.clkr, 3481 + [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, 3482 + [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, 3483 + [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] = 3484 + &gcc_ufs_phy_unipro_core_clk_src.clkr, 3485 + [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr, 3486 + [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr, 3487 + [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr, 3488 + [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] = 3489 + &gcc_usb30_prim_mock_utmi_clk_src.clkr, 3490 + [GCC_USB30_PRIM_MOCK_UTMI_POSTDIV_CLK_SRC] = 3491 + &gcc_usb30_prim_mock_utmi_postdiv_clk_src.clkr, 3492 + [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr, 3493 + [GCC_USB30_SEC_MASTER_CLK] = &gcc_usb30_sec_master_clk.clkr, 3494 + [GCC_USB30_SEC_MASTER_CLK_SRC] = &gcc_usb30_sec_master_clk_src.clkr, 3495 + [GCC_USB30_SEC_MOCK_UTMI_CLK] = &gcc_usb30_sec_mock_utmi_clk.clkr, 3496 + [GCC_USB30_SEC_MOCK_UTMI_CLK_SRC] = 3497 + &gcc_usb30_sec_mock_utmi_clk_src.clkr, 3498 + [GCC_USB30_SEC_MOCK_UTMI_POSTDIV_CLK_SRC] = 3499 + &gcc_usb30_sec_mock_utmi_postdiv_clk_src.clkr, 3500 + [GCC_USB30_SEC_SLEEP_CLK] = &gcc_usb30_sec_sleep_clk.clkr, 3501 + [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr, 3502 + [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr, 3503 + [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr, 3504 + [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr, 3505 + [GCC_USB3_SEC_CLKREF_EN] = &gcc_usb3_sec_clkref_en.clkr, 3506 + [GCC_USB3_SEC_PHY_AUX_CLK] = &gcc_usb3_sec_phy_aux_clk.clkr, 3507 + [GCC_USB3_SEC_PHY_AUX_CLK_SRC] = &gcc_usb3_sec_phy_aux_clk_src.clkr, 3508 + [GCC_USB3_SEC_PHY_COM_AUX_CLK] = &gcc_usb3_sec_phy_com_aux_clk.clkr, 3509 + [GCC_USB3_SEC_PHY_PIPE_CLK] = &gcc_usb3_sec_phy_pipe_clk.clkr, 3510 + [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr, 3511 + [GCC_VIDEO_AXI1_CLK] = &gcc_video_axi1_clk.clkr, 3512 + [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr, 3513 + [GPLL0] = &gpll0.clkr, 3514 + [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr, 3515 + [GPLL4] = &gpll4.clkr, 3516 + [GPLL9] = &gpll9.clkr, 3517 + }; 3518 + 3519 + static struct gdsc *gcc_sm8250_gdscs[] = { 3520 + [PCIE_0_GDSC] = &pcie_0_gdsc, 3521 + [PCIE_1_GDSC] = &pcie_1_gdsc, 3522 + [PCIE_2_GDSC] = &pcie_2_gdsc, 3523 + [UFS_CARD_GDSC] = &ufs_card_gdsc, 3524 + [UFS_PHY_GDSC] = &ufs_phy_gdsc, 3525 + [USB30_PRIM_GDSC] = &usb30_prim_gdsc, 3526 + [USB30_SEC_GDSC] = &usb30_sec_gdsc, 3527 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] = 3528 + &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc, 3529 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC] = 3530 + &hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc, 3531 + [HLOS1_VOTE_MMNOC_MMU_TBU_SF0_GDSC] = 3532 + &hlos1_vote_mmnoc_mmu_tbu_sf0_gdsc, 3533 + [HLOS1_VOTE_MMNOC_MMU_TBU_SF1_GDSC] = 3534 + &hlos1_vote_mmnoc_mmu_tbu_sf1_gdsc, 3535 + }; 3536 + 3537 + static const struct qcom_reset_map gcc_sm8250_resets[] = { 3538 + [GCC_GPU_BCR] = { 0x71000 }, 3539 + [GCC_MMSS_BCR] = { 0xb000 }, 3540 + [GCC_NPU_BWMON_BCR] = { 0x73000 }, 3541 + [GCC_NPU_BCR] = { 0x4d000 }, 3542 + [GCC_PCIE_0_BCR] = { 0x6b000 }, 3543 + [GCC_PCIE_0_LINK_DOWN_BCR] = { 0x6c014 }, 3544 + [GCC_PCIE_0_NOCSR_COM_PHY_BCR] = { 0x6c020 }, 3545 + [GCC_PCIE_0_PHY_BCR] = { 0x6c01c }, 3546 + [GCC_PCIE_0_PHY_NOCSR_COM_PHY_BCR] = { 0x6c028 }, 3547 + [GCC_PCIE_1_BCR] = { 0x8d000 }, 3548 + [GCC_PCIE_1_LINK_DOWN_BCR] = { 0x8e014 }, 3549 + [GCC_PCIE_1_NOCSR_COM_PHY_BCR] = { 0x8e020 }, 3550 + [GCC_PCIE_1_PHY_BCR] = { 0x8e01c }, 3551 + [GCC_PCIE_1_PHY_NOCSR_COM_PHY_BCR] = { 0x8e000 }, 3552 + [GCC_PCIE_2_BCR] = { 0x6000 }, 3553 + [GCC_PCIE_2_LINK_DOWN_BCR] = { 0x1f014 }, 3554 + [GCC_PCIE_2_NOCSR_COM_PHY_BCR] = { 0x1f020 }, 3555 + [GCC_PCIE_2_PHY_BCR] = { 0x1f01c }, 3556 + [GCC_PCIE_2_PHY_NOCSR_COM_PHY_BCR] = { 0x1f028 }, 3557 + [GCC_PCIE_PHY_BCR] = { 0x6f000 }, 3558 + [GCC_PCIE_PHY_CFG_AHB_BCR] = { 0x6f00c }, 3559 + [GCC_PCIE_PHY_COM_BCR] = { 0x6f010 }, 3560 + [GCC_PDM_BCR] = { 0x33000 }, 3561 + [GCC_PRNG_BCR] = { 0x34000 }, 3562 + [GCC_QUPV3_WRAPPER_0_BCR] = { 0x17000 }, 3563 + [GCC_QUPV3_WRAPPER_1_BCR] = { 0x18000 }, 3564 + [GCC_QUPV3_WRAPPER_2_BCR] = { 0x1e000 }, 3565 + [GCC_QUSB2PHY_PRIM_BCR] = { 0x12000 }, 3566 + [GCC_QUSB2PHY_SEC_BCR] = { 0x12004 }, 3567 + [GCC_SDCC2_BCR] = { 0x14000 }, 3568 + [GCC_SDCC4_BCR] = { 0x16000 }, 3569 + [GCC_TSIF_BCR] = { 0x36000 }, 3570 + [GCC_UFS_CARD_BCR] = { 0x75000 }, 3571 + [GCC_UFS_PHY_BCR] = { 0x77000 }, 3572 + [GCC_USB30_PRIM_BCR] = { 0xf000 }, 3573 + [GCC_USB30_SEC_BCR] = { 0x10000 }, 3574 + [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 }, 3575 + [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 }, 3576 + [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 }, 3577 + [GCC_USB3_PHY_SEC_BCR] = { 0x5000c }, 3578 + [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, 3579 + [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, 3580 + [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, 3581 + [GCC_VIDEO_AXI0_CLK_ARES] = { 0xb024, 2 }, 3582 + [GCC_VIDEO_AXI1_CLK_ARES] = { 0xb028, 2 }, 3583 + }; 3584 + 3585 + static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 3586 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src), 3587 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src), 3588 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src), 3589 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src), 3590 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src), 3591 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src), 3592 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s6_clk_src), 3593 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s7_clk_src), 3594 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src), 3595 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src), 3596 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src), 3597 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src), 3598 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src), 3599 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src), 3600 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s0_clk_src), 3601 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s1_clk_src), 3602 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s2_clk_src), 3603 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s3_clk_src), 3604 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s4_clk_src), 3605 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s5_clk_src), 3606 + }; 3607 + 3608 + static const struct regmap_config gcc_sm8250_regmap_config = { 3609 + .reg_bits = 32, 3610 + .reg_stride = 4, 3611 + .val_bits = 32, 3612 + .max_register = 0x9c100, 3613 + .fast_io = true, 3614 + }; 3615 + 3616 + static const struct qcom_cc_desc gcc_sm8250_desc = { 3617 + .config = &gcc_sm8250_regmap_config, 3618 + .clks = gcc_sm8250_clocks, 3619 + .num_clks = ARRAY_SIZE(gcc_sm8250_clocks), 3620 + .resets = gcc_sm8250_resets, 3621 + .num_resets = ARRAY_SIZE(gcc_sm8250_resets), 3622 + .gdscs = gcc_sm8250_gdscs, 3623 + .num_gdscs = ARRAY_SIZE(gcc_sm8250_gdscs), 3624 + }; 3625 + 3626 + static const struct of_device_id gcc_sm8250_match_table[] = { 3627 + { .compatible = "qcom,gcc-sm8250" }, 3628 + { } 3629 + }; 3630 + MODULE_DEVICE_TABLE(of, gcc_sm8250_match_table); 3631 + 3632 + static int gcc_sm8250_probe(struct platform_device *pdev) 3633 + { 3634 + struct regmap *regmap; 3635 + int ret; 3636 + 3637 + regmap = qcom_cc_map(pdev, &gcc_sm8250_desc); 3638 + if (IS_ERR(regmap)) 3639 + return PTR_ERR(regmap); 3640 + 3641 + /* 3642 + * Disable the GPLL0 active input to NPU and GPU 3643 + * via MISC registers. 3644 + */ 3645 + regmap_update_bits(regmap, 0x4d110, 0x3, 0x3); 3646 + regmap_update_bits(regmap, 0x71028, 0x3, 0x3); 3647 + 3648 + /* 3649 + * Keep the clocks always-ON 3650 + * GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, GCC_DISP_AHB_CLK, 3651 + * GCC_CPUSS_DVM_BUS_CLK, GCC_GPU_CFG_AHB_CLK, 3652 + * GCC_SYS_NOC_CPUSS_AHB_CLK 3653 + */ 3654 + regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0)); 3655 + regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0)); 3656 + regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0)); 3657 + regmap_update_bits(regmap, 0x4818c, BIT(0), BIT(0)); 3658 + regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0)); 3659 + regmap_update_bits(regmap, 0x52000, BIT(0), BIT(0)); 3660 + 3661 + ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, 3662 + ARRAY_SIZE(gcc_dfs_clocks)); 3663 + if (ret) 3664 + return ret; 3665 + 3666 + return qcom_cc_really_probe(pdev, &gcc_sm8250_desc, regmap); 3667 + } 3668 + 3669 + static struct platform_driver gcc_sm8250_driver = { 3670 + .probe = gcc_sm8250_probe, 3671 + .driver = { 3672 + .name = "gcc-sm8250", 3673 + .of_match_table = gcc_sm8250_match_table, 3674 + }, 3675 + }; 3676 + 3677 + static int __init gcc_sm8250_init(void) 3678 + { 3679 + return platform_driver_register(&gcc_sm8250_driver); 3680 + } 3681 + subsys_initcall(gcc_sm8250_init); 3682 + 3683 + static void __exit gcc_sm8250_exit(void) 3684 + { 3685 + platform_driver_unregister(&gcc_sm8250_driver); 3686 + } 3687 + module_exit(gcc_sm8250_exit); 3688 + 3689 + MODULE_DESCRIPTION("QTI GCC SM8250 Driver"); 3690 + MODULE_LICENSE("GPL v2");
+37
drivers/clk/qcom/gpucc-sc7180.c
··· 170 170 .flags = VOTABLE, 171 171 }; 172 172 173 + /* 174 + * On SC7180 the GPU GX domain is *almost* entirely controlled by the GMU 175 + * running in the CX domain so the CPU doesn't need to know anything about the 176 + * GX domain EXCEPT.... 177 + * 178 + * Hardware constraints dictate that the GX be powered down before the CX. If 179 + * the GMU crashes it could leave the GX on. In order to successfully bring back 180 + * the device the CPU needs to disable the GX headswitch. There being no sane 181 + * way to reach in and touch that register from deep inside the GPU driver we 182 + * need to set up the infrastructure to be able to ensure that the GPU can 183 + * ensure that the GX is off during this super special case. We do this by 184 + * defining a GX gdsc with a dummy enable function and a "default" disable 185 + * function. 186 + * 187 + * This allows us to attach with genpd_dev_pm_attach_by_name() in the GPU 188 + * driver. During power up, nothing will happen from the CPU (and the GMU will 189 + * power up normally but during power down this will ensure that the GX domain 190 + * is *really* off - this gives us a semi standard way of doing what we need. 191 + */ 192 + static int gx_gdsc_enable(struct generic_pm_domain *domain) 193 + { 194 + /* Do nothing but give genpd the impression that we were successful */ 195 + return 0; 196 + } 197 + 198 + static struct gdsc gx_gdsc = { 199 + .gdscr = 0x100c, 200 + .clamp_io_ctrl = 0x1508, 201 + .pd = { 202 + .name = "gx_gdsc", 203 + .power_on = gx_gdsc_enable, 204 + }, 205 + .pwrsts = PWRSTS_OFF_ON, 206 + .flags = CLAMP_IO, 207 + }; 208 + 173 209 static struct gdsc *gpu_cc_sc7180_gdscs[] = { 174 210 [CX_GDSC] = &cx_gdsc, 211 + [GX_GDSC] = &gx_gdsc, 175 212 }; 176 213 177 214 static struct clk_regmap *gpu_cc_sc7180_clocks[] = {
+143
drivers/clk/qcom/mss-sc7180.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2020, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/platform_device.h> 8 + #include <linux/module.h> 9 + #include <linux/pm_clock.h> 10 + #include <linux/pm_runtime.h> 11 + #include <linux/regmap.h> 12 + 13 + #include <dt-bindings/clock/qcom,mss-sc7180.h> 14 + 15 + #include "clk-regmap.h" 16 + #include "clk-branch.h" 17 + #include "common.h" 18 + 19 + static struct clk_branch mss_axi_nav_clk = { 20 + .halt_reg = 0x20bc, 21 + .halt_check = BRANCH_HALT, 22 + .clkr = { 23 + .enable_reg = 0x20bc, 24 + .enable_mask = BIT(0), 25 + .hw.init = &(struct clk_init_data){ 26 + .name = "mss_axi_nav_clk", 27 + .parent_data = &(const struct clk_parent_data){ 28 + .fw_name = "gcc_mss_nav_axi", 29 + }, 30 + .num_parents = 1, 31 + .ops = &clk_branch2_ops, 32 + }, 33 + }, 34 + }; 35 + 36 + static struct clk_branch mss_axi_crypto_clk = { 37 + .halt_reg = 0x20cc, 38 + .halt_check = BRANCH_HALT, 39 + .clkr = { 40 + .enable_reg = 0x20cc, 41 + .enable_mask = BIT(0), 42 + .hw.init = &(struct clk_init_data){ 43 + .name = "mss_axi_crypto_clk", 44 + .parent_data = &(const struct clk_parent_data){ 45 + .fw_name = "gcc_mss_mfab_axis", 46 + }, 47 + .num_parents = 1, 48 + .ops = &clk_branch2_ops, 49 + }, 50 + }, 51 + }; 52 + 53 + static const struct regmap_config mss_regmap_config = { 54 + .reg_bits = 32, 55 + .reg_stride = 4, 56 + .val_bits = 32, 57 + .fast_io = true, 58 + .max_register = 0x41aa0cc, 59 + }; 60 + 61 + static struct clk_regmap *mss_sc7180_clocks[] = { 62 + [MSS_AXI_CRYPTO_CLK] = &mss_axi_crypto_clk.clkr, 63 + [MSS_AXI_NAV_CLK] = &mss_axi_nav_clk.clkr, 64 + }; 65 + 66 + static const struct qcom_cc_desc mss_sc7180_desc = { 67 + .config = &mss_regmap_config, 68 + .clks = mss_sc7180_clocks, 69 + .num_clks = ARRAY_SIZE(mss_sc7180_clocks), 70 + }; 71 + 72 + static int mss_sc7180_probe(struct platform_device *pdev) 73 + { 74 + int ret; 75 + 76 + pm_runtime_enable(&pdev->dev); 77 + ret = pm_clk_create(&pdev->dev); 78 + if (ret) 79 + goto disable_pm_runtime; 80 + 81 + ret = pm_clk_add(&pdev->dev, "cfg_ahb"); 82 + if (ret < 0) { 83 + dev_err(&pdev->dev, "failed to acquire iface clock\n"); 84 + goto destroy_pm_clk; 85 + } 86 + 87 + ret = qcom_cc_probe(pdev, &mss_sc7180_desc); 88 + if (ret < 0) 89 + goto destroy_pm_clk; 90 + 91 + return 0; 92 + 93 + destroy_pm_clk: 94 + pm_clk_destroy(&pdev->dev); 95 + 96 + disable_pm_runtime: 97 + pm_runtime_disable(&pdev->dev); 98 + 99 + return ret; 100 + } 101 + 102 + static int mss_sc7180_remove(struct platform_device *pdev) 103 + { 104 + pm_clk_destroy(&pdev->dev); 105 + pm_runtime_disable(&pdev->dev); 106 + 107 + return 0; 108 + } 109 + 110 + static const struct dev_pm_ops mss_sc7180_pm_ops = { 111 + SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL) 112 + }; 113 + 114 + static const struct of_device_id mss_sc7180_match_table[] = { 115 + { .compatible = "qcom,sc7180-mss" }, 116 + { } 117 + }; 118 + MODULE_DEVICE_TABLE(of, mss_sc7180_match_table); 119 + 120 + static struct platform_driver mss_sc7180_driver = { 121 + .probe = mss_sc7180_probe, 122 + .remove = mss_sc7180_remove, 123 + .driver = { 124 + .name = "sc7180-mss", 125 + .of_match_table = mss_sc7180_match_table, 126 + .pm = &mss_sc7180_pm_ops, 127 + }, 128 + }; 129 + 130 + static int __init mss_sc7180_init(void) 131 + { 132 + return platform_driver_register(&mss_sc7180_driver); 133 + } 134 + subsys_initcall(mss_sc7180_init); 135 + 136 + static void __exit mss_sc7180_exit(void) 137 + { 138 + platform_driver_unregister(&mss_sc7180_driver); 139 + } 140 + module_exit(mss_sc7180_exit); 141 + 142 + MODULE_DESCRIPTION("QTI MSS SC7180 Driver"); 143 + MODULE_LICENSE("GPL v2");
+2 -1
drivers/clk/renesas/Kconfig
··· 20 20 select CLK_R8A7791 if ARCH_R8A7791 || ARCH_R8A7793 21 21 select CLK_R8A7792 if ARCH_R8A7792 22 22 select CLK_R8A7794 if ARCH_R8A7794 23 - select CLK_R8A7795 if ARCH_R8A77950 || ARCH_R8A77951 || ARCH_R8A7795 23 + select CLK_R8A7795 if ARCH_R8A77950 || ARCH_R8A77951 24 24 select CLK_R8A77960 if ARCH_R8A77960 25 25 select CLK_R8A77961 if ARCH_R8A77961 26 26 select CLK_R8A77965 if ARCH_R8A77965 ··· 161 161 config CLK_RCAR_USB2_CLOCK_SEL 162 162 bool "Renesas R-Car USB2 clock selector support" 163 163 depends on ARCH_RENESAS || COMPILE_TEST 164 + select RESET_CONTROLLER 164 165 help 165 166 This is a driver for R-Car USB2 clock selector 166 167
+8
drivers/clk/renesas/r8a7795-cpg-mssr.c
··· 44 44 CLK_S3, 45 45 CLK_SDSRC, 46 46 CLK_SSPSRC, 47 + CLK_RPCSRC, 47 48 CLK_RINT, 48 49 49 50 /* Module Clocks */ ··· 71 70 DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), 72 71 DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), 73 72 DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 73 + DEF_BASE(".rpcsrc", CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1), 74 + 75 + DEF_BASE("rpc", R8A7795_CLK_RPC, CLK_TYPE_GEN3_RPC, 76 + CLK_RPCSRC), 77 + DEF_BASE("rpcd2", R8A7795_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, 78 + R8A7795_CLK_RPC), 74 79 75 80 DEF_GEN3_OSC(".r", CLK_RINT, CLK_EXTAL, 32), 76 81 ··· 249 242 DEF_MOD("can-fd", 914, R8A7795_CLK_S3D2), 250 243 DEF_MOD("can-if1", 915, R8A7795_CLK_S3D4), 251 244 DEF_MOD("can-if0", 916, R8A7795_CLK_S3D4), 245 + DEF_MOD("rpc-if", 917, R8A7795_CLK_RPCD2), 252 246 DEF_MOD("i2c6", 918, R8A7795_CLK_S0D6), 253 247 DEF_MOD("i2c5", 919, R8A7795_CLK_S0D6), 254 248 DEF_MOD("i2c-dvfs", 926, R8A7795_CLK_CP),
+10
drivers/clk/renesas/r8a7796-cpg-mssr.c
··· 46 46 CLK_S3, 47 47 CLK_SDSRC, 48 48 CLK_SSPSRC, 49 + CLK_RPCSRC, 49 50 CLK_RINT, 50 51 51 52 /* Module Clocks */ ··· 73 72 DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), 74 73 DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), 75 74 DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 75 + DEF_BASE(".rpcsrc", CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1), 76 + 77 + DEF_BASE("rpc", R8A7796_CLK_RPC, CLK_TYPE_GEN3_RPC, 78 + CLK_RPCSRC), 79 + DEF_BASE("rpcd2", R8A7796_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, 80 + R8A7796_CLK_RPC), 76 81 77 82 DEF_GEN3_OSC(".r", CLK_RINT, CLK_EXTAL, 32), 78 83 ··· 112 105 DEF_GEN3_SD("sd3", R8A7796_CLK_SD3, CLK_SDSRC, 0x26c), 113 106 114 107 DEF_FIXED("cl", R8A7796_CLK_CL, CLK_PLL1_DIV2, 48, 1), 108 + DEF_FIXED("cr", R8A7796_CLK_CR, CLK_PLL1_DIV4, 2, 1), 115 109 DEF_FIXED("cp", R8A7796_CLK_CP, CLK_EXTAL, 2, 1), 116 110 DEF_FIXED("cpex", R8A7796_CLK_CPEX, CLK_EXTAL, 2, 1), 117 111 ··· 140 132 DEF_MOD("sys-dmac2", 217, R8A7796_CLK_S3D1), 141 133 DEF_MOD("sys-dmac1", 218, R8A7796_CLK_S3D1), 142 134 DEF_MOD("sys-dmac0", 219, R8A7796_CLK_S0D3), 135 + DEF_MOD("sceg-pub", 229, R8A7796_CLK_CR), 143 136 DEF_MOD("cmt3", 300, R8A7796_CLK_R), 144 137 DEF_MOD("cmt2", 301, R8A7796_CLK_R), 145 138 DEF_MOD("cmt1", 302, R8A7796_CLK_R), ··· 224 215 DEF_MOD("can-fd", 914, R8A7796_CLK_S3D2), 225 216 DEF_MOD("can-if1", 915, R8A7796_CLK_S3D4), 226 217 DEF_MOD("can-if0", 916, R8A7796_CLK_S3D4), 218 + DEF_MOD("rpc-if", 917, R8A7796_CLK_RPCD2), 227 219 DEF_MOD("i2c6", 918, R8A7796_CLK_S0D6), 228 220 DEF_MOD("i2c5", 919, R8A7796_CLK_S0D6), 229 221 DEF_MOD("i2c-dvfs", 926, R8A7796_CLK_CP),
+11 -1
drivers/clk/renesas/r8a77965-cpg-mssr.c
··· 43 43 CLK_S3, 44 44 CLK_SDSRC, 45 45 CLK_SSPSRC, 46 + CLK_RPCSRC, 46 47 CLK_RINT, 47 48 48 49 /* Module Clocks */ ··· 69 68 DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), 70 69 DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), 71 70 DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 71 + DEF_BASE(".rpcsrc", CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1), 72 + 73 + DEF_BASE("rpc", R8A77965_CLK_RPC, CLK_TYPE_GEN3_RPC, 74 + CLK_RPCSRC), 75 + DEF_BASE("rpcd2", R8A77965_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, 76 + R8A77965_CLK_RPC), 72 77 73 78 DEF_GEN3_OSC(".r", CLK_RINT, CLK_EXTAL, 32), 74 79 ··· 106 99 DEF_GEN3_SD("sd2", R8A77965_CLK_SD2, CLK_SDSRC, 0x268), 107 100 DEF_GEN3_SD("sd3", R8A77965_CLK_SD3, CLK_SDSRC, 0x26c), 108 101 109 - DEF_FIXED("cl", R8A77965_CLK_CL, CLK_PLL1_DIV2, 48, 1), 102 + DEF_FIXED("cl", R8A77965_CLK_CL, CLK_PLL1_DIV2, 48, 1), 103 + DEF_FIXED("cr", R8A77965_CLK_CR, CLK_PLL1_DIV4, 2, 1), 110 104 DEF_FIXED("cp", R8A77965_CLK_CP, CLK_EXTAL, 2, 1), 111 105 DEF_FIXED("cpex", R8A77965_CLK_CPEX, CLK_EXTAL, 2, 1), 112 106 ··· 135 127 DEF_MOD("sys-dmac2", 217, R8A77965_CLK_S3D1), 136 128 DEF_MOD("sys-dmac1", 218, R8A77965_CLK_S3D1), 137 129 DEF_MOD("sys-dmac0", 219, R8A77965_CLK_S0D3), 130 + DEF_MOD("sceg-pub", 229, R8A77965_CLK_CR), 138 131 139 132 DEF_MOD("cmt3", 300, R8A77965_CLK_R), 140 133 DEF_MOD("cmt2", 301, R8A77965_CLK_R), ··· 224 215 DEF_MOD("can-fd", 914, R8A77965_CLK_S3D2), 225 216 DEF_MOD("can-if1", 915, R8A77965_CLK_S3D4), 226 217 DEF_MOD("can-if0", 916, R8A77965_CLK_S3D4), 218 + DEF_MOD("rpc-if", 917, R8A77965_CLK_RPCD2), 227 219 DEF_MOD("i2c6", 918, R8A77965_CLK_S0D6), 228 220 DEF_MOD("i2c5", 919, R8A77965_CLK_S0D6), 229 221 DEF_MOD("i2c-dvfs", 926, R8A77965_CLK_CP),
+2
drivers/clk/renesas/r8a77990-cpg-mssr.c
··· 105 105 DEF_GEN3_SD("sd3", R8A77990_CLK_SD3, CLK_SDSRC, 0x026c), 106 106 107 107 DEF_FIXED("cl", R8A77990_CLK_CL, CLK_PLL1, 48, 1), 108 + DEF_FIXED("cr", R8A77990_CLK_CR, CLK_PLL1D2, 2, 1), 108 109 DEF_FIXED("cp", R8A77990_CLK_CP, CLK_EXTAL, 2, 1), 109 110 DEF_FIXED("cpex", R8A77990_CLK_CPEX, CLK_EXTAL, 4, 1), 110 111 ··· 136 135 DEF_MOD("sys-dmac2", 217, R8A77990_CLK_S3D1), 137 136 DEF_MOD("sys-dmac1", 218, R8A77990_CLK_S3D1), 138 137 DEF_MOD("sys-dmac0", 219, R8A77990_CLK_S3D1), 138 + DEF_MOD("sceg-pub", 229, R8A77990_CLK_CR), 139 139 140 140 DEF_MOD("cmt3", 300, R8A77990_CLK_R), 141 141 DEF_MOD("cmt2", 301, R8A77990_CLK_R),
+2
drivers/clk/renesas/r8a77995-cpg-mssr.c
··· 91 91 DEF_FIXED("s3d4", R8A77995_CLK_S3D4, CLK_S3, 4, 1), 92 92 93 93 DEF_FIXED("cl", R8A77995_CLK_CL, CLK_PLL1, 48, 1), 94 + DEF_FIXED("cr", R8A77995_CLK_CR, CLK_PLL1D2, 2, 1), 94 95 DEF_FIXED("cp", R8A77995_CLK_CP, CLK_EXTAL, 2, 1), 95 96 DEF_FIXED("cpex", R8A77995_CLK_CPEX, CLK_EXTAL, 4, 1), 96 97 ··· 123 122 DEF_MOD("sys-dmac2", 217, R8A77995_CLK_S3D1), 124 123 DEF_MOD("sys-dmac1", 218, R8A77995_CLK_S3D1), 125 124 DEF_MOD("sys-dmac0", 219, R8A77995_CLK_S3D1), 125 + DEF_MOD("sceg-pub", 229, R8A77995_CLK_CR), 126 126 DEF_MOD("cmt3", 300, R8A77995_CLK_R), 127 127 DEF_MOD("cmt2", 301, R8A77995_CLK_R), 128 128 DEF_MOD("cmt1", 302, R8A77995_CLK_R),
+38 -2
drivers/clk/renesas/rcar-usb2-clock-sel.c
··· 19 19 #include <linux/platform_device.h> 20 20 #include <linux/pm.h> 21 21 #include <linux/pm_runtime.h> 22 + #include <linux/reset.h> 22 23 #include <linux/slab.h> 23 24 24 25 #define USB20_CLKSET0 0x00 ··· 27 26 #define CLKSET0_PRIVATE BIT(0) 28 27 #define CLKSET0_EXTAL_ONLY (CLKSET0_INTCLK_EN | CLKSET0_PRIVATE) 29 28 29 + static const struct clk_bulk_data rcar_usb2_clocks[] = { 30 + { .id = "ehci_ohci", }, 31 + { .id = "hs-usb-if", }, 32 + }; 33 + 30 34 struct usb2_clock_sel_priv { 31 35 void __iomem *base; 32 36 struct clk_hw hw; 37 + struct clk_bulk_data clks[ARRAY_SIZE(rcar_usb2_clocks)]; 38 + struct reset_control *rsts; 33 39 bool extal; 34 40 bool xtal; 35 41 }; ··· 61 53 62 54 static int usb2_clock_sel_enable(struct clk_hw *hw) 63 55 { 64 - usb2_clock_sel_enable_extal_only(to_priv(hw)); 56 + struct usb2_clock_sel_priv *priv = to_priv(hw); 57 + int ret; 58 + 59 + ret = reset_control_deassert(priv->rsts); 60 + if (ret) 61 + return ret; 62 + 63 + ret = clk_bulk_prepare_enable(ARRAY_SIZE(priv->clks), priv->clks); 64 + if (ret) { 65 + reset_control_assert(priv->rsts); 66 + return ret; 67 + } 68 + 69 + usb2_clock_sel_enable_extal_only(priv); 65 70 66 71 return 0; 67 72 } 68 73 69 74 static void usb2_clock_sel_disable(struct clk_hw *hw) 70 75 { 71 - usb2_clock_sel_disable_extal_only(to_priv(hw)); 76 + struct usb2_clock_sel_priv *priv = to_priv(hw); 77 + 78 + usb2_clock_sel_disable_extal_only(priv); 79 + 80 + clk_bulk_disable_unprepare(ARRAY_SIZE(priv->clks), priv->clks); 81 + reset_control_assert(priv->rsts); 72 82 } 73 83 74 84 /* ··· 145 119 struct usb2_clock_sel_priv *priv; 146 120 struct clk *clk; 147 121 struct clk_init_data init; 122 + int ret; 148 123 149 124 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 150 125 if (!priv) ··· 154 127 priv->base = devm_platform_ioremap_resource(pdev, 0); 155 128 if (IS_ERR(priv->base)) 156 129 return PTR_ERR(priv->base); 130 + 131 + memcpy(priv->clks, rcar_usb2_clocks, sizeof(priv->clks)); 132 + ret = devm_clk_bulk_get(dev, ARRAY_SIZE(priv->clks), priv->clks); 133 + if (ret < 0) 134 + return ret; 135 + 136 + priv->rsts = devm_reset_control_array_get(dev, true, false); 137 + if (IS_ERR(priv->rsts)) 138 + return PTR_ERR(priv->rsts); 157 139 158 140 pm_runtime_enable(dev); 159 141 pm_runtime_get_sync(dev);
+2 -2
drivers/clk/rockchip/clk-mmc-phase.c
··· 51 51 u16 degrees; 52 52 u32 delay_num = 0; 53 53 54 - /* See the comment for rockchip_mmc_set_phase below */ 54 + /* Constant signal, no measurable phase shift */ 55 55 if (!rate) 56 - return -EINVAL; 56 + return 0; 57 57 58 58 raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift); 59 59
-4
drivers/clk/samsung/clk.c
··· 356 356 } 357 357 358 358 ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids); 359 - if (!ctx) { 360 - panic("%s: unable to allocate ctx\n", __func__); 361 - return ctx; 362 - } 363 359 364 360 if (cmu->pll_clks) 365 361 samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks,
+17 -23
drivers/clk/socfpga/clk-gate-s10.c
··· 65 65 .get_parent = socfpga_gate_get_parent, 66 66 }; 67 67 68 - struct clk *s10_register_gate(const char *name, const char *parent_name, 69 - const char * const *parent_names, 70 - u8 num_parents, unsigned long flags, 71 - void __iomem *regbase, unsigned long gate_reg, 72 - unsigned long gate_idx, unsigned long div_reg, 73 - unsigned long div_offset, u8 div_width, 74 - unsigned long bypass_reg, u8 bypass_shift, 75 - u8 fixed_div) 68 + struct clk *s10_register_gate(const struct stratix10_gate_clock *clks, void __iomem *regbase) 76 69 { 77 70 struct clk *clk; 78 71 struct socfpga_gate_clk *socfpga_clk; 79 72 struct clk_init_data init; 73 + const char * const *parent_names = clks->parent_names; 74 + const char *parent_name = clks->parent_name; 80 75 81 76 socfpga_clk = kzalloc(sizeof(*socfpga_clk), GFP_KERNEL); 82 77 if (!socfpga_clk) 83 78 return NULL; 84 79 85 - socfpga_clk->hw.reg = regbase + gate_reg; 86 - socfpga_clk->hw.bit_idx = gate_idx; 80 + socfpga_clk->hw.reg = regbase + clks->gate_reg; 81 + socfpga_clk->hw.bit_idx = clks->gate_idx; 87 82 88 83 gateclk_ops.enable = clk_gate_ops.enable; 89 84 gateclk_ops.disable = clk_gate_ops.disable; 90 85 91 - socfpga_clk->fixed_div = fixed_div; 86 + socfpga_clk->fixed_div = clks->fixed_div; 92 87 93 - if (div_reg) 94 - socfpga_clk->div_reg = regbase + div_reg; 88 + if (clks->div_reg) 89 + socfpga_clk->div_reg = regbase + clks->div_reg; 95 90 else 96 91 socfpga_clk->div_reg = NULL; 97 92 98 - socfpga_clk->width = div_width; 99 - socfpga_clk->shift = div_offset; 93 + socfpga_clk->width = clks->div_width; 94 + socfpga_clk->shift = clks->div_offset; 100 95 101 - if (bypass_reg) 102 - socfpga_clk->bypass_reg = regbase + bypass_reg; 96 + if (clks->bypass_reg) 97 + socfpga_clk->bypass_reg = regbase + clks->bypass_reg; 103 98 else 104 99 socfpga_clk->bypass_reg = NULL; 105 - socfpga_clk->bypass_shift = bypass_shift; 100 + socfpga_clk->bypass_shift = clks->bypass_shift; 106 101 107 - if (streq(name, "cs_pdbg_clk")) 102 + if (streq(clks->name, "cs_pdbg_clk")) 108 103 init.ops = &dbgclk_ops; 109 104 else 110 105 init.ops = &gateclk_ops; 111 106 112 - init.name = name; 113 - init.flags = flags; 107 + init.name = clks->name; 108 + init.flags = clks->flags; 114 109 115 - init.num_parents = num_parents; 110 + init.num_parents = clks->num_parents; 116 111 init.parent_names = parent_names ? parent_names : &parent_name; 117 112 socfpga_clk->hw.hw.init = &init; 118 113 ··· 116 121 kfree(socfpga_clk); 117 122 return NULL; 118 123 } 119 - 120 124 return clk; 121 125 }
+21 -21
drivers/clk/socfpga/clk-periph-s10.c
··· 73 73 .get_parent = clk_periclk_get_parent, 74 74 }; 75 75 76 - struct clk *s10_register_periph(const char *name, const char *parent_name, 77 - const char * const *parent_names, 78 - u8 num_parents, unsigned long flags, 79 - void __iomem *reg, unsigned long offset) 76 + struct clk *s10_register_periph(const struct stratix10_perip_c_clock *clks, 77 + void __iomem *reg) 80 78 { 81 79 struct clk *clk; 82 80 struct socfpga_periph_clk *periph_clk; 83 81 struct clk_init_data init; 82 + const char *name = clks->name; 83 + const char *parent_name = clks->parent_name; 84 + const char * const *parent_names = clks->parent_names; 84 85 85 86 periph_clk = kzalloc(sizeof(*periph_clk), GFP_KERNEL); 86 87 if (WARN_ON(!periph_clk)) 87 88 return NULL; 88 89 89 - periph_clk->hw.reg = reg + offset; 90 + periph_clk->hw.reg = reg + clks->offset; 90 91 91 92 init.name = name; 92 93 init.ops = &peri_c_clk_ops; 93 - init.flags = flags; 94 + init.flags = clks->flags; 94 95 95 - init.num_parents = num_parents; 96 + init.num_parents = clks->num_parents; 96 97 init.parent_names = parent_names ? parent_names : &parent_name; 97 98 98 99 periph_clk->hw.hw.init = &init; ··· 106 105 return clk; 107 106 } 108 107 109 - struct clk *s10_register_cnt_periph(const char *name, const char *parent_name, 110 - const char * const *parent_names, 111 - u8 num_parents, unsigned long flags, 112 - void __iomem *regbase, unsigned long offset, 113 - u8 fixed_divider, unsigned long bypass_reg, 114 - unsigned long bypass_shift) 108 + struct clk *s10_register_cnt_periph(const struct stratix10_perip_cnt_clock *clks, 109 + void __iomem *regbase) 115 110 { 116 111 struct clk *clk; 117 112 struct socfpga_periph_clk *periph_clk; 118 113 struct clk_init_data init; 114 + const char *name = clks->name; 115 + const char *parent_name = clks->parent_name; 116 + const char * const *parent_names = clks->parent_names; 119 117 120 118 periph_clk = kzalloc(sizeof(*periph_clk), GFP_KERNEL); 121 119 if (WARN_ON(!periph_clk)) 122 120 return NULL; 123 121 124 - if (offset) 125 - periph_clk->hw.reg = regbase + offset; 122 + if (clks->offset) 123 + periph_clk->hw.reg = regbase + clks->offset; 126 124 else 127 125 periph_clk->hw.reg = NULL; 128 126 129 - if (bypass_reg) 130 - periph_clk->bypass_reg = regbase + bypass_reg; 127 + if (clks->bypass_reg) 128 + periph_clk->bypass_reg = regbase + clks->bypass_reg; 131 129 else 132 130 periph_clk->bypass_reg = NULL; 133 - periph_clk->bypass_shift = bypass_shift; 134 - periph_clk->fixed_div = fixed_divider; 131 + periph_clk->bypass_shift = clks->bypass_shift; 132 + periph_clk->fixed_div = clks->fixed_divider; 135 133 136 134 init.name = name; 137 135 init.ops = &peri_cnt_clk_ops; 138 - init.flags = flags; 136 + init.flags = clks->flags; 139 137 140 - init.num_parents = num_parents; 138 + init.num_parents = clks->num_parents; 141 139 init.parent_names = parent_names ? parent_names : &parent_name; 142 140 143 141 periph_clk->hw.hw.init = &init;
+10 -7
drivers/clk/socfpga/clk-pll-s10.c
··· 39 39 /* read VCO1 reg for numerator and denominator */ 40 40 reg = readl(socfpgaclk->hw.reg); 41 41 refdiv = (reg & SOCFPGA_PLL_REFDIV_MASK) >> SOCFPGA_PLL_REFDIV_SHIFT; 42 - vco_freq = (unsigned long long)parent_rate / refdiv; 42 + 43 + vco_freq = parent_rate; 44 + do_div(vco_freq, refdiv); 43 45 44 46 /* Read mdiv and fdiv from the fdbck register */ 45 47 reg = readl(socfpgaclk->hw.reg + 0x4); ··· 110 108 .prepare = clk_pll_prepare, 111 109 }; 112 110 113 - struct clk *s10_register_pll(const char *name, const char * const *parent_names, 114 - u8 num_parents, unsigned long flags, 115 - void __iomem *reg, unsigned long offset) 111 + struct clk *s10_register_pll(const struct stratix10_pll_clock *clks, 112 + void __iomem *reg) 116 113 { 117 114 struct clk *clk; 118 115 struct socfpga_pll *pll_clk; 119 116 struct clk_init_data init; 117 + const char *name = clks->name; 118 + const char * const *parent_names = clks->parent_names; 120 119 121 120 pll_clk = kzalloc(sizeof(*pll_clk), GFP_KERNEL); 122 121 if (WARN_ON(!pll_clk)) 123 122 return NULL; 124 123 125 - pll_clk->hw.reg = reg + offset; 124 + pll_clk->hw.reg = reg + clks->offset; 126 125 127 126 if (streq(name, SOCFPGA_BOOT_CLK)) 128 127 init.ops = &clk_boot_ops; ··· 131 128 init.ops = &clk_pll_ops; 132 129 133 130 init.name = name; 134 - init.flags = flags; 131 + init.flags = clks->flags; 135 132 136 - init.num_parents = num_parents; 133 + init.num_parents = clks->num_parents; 137 134 init.parent_names = parent_names; 138 135 pll_clk->hw.hw.init = &init; 139 136
+4 -25
drivers/clk/socfpga/clk-s10.c
··· 177 177 int i; 178 178 179 179 for (i = 0; i < nums; i++) { 180 - clk = s10_register_periph(clks[i].name, clks[i].parent_name, 181 - clks[i].parent_names, clks[i].num_parents, 182 - clks[i].flags, base, clks[i].offset); 180 + clk = s10_register_periph(&clks[i], base); 183 181 if (IS_ERR(clk)) { 184 182 pr_err("%s: failed to register clock %s\n", 185 183 __func__, clks[i].name); ··· 196 198 int i; 197 199 198 200 for (i = 0; i < nums; i++) { 199 - clk = s10_register_cnt_periph(clks[i].name, clks[i].parent_name, 200 - clks[i].parent_names, 201 - clks[i].num_parents, 202 - clks[i].flags, base, 203 - clks[i].offset, 204 - clks[i].fixed_divider, 205 - clks[i].bypass_reg, 206 - clks[i].bypass_shift); 201 + clk = s10_register_cnt_periph(&clks[i], base); 207 202 if (IS_ERR(clk)) { 208 203 pr_err("%s: failed to register clock %s\n", 209 204 __func__, clks[i].name); ··· 216 225 int i; 217 226 218 227 for (i = 0; i < nums; i++) { 219 - clk = s10_register_gate(clks[i].name, clks[i].parent_name, 220 - clks[i].parent_names, 221 - clks[i].num_parents, 222 - clks[i].flags, base, 223 - clks[i].gate_reg, 224 - clks[i].gate_idx, clks[i].div_reg, 225 - clks[i].div_offset, clks[i].div_width, 226 - clks[i].bypass_reg, 227 - clks[i].bypass_shift, 228 - clks[i].fixed_div); 228 + clk = s10_register_gate(&clks[i], base); 229 229 if (IS_ERR(clk)) { 230 230 pr_err("%s: failed to register clock %s\n", 231 231 __func__, clks[i].name); ··· 236 254 int i; 237 255 238 256 for (i = 0; i < nums; i++) { 239 - clk = s10_register_pll(clks[i].name, clks[i].parent_names, 240 - clks[i].num_parents, 241 - clks[i].flags, base, 242 - clks[i].offset); 257 + clk = s10_register_pll(&clks[i], base); 243 258 if (IS_ERR(clk)) { 244 259 pr_err("%s: failed to register clock %s\n", 245 260 __func__, clks[i].name);
+8 -17
drivers/clk/socfpga/stratix10-clk.h
··· 60 60 u8 fixed_div; 61 61 }; 62 62 63 - struct clk *s10_register_pll(const char *, const char *const *, u8, 64 - unsigned long, void __iomem *, unsigned long); 65 - 66 - struct clk *s10_register_periph(const char *, const char *, 67 - const char * const *, u8, unsigned long, 68 - void __iomem *, unsigned long); 69 - struct clk *s10_register_cnt_periph(const char *, const char *, 70 - const char * const *, u8, 71 - unsigned long, void __iomem *, 72 - unsigned long, u8, unsigned long, 73 - unsigned long); 74 - struct clk *s10_register_gate(const char *, const char *, 75 - const char * const *, u8, 76 - unsigned long, void __iomem *, 77 - unsigned long, unsigned long, 78 - unsigned long, unsigned long, u8, 79 - unsigned long, u8, u8); 63 + struct clk *s10_register_pll(const struct stratix10_pll_clock *, 64 + void __iomem *); 65 + struct clk *s10_register_periph(const struct stratix10_perip_c_clock *, 66 + void __iomem *); 67 + struct clk *s10_register_cnt_periph(const struct stratix10_perip_cnt_clock *, 68 + void __iomem *); 69 + struct clk *s10_register_gate(const struct stratix10_gate_clock *, 70 + void __iomem *); 80 71 #endif /* __STRATIX10_CLK_H */
+8
drivers/clk/sprd/Kconfig
··· 13 13 tristate "Support for the Spreadtrum SC9860 clocks" 14 14 depends on (ARM64 && ARCH_SPRD) || COMPILE_TEST 15 15 default ARM64 && ARCH_SPRD 16 + 17 + config SPRD_SC9863A_CLK 18 + tristate "Support for the Spreadtrum SC9863A clocks" 19 + depends on (ARM64 && ARCH_SPRD) || COMPILE_TEST 20 + default ARM64 && ARCH_SPRD 21 + help 22 + Support for the global clock controller on sc9863a devices. 23 + Say Y if you want to use peripheral devices on sc9863a SoC. 16 24 endif
+1
drivers/clk/sprd/Makefile
··· 10 10 11 11 ## SoC support 12 12 obj-$(CONFIG_SPRD_SC9860_CLK) += sc9860-clk.o 13 + obj-$(CONFIG_SPRD_SC9863A_CLK) += sc9863a-clk.o
+9 -1
drivers/clk/sprd/common.c
··· 40 40 const struct sprd_clk_desc *desc) 41 41 { 42 42 void __iomem *base; 43 - struct device_node *node = pdev->dev.of_node; 43 + struct device *dev = &pdev->dev; 44 + struct device_node *node = dev->of_node; 44 45 struct regmap *regmap; 45 46 46 47 if (of_find_property(node, "sprd,syscon", NULL)) { 47 48 regmap = syscon_regmap_lookup_by_phandle(node, "sprd,syscon"); 48 49 if (IS_ERR(regmap)) { 49 50 pr_err("%s: failed to get syscon regmap\n", __func__); 51 + return PTR_ERR(regmap); 52 + } 53 + } else if (of_device_is_compatible(of_get_parent(dev->of_node), 54 + "syscon")) { 55 + regmap = device_node_to_regmap(of_get_parent(dev->of_node)); 56 + if (IS_ERR(regmap)) { 57 + dev_err(dev, "failed to get regmap from its parent.\n"); 50 58 return PTR_ERR(regmap); 51 59 } 52 60 } else {
+28 -11
drivers/clk/sprd/composite.h
··· 18 18 struct sprd_clk_common common; 19 19 }; 20 20 21 - #define SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, _table, \ 22 - _mshift, _mwidth, _dshift, _dwidth, _flags) \ 21 + #define SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \ 22 + _mshift, _mwidth, _dshift, _dwidth, \ 23 + _flags, _fn) \ 23 24 struct sprd_comp _struct = { \ 24 25 .mux = _SPRD_MUX_CLK(_mshift, _mwidth, _table), \ 25 26 .div = _SPRD_DIV_CLK(_dshift, _dwidth), \ 26 27 .common = { \ 27 28 .regmap = NULL, \ 28 29 .reg = _reg, \ 29 - .hw.init = CLK_HW_INIT_PARENTS(_name, \ 30 - _parent, \ 31 - &sprd_comp_ops, \ 32 - _flags), \ 30 + .hw.init = _fn(_name, _parent, \ 31 + &sprd_comp_ops, _flags), \ 33 32 } \ 34 33 } 35 34 36 - #define SPRD_COMP_CLK(_struct, _name, _parent, _reg, _mshift, \ 37 - _mwidth, _dshift, _dwidth, _flags) \ 38 - SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, \ 39 - NULL, _mshift, _mwidth, \ 40 - _dshift, _dwidth, _flags) 35 + #define SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, _table, \ 36 + _mshift, _mwidth, _dshift, _dwidth, _flags) \ 37 + SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \ 38 + _mshift, _mwidth, _dshift, _dwidth, \ 39 + _flags, CLK_HW_INIT_PARENTS) 40 + 41 + #define SPRD_COMP_CLK(_struct, _name, _parent, _reg, _mshift, \ 42 + _mwidth, _dshift, _dwidth, _flags) \ 43 + SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, NULL, \ 44 + _mshift, _mwidth, _dshift, _dwidth, _flags) 45 + 46 + #define SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, _table, \ 47 + _mshift, _mwidth, _dshift, \ 48 + _dwidth, _flags) \ 49 + SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \ 50 + _mshift, _mwidth, _dshift, _dwidth, \ 51 + _flags, CLK_HW_INIT_PARENTS_DATA) 52 + 53 + #define SPRD_COMP_CLK_DATA(_struct, _name, _parent, _reg, _mshift, \ 54 + _mwidth, _dshift, _dwidth, _flags) \ 55 + SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, NULL, \ 56 + _mshift, _mwidth, _dshift, _dwidth, \ 57 + _flags) 41 58 42 59 static inline struct sprd_comp *hw_to_sprd_comp(const struct clk_hw *hw) 43 60 {
+14 -6
drivers/clk/sprd/div.h
··· 35 35 struct sprd_clk_common common; 36 36 }; 37 37 38 - #define SPRD_DIV_CLK(_struct, _name, _parent, _reg, \ 39 - _shift, _width, _flags) \ 38 + #define SPRD_DIV_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 39 + _shift, _width, _flags, _fn) \ 40 40 struct sprd_div _struct = { \ 41 41 .div = _SPRD_DIV_CLK(_shift, _width), \ 42 42 .common = { \ 43 43 .regmap = NULL, \ 44 44 .reg = _reg, \ 45 - .hw.init = CLK_HW_INIT(_name, \ 46 - _parent, \ 47 - &sprd_div_ops, \ 48 - _flags), \ 45 + .hw.init = _fn(_name, _parent, \ 46 + &sprd_div_ops, _flags), \ 49 47 } \ 50 48 } 49 + 50 + #define SPRD_DIV_CLK(_struct, _name, _parent, _reg, \ 51 + _shift, _width, _flags) \ 52 + SPRD_DIV_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 53 + _shift, _width, _flags, CLK_HW_INIT) 54 + 55 + #define SPRD_DIV_CLK_HW(_struct, _name, _parent, _reg, \ 56 + _shift, _width, _flags) \ 57 + SPRD_DIV_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 58 + _shift, _width, _flags, CLK_HW_INIT_HW) 51 59 52 60 static inline struct sprd_div *hw_to_sprd_div(const struct clk_hw *hw) 53 61 {
+17
drivers/clk/sprd/gate.c
··· 79 79 80 80 return 0; 81 81 } 82 + 83 + static int sprd_pll_sc_gate_prepare(struct clk_hw *hw) 84 + { 85 + struct sprd_gate *sg = hw_to_sprd_gate(hw); 86 + 87 + clk_sc_gate_toggle(sg, true); 88 + udelay(sg->udelay); 89 + 90 + return 0; 91 + } 92 + 82 93 static int sprd_gate_is_enabled(struct clk_hw *hw) 83 94 { 84 95 struct sprd_gate *sg = hw_to_sprd_gate(hw); ··· 120 109 }; 121 110 EXPORT_SYMBOL_GPL(sprd_sc_gate_ops); 122 111 112 + const struct clk_ops sprd_pll_sc_gate_ops = { 113 + .unprepare = sprd_sc_gate_disable, 114 + .prepare = sprd_pll_sc_gate_prepare, 115 + .is_enabled = sprd_gate_is_enabled, 116 + }; 117 + EXPORT_SYMBOL_GPL(sprd_pll_sc_gate_ops);
+110 -10
drivers/clk/sprd/gate.h
··· 14 14 u32 enable_mask; 15 15 u16 flags; 16 16 u16 sc_offset; 17 + u16 udelay; 17 18 18 19 struct sprd_clk_common common; 19 20 }; 20 21 21 - #define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 22 - _enable_mask, _flags, _gate_flags, _ops) \ 22 + #define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 23 + _sc_offset, _enable_mask, _flags, \ 24 + _gate_flags, _udelay, _ops, _fn) \ 23 25 struct sprd_gate _struct = { \ 24 26 .enable_mask = _enable_mask, \ 25 27 .sc_offset = _sc_offset, \ 26 28 .flags = _gate_flags, \ 29 + .udelay = _udelay, \ 27 30 .common = { \ 28 31 .regmap = NULL, \ 29 32 .reg = _reg, \ 30 - .hw.init = CLK_HW_INIT(_name, \ 31 - _parent, \ 32 - _ops, \ 33 - _flags), \ 33 + .hw.init = _fn(_name, _parent, \ 34 + _ops, _flags), \ 34 35 } \ 35 36 } 37 + 38 + #define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 39 + _sc_offset, _enable_mask, _flags, \ 40 + _gate_flags, _udelay, _ops) \ 41 + SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 42 + _sc_offset, _enable_mask, _flags, \ 43 + _gate_flags, _udelay, _ops, CLK_HW_INIT) 44 + 45 + #define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 46 + _enable_mask, _flags, _gate_flags, _ops) \ 47 + SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 48 + _sc_offset, _enable_mask, _flags, \ 49 + _gate_flags, 0, _ops) 50 + 51 + #define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 52 + _enable_mask, _flags, _gate_flags) \ 53 + SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 54 + _enable_mask, _flags, _gate_flags, \ 55 + &sprd_sc_gate_ops) 36 56 37 57 #define SPRD_GATE_CLK(_struct, _name, _parent, _reg, \ 38 58 _enable_mask, _flags, _gate_flags) \ ··· 60 40 _enable_mask, _flags, _gate_flags, \ 61 41 &sprd_gate_ops) 62 42 63 - #define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 64 - _enable_mask, _flags, _gate_flags) \ 65 - SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 43 + #define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 66 44 _enable_mask, _flags, _gate_flags, \ 67 - &sprd_sc_gate_ops) 45 + _udelay) \ 46 + SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 47 + _sc_offset, _enable_mask, _flags, \ 48 + _gate_flags, _udelay, \ 49 + &sprd_pll_sc_gate_ops) 50 + 51 + 52 + #define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 53 + _sc_offset, _enable_mask, \ 54 + _flags, _gate_flags, \ 55 + _udelay, _ops) \ 56 + SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 57 + _sc_offset, _enable_mask, _flags, \ 58 + _gate_flags, _udelay, _ops, \ 59 + CLK_HW_INIT_HW) 60 + 61 + #define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \ 62 + _sc_offset, _enable_mask, _flags, \ 63 + _gate_flags, _ops) \ 64 + SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 65 + _sc_offset, _enable_mask, \ 66 + _flags, _gate_flags, 0, _ops) 67 + 68 + #define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 69 + _sc_offset, _enable_mask, _flags, \ 70 + _gate_flags) \ 71 + SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \ 72 + _sc_offset, _enable_mask, _flags, \ 73 + _gate_flags, &sprd_sc_gate_ops) 74 + 75 + #define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 76 + _enable_mask, _flags, _gate_flags) \ 77 + SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0, \ 78 + _enable_mask, _flags, _gate_flags, \ 79 + &sprd_gate_ops) 80 + 81 + #define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 82 + _sc_offset, _enable_mask, _flags, \ 83 + _gate_flags, _udelay) \ 84 + SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 85 + _sc_offset, _enable_mask, \ 86 + _flags, _gate_flags, _udelay, \ 87 + &sprd_pll_sc_gate_ops) 88 + 89 + #define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 90 + _reg, _sc_offset, \ 91 + _enable_mask, _flags, \ 92 + _gate_flags, _udelay, _ops) \ 93 + SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 94 + _sc_offset, _enable_mask, _flags, \ 95 + _gate_flags, _udelay, _ops, \ 96 + CLK_HW_INIT_FW_NAME) 97 + 98 + #define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \ 99 + _sc_offset, _enable_mask, _flags, \ 100 + _gate_flags, _ops) \ 101 + SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 102 + _reg, _sc_offset, \ 103 + _enable_mask, _flags, \ 104 + _gate_flags, 0, _ops) 105 + 106 + #define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 107 + _sc_offset, _enable_mask, _flags, \ 108 + _gate_flags) \ 109 + SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \ 110 + _sc_offset, _enable_mask, _flags, \ 111 + _gate_flags, &sprd_sc_gate_ops) 112 + 113 + #define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 114 + _enable_mask, _flags, _gate_flags) \ 115 + SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0, \ 116 + _enable_mask, _flags, _gate_flags, \ 117 + &sprd_gate_ops) 118 + 119 + #define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 120 + _sc_offset, _enable_mask, _flags, \ 121 + _gate_flags, _udelay) \ 122 + SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 123 + _reg, _sc_offset, \ 124 + _enable_mask, _flags, \ 125 + _gate_flags, _udelay, \ 126 + &sprd_pll_sc_gate_ops) 68 127 69 128 static inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw) 70 129 { ··· 154 55 155 56 extern const struct clk_ops sprd_gate_ops; 156 57 extern const struct clk_ops sprd_sc_gate_ops; 58 + extern const struct clk_ops sprd_pll_sc_gate_ops; 157 59 158 60 #endif /* _SPRD_GATE_H_ */
+21 -7
drivers/clk/sprd/mux.h
··· 36 36 .table = _table, \ 37 37 } 38 38 39 - #define SPRD_MUX_CLK_TABLE(_struct, _name, _parents, _table, \ 40 - _reg, _shift, _width, \ 41 - _flags) \ 39 + #define SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table, \ 40 + _reg, _shift, _width, _flags, _fn) \ 42 41 struct sprd_mux _struct = { \ 43 42 .mux = _SPRD_MUX_CLK(_shift, _width, _table), \ 44 43 .common = { \ 45 44 .regmap = NULL, \ 46 45 .reg = _reg, \ 47 - .hw.init = CLK_HW_INIT_PARENTS(_name, \ 48 - _parents, \ 49 - &sprd_mux_ops, \ 50 - _flags), \ 46 + .hw.init = _fn(_name, _parents, \ 47 + &sprd_mux_ops, _flags), \ 51 48 } \ 52 49 } 50 + 51 + #define SPRD_MUX_CLK_TABLE(_struct, _name, _parents, _table, \ 52 + _reg, _shift, _width, _flags) \ 53 + SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table, \ 54 + _reg, _shift, _width, _flags, \ 55 + CLK_HW_INIT_PARENTS) 53 56 54 57 #define SPRD_MUX_CLK(_struct, _name, _parents, _reg, \ 55 58 _shift, _width, _flags) \ 56 59 SPRD_MUX_CLK_TABLE(_struct, _name, _parents, NULL, \ 57 60 _reg, _shift, _width, _flags) 61 + 62 + #define SPRD_MUX_CLK_DATA_TABLE(_struct, _name, _parents, _table, \ 63 + _reg, _shift, _width, _flags) \ 64 + SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table, \ 65 + _reg, _shift, _width, _flags, \ 66 + CLK_HW_INIT_PARENTS_DATA) 67 + 68 + #define SPRD_MUX_CLK_DATA(_struct, _name, _parents, _reg, \ 69 + _shift, _width, _flags) \ 70 + SPRD_MUX_CLK_DATA_TABLE(_struct, _name, _parents, NULL, \ 71 + _reg, _shift, _width, _flags) 58 72 59 73 static inline struct sprd_mux *hw_to_sprd_mux(const struct clk_hw *hw) 60 74 {
+4 -3
drivers/clk/sprd/pll.c
··· 87 87 { 88 88 u32 i, num = table[0]; 89 89 90 - for (i = 1; i < num + 1; i++) 91 - if (rate <= table[i]) 90 + /* table[0] indicates the number of items in this table */ 91 + for (i = 0; i < num; i++) 92 + if (rate <= table[i + 1]) 92 93 break; 93 94 94 - return (i == num + 1) ? num : i; 95 + return i == num ? num - 1 : i; 95 96 } 96 97 97 98 static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll,
+37 -18
drivers/clk/sprd/pll.h
··· 61 61 struct sprd_clk_common common; 62 62 }; 63 63 64 + #define SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, \ 65 + _regs_num, _itable, _factors, \ 66 + _udelay, _k1, _k2, _fflag, \ 67 + _fvco, _fn) \ 68 + struct sprd_pll _struct = { \ 69 + .regs_num = _regs_num, \ 70 + .itable = _itable, \ 71 + .factors = _factors, \ 72 + .udelay = _udelay, \ 73 + .k1 = _k1, \ 74 + .k2 = _k2, \ 75 + .fflag = _fflag, \ 76 + .fvco = _fvco, \ 77 + .common = { \ 78 + .regmap = NULL, \ 79 + .reg = _reg, \ 80 + .hw.init = _fn(_name, _parent, \ 81 + &sprd_pll_ops, 0),\ 82 + }, \ 83 + } 84 + 64 85 #define SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \ 65 86 _regs_num, _itable, _factors, \ 66 87 _udelay, _k1, _k2, _fflag, _fvco) \ 67 - struct sprd_pll _struct = { \ 68 - .regs_num = _regs_num, \ 69 - .itable = _itable, \ 70 - .factors = _factors, \ 71 - .udelay = _udelay, \ 72 - .k1 = _k1, \ 73 - .k2 = _k2, \ 74 - .fflag = _fflag, \ 75 - .fvco = _fvco, \ 76 - .common = { \ 77 - .regmap = NULL, \ 78 - .reg = _reg, \ 79 - .hw.init = CLK_HW_INIT(_name, \ 80 - _parent, \ 81 - &sprd_pll_ops, \ 82 - 0), \ 83 - }, \ 84 - } 88 + SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \ 89 + _itable, _factors, _udelay, _k1, _k2, \ 90 + _fflag, _fvco, CLK_HW_INIT) 85 91 86 92 #define SPRD_PLL_WITH_ITABLE_K(_struct, _name, _parent, _reg, \ 87 93 _regs_num, _itable, _factors, \ ··· 101 95 SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \ 102 96 _regs_num, _itable, _factors, \ 103 97 _udelay, 1000, 1000, 0, 0) 98 + 99 + #define SPRD_PLL_FW_NAME(_struct, _name, _parent, _reg, _regs_num, \ 100 + _itable, _factors, _udelay, _k1, _k2, \ 101 + _fflag, _fvco) \ 102 + SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \ 103 + _itable, _factors, _udelay, _k1, _k2, \ 104 + _fflag, _fvco, CLK_HW_INIT_FW_NAME) 105 + 106 + #define SPRD_PLL_HW(_struct, _name, _parent, _reg, _regs_num, _itable, \ 107 + _factors, _udelay, _k1, _k2, _fflag, _fvco) \ 108 + SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \ 109 + _itable, _factors, _udelay, _k1, _k2, \ 110 + _fflag, _fvco, CLK_HW_INIT_HW) 104 111 105 112 static inline struct sprd_pll *hw_to_sprd_pll(struct clk_hw *hw) 106 113 {
+1772
drivers/clk/sprd/sc9863a-clk.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Unisoc SC9863A clock driver 4 + * 5 + * Copyright (C) 2019 Unisoc, Inc. 6 + * Author: Chunyan Zhang <chunyan.zhang@unisoc.com> 7 + */ 8 + 9 + #include <linux/clk-provider.h> 10 + #include <linux/err.h> 11 + #include <linux/io.h> 12 + #include <linux/module.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/slab.h> 15 + 16 + #include <dt-bindings/clock/sprd,sc9863a-clk.h> 17 + 18 + #include "common.h" 19 + #include "composite.h" 20 + #include "div.h" 21 + #include "gate.h" 22 + #include "mux.h" 23 + #include "pll.h" 24 + 25 + /* mpll*_gate clocks control cpu cores, they were enabled by default */ 26 + SPRD_PLL_SC_GATE_CLK_FW_NAME(mpll0_gate, "mpll0-gate", "ext-26m", 0x94, 27 + 0x1000, BIT(0), CLK_IGNORE_UNUSED, 0, 240); 28 + SPRD_PLL_SC_GATE_CLK_FW_NAME(dpll0_gate, "dpll0-gate", "ext-26m", 0x98, 29 + 0x1000, BIT(0), 0, 0, 240); 30 + SPRD_PLL_SC_GATE_CLK_FW_NAME(lpll_gate, "lpll-gate", "ext-26m", 0x9c, 31 + 0x1000, BIT(0), 0, 0, 240); 32 + SPRD_PLL_SC_GATE_CLK_FW_NAME(gpll_gate, "gpll-gate", "ext-26m", 0xa8, 33 + 0x1000, BIT(0), 0, 0, 240); 34 + SPRD_PLL_SC_GATE_CLK_FW_NAME(dpll1_gate, "dpll1-gate", "ext-26m", 0x1dc, 35 + 0x1000, BIT(0), 0, 0, 240); 36 + SPRD_PLL_SC_GATE_CLK_FW_NAME(mpll1_gate, "mpll1-gate", "ext-26m", 0x1e0, 37 + 0x1000, BIT(0), CLK_IGNORE_UNUSED, 0, 240); 38 + SPRD_PLL_SC_GATE_CLK_FW_NAME(mpll2_gate, "mpll2-gate", "ext-26m", 0x1e4, 39 + 0x1000, BIT(0), CLK_IGNORE_UNUSED, 0, 240); 40 + SPRD_PLL_SC_GATE_CLK_FW_NAME(isppll_gate, "isppll-gate", "ext-26m", 0x1e8, 41 + 0x1000, BIT(0), 0, 0, 240); 42 + 43 + static struct sprd_clk_common *sc9863a_pmu_gate_clks[] = { 44 + /* address base is 0x402b0000 */ 45 + &mpll0_gate.common, 46 + &dpll0_gate.common, 47 + &lpll_gate.common, 48 + &gpll_gate.common, 49 + &dpll1_gate.common, 50 + &mpll1_gate.common, 51 + &mpll2_gate.common, 52 + &isppll_gate.common, 53 + }; 54 + 55 + static struct clk_hw_onecell_data sc9863a_pmu_gate_hws = { 56 + .hws = { 57 + [CLK_MPLL0_GATE] = &mpll0_gate.common.hw, 58 + [CLK_DPLL0_GATE] = &dpll0_gate.common.hw, 59 + [CLK_LPLL_GATE] = &lpll_gate.common.hw, 60 + [CLK_GPLL_GATE] = &gpll_gate.common.hw, 61 + [CLK_DPLL1_GATE] = &dpll1_gate.common.hw, 62 + [CLK_MPLL1_GATE] = &mpll1_gate.common.hw, 63 + [CLK_MPLL2_GATE] = &mpll2_gate.common.hw, 64 + [CLK_ISPPLL_GATE] = &isppll_gate.common.hw, 65 + }, 66 + .num = CLK_PMU_APB_NUM, 67 + }; 68 + 69 + static const struct sprd_clk_desc sc9863a_pmu_gate_desc = { 70 + .clk_clks = sc9863a_pmu_gate_clks, 71 + .num_clk_clks = ARRAY_SIZE(sc9863a_pmu_gate_clks), 72 + .hw_clks = &sc9863a_pmu_gate_hws, 73 + }; 74 + 75 + static const u64 itable[5] = {4, 1000000000, 1200000000, 76 + 1400000000, 1600000000}; 77 + 78 + static const struct clk_bit_field f_twpll[PLL_FACT_MAX] = { 79 + { .shift = 95, .width = 1 }, /* lock_done */ 80 + { .shift = 0, .width = 1 }, /* div_s */ 81 + { .shift = 1, .width = 1 }, /* mod_en */ 82 + { .shift = 2, .width = 1 }, /* sdm_en */ 83 + { .shift = 0, .width = 0 }, /* refin */ 84 + { .shift = 3, .width = 3 }, /* ibias */ 85 + { .shift = 8, .width = 11 }, /* n */ 86 + { .shift = 55, .width = 7 }, /* nint */ 87 + { .shift = 32, .width = 23}, /* kint */ 88 + { .shift = 0, .width = 0 }, /* prediv */ 89 + { .shift = 0, .width = 0 }, /* postdiv */ 90 + }; 91 + static SPRD_PLL_FW_NAME(twpll, "twpll", "ext-26m", 0x4, 3, itable, 92 + f_twpll, 240, 1000, 1000, 0, 0); 93 + static CLK_FIXED_FACTOR_HW(twpll_768m, "twpll-768m", &twpll.common.hw, 2, 1, 0); 94 + static CLK_FIXED_FACTOR_HW(twpll_384m, "twpll-384m", &twpll.common.hw, 4, 1, 0); 95 + static CLK_FIXED_FACTOR_HW(twpll_192m, "twpll-192m", &twpll.common.hw, 8, 1, 0); 96 + static CLK_FIXED_FACTOR_HW(twpll_96m, "twpll-96m", &twpll.common.hw, 16, 1, 0); 97 + static CLK_FIXED_FACTOR_HW(twpll_48m, "twpll-48m", &twpll.common.hw, 32, 1, 0); 98 + static CLK_FIXED_FACTOR_HW(twpll_24m, "twpll-24m", &twpll.common.hw, 64, 1, 0); 99 + static CLK_FIXED_FACTOR_HW(twpll_12m, "twpll-12m", &twpll.common.hw, 128, 1, 0); 100 + static CLK_FIXED_FACTOR_HW(twpll_512m, "twpll-512m", &twpll.common.hw, 3, 1, 0); 101 + static CLK_FIXED_FACTOR_HW(twpll_256m, "twpll-256m", &twpll.common.hw, 6, 1, 0); 102 + static CLK_FIXED_FACTOR_HW(twpll_128m, "twpll-128m", &twpll.common.hw, 12, 1, 0); 103 + static CLK_FIXED_FACTOR_HW(twpll_64m, "twpll-64m", &twpll.common.hw, 24, 1, 0); 104 + static CLK_FIXED_FACTOR_HW(twpll_307m2, "twpll-307m2", &twpll.common.hw, 5, 1, 0); 105 + static CLK_FIXED_FACTOR_HW(twpll_219m4, "twpll-219m4", &twpll.common.hw, 7, 1, 0); 106 + static CLK_FIXED_FACTOR_HW(twpll_170m6, "twpll-170m6", &twpll.common.hw, 9, 1, 0); 107 + static CLK_FIXED_FACTOR_HW(twpll_153m6, "twpll-153m6", &twpll.common.hw, 10, 1, 0); 108 + static CLK_FIXED_FACTOR_HW(twpll_76m8, "twpll-76m8", &twpll.common.hw, 20, 1, 0); 109 + static CLK_FIXED_FACTOR_HW(twpll_51m2, "twpll-51m2", &twpll.common.hw, 30, 1, 0); 110 + static CLK_FIXED_FACTOR_HW(twpll_38m4, "twpll-38m4", &twpll.common.hw, 40, 1, 0); 111 + static CLK_FIXED_FACTOR_HW(twpll_19m2, "twpll-19m2", &twpll.common.hw, 80, 1, 0); 112 + 113 + static const struct clk_bit_field f_lpll[PLL_FACT_MAX] = { 114 + { .shift = 95, .width = 1 }, /* lock_done */ 115 + { .shift = 0, .width = 1 }, /* div_s */ 116 + { .shift = 1, .width = 1 }, /* mod_en */ 117 + { .shift = 2, .width = 1 }, /* sdm_en */ 118 + { .shift = 0, .width = 0 }, /* refin */ 119 + { .shift = 6, .width = 2 }, /* ibias */ 120 + { .shift = 8, .width = 11 }, /* n */ 121 + { .shift = 55, .width = 7 }, /* nint */ 122 + { .shift = 32, .width = 23}, /* kint */ 123 + { .shift = 0, .width = 0 }, /* prediv */ 124 + { .shift = 0, .width = 0 }, /* postdiv */ 125 + }; 126 + static SPRD_PLL_HW(lpll, "lpll", &lpll_gate.common.hw, 0x20, 3, itable, 127 + f_lpll, 240, 1000, 1000, 0, 0); 128 + static CLK_FIXED_FACTOR_HW(lpll_409m6, "lpll-409m6", &lpll.common.hw, 3, 1, 0); 129 + static CLK_FIXED_FACTOR_HW(lpll_245m76, "lpll-245m76", &lpll.common.hw, 5, 1, 0); 130 + 131 + static const struct clk_bit_field f_gpll[PLL_FACT_MAX] = { 132 + { .shift = 95, .width = 1 }, /* lock_done */ 133 + { .shift = 0, .width = 1 }, /* div_s */ 134 + { .shift = 1, .width = 1 }, /* mod_en */ 135 + { .shift = 2, .width = 1 }, /* sdm_en */ 136 + { .shift = 0, .width = 0 }, /* refin */ 137 + { .shift = 6, .width = 2 }, /* ibias */ 138 + { .shift = 8, .width = 11 }, /* n */ 139 + { .shift = 55, .width = 7 }, /* nint */ 140 + { .shift = 32, .width = 23}, /* kint */ 141 + { .shift = 0, .width = 0 }, /* prediv */ 142 + { .shift = 80, .width = 1 }, /* postdiv */ 143 + }; 144 + static SPRD_PLL_HW(gpll, "gpll", &gpll_gate.common.hw, 0x38, 3, itable, 145 + f_gpll, 240, 1000, 1000, 1, 400000000); 146 + 147 + static SPRD_PLL_HW(isppll, "isppll", &isppll_gate.common.hw, 0x50, 3, itable, 148 + f_gpll, 240, 1000, 1000, 0, 0); 149 + static CLK_FIXED_FACTOR_HW(isppll_468m, "isppll-468m", &isppll.common.hw, 2, 1, 0); 150 + 151 + static struct sprd_clk_common *sc9863a_pll_clks[] = { 152 + /* address base is 0x40353000 */ 153 + &twpll.common, 154 + &lpll.common, 155 + &gpll.common, 156 + &isppll.common, 157 + }; 158 + 159 + static struct clk_hw_onecell_data sc9863a_pll_hws = { 160 + .hws = { 161 + [CLK_TWPLL] = &twpll.common.hw, 162 + [CLK_TWPLL_768M] = &twpll_768m.hw, 163 + [CLK_TWPLL_384M] = &twpll_384m.hw, 164 + [CLK_TWPLL_192M] = &twpll_192m.hw, 165 + [CLK_TWPLL_96M] = &twpll_96m.hw, 166 + [CLK_TWPLL_48M] = &twpll_48m.hw, 167 + [CLK_TWPLL_24M] = &twpll_24m.hw, 168 + [CLK_TWPLL_12M] = &twpll_12m.hw, 169 + [CLK_TWPLL_512M] = &twpll_512m.hw, 170 + [CLK_TWPLL_256M] = &twpll_256m.hw, 171 + [CLK_TWPLL_128M] = &twpll_128m.hw, 172 + [CLK_TWPLL_64M] = &twpll_64m.hw, 173 + [CLK_TWPLL_307M2] = &twpll_307m2.hw, 174 + [CLK_TWPLL_219M4] = &twpll_219m4.hw, 175 + [CLK_TWPLL_170M6] = &twpll_170m6.hw, 176 + [CLK_TWPLL_153M6] = &twpll_153m6.hw, 177 + [CLK_TWPLL_76M8] = &twpll_76m8.hw, 178 + [CLK_TWPLL_51M2] = &twpll_51m2.hw, 179 + [CLK_TWPLL_38M4] = &twpll_38m4.hw, 180 + [CLK_TWPLL_19M2] = &twpll_19m2.hw, 181 + [CLK_LPLL] = &lpll.common.hw, 182 + [CLK_LPLL_409M6] = &lpll_409m6.hw, 183 + [CLK_LPLL_245M76] = &lpll_245m76.hw, 184 + [CLK_GPLL] = &gpll.common.hw, 185 + [CLK_ISPPLL] = &isppll.common.hw, 186 + [CLK_ISPPLL_468M] = &isppll_468m.hw, 187 + 188 + }, 189 + .num = CLK_ANLG_PHY_G1_NUM, 190 + }; 191 + 192 + static const struct sprd_clk_desc sc9863a_pll_desc = { 193 + .clk_clks = sc9863a_pll_clks, 194 + .num_clk_clks = ARRAY_SIZE(sc9863a_pll_clks), 195 + .hw_clks = &sc9863a_pll_hws, 196 + }; 197 + 198 + static const u64 itable_mpll[6] = {5, 1000000000, 1200000000, 1400000000, 199 + 1600000000, 1800000000}; 200 + static SPRD_PLL_HW(mpll0, "mpll0", &mpll0_gate.common.hw, 0x0, 3, itable_mpll, 201 + f_gpll, 240, 1000, 1000, 1, 1000000000); 202 + static SPRD_PLL_HW(mpll1, "mpll1", &mpll1_gate.common.hw, 0x18, 3, itable_mpll, 203 + f_gpll, 240, 1000, 1000, 1, 1000000000); 204 + static SPRD_PLL_HW(mpll2, "mpll2", &mpll2_gate.common.hw, 0x30, 3, itable_mpll, 205 + f_gpll, 240, 1000, 1000, 1, 1000000000); 206 + static CLK_FIXED_FACTOR_HW(mpll2_675m, "mpll2-675m", &mpll2.common.hw, 2, 1, 0); 207 + 208 + static struct sprd_clk_common *sc9863a_mpll_clks[] = { 209 + /* address base is 0x40359000 */ 210 + &mpll0.common, 211 + &mpll1.common, 212 + &mpll2.common, 213 + }; 214 + 215 + static struct clk_hw_onecell_data sc9863a_mpll_hws = { 216 + .hws = { 217 + [CLK_MPLL0] = &mpll0.common.hw, 218 + [CLK_MPLL1] = &mpll1.common.hw, 219 + [CLK_MPLL2] = &mpll2.common.hw, 220 + [CLK_MPLL2_675M] = &mpll2_675m.hw, 221 + 222 + }, 223 + .num = CLK_ANLG_PHY_G4_NUM, 224 + }; 225 + 226 + static const struct sprd_clk_desc sc9863a_mpll_desc = { 227 + .clk_clks = sc9863a_mpll_clks, 228 + .num_clk_clks = ARRAY_SIZE(sc9863a_mpll_clks), 229 + .hw_clks = &sc9863a_mpll_hws, 230 + }; 231 + 232 + static SPRD_SC_GATE_CLK_FW_NAME(audio_gate, "audio-gate", "ext-26m", 233 + 0x4, 0x1000, BIT(8), 0, 0); 234 + 235 + static SPRD_PLL_FW_NAME(rpll, "rpll", "ext-26m", 0x10, 236 + 3, itable, f_lpll, 240, 1000, 1000, 0, 0); 237 + 238 + static CLK_FIXED_FACTOR_HW(rpll_390m, "rpll-390m", &rpll.common.hw, 2, 1, 0); 239 + static CLK_FIXED_FACTOR_HW(rpll_260m, "rpll-260m", &rpll.common.hw, 3, 1, 0); 240 + static CLK_FIXED_FACTOR_HW(rpll_195m, "rpll-195m", &rpll.common.hw, 4, 1, 0); 241 + static CLK_FIXED_FACTOR_HW(rpll_26m, "rpll-26m", &rpll.common.hw, 30, 1, 0); 242 + 243 + static struct sprd_clk_common *sc9863a_rpll_clks[] = { 244 + /* address base is 0x4035c000 */ 245 + &audio_gate.common, 246 + &rpll.common, 247 + }; 248 + 249 + static struct clk_hw_onecell_data sc9863a_rpll_hws = { 250 + .hws = { 251 + [CLK_AUDIO_GATE] = &audio_gate.common.hw, 252 + [CLK_RPLL] = &rpll.common.hw, 253 + [CLK_RPLL_390M] = &rpll_390m.hw, 254 + [CLK_RPLL_260M] = &rpll_260m.hw, 255 + [CLK_RPLL_195M] = &rpll_195m.hw, 256 + [CLK_RPLL_26M] = &rpll_26m.hw, 257 + }, 258 + .num = CLK_ANLG_PHY_G5_NUM, 259 + }; 260 + 261 + static const struct sprd_clk_desc sc9863a_rpll_desc = { 262 + .clk_clks = sc9863a_rpll_clks, 263 + .num_clk_clks = ARRAY_SIZE(sc9863a_rpll_clks), 264 + .hw_clks = &sc9863a_rpll_hws, 265 + }; 266 + 267 + static const u64 itable_dpll[5] = {4, 1211000000, 1320000000, 1570000000, 268 + 1866000000}; 269 + static SPRD_PLL_HW(dpll0, "dpll0", &dpll0_gate.common.hw, 0x0, 3, itable_dpll, 270 + f_lpll, 240, 1000, 1000, 0, 0); 271 + static SPRD_PLL_HW(dpll1, "dpll1", &dpll1_gate.common.hw, 0x18, 3, itable_dpll, 272 + f_lpll, 240, 1000, 1000, 0, 0); 273 + 274 + static CLK_FIXED_FACTOR_HW(dpll0_933m, "dpll0-933m", &dpll0.common.hw, 2, 1, 0); 275 + static CLK_FIXED_FACTOR_HW(dpll0_622m3, "dpll0-622m3", &dpll0.common.hw, 3, 1, 0); 276 + static CLK_FIXED_FACTOR_HW(dpll1_400m, "dpll1-400m", &dpll0.common.hw, 4, 1, 0); 277 + static CLK_FIXED_FACTOR_HW(dpll1_266m7, "dpll1-266m7", &dpll0.common.hw, 6, 1, 0); 278 + static CLK_FIXED_FACTOR_HW(dpll1_123m1, "dpll1-123m1", &dpll0.common.hw, 13, 1, 0); 279 + static CLK_FIXED_FACTOR_HW(dpll1_50m, "dpll1-50m", &dpll0.common.hw, 32, 1, 0); 280 + 281 + static struct sprd_clk_common *sc9863a_dpll_clks[] = { 282 + /* address base is 0x40363000 */ 283 + &dpll0.common, 284 + &dpll1.common, 285 + }; 286 + 287 + static struct clk_hw_onecell_data sc9863a_dpll_hws = { 288 + .hws = { 289 + [CLK_DPLL0] = &dpll0.common.hw, 290 + [CLK_DPLL1] = &dpll1.common.hw, 291 + [CLK_DPLL0_933M] = &dpll0_933m.hw, 292 + [CLK_DPLL0_622M3] = &dpll0_622m3.hw, 293 + [CLK_DPLL0_400M] = &dpll1_400m.hw, 294 + [CLK_DPLL0_266M7] = &dpll1_266m7.hw, 295 + [CLK_DPLL0_123M1] = &dpll1_123m1.hw, 296 + [CLK_DPLL0_50M] = &dpll1_50m.hw, 297 + 298 + }, 299 + .num = CLK_ANLG_PHY_G7_NUM, 300 + }; 301 + 302 + static const struct sprd_clk_desc sc9863a_dpll_desc = { 303 + .clk_clks = sc9863a_dpll_clks, 304 + .num_clk_clks = ARRAY_SIZE(sc9863a_dpll_clks), 305 + .hw_clks = &sc9863a_dpll_hws, 306 + }; 307 + 308 + static CLK_FIXED_FACTOR_FW_NAME(clk_6m5, "clk-6m5", "ext-26m", 4, 1, 0); 309 + static CLK_FIXED_FACTOR_FW_NAME(clk_4m3, "clk-4m3", "ext-26m", 6, 1, 0); 310 + static CLK_FIXED_FACTOR_FW_NAME(clk_2m, "clk-2m", "ext-26m", 13, 1, 0); 311 + static CLK_FIXED_FACTOR_FW_NAME(clk_250k, "clk-250k", "ext-26m", 104, 1, 0); 312 + static CLK_FIXED_FACTOR_FW_NAME(rco_25m, "rco-25m", "rco-100m", 4, 1, 0); 313 + static CLK_FIXED_FACTOR_FW_NAME(rco_4m, "rco-4m", "rco-100m", 25, 1, 0); 314 + static CLK_FIXED_FACTOR_FW_NAME(rco_2m, "rco-2m", "rco-100m", 50, 1, 0); 315 + 316 + #define SC9863A_MUX_FLAG \ 317 + (CLK_GET_RATE_NOCACHE | CLK_SET_RATE_NO_REPARENT) 318 + 319 + static CLK_FIXED_FACTOR_FW_NAME(clk_13m, "clk-13m", "ext-26m", 2, 1, 0); 320 + static const struct clk_parent_data emc_clk_parents[] = { 321 + { .fw_name = "ext-26m" }, 322 + { .hw = &twpll_384m.hw }, 323 + { .hw = &twpll_512m.hw }, 324 + { .hw = &twpll_768m.hw }, 325 + { .hw = &twpll.common.hw }, 326 + }; 327 + static SPRD_MUX_CLK_DATA(emc_clk, "emc-clk", emc_clk_parents, 0x220, 328 + 0, 3, SC9863A_MUX_FLAG); 329 + 330 + static const struct clk_parent_data aon_apb_parents[] = { 331 + { .hw = &rco_4m.hw }, 332 + { .hw = &rco_25m.hw }, 333 + { .fw_name = "ext-26m" }, 334 + { .hw = &twpll_96m.hw }, 335 + { .fw_name = "rco-100m" }, 336 + { .hw = &twpll_128m.hw }, 337 + }; 338 + static SPRD_COMP_CLK_DATA(aon_apb, "aon-apb", aon_apb_parents, 0x224, 339 + 0, 3, 8, 2, 0); 340 + 341 + static const struct clk_parent_data adi_parents[] = { 342 + { .hw = &rco_4m.hw }, 343 + { .hw = &rco_25m.hw }, 344 + { .fw_name = "ext-26m" }, 345 + { .hw = &twpll_38m4.hw }, 346 + { .hw = &twpll_51m2.hw }, 347 + }; 348 + static SPRD_MUX_CLK_DATA(adi_clk, "adi-clk", adi_parents, 0x228, 349 + 0, 3, SC9863A_MUX_FLAG); 350 + 351 + static const struct clk_parent_data aux_parents[] = { 352 + { .fw_name = "ext-32k" }, 353 + { .hw = &rpll_26m.hw }, 354 + { .fw_name = "ext-26m" }, 355 + }; 356 + static SPRD_COMP_CLK_DATA(aux0_clk, "aux0-clk", aux_parents, 0x22c, 357 + 0, 5, 8, 4, 0); 358 + static SPRD_COMP_CLK_DATA(aux1_clk, "aux1-clk", aux_parents, 0x230, 359 + 0, 5, 8, 4, 0); 360 + static SPRD_COMP_CLK_DATA(aux2_clk, "aux2-clk", aux_parents, 0x234, 361 + 0, 5, 8, 4, 0); 362 + static SPRD_COMP_CLK_DATA(probe_clk, "probe-clk", aux_parents, 0x238, 363 + 0, 5, 8, 4, 0); 364 + 365 + static const struct clk_parent_data pwm_parents[] = { 366 + { .fw_name = "ext-32k" }, 367 + { .hw = &rpll_26m.hw }, 368 + { .fw_name = "ext-26m" }, 369 + { .hw = &twpll_48m.hw }, 370 + }; 371 + static SPRD_MUX_CLK_DATA(pwm0_clk, "pwm0-clk", pwm_parents, 0x23c, 372 + 0, 2, SC9863A_MUX_FLAG); 373 + static SPRD_MUX_CLK_DATA(pwm1_clk, "pwm1-clk", pwm_parents, 0x240, 374 + 0, 2, SC9863A_MUX_FLAG); 375 + static SPRD_MUX_CLK_DATA(pwm2_clk, "pwm2-clk", pwm_parents, 0x244, 376 + 0, 2, SC9863A_MUX_FLAG); 377 + 378 + static const struct clk_parent_data aon_thm_parents[] = { 379 + { .fw_name = "ext-32k" }, 380 + { .hw = &clk_250k.hw }, 381 + }; 382 + static SPRD_MUX_CLK_DATA(aon_thm_clk, "aon-thm-clk", aon_thm_parents, 0x25c, 383 + 0, 1, SC9863A_MUX_FLAG); 384 + 385 + static const struct clk_parent_data audif_parents[] = { 386 + { .fw_name = "ext-26m" }, 387 + { .hw = &twpll_38m4.hw }, 388 + { .hw = &twpll_51m2.hw }, 389 + }; 390 + static SPRD_MUX_CLK_DATA(audif_clk, "audif-clk", audif_parents, 0x264, 391 + 0, 2, SC9863A_MUX_FLAG); 392 + 393 + static const struct clk_parent_data cpu_dap_parents[] = { 394 + { .hw = &rco_4m.hw }, 395 + { .hw = &rco_25m.hw }, 396 + { .fw_name = "ext-26m" }, 397 + { .hw = &twpll_76m8.hw }, 398 + { .fw_name = "rco-100m" }, 399 + { .hw = &twpll_128m.hw }, 400 + { .hw = &twpll_153m6.hw }, 401 + }; 402 + static SPRD_MUX_CLK_DATA(cpu_dap_clk, "cpu-dap-clk", cpu_dap_parents, 0x26c, 403 + 0, 3, SC9863A_MUX_FLAG); 404 + 405 + static const struct clk_parent_data cpu_ts_parents[] = { 406 + { .fw_name = "ext-32k" }, 407 + { .fw_name = "ext-26m" }, 408 + { .hw = &twpll_128m.hw }, 409 + { .hw = &twpll_153m6.hw }, 410 + }; 411 + static SPRD_MUX_CLK_DATA(cpu_ts_clk, "cpu-ts-clk", cpu_ts_parents, 0x274, 412 + 0, 2, SC9863A_MUX_FLAG); 413 + 414 + static const struct clk_parent_data djtag_tck_parents[] = { 415 + { .hw = &rco_4m.hw }, 416 + { .fw_name = "ext-26m" }, 417 + }; 418 + static SPRD_MUX_CLK_DATA(djtag_tck_clk, "djtag-tck-clk", djtag_tck_parents, 0x28c, 419 + 0, 1, SC9863A_MUX_FLAG); 420 + 421 + static const struct clk_parent_data emc_ref_parents[] = { 422 + { .hw = &clk_6m5.hw }, 423 + { .hw = &clk_13m.hw }, 424 + { .fw_name = "ext-26m" }, 425 + }; 426 + static SPRD_MUX_CLK_DATA(emc_ref_clk, "emc-ref-clk", emc_ref_parents, 0x29c, 427 + 0, 2, SC9863A_MUX_FLAG); 428 + 429 + static const struct clk_parent_data cssys_parents[] = { 430 + { .hw = &rco_4m.hw }, 431 + { .fw_name = "ext-26m" }, 432 + { .hw = &twpll_96m.hw }, 433 + { .fw_name = "rco-100m" }, 434 + { .hw = &twpll_128m.hw }, 435 + { .hw = &twpll_153m6.hw }, 436 + { .hw = &twpll_384m.hw }, 437 + { .hw = &twpll_512m.hw }, 438 + { .hw = &mpll2_675m.hw }, 439 + }; 440 + static SPRD_COMP_CLK_DATA(cssys_clk, "cssys-clk", cssys_parents, 0x2a0, 441 + 0, 4, 8, 2, 0); 442 + 443 + static const struct clk_parent_data aon_pmu_parents[] = { 444 + { .fw_name = "ext-32k" }, 445 + { .hw = &rco_4m.hw }, 446 + { .fw_name = "ext-4m" }, 447 + }; 448 + static SPRD_MUX_CLK_DATA(aon_pmu_clk, "aon-pmu-clk", aon_pmu_parents, 0x2a8, 449 + 0, 2, SC9863A_MUX_FLAG); 450 + 451 + static const struct clk_parent_data pmu_26m_parents[] = { 452 + { .hw = &rco_4m.hw }, 453 + { .hw = &rco_25m.hw }, 454 + { .fw_name = "ext-26m" }, 455 + }; 456 + static SPRD_MUX_CLK_DATA(pmu_26m_clk, "26m-pmu-clk", pmu_26m_parents, 0x2ac, 457 + 0, 2, SC9863A_MUX_FLAG); 458 + 459 + static const struct clk_parent_data aon_tmr_parents[] = { 460 + { .hw = &rco_4m.hw }, 461 + { .fw_name = "ext-26m" }, 462 + }; 463 + static SPRD_MUX_CLK_DATA(aon_tmr_clk, "aon-tmr-clk", aon_tmr_parents, 0x2b0, 464 + 0, 1, SC9863A_MUX_FLAG); 465 + 466 + static const struct clk_parent_data power_cpu_parents[] = { 467 + { .fw_name = "ext-26m" }, 468 + { .hw = &rco_25m.hw }, 469 + { .fw_name = "rco-100m" }, 470 + { .hw = &twpll_128m.hw }, 471 + }; 472 + static SPRD_MUX_CLK_DATA(power_cpu_clk, "power-cpu-clk", power_cpu_parents, 0x2c4, 473 + 0, 2, SC9863A_MUX_FLAG); 474 + 475 + static const struct clk_parent_data ap_axi_parents[] = { 476 + { .fw_name = "ext-26m" }, 477 + { .hw = &twpll_76m8.hw }, 478 + { .hw = &twpll_128m.hw }, 479 + { .hw = &twpll_256m.hw }, 480 + }; 481 + static SPRD_MUX_CLK_DATA(ap_axi, "ap-axi", ap_axi_parents, 0x2c8, 482 + 0, 2, SC9863A_MUX_FLAG); 483 + 484 + static const struct clk_parent_data sdio_parents[] = { 485 + { .fw_name = "ext-26m" }, 486 + { .hw = &twpll_307m2.hw }, 487 + { .hw = &twpll_384m.hw }, 488 + { .hw = &rpll_390m.hw }, 489 + { .hw = &dpll1_400m.hw }, 490 + { .hw = &lpll_409m6.hw }, 491 + }; 492 + static SPRD_MUX_CLK_DATA(sdio0_2x, "sdio0-2x", sdio_parents, 0x2cc, 493 + 0, 3, SC9863A_MUX_FLAG); 494 + static SPRD_MUX_CLK_DATA(sdio1_2x, "sdio1-2x", sdio_parents, 0x2d4, 495 + 0, 3, SC9863A_MUX_FLAG); 496 + static SPRD_MUX_CLK_DATA(sdio2_2x, "sdio2-2x", sdio_parents, 0x2dc, 497 + 0, 3, SC9863A_MUX_FLAG); 498 + static SPRD_MUX_CLK_DATA(emmc_2x, "emmc-2x", sdio_parents, 0x2e4, 499 + 0, 3, SC9863A_MUX_FLAG); 500 + 501 + static const struct clk_parent_data dpu_parents[] = { 502 + { .hw = &twpll_153m6.hw }, 503 + { .hw = &twpll_192m.hw }, 504 + { .hw = &twpll_256m.hw }, 505 + { .hw = &twpll_384m.hw }, 506 + }; 507 + static SPRD_MUX_CLK_DATA(dpu_clk, "dpu", dpu_parents, 0x2f4, 508 + 0, 2, SC9863A_MUX_FLAG); 509 + 510 + static const struct clk_parent_data dpu_dpi_parents[] = { 511 + { .hw = &twpll_128m.hw }, 512 + { .hw = &twpll_153m6.hw }, 513 + { .hw = &twpll_192m.hw }, 514 + }; 515 + static SPRD_COMP_CLK_DATA(dpu_dpi, "dpu-dpi", dpu_dpi_parents, 0x2f8, 516 + 0, 2, 8, 4, 0); 517 + 518 + static const struct clk_parent_data otg_ref_parents[] = { 519 + { .hw = &twpll_12m.hw }, 520 + { .fw_name = "ext-26m" }, 521 + }; 522 + static SPRD_MUX_CLK_DATA(otg_ref_clk, "otg-ref-clk", otg_ref_parents, 0x308, 523 + 0, 1, SC9863A_MUX_FLAG); 524 + 525 + static const struct clk_parent_data sdphy_apb_parents[] = { 526 + { .fw_name = "ext-26m" }, 527 + { .hw = &twpll_48m.hw }, 528 + }; 529 + static SPRD_MUX_CLK_DATA(sdphy_apb_clk, "sdphy-apb-clk", sdphy_apb_parents, 0x330, 530 + 0, 1, SC9863A_MUX_FLAG); 531 + 532 + static const struct clk_parent_data alg_io_apb_parents[] = { 533 + { .hw = &rco_4m.hw }, 534 + { .fw_name = "ext-26m" }, 535 + { .hw = &twpll_48m.hw }, 536 + { .hw = &twpll_96m.hw }, 537 + }; 538 + static SPRD_MUX_CLK_DATA(alg_io_apb_clk, "alg-io-apb-clk", alg_io_apb_parents, 0x33c, 539 + 0, 1, SC9863A_MUX_FLAG); 540 + 541 + static const struct clk_parent_data gpu_parents[] = { 542 + { .hw = &twpll_153m6.hw }, 543 + { .hw = &twpll_192m.hw }, 544 + { .hw = &twpll_256m.hw }, 545 + { .hw = &twpll_307m2.hw }, 546 + { .hw = &twpll_384m.hw }, 547 + { .hw = &twpll_512m.hw }, 548 + { .hw = &gpll.common.hw }, 549 + }; 550 + static SPRD_COMP_CLK_DATA(gpu_core, "gpu-core", gpu_parents, 0x344, 551 + 0, 3, 8, 2, 0); 552 + static SPRD_COMP_CLK_DATA(gpu_soc, "gpu-soc", gpu_parents, 0x348, 553 + 0, 3, 8, 2, 0); 554 + 555 + static const struct clk_parent_data mm_emc_parents[] = { 556 + { .fw_name = "ext-26m" }, 557 + { .hw = &twpll_384m.hw }, 558 + { .hw = &isppll_468m.hw }, 559 + { .hw = &twpll_512m.hw }, 560 + }; 561 + static SPRD_MUX_CLK_DATA(mm_emc, "mm-emc", mm_emc_parents, 0x350, 562 + 0, 2, SC9863A_MUX_FLAG); 563 + 564 + static const struct clk_parent_data mm_ahb_parents[] = { 565 + { .fw_name = "ext-26m" }, 566 + { .hw = &twpll_96m.hw }, 567 + { .hw = &twpll_128m.hw }, 568 + { .hw = &twpll_153m6.hw }, 569 + }; 570 + static SPRD_MUX_CLK_DATA(mm_ahb, "mm-ahb", mm_ahb_parents, 0x354, 571 + 0, 2, SC9863A_MUX_FLAG); 572 + 573 + static const struct clk_parent_data bpc_clk_parents[] = { 574 + { .hw = &twpll_192m.hw }, 575 + { .hw = &twpll_307m2.hw }, 576 + { .hw = &twpll_384m.hw }, 577 + { .hw = &isppll_468m.hw }, 578 + { .hw = &dpll0_622m3.hw }, 579 + }; 580 + static SPRD_MUX_CLK_DATA(bpc_clk, "bpc-clk", bpc_clk_parents, 0x358, 581 + 0, 3, SC9863A_MUX_FLAG); 582 + 583 + static const struct clk_parent_data dcam_if_parents[] = { 584 + { .hw = &twpll_192m.hw }, 585 + { .hw = &twpll_256m.hw }, 586 + { .hw = &twpll_307m2.hw }, 587 + { .hw = &twpll_384m.hw }, 588 + }; 589 + static SPRD_MUX_CLK_DATA(dcam_if_clk, "dcam-if-clk", dcam_if_parents, 0x35c, 590 + 0, 2, SC9863A_MUX_FLAG); 591 + 592 + static const struct clk_parent_data isp_parents[] = { 593 + { .hw = &twpll_128m.hw }, 594 + { .hw = &twpll_256m.hw }, 595 + { .hw = &twpll_307m2.hw }, 596 + { .hw = &twpll_384m.hw }, 597 + { .hw = &isppll_468m.hw }, 598 + }; 599 + static SPRD_MUX_CLK_DATA(isp_clk, "isp-clk", isp_parents, 0x360, 600 + 0, 3, SC9863A_MUX_FLAG); 601 + 602 + static const struct clk_parent_data jpg_parents[] = { 603 + { .hw = &twpll_76m8.hw }, 604 + { .hw = &twpll_128m.hw }, 605 + { .hw = &twpll_256m.hw }, 606 + { .hw = &twpll_307m2.hw }, 607 + }; 608 + static SPRD_MUX_CLK_DATA(jpg_clk, "jpg-clk", jpg_parents, 0x364, 609 + 0, 2, SC9863A_MUX_FLAG); 610 + static SPRD_MUX_CLK_DATA(cpp_clk, "cpp-clk", jpg_parents, 0x368, 611 + 0, 2, SC9863A_MUX_FLAG); 612 + 613 + static const struct clk_parent_data sensor_parents[] = { 614 + { .fw_name = "ext-26m" }, 615 + { .hw = &twpll_48m.hw }, 616 + { .hw = &twpll_76m8.hw }, 617 + { .hw = &twpll_96m.hw }, 618 + }; 619 + static SPRD_COMP_CLK_DATA(sensor0_clk, "sensor0-clk", sensor_parents, 0x36c, 620 + 0, 2, 8, 3, 0); 621 + static SPRD_COMP_CLK_DATA(sensor1_clk, "sensor1-clk", sensor_parents, 0x370, 622 + 0, 2, 8, 3, 0); 623 + static SPRD_COMP_CLK_DATA(sensor2_clk, "sensor2-clk", sensor_parents, 0x374, 624 + 0, 2, 8, 3, 0); 625 + 626 + static const struct clk_parent_data mm_vemc_parents[] = { 627 + { .fw_name = "ext-26m" }, 628 + { .hw = &twpll_307m2.hw }, 629 + { .hw = &twpll_384m.hw }, 630 + { .hw = &isppll_468m.hw }, 631 + }; 632 + static SPRD_MUX_CLK_DATA(mm_vemc, "mm-vemc", mm_vemc_parents, 0x378, 633 + 0, 2, SC9863A_MUX_FLAG); 634 + 635 + static SPRD_MUX_CLK_DATA(mm_vahb, "mm-vahb", mm_ahb_parents, 0x37c, 636 + 0, 2, SC9863A_MUX_FLAG); 637 + 638 + static const struct clk_parent_data vsp_parents[] = { 639 + { .hw = &twpll_76m8.hw }, 640 + { .hw = &twpll_128m.hw }, 641 + { .hw = &twpll_256m.hw }, 642 + { .hw = &twpll_307m2.hw }, 643 + { .hw = &twpll_384m.hw }, 644 + }; 645 + static SPRD_MUX_CLK_DATA(clk_vsp, "vsp-clk", vsp_parents, 0x380, 646 + 0, 3, SC9863A_MUX_FLAG); 647 + 648 + static const struct clk_parent_data core_parents[] = { 649 + { .fw_name = "ext-26m" }, 650 + { .hw = &twpll_512m.hw }, 651 + { .hw = &twpll_768m.hw }, 652 + { .hw = &lpll.common.hw }, 653 + { .hw = &dpll0.common.hw }, 654 + { .hw = &mpll2.common.hw }, 655 + { .hw = &mpll0.common.hw }, 656 + { .hw = &mpll1.common.hw }, 657 + }; 658 + static SPRD_COMP_CLK_DATA(core0_clk, "core0-clk", core_parents, 0xa20, 659 + 0, 3, 8, 3, 0); 660 + static SPRD_COMP_CLK_DATA(core1_clk, "core1-clk", core_parents, 0xa24, 661 + 0, 3, 8, 3, 0); 662 + static SPRD_COMP_CLK_DATA(core2_clk, "core2-clk", core_parents, 0xa28, 663 + 0, 3, 8, 3, 0); 664 + static SPRD_COMP_CLK_DATA(core3_clk, "core3-clk", core_parents, 0xa2c, 665 + 0, 3, 8, 3, 0); 666 + static SPRD_COMP_CLK_DATA(core4_clk, "core4-clk", core_parents, 0xa30, 667 + 0, 3, 8, 3, 0); 668 + static SPRD_COMP_CLK_DATA(core5_clk, "core5-clk", core_parents, 0xa34, 669 + 0, 3, 8, 3, 0); 670 + static SPRD_COMP_CLK_DATA(core6_clk, "core6-clk", core_parents, 0xa38, 671 + 0, 3, 8, 3, 0); 672 + static SPRD_COMP_CLK_DATA(core7_clk, "core7-clk", core_parents, 0xa3c, 673 + 0, 3, 8, 3, 0); 674 + static SPRD_COMP_CLK_DATA(scu_clk, "scu-clk", core_parents, 0xa40, 675 + 0, 3, 8, 3, 0); 676 + 677 + static SPRD_DIV_CLK_HW(ace_clk, "ace-clk", &scu_clk.common.hw, 0xa44, 678 + 8, 3, 0); 679 + static SPRD_DIV_CLK_HW(axi_periph_clk, "axi-periph-clk", &scu_clk.common.hw, 0xa48, 680 + 8, 3, 0); 681 + static SPRD_DIV_CLK_HW(axi_acp_clk, "axi-acp-clk", &scu_clk.common.hw, 0xa4c, 682 + 8, 3, 0); 683 + 684 + static const struct clk_parent_data atb_parents[] = { 685 + { .fw_name = "ext-26m" }, 686 + { .hw = &twpll_384m.hw }, 687 + { .hw = &twpll_512m.hw }, 688 + { .hw = &mpll2.common.hw }, 689 + }; 690 + static SPRD_COMP_CLK_DATA(atb_clk, "atb-clk", atb_parents, 0xa50, 691 + 0, 2, 8, 3, 0); 692 + static SPRD_DIV_CLK_HW(debug_apb_clk, "debug-apb-clk", &atb_clk.common.hw, 0xa54, 693 + 8, 3, 0); 694 + 695 + static const struct clk_parent_data gic_parents[] = { 696 + { .fw_name = "ext-26m" }, 697 + { .hw = &twpll_153m6.hw }, 698 + { .hw = &twpll_384m.hw }, 699 + { .hw = &twpll_512m.hw }, 700 + }; 701 + static SPRD_COMP_CLK_DATA(gic_clk, "gic-clk", gic_parents, 0xa58, 702 + 0, 2, 8, 3, 0); 703 + static SPRD_COMP_CLK_DATA(periph_clk, "periph-clk", gic_parents, 0xa5c, 704 + 0, 2, 8, 3, 0); 705 + 706 + static struct sprd_clk_common *sc9863a_aon_clks[] = { 707 + /* address base is 0x402d0000 */ 708 + &emc_clk.common, 709 + &aon_apb.common, 710 + &adi_clk.common, 711 + &aux0_clk.common, 712 + &aux1_clk.common, 713 + &aux2_clk.common, 714 + &probe_clk.common, 715 + &pwm0_clk.common, 716 + &pwm1_clk.common, 717 + &pwm2_clk.common, 718 + &aon_thm_clk.common, 719 + &audif_clk.common, 720 + &cpu_dap_clk.common, 721 + &cpu_ts_clk.common, 722 + &djtag_tck_clk.common, 723 + &emc_ref_clk.common, 724 + &cssys_clk.common, 725 + &aon_pmu_clk.common, 726 + &pmu_26m_clk.common, 727 + &aon_tmr_clk.common, 728 + &power_cpu_clk.common, 729 + &ap_axi.common, 730 + &sdio0_2x.common, 731 + &sdio1_2x.common, 732 + &sdio2_2x.common, 733 + &emmc_2x.common, 734 + &dpu_clk.common, 735 + &dpu_dpi.common, 736 + &otg_ref_clk.common, 737 + &sdphy_apb_clk.common, 738 + &alg_io_apb_clk.common, 739 + &gpu_core.common, 740 + &gpu_soc.common, 741 + &mm_emc.common, 742 + &mm_ahb.common, 743 + &bpc_clk.common, 744 + &dcam_if_clk.common, 745 + &isp_clk.common, 746 + &jpg_clk.common, 747 + &cpp_clk.common, 748 + &sensor0_clk.common, 749 + &sensor1_clk.common, 750 + &sensor2_clk.common, 751 + &mm_vemc.common, 752 + &mm_vahb.common, 753 + &clk_vsp.common, 754 + &core0_clk.common, 755 + &core1_clk.common, 756 + &core2_clk.common, 757 + &core3_clk.common, 758 + &core4_clk.common, 759 + &core5_clk.common, 760 + &core6_clk.common, 761 + &core7_clk.common, 762 + &scu_clk.common, 763 + &ace_clk.common, 764 + &axi_periph_clk.common, 765 + &axi_acp_clk.common, 766 + &atb_clk.common, 767 + &debug_apb_clk.common, 768 + &gic_clk.common, 769 + &periph_clk.common, 770 + }; 771 + 772 + static struct clk_hw_onecell_data sc9863a_aon_clk_hws = { 773 + .hws = { 774 + [CLK_13M] = &clk_13m.hw, 775 + [CLK_6M5] = &clk_6m5.hw, 776 + [CLK_4M3] = &clk_4m3.hw, 777 + [CLK_2M] = &clk_2m.hw, 778 + [CLK_250K] = &clk_250k.hw, 779 + [CLK_RCO_25M] = &rco_25m.hw, 780 + [CLK_RCO_4M] = &rco_4m.hw, 781 + [CLK_RCO_2M] = &rco_2m.hw, 782 + [CLK_EMC] = &emc_clk.common.hw, 783 + [CLK_AON_APB] = &aon_apb.common.hw, 784 + [CLK_ADI] = &adi_clk.common.hw, 785 + [CLK_AUX0] = &aux0_clk.common.hw, 786 + [CLK_AUX1] = &aux1_clk.common.hw, 787 + [CLK_AUX2] = &aux2_clk.common.hw, 788 + [CLK_PROBE] = &probe_clk.common.hw, 789 + [CLK_PWM0] = &pwm0_clk.common.hw, 790 + [CLK_PWM1] = &pwm1_clk.common.hw, 791 + [CLK_PWM2] = &pwm2_clk.common.hw, 792 + [CLK_AON_THM] = &aon_thm_clk.common.hw, 793 + [CLK_AUDIF] = &audif_clk.common.hw, 794 + [CLK_CPU_DAP] = &cpu_dap_clk.common.hw, 795 + [CLK_CPU_TS] = &cpu_ts_clk.common.hw, 796 + [CLK_DJTAG_TCK] = &djtag_tck_clk.common.hw, 797 + [CLK_EMC_REF] = &emc_ref_clk.common.hw, 798 + [CLK_CSSYS] = &cssys_clk.common.hw, 799 + [CLK_AON_PMU] = &aon_pmu_clk.common.hw, 800 + [CLK_PMU_26M] = &pmu_26m_clk.common.hw, 801 + [CLK_AON_TMR] = &aon_tmr_clk.common.hw, 802 + [CLK_POWER_CPU] = &power_cpu_clk.common.hw, 803 + [CLK_AP_AXI] = &ap_axi.common.hw, 804 + [CLK_SDIO0_2X] = &sdio0_2x.common.hw, 805 + [CLK_SDIO1_2X] = &sdio1_2x.common.hw, 806 + [CLK_SDIO2_2X] = &sdio2_2x.common.hw, 807 + [CLK_EMMC_2X] = &emmc_2x.common.hw, 808 + [CLK_DPU] = &dpu_clk.common.hw, 809 + [CLK_DPU_DPI] = &dpu_dpi.common.hw, 810 + [CLK_OTG_REF] = &otg_ref_clk.common.hw, 811 + [CLK_SDPHY_APB] = &sdphy_apb_clk.common.hw, 812 + [CLK_ALG_IO_APB] = &alg_io_apb_clk.common.hw, 813 + [CLK_GPU_CORE] = &gpu_core.common.hw, 814 + [CLK_GPU_SOC] = &gpu_soc.common.hw, 815 + [CLK_MM_EMC] = &mm_emc.common.hw, 816 + [CLK_MM_AHB] = &mm_ahb.common.hw, 817 + [CLK_BPC] = &bpc_clk.common.hw, 818 + [CLK_DCAM_IF] = &dcam_if_clk.common.hw, 819 + [CLK_ISP] = &isp_clk.common.hw, 820 + [CLK_JPG] = &jpg_clk.common.hw, 821 + [CLK_CPP] = &cpp_clk.common.hw, 822 + [CLK_SENSOR0] = &sensor0_clk.common.hw, 823 + [CLK_SENSOR1] = &sensor1_clk.common.hw, 824 + [CLK_SENSOR2] = &sensor2_clk.common.hw, 825 + [CLK_MM_VEMC] = &mm_vemc.common.hw, 826 + [CLK_MM_VAHB] = &mm_vahb.common.hw, 827 + [CLK_VSP] = &clk_vsp.common.hw, 828 + [CLK_CORE0] = &core0_clk.common.hw, 829 + [CLK_CORE1] = &core1_clk.common.hw, 830 + [CLK_CORE2] = &core2_clk.common.hw, 831 + [CLK_CORE3] = &core3_clk.common.hw, 832 + [CLK_CORE4] = &core4_clk.common.hw, 833 + [CLK_CORE5] = &core5_clk.common.hw, 834 + [CLK_CORE6] = &core6_clk.common.hw, 835 + [CLK_CORE7] = &core7_clk.common.hw, 836 + [CLK_SCU] = &scu_clk.common.hw, 837 + [CLK_ACE] = &ace_clk.common.hw, 838 + [CLK_AXI_PERIPH] = &axi_periph_clk.common.hw, 839 + [CLK_AXI_ACP] = &axi_acp_clk.common.hw, 840 + [CLK_ATB] = &atb_clk.common.hw, 841 + [CLK_DEBUG_APB] = &debug_apb_clk.common.hw, 842 + [CLK_GIC] = &gic_clk.common.hw, 843 + [CLK_PERIPH] = &periph_clk.common.hw, 844 + }, 845 + .num = CLK_AON_CLK_NUM, 846 + }; 847 + 848 + static const struct sprd_clk_desc sc9863a_aon_clk_desc = { 849 + .clk_clks = sc9863a_aon_clks, 850 + .num_clk_clks = ARRAY_SIZE(sc9863a_aon_clks), 851 + .hw_clks = &sc9863a_aon_clk_hws, 852 + }; 853 + 854 + static const struct clk_parent_data ap_apb_parents[] = { 855 + { .fw_name = "ext-26m" }, 856 + { .hw = &twpll_64m.hw }, 857 + { .hw = &twpll_96m.hw }, 858 + { .hw = &twpll_128m.hw }, 859 + }; 860 + static SPRD_MUX_CLK_DATA(ap_apb, "ap-apb", ap_apb_parents, 0x20, 861 + 0, 2, SC9863A_MUX_FLAG); 862 + 863 + static const struct clk_parent_data ap_ce_parents[] = { 864 + { .fw_name = "ext-26m" }, 865 + { .hw = &twpll_256m.hw }, 866 + }; 867 + static SPRD_COMP_CLK_DATA(ap_ce, "ap-ce", ap_ce_parents, 0x24, 868 + 0, 1, 8, 3, 0); 869 + 870 + static const struct clk_parent_data nandc_ecc_parents[] = { 871 + { .fw_name = "ext-26m" }, 872 + { .hw = &twpll_256m.hw }, 873 + { .hw = &twpll_307m2.hw }, 874 + }; 875 + static SPRD_COMP_CLK_DATA(nandc_ecc, "nandc-ecc", nandc_ecc_parents, 0x28, 876 + 0, 2, 8, 3, 0); 877 + 878 + static const struct clk_parent_data nandc_26m_parents[] = { 879 + { .fw_name = "ext-32k" }, 880 + { .fw_name = "ext-26m" }, 881 + }; 882 + static SPRD_MUX_CLK_DATA(nandc_26m, "nandc-26m", nandc_26m_parents, 0x2c, 883 + 0, 1, SC9863A_MUX_FLAG); 884 + static SPRD_MUX_CLK_DATA(emmc_32k, "emmc-32k", nandc_26m_parents, 0x30, 885 + 0, 1, SC9863A_MUX_FLAG); 886 + static SPRD_MUX_CLK_DATA(sdio0_32k, "sdio0-32k", nandc_26m_parents, 0x34, 887 + 0, 1, SC9863A_MUX_FLAG); 888 + static SPRD_MUX_CLK_DATA(sdio1_32k, "sdio1-32k", nandc_26m_parents, 0x38, 889 + 0, 1, SC9863A_MUX_FLAG); 890 + static SPRD_MUX_CLK_DATA(sdio2_32k, "sdio2-32k", nandc_26m_parents, 0x3c, 891 + 0, 1, SC9863A_MUX_FLAG); 892 + 893 + static SPRD_GATE_CLK_HW(otg_utmi, "otg-utmi", &aon_apb.common.hw, 0x40, 894 + BIT(16), 0, 0); 895 + 896 + static const struct clk_parent_data ap_uart_parents[] = { 897 + { .fw_name = "ext-26m" }, 898 + { .hw = &twpll_48m.hw }, 899 + { .hw = &twpll_51m2.hw }, 900 + { .hw = &twpll_96m.hw }, 901 + }; 902 + static SPRD_COMP_CLK_DATA(ap_uart0, "ap-uart0", ap_uart_parents, 0x44, 903 + 0, 2, 8, 3, 0); 904 + static SPRD_COMP_CLK_DATA(ap_uart1, "ap-uart1", ap_uart_parents, 0x48, 905 + 0, 2, 8, 3, 0); 906 + static SPRD_COMP_CLK_DATA(ap_uart2, "ap-uart2", ap_uart_parents, 0x4c, 907 + 0, 2, 8, 3, 0); 908 + static SPRD_COMP_CLK_DATA(ap_uart3, "ap-uart3", ap_uart_parents, 0x50, 909 + 0, 2, 8, 3, 0); 910 + static SPRD_COMP_CLK_DATA(ap_uart4, "ap-uart4", ap_uart_parents, 0x54, 911 + 0, 2, 8, 3, 0); 912 + 913 + static const struct clk_parent_data i2c_parents[] = { 914 + { .fw_name = "ext-26m" }, 915 + { .hw = &twpll_48m.hw }, 916 + { .hw = &twpll_51m2.hw }, 917 + { .hw = &twpll_153m6.hw }, 918 + }; 919 + static SPRD_COMP_CLK_DATA(ap_i2c0, "ap-i2c0", i2c_parents, 0x58, 920 + 0, 2, 8, 3, 0); 921 + static SPRD_COMP_CLK_DATA(ap_i2c1, "ap-i2c1", i2c_parents, 0x5c, 922 + 0, 2, 8, 3, 0); 923 + static SPRD_COMP_CLK_DATA(ap_i2c2, "ap-i2c2", i2c_parents, 0x60, 924 + 0, 2, 8, 3, 0); 925 + static SPRD_COMP_CLK_DATA(ap_i2c3, "ap-i2c3", i2c_parents, 0x64, 926 + 0, 2, 8, 3, 0); 927 + static SPRD_COMP_CLK_DATA(ap_i2c4, "ap-i2c4", i2c_parents, 0x68, 928 + 0, 2, 8, 3, 0); 929 + static SPRD_COMP_CLK_DATA(ap_i2c5, "ap-i2c5", i2c_parents, 0x6c, 930 + 0, 2, 8, 3, 0); 931 + static SPRD_COMP_CLK_DATA(ap_i2c6, "ap-i2c6", i2c_parents, 0x70, 932 + 0, 2, 8, 3, 0); 933 + 934 + static const struct clk_parent_data spi_parents[] = { 935 + { .fw_name = "ext-26m" }, 936 + { .hw = &twpll_128m.hw }, 937 + { .hw = &twpll_153m6.hw }, 938 + { .hw = &twpll_192m.hw }, 939 + }; 940 + static SPRD_COMP_CLK_DATA(ap_spi0, "ap-spi0", spi_parents, 0x74, 941 + 0, 2, 8, 3, 0); 942 + static SPRD_COMP_CLK_DATA(ap_spi1, "ap-spi1", spi_parents, 0x78, 943 + 0, 2, 8, 3, 0); 944 + static SPRD_COMP_CLK_DATA(ap_spi2, "ap-spi2", spi_parents, 0x7c, 945 + 0, 2, 8, 3, 0); 946 + static SPRD_COMP_CLK_DATA(ap_spi3, "ap-spi3", spi_parents, 0x80, 947 + 0, 2, 8, 3, 0); 948 + 949 + static const struct clk_parent_data iis_parents[] = { 950 + { .fw_name = "ext-26m" }, 951 + { .hw = &twpll_128m.hw }, 952 + { .hw = &twpll_153m6.hw }, 953 + }; 954 + static SPRD_COMP_CLK_DATA(ap_iis0, "ap-iis0", iis_parents, 0x84, 955 + 0, 2, 8, 3, 0); 956 + static SPRD_COMP_CLK_DATA(ap_iis1, "ap-iis1", iis_parents, 0x88, 957 + 0, 2, 8, 3, 0); 958 + static SPRD_COMP_CLK_DATA(ap_iis2, "ap-iis2", iis_parents, 0x8c, 959 + 0, 2, 8, 3, 0); 960 + 961 + static const struct clk_parent_data sim0_parents[] = { 962 + { .fw_name = "ext-26m" }, 963 + { .hw = &twpll_51m2.hw }, 964 + { .hw = &twpll_64m.hw }, 965 + { .hw = &twpll_96m.hw }, 966 + { .hw = &twpll_128m.hw }, 967 + }; 968 + static SPRD_COMP_CLK_DATA(sim0, "sim0", sim0_parents, 0x90, 969 + 0, 3, 8, 3, 0); 970 + 971 + static const struct clk_parent_data sim0_32k_parents[] = { 972 + { .fw_name = "ext-32k" }, 973 + { .fw_name = "ext-26m" }, 974 + }; 975 + static SPRD_MUX_CLK_DATA(sim0_32k, "sim0-32k", sim0_32k_parents, 0x94, 976 + 0, 1, SC9863A_MUX_FLAG); 977 + 978 + static struct sprd_clk_common *sc9863a_ap_clks[] = { 979 + /* address base is 0x21500000 */ 980 + &ap_apb.common, 981 + &ap_ce.common, 982 + &nandc_ecc.common, 983 + &nandc_26m.common, 984 + &emmc_32k.common, 985 + &sdio0_32k.common, 986 + &sdio1_32k.common, 987 + &sdio2_32k.common, 988 + &otg_utmi.common, 989 + &ap_uart0.common, 990 + &ap_uart1.common, 991 + &ap_uart2.common, 992 + &ap_uart3.common, 993 + &ap_uart4.common, 994 + &ap_i2c0.common, 995 + &ap_i2c1.common, 996 + &ap_i2c2.common, 997 + &ap_i2c3.common, 998 + &ap_i2c4.common, 999 + &ap_i2c5.common, 1000 + &ap_i2c6.common, 1001 + &ap_spi0.common, 1002 + &ap_spi1.common, 1003 + &ap_spi2.common, 1004 + &ap_spi3.common, 1005 + &ap_iis0.common, 1006 + &ap_iis1.common, 1007 + &ap_iis2.common, 1008 + &sim0.common, 1009 + &sim0_32k.common, 1010 + }; 1011 + 1012 + static struct clk_hw_onecell_data sc9863a_ap_clk_hws = { 1013 + .hws = { 1014 + [CLK_AP_APB] = &ap_apb.common.hw, 1015 + [CLK_AP_CE] = &ap_ce.common.hw, 1016 + [CLK_NANDC_ECC] = &nandc_ecc.common.hw, 1017 + [CLK_NANDC_26M] = &nandc_26m.common.hw, 1018 + [CLK_EMMC_32K] = &emmc_32k.common.hw, 1019 + [CLK_SDIO0_32K] = &sdio0_32k.common.hw, 1020 + [CLK_SDIO1_32K] = &sdio1_32k.common.hw, 1021 + [CLK_SDIO2_32K] = &sdio2_32k.common.hw, 1022 + [CLK_OTG_UTMI] = &otg_utmi.common.hw, 1023 + [CLK_AP_UART0] = &ap_uart0.common.hw, 1024 + [CLK_AP_UART1] = &ap_uart1.common.hw, 1025 + [CLK_AP_UART2] = &ap_uart2.common.hw, 1026 + [CLK_AP_UART3] = &ap_uart3.common.hw, 1027 + [CLK_AP_UART4] = &ap_uart4.common.hw, 1028 + [CLK_AP_I2C0] = &ap_i2c0.common.hw, 1029 + [CLK_AP_I2C1] = &ap_i2c1.common.hw, 1030 + [CLK_AP_I2C2] = &ap_i2c2.common.hw, 1031 + [CLK_AP_I2C3] = &ap_i2c3.common.hw, 1032 + [CLK_AP_I2C4] = &ap_i2c4.common.hw, 1033 + [CLK_AP_I2C5] = &ap_i2c5.common.hw, 1034 + [CLK_AP_I2C6] = &ap_i2c6.common.hw, 1035 + [CLK_AP_SPI0] = &ap_spi0.common.hw, 1036 + [CLK_AP_SPI1] = &ap_spi1.common.hw, 1037 + [CLK_AP_SPI2] = &ap_spi2.common.hw, 1038 + [CLK_AP_SPI3] = &ap_spi3.common.hw, 1039 + [CLK_AP_IIS0] = &ap_iis0.common.hw, 1040 + [CLK_AP_IIS1] = &ap_iis1.common.hw, 1041 + [CLK_AP_IIS2] = &ap_iis2.common.hw, 1042 + [CLK_SIM0] = &sim0.common.hw, 1043 + [CLK_SIM0_32K] = &sim0_32k.common.hw, 1044 + }, 1045 + .num = CLK_AP_CLK_NUM, 1046 + }; 1047 + 1048 + static const struct sprd_clk_desc sc9863a_ap_clk_desc = { 1049 + .clk_clks = sc9863a_ap_clks, 1050 + .num_clk_clks = ARRAY_SIZE(sc9863a_ap_clks), 1051 + .hw_clks = &sc9863a_ap_clk_hws, 1052 + }; 1053 + 1054 + static SPRD_SC_GATE_CLK_HW(otg_eb, "otg-eb", &ap_axi.common.hw, 0x0, 0x1000, 1055 + BIT(4), 0, 0); 1056 + static SPRD_SC_GATE_CLK_HW(dma_eb, "dma-eb", &ap_axi.common.hw, 0x0, 0x1000, 1057 + BIT(5), 0, 0); 1058 + static SPRD_SC_GATE_CLK_HW(ce_eb, "ce-eb", &ap_axi.common.hw, 0x0, 0x1000, 1059 + BIT(6), 0, 0); 1060 + static SPRD_SC_GATE_CLK_HW(nandc_eb, "nandc-eb", &ap_axi.common.hw, 0x0, 0x1000, 1061 + BIT(7), 0, 0); 1062 + static SPRD_SC_GATE_CLK_HW(sdio0_eb, "sdio0-eb", &ap_axi.common.hw, 0x0, 0x1000, 1063 + BIT(8), 0, 0); 1064 + static SPRD_SC_GATE_CLK_HW(sdio1_eb, "sdio1-eb", &ap_axi.common.hw, 0x0, 0x1000, 1065 + BIT(9), 0, 0); 1066 + static SPRD_SC_GATE_CLK_HW(sdio2_eb, "sdio2-eb", &ap_axi.common.hw, 0x0, 0x1000, 1067 + BIT(10), 0, 0); 1068 + static SPRD_SC_GATE_CLK_HW(emmc_eb, "emmc-eb", &ap_axi.common.hw, 0x0, 0x1000, 1069 + BIT(11), 0, 0); 1070 + static SPRD_SC_GATE_CLK_HW(emmc_32k_eb, "emmc-32k-eb", &ap_axi.common.hw, 0x0, 1071 + 0x1000, BIT(27), 0, 0); 1072 + static SPRD_SC_GATE_CLK_HW(sdio0_32k_eb, "sdio0-32k-eb", &ap_axi.common.hw, 0x0, 1073 + 0x1000, BIT(28), 0, 0); 1074 + static SPRD_SC_GATE_CLK_HW(sdio1_32k_eb, "sdio1-32k-eb", &ap_axi.common.hw, 0x0, 1075 + 0x1000, BIT(29), 0, 0); 1076 + static SPRD_SC_GATE_CLK_HW(sdio2_32k_eb, "sdio2-32k-eb", &ap_axi.common.hw, 0x0, 1077 + 0x1000, BIT(30), 0, 0); 1078 + static SPRD_SC_GATE_CLK_HW(nandc_26m_eb, "nandc-26m-eb", &ap_axi.common.hw, 0x0, 1079 + 0x1000, BIT(31), 0, 0); 1080 + static SPRD_SC_GATE_CLK_HW(dma_eb2, "dma-eb2", &ap_axi.common.hw, 0x18, 1081 + 0x1000, BIT(0), 0, 0); 1082 + static SPRD_SC_GATE_CLK_HW(ce_eb2, "ce-eb2", &ap_axi.common.hw, 0x18, 1083 + 0x1000, BIT(1), 0, 0); 1084 + 1085 + static struct sprd_clk_common *sc9863a_apahb_gate_clks[] = { 1086 + /* address base is 0x20e00000 */ 1087 + &otg_eb.common, 1088 + &dma_eb.common, 1089 + &ce_eb.common, 1090 + &nandc_eb.common, 1091 + &sdio0_eb.common, 1092 + &sdio1_eb.common, 1093 + &sdio2_eb.common, 1094 + &emmc_eb.common, 1095 + &emmc_32k_eb.common, 1096 + &sdio0_32k_eb.common, 1097 + &sdio1_32k_eb.common, 1098 + &sdio2_32k_eb.common, 1099 + &nandc_26m_eb.common, 1100 + &dma_eb2.common, 1101 + &ce_eb2.common, 1102 + }; 1103 + 1104 + static struct clk_hw_onecell_data sc9863a_apahb_gate_hws = { 1105 + .hws = { 1106 + [CLK_OTG_EB] = &otg_eb.common.hw, 1107 + [CLK_DMA_EB] = &dma_eb.common.hw, 1108 + [CLK_CE_EB] = &ce_eb.common.hw, 1109 + [CLK_NANDC_EB] = &nandc_eb.common.hw, 1110 + [CLK_SDIO0_EB] = &sdio0_eb.common.hw, 1111 + [CLK_SDIO1_EB] = &sdio1_eb.common.hw, 1112 + [CLK_SDIO2_EB] = &sdio2_eb.common.hw, 1113 + [CLK_EMMC_EB] = &emmc_eb.common.hw, 1114 + [CLK_EMMC_32K_EB] = &emmc_32k_eb.common.hw, 1115 + [CLK_SDIO0_32K_EB] = &sdio0_32k_eb.common.hw, 1116 + [CLK_SDIO1_32K_EB] = &sdio1_32k_eb.common.hw, 1117 + [CLK_SDIO2_32K_EB] = &sdio2_32k_eb.common.hw, 1118 + [CLK_NANDC_26M_EB] = &nandc_26m_eb.common.hw, 1119 + [CLK_DMA_EB2] = &dma_eb2.common.hw, 1120 + [CLK_CE_EB2] = &ce_eb2.common.hw, 1121 + }, 1122 + .num = CLK_AP_AHB_GATE_NUM, 1123 + }; 1124 + 1125 + static const struct sprd_clk_desc sc9863a_apahb_gate_desc = { 1126 + .clk_clks = sc9863a_apahb_gate_clks, 1127 + .num_clk_clks = ARRAY_SIZE(sc9863a_apahb_gate_clks), 1128 + .hw_clks = &sc9863a_apahb_gate_hws, 1129 + }; 1130 + 1131 + /* aon gate clocks */ 1132 + static SPRD_SC_GATE_CLK_HW(gpio_eb, "gpio-eb", &aon_apb.common.hw, 1133 + 0x0, 0x1000, BIT(3), 0, 0); 1134 + static SPRD_SC_GATE_CLK_HW(pwm0_eb, "pwm0-eb", &aon_apb.common.hw, 1135 + 0x0, 0x1000, BIT(4), 0, 0); 1136 + static SPRD_SC_GATE_CLK_HW(pwm1_eb, "pwm1-eb", &aon_apb.common.hw, 1137 + 0x0, 0x1000, BIT(5), CLK_IGNORE_UNUSED, 0); 1138 + static SPRD_SC_GATE_CLK_HW(pwm2_eb, "pwm2-eb", &aon_apb.common.hw, 0x0, 1139 + 0x1000, BIT(6), 0, 0); 1140 + static SPRD_SC_GATE_CLK_HW(pwm3_eb, "pwm3-eb", &aon_apb.common.hw, 0x0, 1141 + 0x1000, BIT(7), 0, 0); 1142 + static SPRD_SC_GATE_CLK_HW(kpd_eb, "kpd-eb", &aon_apb.common.hw, 0x0, 1143 + 0x1000, BIT(8), 0, 0); 1144 + static SPRD_SC_GATE_CLK_HW(aon_syst_eb, "aon-syst-eb", &aon_apb.common.hw, 0x0, 1145 + 0x1000, BIT(9), CLK_IGNORE_UNUSED, 0); 1146 + static SPRD_SC_GATE_CLK_HW(ap_syst_eb, "ap-syst-eb", &aon_apb.common.hw, 0x0, 1147 + 0x1000, BIT(10), CLK_IGNORE_UNUSED, 0); 1148 + static SPRD_SC_GATE_CLK_HW(aon_tmr_eb, "aon-tmr-eb", &aon_apb.common.hw, 0x0, 1149 + 0x1000, BIT(11), CLK_IGNORE_UNUSED, 0); 1150 + static SPRD_SC_GATE_CLK_HW(efuse_eb, "efuse-eb", &aon_apb.common.hw, 0x0, 1151 + 0x1000, BIT(13), CLK_IGNORE_UNUSED, 0); 1152 + static SPRD_SC_GATE_CLK_HW(eic_eb, "eic-eb", &aon_apb.common.hw, 0x0, 1153 + 0x1000, BIT(14), CLK_IGNORE_UNUSED, 0); 1154 + static SPRD_SC_GATE_CLK_HW(intc_eb, "intc-eb", &aon_apb.common.hw, 0x0, 1155 + 0x1000, BIT(15), CLK_IGNORE_UNUSED, 0); 1156 + static SPRD_SC_GATE_CLK_HW(adi_eb, "adi-eb", &aon_apb.common.hw, 0x0, 1157 + 0x1000, BIT(16), CLK_IGNORE_UNUSED, 0); 1158 + static SPRD_SC_GATE_CLK_HW(audif_eb, "audif-eb", &aon_apb.common.hw, 0x0, 1159 + 0x1000, BIT(17), 0, 0); 1160 + static SPRD_SC_GATE_CLK_HW(aud_eb, "aud-eb", &aon_apb.common.hw, 0x0, 1161 + 0x1000, BIT(18), 0, 0); 1162 + static SPRD_SC_GATE_CLK_HW(vbc_eb, "vbc-eb", &aon_apb.common.hw, 0x0, 1163 + 0x1000, BIT(19), 0, 0); 1164 + static SPRD_SC_GATE_CLK_HW(pin_eb, "pin-eb", &aon_apb.common.hw, 0x0, 1165 + 0x1000, BIT(20), CLK_IGNORE_UNUSED, 0); 1166 + static SPRD_SC_GATE_CLK_HW(ap_wdg_eb, "ap-wdg-eb", &aon_apb.common.hw, 0x0, 1167 + 0x1000, BIT(24), 0, 0); 1168 + static SPRD_SC_GATE_CLK_HW(mm_eb, "mm-eb", &aon_apb.common.hw, 0x0, 1169 + 0x1000, BIT(25), CLK_IGNORE_UNUSED, 0); 1170 + static SPRD_SC_GATE_CLK_HW(aon_apb_ckg_eb, "aon-apb-ckg-eb", &aon_apb.common.hw, 1171 + 0x0, 0x1000, BIT(26), CLK_IGNORE_UNUSED, 0); 1172 + static SPRD_SC_GATE_CLK_HW(ca53_ts0_eb, "ca53-ts0-eb", &aon_apb.common.hw, 1173 + 0x0, 0x1000, BIT(28), CLK_IGNORE_UNUSED, 0); 1174 + static SPRD_SC_GATE_CLK_HW(ca53_ts1_eb, "ca53-ts1-eb", &aon_apb.common.hw, 1175 + 0x0, 0x1000, BIT(29), CLK_IGNORE_UNUSED, 0); 1176 + static SPRD_SC_GATE_CLK_HW(ca53_dap_eb, "ca53-dap-eb", &aon_apb.common.hw, 1177 + 0x0, 0x1000, BIT(30), CLK_IGNORE_UNUSED, 0); 1178 + static SPRD_SC_GATE_CLK_HW(pmu_eb, "pmu-eb", &aon_apb.common.hw, 1179 + 0x4, 0x1000, BIT(0), CLK_IGNORE_UNUSED, 0); 1180 + static SPRD_SC_GATE_CLK_HW(thm_eb, "thm-eb", &aon_apb.common.hw, 1181 + 0x4, 0x1000, BIT(1), CLK_IGNORE_UNUSED, 0); 1182 + static SPRD_SC_GATE_CLK_HW(aux0_eb, "aux0-eb", &aon_apb.common.hw, 1183 + 0x4, 0x1000, BIT(2), CLK_IGNORE_UNUSED, 0); 1184 + static SPRD_SC_GATE_CLK_HW(aux1_eb, "aux1-eb", &aon_apb.common.hw, 1185 + 0x4, 0x1000, BIT(3), 0, 0); 1186 + static SPRD_SC_GATE_CLK_HW(aux2_eb, "aux2-eb", &aon_apb.common.hw, 1187 + 0x4, 0x1000, BIT(4), CLK_IGNORE_UNUSED, 0); 1188 + static SPRD_SC_GATE_CLK_HW(probe_eb, "probe-eb", &aon_apb.common.hw, 1189 + 0x4, 0x1000, BIT(5), 0, 0); 1190 + static SPRD_SC_GATE_CLK_HW(emc_ref_eb, "emc-ref-eb", &aon_apb.common.hw, 1191 + 0x4, 0x1000, BIT(7), CLK_IGNORE_UNUSED, 0); 1192 + static SPRD_SC_GATE_CLK_HW(ca53_wdg_eb, "ca53-wdg-eb", &aon_apb.common.hw, 1193 + 0x4, 0x1000, BIT(8), CLK_IGNORE_UNUSED, 0); 1194 + static SPRD_SC_GATE_CLK_HW(ap_tmr1_eb, "ap-tmr1-eb", &aon_apb.common.hw, 1195 + 0x4, 0x1000, BIT(9), 0, 0); 1196 + static SPRD_SC_GATE_CLK_HW(ap_tmr2_eb, "ap-tmr2-eb", &aon_apb.common.hw, 1197 + 0x4, 0x1000, BIT(10), 0, 0); 1198 + static SPRD_SC_GATE_CLK_HW(disp_emc_eb, "disp-emc-eb", &aon_apb.common.hw, 1199 + 0x4, 0x1000, BIT(11), 0, 0); 1200 + static SPRD_SC_GATE_CLK_HW(zip_emc_eb, "zip-emc-eb", &aon_apb.common.hw, 1201 + 0x4, 0x1000, BIT(12), 0, 0); 1202 + static SPRD_SC_GATE_CLK_HW(gsp_emc_eb, "gsp-emc-eb", &aon_apb.common.hw, 1203 + 0x4, 0x1000, BIT(13), 0, 0); 1204 + static SPRD_SC_GATE_CLK_HW(mm_vsp_eb, "mm-vsp-eb", &aon_apb.common.hw, 1205 + 0x4, 0x1000, BIT(14), 0, 0); 1206 + static SPRD_SC_GATE_CLK_HW(mdar_eb, "mdar-eb", &aon_apb.common.hw, 1207 + 0x4, 0x1000, BIT(17), 0, 0); 1208 + static SPRD_SC_GATE_CLK_HW(rtc4m0_cal_eb, "rtc4m0-cal-eb", &aon_apb.common.hw, 1209 + 0x4, 0x1000, BIT(18), 0, 0); 1210 + static SPRD_SC_GATE_CLK_HW(rtc4m1_cal_eb, "rtc4m1-cal-eb", &aon_apb.common.hw, 1211 + 0x4, 0x1000, BIT(19), 0, 0); 1212 + static SPRD_SC_GATE_CLK_HW(djtag_eb, "djtag-eb", &aon_apb.common.hw, 1213 + 0x4, 0x1000, BIT(20), 0, 0); 1214 + static SPRD_SC_GATE_CLK_HW(mbox_eb, "mbox-eb", &aon_apb.common.hw, 1215 + 0x4, 0x1000, BIT(21), 0, 0); 1216 + static SPRD_SC_GATE_CLK_HW(aon_dma_eb, "aon-dma-eb", &aon_apb.common.hw, 1217 + 0x4, 0x1000, BIT(22), 0, 0); 1218 + static SPRD_SC_GATE_CLK_HW(aon_apb_def_eb, "aon-apb-def-eb", &aon_apb.common.hw, 1219 + 0x4, 0x1000, BIT(25), 0, 0); 1220 + static SPRD_SC_GATE_CLK_HW(ca5_ts0_eb, "ca5-ts0-eb", &aon_apb.common.hw, 1221 + 0x4, 0x1000, BIT(26), 0, 0); 1222 + static SPRD_SC_GATE_CLK_HW(dbg_eb, "dbg-eb", &aon_apb.common.hw, 1223 + 0x4, 0x1000, BIT(28), 0, 0); 1224 + static SPRD_SC_GATE_CLK_HW(dbg_emc_eb, "dbg-emc-eb", &aon_apb.common.hw, 1225 + 0x4, 0x1000, BIT(29), 0, 0); 1226 + static SPRD_SC_GATE_CLK_HW(cross_trig_eb, "cross-trig-eb", &aon_apb.common.hw, 1227 + 0x4, 0x1000, BIT(30), 0, 0); 1228 + static SPRD_SC_GATE_CLK_HW(serdes_dphy_eb, "serdes-dphy-eb", &aon_apb.common.hw, 1229 + 0x4, 0x1000, BIT(31), 0, 0); 1230 + static SPRD_SC_GATE_CLK_HW(arch_rtc_eb, "arch-rtc-eb", &aon_apb.common.hw, 1231 + 0x10, 0x1000, BIT(0), CLK_IGNORE_UNUSED, 0); 1232 + static SPRD_SC_GATE_CLK_HW(kpd_rtc_eb, "kpd-rtc-eb", &aon_apb.common.hw, 1233 + 0x10, 0x1000, BIT(1), 0, 0); 1234 + static SPRD_SC_GATE_CLK_HW(aon_syst_rtc_eb, "aon-syst-rtc-eb", &aon_apb.common.hw, 1235 + 0x10, 0x1000, BIT(2), CLK_IGNORE_UNUSED, 0); 1236 + static SPRD_SC_GATE_CLK_HW(ap_syst_rtc_eb, "ap-syst-rtc-eb", &aon_apb.common.hw, 1237 + 0x10, 0x1000, BIT(3), CLK_IGNORE_UNUSED, 0); 1238 + static SPRD_SC_GATE_CLK_HW(aon_tmr_rtc_eb, "aon-tmr-rtc-eb", &aon_apb.common.hw, 1239 + 0x10, 0x1000, BIT(4), CLK_IGNORE_UNUSED, 0); 1240 + static SPRD_SC_GATE_CLK_HW(ap_tmr0_rtc_eb, "ap-tmr0-rtc-eb", &aon_apb.common.hw, 1241 + 0x10, 0x1000, BIT(5), 0, 0); 1242 + static SPRD_SC_GATE_CLK_HW(eic_rtc_eb, "eic-rtc-eb", &aon_apb.common.hw, 1243 + 0x10, 0x1000, BIT(6), CLK_IGNORE_UNUSED, 0); 1244 + static SPRD_SC_GATE_CLK_HW(eic_rtcdv5_eb, "eic-rtcdv5-eb", &aon_apb.common.hw, 1245 + 0x10, 0x1000, BIT(7), CLK_IGNORE_UNUSED, 0); 1246 + static SPRD_SC_GATE_CLK_HW(ap_wdg_rtc_eb, "ap-wdg-rtc-eb", &aon_apb.common.hw, 1247 + 0x10, 0x1000, BIT(8), CLK_IGNORE_UNUSED, 0); 1248 + static SPRD_SC_GATE_CLK_HW(ca53_wdg_rtc_eb, "ca53-wdg-rtc-eb", &aon_apb.common.hw, 1249 + 0x10, 0x1000, BIT(9), CLK_IGNORE_UNUSED, 0); 1250 + static SPRD_SC_GATE_CLK_HW(thm_rtc_eb, "thm-rtc-eb", &aon_apb.common.hw, 1251 + 0x10, 0x1000, BIT(10), 0, 0); 1252 + static SPRD_SC_GATE_CLK_HW(athma_rtc_eb, "athma-rtc-eb", &aon_apb.common.hw, 1253 + 0x10, 0x1000, BIT(11), 0, 0); 1254 + static SPRD_SC_GATE_CLK_HW(gthma_rtc_eb, "gthma-rtc-eb", &aon_apb.common.hw, 1255 + 0x10, 0x1000, BIT(12), 0, 0); 1256 + static SPRD_SC_GATE_CLK_HW(athma_rtc_a_eb, "athma-rtc-a-eb", &aon_apb.common.hw, 1257 + 0x10, 0x1000, BIT(13), 0, 0); 1258 + static SPRD_SC_GATE_CLK_HW(gthma_rtc_a_eb, "gthma-rtc-a-eb", &aon_apb.common.hw, 1259 + 0x10, 0x1000, BIT(14), 0, 0); 1260 + static SPRD_SC_GATE_CLK_HW(ap_tmr1_rtc_eb, "ap-tmr1-rtc-eb", &aon_apb.common.hw, 1261 + 0x10, 0x1000, BIT(15), 0, 0); 1262 + static SPRD_SC_GATE_CLK_HW(ap_tmr2_rtc_eb, "ap-tmr2-rtc-eb", &aon_apb.common.hw, 1263 + 0x10, 0x1000, BIT(16), 0, 0); 1264 + static SPRD_SC_GATE_CLK_HW(dxco_lc_rtc_eb, "dxco-lc-rtc-eb", &aon_apb.common.hw, 1265 + 0x10, 0x1000, BIT(17), 0, 0); 1266 + static SPRD_SC_GATE_CLK_HW(bb_cal_rtc_eb, "bb-cal-rtc-eb", &aon_apb.common.hw, 1267 + 0x10, 0x1000, BIT(18), 0, 0); 1268 + static SPRD_SC_GATE_CLK_HW(gpu_eb, "gpu-eb", &aon_apb.common.hw, 0x50, 1269 + 0x1000, BIT(0), 0, 0); 1270 + static SPRD_SC_GATE_CLK_HW(disp_eb, "disp-eb", &aon_apb.common.hw, 0x50, 1271 + 0x1000, BIT(2), 0, 0); 1272 + static SPRD_SC_GATE_CLK_HW(mm_emc_eb, "mm-emc-eb", &aon_apb.common.hw, 0x50, 1273 + 0x1000, BIT(3), 0, 0); 1274 + static SPRD_SC_GATE_CLK_HW(power_cpu_eb, "power-cpu-eb", &aon_apb.common.hw, 0x50, 1275 + 0x1000, BIT(10), CLK_IGNORE_UNUSED, 0); 1276 + static SPRD_SC_GATE_CLK_HW(hw_i2c_eb, "hw-i2c-eb", &aon_apb.common.hw, 0x50, 1277 + 0x1000, BIT(11), 0, 0); 1278 + static SPRD_SC_GATE_CLK_HW(mm_vsp_emc_eb, "mm-vsp-emc-eb", &aon_apb.common.hw, 0x50, 1279 + 0x1000, BIT(14), 0, 0); 1280 + static SPRD_SC_GATE_CLK_HW(vsp_eb, "vsp-eb", &aon_apb.common.hw, 0x50, 1281 + 0x1000, BIT(16), 0, 0); 1282 + static SPRD_SC_GATE_CLK_HW(cssys_eb, "cssys-eb", &aon_apb.common.hw, 0xb0, 1283 + 0x1000, BIT(4), 0, 0); 1284 + static SPRD_SC_GATE_CLK_HW(dmc_eb, "dmc-eb", &aon_apb.common.hw, 0xb0, 1285 + 0x1000, BIT(5), CLK_IGNORE_UNUSED, 0); 1286 + static SPRD_SC_GATE_CLK_HW(rosc_eb, "rosc-eb", &aon_apb.common.hw, 0xb0, 1287 + 0x1000, BIT(7), 0, 0); 1288 + static SPRD_SC_GATE_CLK_HW(s_d_cfg_eb, "s-d-cfg-eb", &aon_apb.common.hw, 0xb0, 1289 + 0x1000, BIT(8), 0, 0); 1290 + static SPRD_SC_GATE_CLK_HW(s_d_ref_eb, "s-d-ref-eb", &aon_apb.common.hw, 0xb0, 1291 + 0x1000, BIT(9), 0, 0); 1292 + static SPRD_SC_GATE_CLK_HW(b_dma_eb, "b-dma-eb", &aon_apb.common.hw, 0xb0, 1293 + 0x1000, BIT(10), 0, 0); 1294 + static SPRD_SC_GATE_CLK_HW(anlg_eb, "anlg-eb", &aon_apb.common.hw, 0xb0, 1295 + 0x1000, BIT(11), CLK_IGNORE_UNUSED, 0); 1296 + static SPRD_SC_GATE_CLK_HW(anlg_apb_eb, "anlg-apb-eb", &aon_apb.common.hw, 0xb0, 1297 + 0x1000, BIT(13), 0, 0); 1298 + static SPRD_SC_GATE_CLK_HW(bsmtmr_eb, "bsmtmr-eb", &aon_apb.common.hw, 0xb0, 1299 + 0x1000, BIT(14), 0, 0); 1300 + static SPRD_SC_GATE_CLK_HW(ap_axi_eb, "ap-axi-eb", &aon_apb.common.hw, 0xb0, 1301 + 0x1000, BIT(15), CLK_IGNORE_UNUSED, 0); 1302 + static SPRD_SC_GATE_CLK_HW(ap_intc0_eb, "ap-intc0-eb", &aon_apb.common.hw, 0xb0, 1303 + 0x1000, BIT(16), CLK_IGNORE_UNUSED, 0); 1304 + static SPRD_SC_GATE_CLK_HW(ap_intc1_eb, "ap-intc1-eb", &aon_apb.common.hw, 0xb0, 1305 + 0x1000, BIT(17), CLK_IGNORE_UNUSED, 0); 1306 + static SPRD_SC_GATE_CLK_HW(ap_intc2_eb, "ap-intc2-eb", &aon_apb.common.hw, 0xb0, 1307 + 0x1000, BIT(18), CLK_IGNORE_UNUSED, 0); 1308 + static SPRD_SC_GATE_CLK_HW(ap_intc3_eb, "ap-intc3-eb", &aon_apb.common.hw, 0xb0, 1309 + 0x1000, BIT(19), CLK_IGNORE_UNUSED, 0); 1310 + static SPRD_SC_GATE_CLK_HW(ap_intc4_eb, "ap-intc4-eb", &aon_apb.common.hw, 0xb0, 1311 + 0x1000, BIT(20), CLK_IGNORE_UNUSED, 0); 1312 + static SPRD_SC_GATE_CLK_HW(ap_intc5_eb, "ap-intc5-eb", &aon_apb.common.hw, 0xb0, 1313 + 0x1000, BIT(21), CLK_IGNORE_UNUSED, 0); 1314 + static SPRD_SC_GATE_CLK_HW(scc_eb, "scc-eb", &aon_apb.common.hw, 0xb0, 1315 + 0x1000, BIT(22), 0, 0); 1316 + static SPRD_SC_GATE_CLK_HW(dphy_cfg_eb, "dphy-cfg-eb", &aon_apb.common.hw, 0xb0, 1317 + 0x1000, BIT(23), 0, 0); 1318 + static SPRD_SC_GATE_CLK_HW(dphy_ref_eb, "dphy-ref-eb", &aon_apb.common.hw, 0xb0, 1319 + 0x1000, BIT(24), 0, 0); 1320 + static SPRD_SC_GATE_CLK_HW(cphy_cfg_eb, "cphy-cfg-eb", &aon_apb.common.hw, 0xb0, 1321 + 0x1000, BIT(25), 0, 0); 1322 + static SPRD_SC_GATE_CLK_HW(otg_ref_eb, "otg-ref-eb", &aon_apb.common.hw, 0xb0, 1323 + 0x1000, BIT(26), 0, 0); 1324 + static SPRD_SC_GATE_CLK_HW(serdes_eb, "serdes-eb", &aon_apb.common.hw, 0xb0, 1325 + 0x1000, BIT(27), 0, 0); 1326 + static SPRD_SC_GATE_CLK_HW(aon_ap_emc_eb, "aon-ap-emc-eb", &aon_apb.common.hw, 0xb0, 1327 + 0x1000, BIT(28), 0, 0); 1328 + static struct sprd_clk_common *sc9863a_aonapb_gate_clks[] = { 1329 + /* address base is 0x402e0000 */ 1330 + &gpio_eb.common, 1331 + &pwm0_eb.common, 1332 + &pwm1_eb.common, 1333 + &pwm2_eb.common, 1334 + &pwm3_eb.common, 1335 + &kpd_eb.common, 1336 + &aon_syst_eb.common, 1337 + &ap_syst_eb.common, 1338 + &aon_tmr_eb.common, 1339 + &efuse_eb.common, 1340 + &eic_eb.common, 1341 + &intc_eb.common, 1342 + &adi_eb.common, 1343 + &audif_eb.common, 1344 + &aud_eb.common, 1345 + &vbc_eb.common, 1346 + &pin_eb.common, 1347 + &ap_wdg_eb.common, 1348 + &mm_eb.common, 1349 + &aon_apb_ckg_eb.common, 1350 + &ca53_ts0_eb.common, 1351 + &ca53_ts1_eb.common, 1352 + &ca53_dap_eb.common, 1353 + &pmu_eb.common, 1354 + &thm_eb.common, 1355 + &aux0_eb.common, 1356 + &aux1_eb.common, 1357 + &aux2_eb.common, 1358 + &probe_eb.common, 1359 + &emc_ref_eb.common, 1360 + &ca53_wdg_eb.common, 1361 + &ap_tmr1_eb.common, 1362 + &ap_tmr2_eb.common, 1363 + &disp_emc_eb.common, 1364 + &zip_emc_eb.common, 1365 + &gsp_emc_eb.common, 1366 + &mm_vsp_eb.common, 1367 + &mdar_eb.common, 1368 + &rtc4m0_cal_eb.common, 1369 + &rtc4m1_cal_eb.common, 1370 + &djtag_eb.common, 1371 + &mbox_eb.common, 1372 + &aon_dma_eb.common, 1373 + &aon_apb_def_eb.common, 1374 + &ca5_ts0_eb.common, 1375 + &dbg_eb.common, 1376 + &dbg_emc_eb.common, 1377 + &cross_trig_eb.common, 1378 + &serdes_dphy_eb.common, 1379 + &arch_rtc_eb.common, 1380 + &kpd_rtc_eb.common, 1381 + &aon_syst_rtc_eb.common, 1382 + &ap_syst_rtc_eb.common, 1383 + &aon_tmr_rtc_eb.common, 1384 + &ap_tmr0_rtc_eb.common, 1385 + &eic_rtc_eb.common, 1386 + &eic_rtcdv5_eb.common, 1387 + &ap_wdg_rtc_eb.common, 1388 + &ca53_wdg_rtc_eb.common, 1389 + &thm_rtc_eb.common, 1390 + &athma_rtc_eb.common, 1391 + &gthma_rtc_eb.common, 1392 + &athma_rtc_a_eb.common, 1393 + &gthma_rtc_a_eb.common, 1394 + &ap_tmr1_rtc_eb.common, 1395 + &ap_tmr2_rtc_eb.common, 1396 + &dxco_lc_rtc_eb.common, 1397 + &bb_cal_rtc_eb.common, 1398 + &gpu_eb.common, 1399 + &disp_eb.common, 1400 + &mm_emc_eb.common, 1401 + &power_cpu_eb.common, 1402 + &hw_i2c_eb.common, 1403 + &mm_vsp_emc_eb.common, 1404 + &vsp_eb.common, 1405 + &cssys_eb.common, 1406 + &dmc_eb.common, 1407 + &rosc_eb.common, 1408 + &s_d_cfg_eb.common, 1409 + &s_d_ref_eb.common, 1410 + &b_dma_eb.common, 1411 + &anlg_eb.common, 1412 + &anlg_apb_eb.common, 1413 + &bsmtmr_eb.common, 1414 + &ap_axi_eb.common, 1415 + &ap_intc0_eb.common, 1416 + &ap_intc1_eb.common, 1417 + &ap_intc2_eb.common, 1418 + &ap_intc3_eb.common, 1419 + &ap_intc4_eb.common, 1420 + &ap_intc5_eb.common, 1421 + &scc_eb.common, 1422 + &dphy_cfg_eb.common, 1423 + &dphy_ref_eb.common, 1424 + &cphy_cfg_eb.common, 1425 + &otg_ref_eb.common, 1426 + &serdes_eb.common, 1427 + &aon_ap_emc_eb.common, 1428 + }; 1429 + 1430 + static struct clk_hw_onecell_data sc9863a_aonapb_gate_hws = { 1431 + .hws = { 1432 + [CLK_GPIO_EB] = &gpio_eb.common.hw, 1433 + [CLK_PWM0_EB] = &pwm0_eb.common.hw, 1434 + [CLK_PWM1_EB] = &pwm1_eb.common.hw, 1435 + [CLK_PWM2_EB] = &pwm2_eb.common.hw, 1436 + [CLK_PWM3_EB] = &pwm3_eb.common.hw, 1437 + [CLK_KPD_EB] = &kpd_eb.common.hw, 1438 + [CLK_AON_SYST_EB] = &aon_syst_eb.common.hw, 1439 + [CLK_AP_SYST_EB] = &ap_syst_eb.common.hw, 1440 + [CLK_AON_TMR_EB] = &aon_tmr_eb.common.hw, 1441 + [CLK_EFUSE_EB] = &efuse_eb.common.hw, 1442 + [CLK_EIC_EB] = &eic_eb.common.hw, 1443 + [CLK_INTC_EB] = &intc_eb.common.hw, 1444 + [CLK_ADI_EB] = &adi_eb.common.hw, 1445 + [CLK_AUDIF_EB] = &audif_eb.common.hw, 1446 + [CLK_AUD_EB] = &aud_eb.common.hw, 1447 + [CLK_VBC_EB] = &vbc_eb.common.hw, 1448 + [CLK_PIN_EB] = &pin_eb.common.hw, 1449 + [CLK_AP_WDG_EB] = &ap_wdg_eb.common.hw, 1450 + [CLK_MM_EB] = &mm_eb.common.hw, 1451 + [CLK_AON_APB_CKG_EB] = &aon_apb_ckg_eb.common.hw, 1452 + [CLK_CA53_TS0_EB] = &ca53_ts0_eb.common.hw, 1453 + [CLK_CA53_TS1_EB] = &ca53_ts1_eb.common.hw, 1454 + [CLK_CS53_DAP_EB] = &ca53_dap_eb.common.hw, 1455 + [CLK_PMU_EB] = &pmu_eb.common.hw, 1456 + [CLK_THM_EB] = &thm_eb.common.hw, 1457 + [CLK_AUX0_EB] = &aux0_eb.common.hw, 1458 + [CLK_AUX1_EB] = &aux1_eb.common.hw, 1459 + [CLK_AUX2_EB] = &aux2_eb.common.hw, 1460 + [CLK_PROBE_EB] = &probe_eb.common.hw, 1461 + [CLK_EMC_REF_EB] = &emc_ref_eb.common.hw, 1462 + [CLK_CA53_WDG_EB] = &ca53_wdg_eb.common.hw, 1463 + [CLK_AP_TMR1_EB] = &ap_tmr1_eb.common.hw, 1464 + [CLK_AP_TMR2_EB] = &ap_tmr2_eb.common.hw, 1465 + [CLK_DISP_EMC_EB] = &disp_emc_eb.common.hw, 1466 + [CLK_ZIP_EMC_EB] = &zip_emc_eb.common.hw, 1467 + [CLK_GSP_EMC_EB] = &gsp_emc_eb.common.hw, 1468 + [CLK_MM_VSP_EB] = &mm_vsp_eb.common.hw, 1469 + [CLK_MDAR_EB] = &mdar_eb.common.hw, 1470 + [CLK_RTC4M0_CAL_EB] = &rtc4m0_cal_eb.common.hw, 1471 + [CLK_RTC4M1_CAL_EB] = &rtc4m1_cal_eb.common.hw, 1472 + [CLK_DJTAG_EB] = &djtag_eb.common.hw, 1473 + [CLK_MBOX_EB] = &mbox_eb.common.hw, 1474 + [CLK_AON_DMA_EB] = &aon_dma_eb.common.hw, 1475 + [CLK_AON_APB_DEF_EB] = &aon_apb_def_eb.common.hw, 1476 + [CLK_CA5_TS0_EB] = &ca5_ts0_eb.common.hw, 1477 + [CLK_DBG_EB] = &dbg_eb.common.hw, 1478 + [CLK_DBG_EMC_EB] = &dbg_emc_eb.common.hw, 1479 + [CLK_CROSS_TRIG_EB] = &cross_trig_eb.common.hw, 1480 + [CLK_SERDES_DPHY_EB] = &serdes_dphy_eb.common.hw, 1481 + [CLK_ARCH_RTC_EB] = &arch_rtc_eb.common.hw, 1482 + [CLK_KPD_RTC_EB] = &kpd_rtc_eb.common.hw, 1483 + [CLK_AON_SYST_RTC_EB] = &aon_syst_rtc_eb.common.hw, 1484 + [CLK_AP_SYST_RTC_EB] = &ap_syst_rtc_eb.common.hw, 1485 + [CLK_AON_TMR_RTC_EB] = &aon_tmr_rtc_eb.common.hw, 1486 + [CLK_AP_TMR0_RTC_EB] = &ap_tmr0_rtc_eb.common.hw, 1487 + [CLK_EIC_RTC_EB] = &eic_rtc_eb.common.hw, 1488 + [CLK_EIC_RTCDV5_EB] = &eic_rtcdv5_eb.common.hw, 1489 + [CLK_AP_WDG_RTC_EB] = &ap_wdg_rtc_eb.common.hw, 1490 + [CLK_CA53_WDG_RTC_EB] = &ca53_wdg_rtc_eb.common.hw, 1491 + [CLK_THM_RTC_EB] = &thm_rtc_eb.common.hw, 1492 + [CLK_ATHMA_RTC_EB] = &athma_rtc_eb.common.hw, 1493 + [CLK_GTHMA_RTC_EB] = &gthma_rtc_eb.common.hw, 1494 + [CLK_ATHMA_RTC_A_EB] = &athma_rtc_a_eb.common.hw, 1495 + [CLK_GTHMA_RTC_A_EB] = &gthma_rtc_a_eb.common.hw, 1496 + [CLK_AP_TMR1_RTC_EB] = &ap_tmr1_rtc_eb.common.hw, 1497 + [CLK_AP_TMR2_RTC_EB] = &ap_tmr2_rtc_eb.common.hw, 1498 + [CLK_DXCO_LC_RTC_EB] = &dxco_lc_rtc_eb.common.hw, 1499 + [CLK_BB_CAL_RTC_EB] = &bb_cal_rtc_eb.common.hw, 1500 + [CLK_GNU_EB] = &gpu_eb.common.hw, 1501 + [CLK_DISP_EB] = &disp_eb.common.hw, 1502 + [CLK_MM_EMC_EB] = &mm_emc_eb.common.hw, 1503 + [CLK_POWER_CPU_EB] = &power_cpu_eb.common.hw, 1504 + [CLK_HW_I2C_EB] = &hw_i2c_eb.common.hw, 1505 + [CLK_MM_VSP_EMC_EB] = &mm_vsp_emc_eb.common.hw, 1506 + [CLK_VSP_EB] = &vsp_eb.common.hw, 1507 + [CLK_CSSYS_EB] = &cssys_eb.common.hw, 1508 + [CLK_DMC_EB] = &dmc_eb.common.hw, 1509 + [CLK_ROSC_EB] = &rosc_eb.common.hw, 1510 + [CLK_S_D_CFG_EB] = &s_d_cfg_eb.common.hw, 1511 + [CLK_S_D_REF_EB] = &s_d_ref_eb.common.hw, 1512 + [CLK_B_DMA_EB] = &b_dma_eb.common.hw, 1513 + [CLK_ANLG_EB] = &anlg_eb.common.hw, 1514 + [CLK_ANLG_APB_EB] = &anlg_apb_eb.common.hw, 1515 + [CLK_BSMTMR_EB] = &bsmtmr_eb.common.hw, 1516 + [CLK_AP_AXI_EB] = &ap_axi_eb.common.hw, 1517 + [CLK_AP_INTC0_EB] = &ap_intc0_eb.common.hw, 1518 + [CLK_AP_INTC1_EB] = &ap_intc1_eb.common.hw, 1519 + [CLK_AP_INTC2_EB] = &ap_intc2_eb.common.hw, 1520 + [CLK_AP_INTC3_EB] = &ap_intc3_eb.common.hw, 1521 + [CLK_AP_INTC4_EB] = &ap_intc4_eb.common.hw, 1522 + [CLK_AP_INTC5_EB] = &ap_intc5_eb.common.hw, 1523 + [CLK_SCC_EB] = &scc_eb.common.hw, 1524 + [CLK_DPHY_CFG_EB] = &dphy_cfg_eb.common.hw, 1525 + [CLK_DPHY_REF_EB] = &dphy_ref_eb.common.hw, 1526 + [CLK_CPHY_CFG_EB] = &cphy_cfg_eb.common.hw, 1527 + [CLK_OTG_REF_EB] = &otg_ref_eb.common.hw, 1528 + [CLK_SERDES_EB] = &serdes_eb.common.hw, 1529 + [CLK_AON_AP_EMC_EB] = &aon_ap_emc_eb.common.hw, 1530 + }, 1531 + .num = CLK_AON_APB_GATE_NUM, 1532 + }; 1533 + 1534 + static const struct sprd_clk_desc sc9863a_aonapb_gate_desc = { 1535 + .clk_clks = sc9863a_aonapb_gate_clks, 1536 + .num_clk_clks = ARRAY_SIZE(sc9863a_aonapb_gate_clks), 1537 + .hw_clks = &sc9863a_aonapb_gate_hws, 1538 + }; 1539 + 1540 + /* mm gate clocks */ 1541 + static SPRD_SC_GATE_CLK_HW(mahb_ckg_eb, "mahb-ckg-eb", &mm_ahb.common.hw, 0x0, 0x1000, 1542 + BIT(0), 0, 0); 1543 + static SPRD_SC_GATE_CLK_HW(mdcam_eb, "mdcam-eb", &mm_ahb.common.hw, 0x0, 0x1000, 1544 + BIT(1), 0, 0); 1545 + static SPRD_SC_GATE_CLK_HW(misp_eb, "misp-eb", &mm_ahb.common.hw, 0x0, 0x1000, 1546 + BIT(2), 0, 0); 1547 + static SPRD_SC_GATE_CLK_HW(mahbcsi_eb, "mahbcsi-eb", &mm_ahb.common.hw, 0x0, 0x1000, 1548 + BIT(3), 0, 0); 1549 + static SPRD_SC_GATE_CLK_HW(mcsi_s_eb, "mcsi-s-eb", &mm_ahb.common.hw, 0x0, 0x1000, 1550 + BIT(4), 0, 0); 1551 + static SPRD_SC_GATE_CLK_HW(mcsi_t_eb, "mcsi-t-eb", &mm_ahb.common.hw, 0x0, 0x1000, 1552 + BIT(5), 0, 0); 1553 + static SPRD_GATE_CLK_HW(dcam_axi_eb, "dcam-axi-eb", &mm_ahb.common.hw, 0x8, 1554 + BIT(0), 0, 0); 1555 + static SPRD_GATE_CLK_HW(isp_axi_eb, "isp-axi-eb", &mm_ahb.common.hw, 0x8, 1556 + BIT(1), 0, 0); 1557 + static SPRD_GATE_CLK_HW(mcsi_eb, "mcsi-eb", &mm_ahb.common.hw, 0x8, 1558 + BIT(2), 0, 0); 1559 + static SPRD_GATE_CLK_HW(mcsi_s_ckg_eb, "mcsi-s-ckg-eb", &mm_ahb.common.hw, 0x8, 1560 + BIT(3), 0, 0); 1561 + static SPRD_GATE_CLK_HW(mcsi_t_ckg_eb, "mcsi-t-ckg-eb", &mm_ahb.common.hw, 0x8, 1562 + BIT(4), 0, 0); 1563 + static SPRD_GATE_CLK_HW(sensor0_eb, "sensor0-eb", &mm_ahb.common.hw, 0x8, 1564 + BIT(5), 0, 0); 1565 + static SPRD_GATE_CLK_HW(sensor1_eb, "sensor1-eb", &mm_ahb.common.hw, 0x8, 1566 + BIT(6), 0, 0); 1567 + static SPRD_GATE_CLK_HW(sensor2_eb, "sensor2-eb", &mm_ahb.common.hw, 0x8, 1568 + BIT(7), 0, 0); 1569 + static SPRD_GATE_CLK_HW(mcphy_cfg_eb, "mcphy-cfg-eb", &mm_ahb.common.hw, 0x8, 1570 + BIT(8), 0, 0); 1571 + 1572 + static struct sprd_clk_common *sc9863a_mm_gate_clks[] = { 1573 + /* address base is 0x60800000 */ 1574 + &mahb_ckg_eb.common, 1575 + &mdcam_eb.common, 1576 + &misp_eb.common, 1577 + &mahbcsi_eb.common, 1578 + &mcsi_s_eb.common, 1579 + &mcsi_t_eb.common, 1580 + &dcam_axi_eb.common, 1581 + &isp_axi_eb.common, 1582 + &mcsi_eb.common, 1583 + &mcsi_s_ckg_eb.common, 1584 + &mcsi_t_ckg_eb.common, 1585 + &sensor0_eb.common, 1586 + &sensor1_eb.common, 1587 + &sensor2_eb.common, 1588 + &mcphy_cfg_eb.common, 1589 + }; 1590 + 1591 + static struct clk_hw_onecell_data sc9863a_mm_gate_hws = { 1592 + .hws = { 1593 + [CLK_MAHB_CKG_EB] = &mahb_ckg_eb.common.hw, 1594 + [CLK_MDCAM_EB] = &mdcam_eb.common.hw, 1595 + [CLK_MISP_EB] = &misp_eb.common.hw, 1596 + [CLK_MAHBCSI_EB] = &mahbcsi_eb.common.hw, 1597 + [CLK_MCSI_S_EB] = &mcsi_s_eb.common.hw, 1598 + [CLK_MCSI_T_EB] = &mcsi_t_eb.common.hw, 1599 + [CLK_DCAM_AXI_EB] = &dcam_axi_eb.common.hw, 1600 + [CLK_ISP_AXI_EB] = &isp_axi_eb.common.hw, 1601 + [CLK_MCSI_EB] = &mcsi_eb.common.hw, 1602 + [CLK_MCSI_S_CKG_EB] = &mcsi_s_ckg_eb.common.hw, 1603 + [CLK_MCSI_T_CKG_EB] = &mcsi_t_ckg_eb.common.hw, 1604 + [CLK_SENSOR0_EB] = &sensor0_eb.common.hw, 1605 + [CLK_SENSOR1_EB] = &sensor1_eb.common.hw, 1606 + [CLK_SENSOR2_EB] = &sensor2_eb.common.hw, 1607 + [CLK_MCPHY_CFG_EB] = &mcphy_cfg_eb.common.hw, 1608 + }, 1609 + .num = CLK_MM_GATE_NUM, 1610 + }; 1611 + 1612 + static const struct sprd_clk_desc sc9863a_mm_gate_desc = { 1613 + .clk_clks = sc9863a_mm_gate_clks, 1614 + .num_clk_clks = ARRAY_SIZE(sc9863a_mm_gate_clks), 1615 + .hw_clks = &sc9863a_mm_gate_hws, 1616 + }; 1617 + 1618 + static SPRD_SC_GATE_CLK_FW_NAME(sim0_eb, "sim0-eb", "ext-26m", 0x0, 1619 + 0x1000, BIT(0), 0, 0); 1620 + static SPRD_SC_GATE_CLK_FW_NAME(iis0_eb, "iis0-eb", "ext-26m", 0x0, 1621 + 0x1000, BIT(1), 0, 0); 1622 + static SPRD_SC_GATE_CLK_FW_NAME(iis1_eb, "iis1-eb", "ext-26m", 0x0, 1623 + 0x1000, BIT(2), 0, 0); 1624 + static SPRD_SC_GATE_CLK_FW_NAME(iis2_eb, "iis2-eb", "ext-26m", 0x0, 1625 + 0x1000, BIT(3), 0, 0); 1626 + static SPRD_SC_GATE_CLK_FW_NAME(spi0_eb, "spi0-eb", "ext-26m", 0x0, 1627 + 0x1000, BIT(5), 0, 0); 1628 + static SPRD_SC_GATE_CLK_FW_NAME(spi1_eb, "spi1-eb", "ext-26m", 0x0, 1629 + 0x1000, BIT(6), 0, 0); 1630 + static SPRD_SC_GATE_CLK_FW_NAME(spi2_eb, "spi2-eb", "ext-26m", 0x0, 1631 + 0x1000, BIT(7), 0, 0); 1632 + static SPRD_SC_GATE_CLK_FW_NAME(i2c0_eb, "i2c0-eb", "ext-26m", 0x0, 1633 + 0x1000, BIT(8), 0, 0); 1634 + static SPRD_SC_GATE_CLK_FW_NAME(i2c1_eb, "i2c1-eb", "ext-26m", 0x0, 1635 + 0x1000, BIT(9), 0, 0); 1636 + static SPRD_SC_GATE_CLK_FW_NAME(i2c2_eb, "i2c2-eb", "ext-26m", 0x0, 1637 + 0x1000, BIT(10), 0, 0); 1638 + static SPRD_SC_GATE_CLK_FW_NAME(i2c3_eb, "i2c3-eb", "ext-26m", 0x0, 1639 + 0x1000, BIT(11), 0, 0); 1640 + static SPRD_SC_GATE_CLK_FW_NAME(i2c4_eb, "i2c4-eb", "ext-26m", 0x0, 1641 + 0x1000, BIT(12), 0, 0); 1642 + static SPRD_SC_GATE_CLK_FW_NAME(uart0_eb, "uart0-eb", "ext-26m", 0x0, 1643 + 0x1000, BIT(13), 0, 0); 1644 + static SPRD_SC_GATE_CLK_FW_NAME(uart1_eb, "uart1-eb", "ext-26m", 0x0, 1645 + 0x1000, BIT(14), 0, 0); 1646 + static SPRD_SC_GATE_CLK_FW_NAME(uart2_eb, "uart2-eb", "ext-26m", 0x0, 1647 + 0x1000, BIT(15), 0, 0); 1648 + static SPRD_SC_GATE_CLK_FW_NAME(uart3_eb, "uart3-eb", "ext-26m", 0x0, 1649 + 0x1000, BIT(16), 0, 0); 1650 + static SPRD_SC_GATE_CLK_FW_NAME(uart4_eb, "uart4-eb", "ext-26m", 0x0, 1651 + 0x1000, BIT(17), 0, 0); 1652 + static SPRD_SC_GATE_CLK_FW_NAME(sim0_32k_eb, "sim0_32k-eb", "ext-26m", 0x0, 1653 + 0x1000, BIT(18), 0, 0); 1654 + static SPRD_SC_GATE_CLK_FW_NAME(spi3_eb, "spi3-eb", "ext-26m", 0x0, 1655 + 0x1000, BIT(19), 0, 0); 1656 + static SPRD_SC_GATE_CLK_FW_NAME(i2c5_eb, "i2c5-eb", "ext-26m", 0x0, 1657 + 0x1000, BIT(20), 0, 0); 1658 + static SPRD_SC_GATE_CLK_FW_NAME(i2c6_eb, "i2c6-eb", "ext-26m", 0x0, 1659 + 0x1000, BIT(21), 0, 0); 1660 + 1661 + static struct sprd_clk_common *sc9863a_apapb_gate[] = { 1662 + /* address base is 0x71300000 */ 1663 + &sim0_eb.common, 1664 + &iis0_eb.common, 1665 + &iis1_eb.common, 1666 + &iis2_eb.common, 1667 + &spi0_eb.common, 1668 + &spi1_eb.common, 1669 + &spi2_eb.common, 1670 + &i2c0_eb.common, 1671 + &i2c1_eb.common, 1672 + &i2c2_eb.common, 1673 + &i2c3_eb.common, 1674 + &i2c4_eb.common, 1675 + &uart0_eb.common, 1676 + &uart1_eb.common, 1677 + &uart2_eb.common, 1678 + &uart3_eb.common, 1679 + &uart4_eb.common, 1680 + &sim0_32k_eb.common, 1681 + &spi3_eb.common, 1682 + &i2c5_eb.common, 1683 + &i2c6_eb.common, 1684 + }; 1685 + 1686 + static struct clk_hw_onecell_data sc9863a_apapb_gate_hws = { 1687 + .hws = { 1688 + [CLK_SIM0_EB] = &sim0_eb.common.hw, 1689 + [CLK_IIS0_EB] = &iis0_eb.common.hw, 1690 + [CLK_IIS1_EB] = &iis1_eb.common.hw, 1691 + [CLK_IIS2_EB] = &iis2_eb.common.hw, 1692 + [CLK_SPI0_EB] = &spi0_eb.common.hw, 1693 + [CLK_SPI1_EB] = &spi1_eb.common.hw, 1694 + [CLK_SPI2_EB] = &spi2_eb.common.hw, 1695 + [CLK_I2C0_EB] = &i2c0_eb.common.hw, 1696 + [CLK_I2C1_EB] = &i2c1_eb.common.hw, 1697 + [CLK_I2C2_EB] = &i2c2_eb.common.hw, 1698 + [CLK_I2C3_EB] = &i2c3_eb.common.hw, 1699 + [CLK_I2C4_EB] = &i2c4_eb.common.hw, 1700 + [CLK_UART0_EB] = &uart0_eb.common.hw, 1701 + [CLK_UART1_EB] = &uart1_eb.common.hw, 1702 + [CLK_UART2_EB] = &uart2_eb.common.hw, 1703 + [CLK_UART3_EB] = &uart3_eb.common.hw, 1704 + [CLK_UART4_EB] = &uart4_eb.common.hw, 1705 + [CLK_SIM0_32K_EB] = &sim0_32k_eb.common.hw, 1706 + [CLK_SPI3_EB] = &spi3_eb.common.hw, 1707 + [CLK_I2C5_EB] = &i2c5_eb.common.hw, 1708 + [CLK_I2C6_EB] = &i2c6_eb.common.hw, 1709 + }, 1710 + .num = CLK_AP_APB_GATE_NUM, 1711 + }; 1712 + 1713 + static const struct sprd_clk_desc sc9863a_apapb_gate_desc = { 1714 + .clk_clks = sc9863a_apapb_gate, 1715 + .num_clk_clks = ARRAY_SIZE(sc9863a_apapb_gate), 1716 + .hw_clks = &sc9863a_apapb_gate_hws, 1717 + }; 1718 + 1719 + static const struct of_device_id sprd_sc9863a_clk_ids[] = { 1720 + { .compatible = "sprd,sc9863a-ap-clk", /* 0x21500000 */ 1721 + .data = &sc9863a_ap_clk_desc }, 1722 + { .compatible = "sprd,sc9863a-pmu-gate", /* 0x402b0000 */ 1723 + .data = &sc9863a_pmu_gate_desc }, 1724 + { .compatible = "sprd,sc9863a-pll", /* 0x40353000 */ 1725 + .data = &sc9863a_pll_desc }, 1726 + { .compatible = "sprd,sc9863a-mpll", /* 0x40359000 */ 1727 + .data = &sc9863a_mpll_desc }, 1728 + { .compatible = "sprd,sc9863a-rpll", /* 0x4035c000 */ 1729 + .data = &sc9863a_rpll_desc }, 1730 + { .compatible = "sprd,sc9863a-dpll", /* 0x40363000 */ 1731 + .data = &sc9863a_dpll_desc }, 1732 + { .compatible = "sprd,sc9863a-aon-clk", /* 0x402d0000 */ 1733 + .data = &sc9863a_aon_clk_desc }, 1734 + { .compatible = "sprd,sc9863a-apahb-gate", /* 0x20e00000 */ 1735 + .data = &sc9863a_apahb_gate_desc }, 1736 + { .compatible = "sprd,sc9863a-aonapb-gate", /* 0x402e0000 */ 1737 + .data = &sc9863a_aonapb_gate_desc }, 1738 + { .compatible = "sprd,sc9863a-mm-gate", /* 0x60800000 */ 1739 + .data = &sc9863a_mm_gate_desc }, 1740 + { .compatible = "sprd,sc9863a-apapb-gate", /* 0x71300000 */ 1741 + .data = &sc9863a_apapb_gate_desc }, 1742 + { } 1743 + }; 1744 + MODULE_DEVICE_TABLE(of, sprd_sc9863a_clk_ids); 1745 + 1746 + static int sc9863a_clk_probe(struct platform_device *pdev) 1747 + { 1748 + const struct sprd_clk_desc *desc; 1749 + int ret; 1750 + 1751 + desc = device_get_match_data(&pdev->dev); 1752 + if (!desc) 1753 + return -ENODEV; 1754 + 1755 + ret = sprd_clk_regmap_init(pdev, desc); 1756 + if (ret) 1757 + return ret; 1758 + 1759 + return sprd_clk_probe(&pdev->dev, desc->hw_clks); 1760 + } 1761 + 1762 + static struct platform_driver sc9863a_clk_driver = { 1763 + .probe = sc9863a_clk_probe, 1764 + .driver = { 1765 + .name = "sc9863a-clk", 1766 + .of_match_table = sprd_sc9863a_clk_ids, 1767 + }, 1768 + }; 1769 + module_platform_driver(sc9863a_clk_driver); 1770 + 1771 + MODULE_DESCRIPTION("Spreadtrum SC9863A Clock Driver"); 1772 + MODULE_LICENSE("GPL v2");
-4
drivers/clk/sunxi-ng/ccu-sun50i-a64.h
··· 55 55 56 56 /* All the DRAM gates are exported */ 57 57 58 - /* Some more module clocks are exported */ 59 - 60 - #define CLK_MBUS 112 61 - 62 58 /* And the DSI and GPU module clock is exported */ 63 59 64 60 #define CLK_NUMBER (CLK_GPU + 1)
+80 -47
drivers/clk/sunxi-ng/ccu-sun8i-de2.c
··· 50 50 CLK_SET_RATE_PARENT); 51 51 static SUNXI_CCU_M(wb_div_a83_clk, "wb-div", "pll-de", 0x0c, 8, 4, 52 52 CLK_SET_RATE_PARENT); 53 - 54 - static struct ccu_common *sun50i_h6_de3_clks[] = { 55 - &mixer0_clk.common, 56 - &mixer1_clk.common, 57 - &wb_clk.common, 58 - 59 - &bus_mixer0_clk.common, 60 - &bus_mixer1_clk.common, 61 - &bus_wb_clk.common, 62 - 63 - &mixer0_div_clk.common, 64 - &mixer1_div_clk.common, 65 - &wb_div_clk.common, 66 - 67 - &bus_rot_clk.common, 68 - &rot_clk.common, 69 - &rot_div_clk.common, 70 - }; 53 + static SUNXI_CCU_M(rot_div_a83_clk, "rot-div", "pll-de", 0x0c, 0x0c, 4, 54 + CLK_SET_RATE_PARENT); 71 55 72 56 static struct ccu_common *sun8i_a83t_de2_clks[] = { 73 57 &mixer0_clk.common, ··· 65 81 &mixer0_div_a83_clk.common, 66 82 &mixer1_div_a83_clk.common, 67 83 &wb_div_a83_clk.common, 84 + 85 + &bus_rot_clk.common, 86 + &rot_clk.common, 87 + &rot_div_a83_clk.common, 68 88 }; 69 89 70 90 static struct ccu_common *sun8i_h3_de2_clks[] = { ··· 96 108 &wb_div_clk.common, 97 109 }; 98 110 111 + static struct ccu_common *sun50i_a64_de2_clks[] = { 112 + &mixer0_clk.common, 113 + &mixer1_clk.common, 114 + &wb_clk.common, 115 + 116 + &bus_mixer0_clk.common, 117 + &bus_mixer1_clk.common, 118 + &bus_wb_clk.common, 119 + 120 + &mixer0_div_clk.common, 121 + &mixer1_div_clk.common, 122 + &wb_div_clk.common, 123 + 124 + &bus_rot_clk.common, 125 + &rot_clk.common, 126 + &rot_div_clk.common, 127 + }; 128 + 99 129 static struct clk_hw_onecell_data sun8i_a83t_de2_hw_clks = { 100 130 .hws = { 101 131 [CLK_MIXER0] = &mixer0_clk.common.hw, 102 132 [CLK_MIXER1] = &mixer1_clk.common.hw, 103 133 [CLK_WB] = &wb_clk.common.hw, 134 + [CLK_ROT] = &rot_clk.common.hw, 104 135 105 136 [CLK_BUS_MIXER0] = &bus_mixer0_clk.common.hw, 106 137 [CLK_BUS_MIXER1] = &bus_mixer1_clk.common.hw, 107 138 [CLK_BUS_WB] = &bus_wb_clk.common.hw, 139 + [CLK_BUS_ROT] = &bus_rot_clk.common.hw, 108 140 109 141 [CLK_MIXER0_DIV] = &mixer0_div_a83_clk.common.hw, 110 142 [CLK_MIXER1_DIV] = &mixer1_div_a83_clk.common.hw, 111 143 [CLK_WB_DIV] = &wb_div_a83_clk.common.hw, 144 + [CLK_ROT_DIV] = &rot_div_a83_clk.common.hw, 112 145 }, 113 - .num = CLK_NUMBER_WITHOUT_ROT, 146 + .num = CLK_NUMBER_WITH_ROT, 114 147 }; 115 148 116 149 static struct clk_hw_onecell_data sun8i_h3_de2_hw_clks = { ··· 165 156 .num = CLK_NUMBER_WITHOUT_ROT, 166 157 }; 167 158 168 - static struct clk_hw_onecell_data sun50i_h6_de3_hw_clks = { 159 + static struct clk_hw_onecell_data sun50i_a64_de2_hw_clks = { 169 160 .hws = { 170 161 [CLK_MIXER0] = &mixer0_clk.common.hw, 171 162 [CLK_MIXER1] = &mixer1_clk.common.hw, ··· 188 179 static struct ccu_reset_map sun8i_a83t_de2_resets[] = { 189 180 [RST_MIXER0] = { 0x08, BIT(0) }, 190 181 /* 191 - * For A83T, H3 and R40, mixer1 reset line is shared with wb, so 192 - * only RST_WB is exported here. 193 - * For V3s there's just no mixer1, so it also shares this struct. 182 + * Mixer1 reset line is shared with wb, so only RST_WB is 183 + * exported here. 184 + */ 185 + [RST_WB] = { 0x08, BIT(2) }, 186 + [RST_ROT] = { 0x08, BIT(3) }, 187 + }; 188 + 189 + static struct ccu_reset_map sun8i_h3_de2_resets[] = { 190 + [RST_MIXER0] = { 0x08, BIT(0) }, 191 + /* 192 + * Mixer1 reset line is shared with wb, so only RST_WB is 193 + * exported here. 194 + * V3s doesn't have mixer1, so it also shares this struct. 194 195 */ 195 196 [RST_WB] = { 0x08, BIT(2) }, 196 197 }; ··· 209 190 [RST_MIXER0] = { 0x08, BIT(0) }, 210 191 [RST_MIXER1] = { 0x08, BIT(1) }, 211 192 [RST_WB] = { 0x08, BIT(2) }, 193 + [RST_ROT] = { 0x08, BIT(3) }, 212 194 }; 213 195 214 - static struct ccu_reset_map sun50i_h6_de3_resets[] = { 196 + static struct ccu_reset_map sun50i_h5_de2_resets[] = { 215 197 [RST_MIXER0] = { 0x08, BIT(0) }, 216 198 [RST_MIXER1] = { 0x08, BIT(1) }, 217 199 [RST_WB] = { 0x08, BIT(2) }, 218 - [RST_ROT] = { 0x08, BIT(3) }, 219 200 }; 220 201 221 202 static const struct sunxi_ccu_desc sun8i_a83t_de2_clk_desc = { ··· 234 215 235 216 .hw_clks = &sun8i_h3_de2_hw_clks, 236 217 218 + .resets = sun8i_h3_de2_resets, 219 + .num_resets = ARRAY_SIZE(sun8i_h3_de2_resets), 220 + }; 221 + 222 + static const struct sunxi_ccu_desc sun8i_r40_de2_clk_desc = { 223 + .ccu_clks = sun50i_a64_de2_clks, 224 + .num_ccu_clks = ARRAY_SIZE(sun50i_a64_de2_clks), 225 + 226 + .hw_clks = &sun50i_a64_de2_hw_clks, 227 + 237 228 .resets = sun8i_a83t_de2_resets, 238 229 .num_resets = ARRAY_SIZE(sun8i_a83t_de2_resets), 239 - }; 240 - 241 - static const struct sunxi_ccu_desc sun50i_a64_de2_clk_desc = { 242 - .ccu_clks = sun8i_h3_de2_clks, 243 - .num_ccu_clks = ARRAY_SIZE(sun8i_h3_de2_clks), 244 - 245 - .hw_clks = &sun8i_h3_de2_hw_clks, 246 - 247 - .resets = sun50i_a64_de2_resets, 248 - .num_resets = ARRAY_SIZE(sun50i_a64_de2_resets), 249 - }; 250 - 251 - static const struct sunxi_ccu_desc sun50i_h6_de3_clk_desc = { 252 - .ccu_clks = sun50i_h6_de3_clks, 253 - .num_ccu_clks = ARRAY_SIZE(sun50i_h6_de3_clks), 254 - 255 - .hw_clks = &sun50i_h6_de3_hw_clks, 256 - 257 - .resets = sun50i_h6_de3_resets, 258 - .num_resets = ARRAY_SIZE(sun50i_h6_de3_resets), 259 230 }; 260 231 261 232 static const struct sunxi_ccu_desc sun8i_v3s_de2_clk_desc = { ··· 256 247 257 248 .resets = sun8i_a83t_de2_resets, 258 249 .num_resets = ARRAY_SIZE(sun8i_a83t_de2_resets), 250 + }; 251 + 252 + static const struct sunxi_ccu_desc sun50i_a64_de2_clk_desc = { 253 + .ccu_clks = sun50i_a64_de2_clks, 254 + .num_ccu_clks = ARRAY_SIZE(sun50i_a64_de2_clks), 255 + 256 + .hw_clks = &sun50i_a64_de2_hw_clks, 257 + 258 + .resets = sun50i_a64_de2_resets, 259 + .num_resets = ARRAY_SIZE(sun50i_a64_de2_resets), 260 + }; 261 + 262 + static const struct sunxi_ccu_desc sun50i_h5_de2_clk_desc = { 263 + .ccu_clks = sun8i_h3_de2_clks, 264 + .num_ccu_clks = ARRAY_SIZE(sun8i_h3_de2_clks), 265 + 266 + .hw_clks = &sun8i_h3_de2_hw_clks, 267 + 268 + .resets = sun50i_h5_de2_resets, 269 + .num_resets = ARRAY_SIZE(sun50i_h5_de2_resets), 259 270 }; 260 271 261 272 static int sunxi_de2_clk_probe(struct platform_device *pdev) ··· 367 338 .data = &sun8i_h3_de2_clk_desc, 368 339 }, 369 340 { 341 + .compatible = "allwinner,sun8i-r40-de2-clk", 342 + .data = &sun8i_r40_de2_clk_desc, 343 + }, 344 + { 370 345 .compatible = "allwinner,sun8i-v3s-de2-clk", 371 346 .data = &sun8i_v3s_de2_clk_desc, 372 347 }, ··· 380 347 }, 381 348 { 382 349 .compatible = "allwinner,sun50i-h5-de2-clk", 383 - .data = &sun50i_a64_de2_clk_desc, 350 + .data = &sun50i_h5_de2_clk_desc, 384 351 }, 385 352 { 386 353 .compatible = "allwinner,sun50i-h6-de3-clk", 387 - .data = &sun50i_h6_de3_clk_desc, 354 + .data = &sun50i_h5_de2_clk_desc, 388 355 }, 389 356 { } 390 357 };
-1
drivers/clk/tegra/Makefile
··· 12 12 obj-y += clk-super.o 13 13 obj-y += clk-tegra-audio.o 14 14 obj-y += clk-tegra-periph.o 15 - obj-y += clk-tegra-pmc.o 16 15 obj-y += clk-tegra-fixed.o 17 16 obj-y += clk-tegra-super-gen4.o 18 17 obj-$(CONFIG_TEGRA_CLK_EMC) += clk-emc.o
+3 -9
drivers/clk/tegra/clk-id.h
··· 32 32 tegra_clk_audio4, 33 33 tegra_clk_audio4_2x, 34 34 tegra_clk_audio4_mux, 35 - tegra_clk_blink, 36 35 tegra_clk_bsea, 37 36 tegra_clk_bsev, 38 37 tegra_clk_cclk_g, ··· 43 44 tegra_clk_clk72Mhz, 44 45 tegra_clk_clk72Mhz_8, 45 46 tegra_clk_clk_m, 46 - tegra_clk_clk_m_div2, 47 - tegra_clk_clk_m_div4, 48 - tegra_clk_clk_out_1, 49 - tegra_clk_clk_out_1_mux, 50 - tegra_clk_clk_out_2, 51 - tegra_clk_clk_out_2_mux, 52 - tegra_clk_clk_out_3, 53 - tegra_clk_clk_out_3_mux, 47 + tegra_clk_osc, 48 + tegra_clk_osc_div2, 49 + tegra_clk_osc_div4, 54 50 tegra_clk_cml0, 55 51 tegra_clk_cml1, 56 52 tegra_clk_csi,
+21 -16
drivers/clk/tegra/clk-tegra-fixed.c
··· 46 46 return -EINVAL; 47 47 } 48 48 49 + dt_clk = tegra_lookup_dt_id(tegra_clk_osc, clks); 50 + if (!dt_clk) 51 + return 0; 52 + 49 53 osc = clk_register_fixed_rate(NULL, "osc", NULL, 0, *osc_freq); 54 + *dt_clk = osc; 55 + 56 + /* osc_div2 */ 57 + dt_clk = tegra_lookup_dt_id(tegra_clk_osc_div2, clks); 58 + if (dt_clk) { 59 + clk = clk_register_fixed_factor(NULL, "osc_div2", "osc", 60 + 0, 1, 2); 61 + *dt_clk = clk; 62 + } 63 + 64 + /* osc_div4 */ 65 + dt_clk = tegra_lookup_dt_id(tegra_clk_osc_div4, clks); 66 + if (dt_clk) { 67 + clk = clk_register_fixed_factor(NULL, "osc_div4", "osc", 68 + 0, 1, 4); 69 + *dt_clk = clk; 70 + } 50 71 51 72 dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m, clks); 52 73 if (!dt_clk) ··· 103 82 dt_clk = tegra_lookup_dt_id(tegra_clk_clk_32k, tegra_clks); 104 83 if (dt_clk) { 105 84 clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, 0, 32768); 106 - *dt_clk = clk; 107 - } 108 - 109 - /* clk_m_div2 */ 110 - dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m_div2, tegra_clks); 111 - if (dt_clk) { 112 - clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m", 113 - CLK_SET_RATE_PARENT, 1, 2); 114 - *dt_clk = clk; 115 - } 116 - 117 - /* clk_m_div4 */ 118 - dt_clk = tegra_lookup_dt_id(tegra_clk_clk_m_div4, tegra_clks); 119 - if (dt_clk) { 120 - clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m", 121 - CLK_SET_RATE_PARENT, 1, 4); 122 85 *dt_clk = clk; 123 86 } 124 87 }
-122
drivers/clk/tegra/clk-tegra-pmc.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * Copyright (c) 2012, 2013, NVIDIA CORPORATION. All rights reserved. 4 - */ 5 - 6 - #include <linux/io.h> 7 - #include <linux/clk-provider.h> 8 - #include <linux/clkdev.h> 9 - #include <linux/of.h> 10 - #include <linux/of_address.h> 11 - #include <linux/delay.h> 12 - #include <linux/export.h> 13 - #include <linux/clk/tegra.h> 14 - 15 - #include "clk.h" 16 - #include "clk-id.h" 17 - 18 - #define PMC_CLK_OUT_CNTRL 0x1a8 19 - #define PMC_DPD_PADS_ORIDE 0x1c 20 - #define PMC_DPD_PADS_ORIDE_BLINK_ENB 20 21 - #define PMC_CTRL 0 22 - #define PMC_CTRL_BLINK_ENB 7 23 - #define PMC_BLINK_TIMER 0x40 24 - 25 - struct pmc_clk_init_data { 26 - char *mux_name; 27 - char *gate_name; 28 - const char **parents; 29 - int num_parents; 30 - int mux_id; 31 - int gate_id; 32 - char *dev_name; 33 - u8 mux_shift; 34 - u8 gate_shift; 35 - }; 36 - 37 - #define PMC_CLK(_num, _mux_shift, _gate_shift)\ 38 - {\ 39 - .mux_name = "clk_out_" #_num "_mux",\ 40 - .gate_name = "clk_out_" #_num,\ 41 - .parents = clk_out ##_num ##_parents,\ 42 - .num_parents = ARRAY_SIZE(clk_out ##_num ##_parents),\ 43 - .mux_id = tegra_clk_clk_out_ ##_num ##_mux,\ 44 - .gate_id = tegra_clk_clk_out_ ##_num,\ 45 - .dev_name = "extern" #_num,\ 46 - .mux_shift = _mux_shift,\ 47 - .gate_shift = _gate_shift,\ 48 - } 49 - 50 - static DEFINE_SPINLOCK(clk_out_lock); 51 - 52 - static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2", 53 - "clk_m_div4", "extern1", 54 - }; 55 - 56 - static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2", 57 - "clk_m_div4", "extern2", 58 - }; 59 - 60 - static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2", 61 - "clk_m_div4", "extern3", 62 - }; 63 - 64 - static struct pmc_clk_init_data pmc_clks[] = { 65 - PMC_CLK(1, 6, 2), 66 - PMC_CLK(2, 14, 10), 67 - PMC_CLK(3, 22, 18), 68 - }; 69 - 70 - void __init tegra_pmc_clk_init(void __iomem *pmc_base, 71 - struct tegra_clk *tegra_clks) 72 - { 73 - struct clk *clk; 74 - struct clk **dt_clk; 75 - int i; 76 - 77 - for (i = 0; i < ARRAY_SIZE(pmc_clks); i++) { 78 - struct pmc_clk_init_data *data; 79 - 80 - data = pmc_clks + i; 81 - 82 - dt_clk = tegra_lookup_dt_id(data->mux_id, tegra_clks); 83 - if (!dt_clk) 84 - continue; 85 - 86 - clk = clk_register_mux(NULL, data->mux_name, data->parents, 87 - data->num_parents, 88 - CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, 89 - pmc_base + PMC_CLK_OUT_CNTRL, data->mux_shift, 90 - 3, 0, &clk_out_lock); 91 - *dt_clk = clk; 92 - 93 - 94 - dt_clk = tegra_lookup_dt_id(data->gate_id, tegra_clks); 95 - if (!dt_clk) 96 - continue; 97 - 98 - clk = clk_register_gate(NULL, data->gate_name, data->mux_name, 99 - CLK_SET_RATE_PARENT, 100 - pmc_base + PMC_CLK_OUT_CNTRL, 101 - data->gate_shift, 0, &clk_out_lock); 102 - *dt_clk = clk; 103 - clk_register_clkdev(clk, data->dev_name, data->gate_name); 104 - } 105 - 106 - /* blink */ 107 - writel_relaxed(0, pmc_base + PMC_BLINK_TIMER); 108 - clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0, 109 - pmc_base + PMC_DPD_PADS_ORIDE, 110 - PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL); 111 - 112 - dt_clk = tegra_lookup_dt_id(tegra_clk_blink, tegra_clks); 113 - if (!dt_clk) 114 - return; 115 - 116 - clk = clk_register_gate(NULL, "blink", "blink_override", 0, 117 - pmc_base + PMC_CTRL, 118 - PMC_CTRL_BLINK_ENB, 0, NULL); 119 - clk_register_clkdev(clk, "blink", NULL); 120 - *dt_clk = clk; 121 - } 122 -
+11 -32
drivers/clk/tegra/clk-tegra114.c
··· 735 735 [tegra_clk_fuse_burn] = { .dt_id = TEGRA114_CLK_FUSE_BURN, .present = true }, 736 736 [tegra_clk_clk_32k] = { .dt_id = TEGRA114_CLK_CLK_32K, .present = true }, 737 737 [tegra_clk_clk_m] = { .dt_id = TEGRA114_CLK_CLK_M, .present = true }, 738 - [tegra_clk_clk_m_div2] = { .dt_id = TEGRA114_CLK_CLK_M_DIV2, .present = true }, 739 - [tegra_clk_clk_m_div4] = { .dt_id = TEGRA114_CLK_CLK_M_DIV4, .present = true }, 738 + [tegra_clk_osc] = { .dt_id = TEGRA114_CLK_OSC, .present = true }, 739 + [tegra_clk_osc_div2] = { .dt_id = TEGRA114_CLK_OSC_DIV2, .present = true }, 740 + [tegra_clk_osc_div4] = { .dt_id = TEGRA114_CLK_OSC_DIV4, .present = true }, 740 741 [tegra_clk_pll_ref] = { .dt_id = TEGRA114_CLK_PLL_REF, .present = true }, 741 742 [tegra_clk_pll_c] = { .dt_id = TEGRA114_CLK_PLL_C, .present = true }, 742 743 [tegra_clk_pll_c_out1] = { .dt_id = TEGRA114_CLK_PLL_C_OUT1, .present = true }, ··· 779 778 [tegra_clk_audio3] = { .dt_id = TEGRA114_CLK_AUDIO3, .present = true }, 780 779 [tegra_clk_audio4] = { .dt_id = TEGRA114_CLK_AUDIO4, .present = true }, 781 780 [tegra_clk_spdif] = { .dt_id = TEGRA114_CLK_SPDIF, .present = true }, 782 - [tegra_clk_clk_out_1] = { .dt_id = TEGRA114_CLK_CLK_OUT_1, .present = true }, 783 - [tegra_clk_clk_out_2] = { .dt_id = TEGRA114_CLK_CLK_OUT_2, .present = true }, 784 - [tegra_clk_clk_out_3] = { .dt_id = TEGRA114_CLK_CLK_OUT_3, .present = true }, 785 - [tegra_clk_blink] = { .dt_id = TEGRA114_CLK_BLINK, .present = true }, 786 781 [tegra_clk_xusb_host_src] = { .dt_id = TEGRA114_CLK_XUSB_HOST_SRC, .present = true }, 787 782 [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA114_CLK_XUSB_FALCON_SRC, .present = true }, 788 783 [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA114_CLK_XUSB_FS_SRC, .present = true }, ··· 800 803 [tegra_clk_audio3_mux] = { .dt_id = TEGRA114_CLK_AUDIO3_MUX, .present = true }, 801 804 [tegra_clk_audio4_mux] = { .dt_id = TEGRA114_CLK_AUDIO4_MUX, .present = true }, 802 805 [tegra_clk_spdif_mux] = { .dt_id = TEGRA114_CLK_SPDIF_MUX, .present = true }, 803 - [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_1_MUX, .present = true }, 804 - [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_2_MUX, .present = true }, 805 - [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_3_MUX, .present = true }, 806 806 [tegra_clk_dsia_mux] = { .dt_id = TEGRA114_CLK_DSIA_MUX, .present = true }, 807 807 [tegra_clk_dsib_mux] = { .dt_id = TEGRA114_CLK_DSIB_MUX, .present = true }, 808 808 [tegra_clk_cec] = { .dt_id = TEGRA114_CLK_CEC, .present = true }, ··· 809 815 { .con_id = "clk_m", .dt_id = TEGRA114_CLK_CLK_M }, 810 816 { .con_id = "pll_ref", .dt_id = TEGRA114_CLK_PLL_REF }, 811 817 { .con_id = "clk_32k", .dt_id = TEGRA114_CLK_CLK_32K }, 812 - { .con_id = "clk_m_div2", .dt_id = TEGRA114_CLK_CLK_M_DIV2 }, 813 - { .con_id = "clk_m_div4", .dt_id = TEGRA114_CLK_CLK_M_DIV4 }, 818 + { .con_id = "osc", .dt_id = TEGRA114_CLK_OSC }, 819 + { .con_id = "osc_div2", .dt_id = TEGRA114_CLK_OSC_DIV2 }, 820 + { .con_id = "osc_div4", .dt_id = TEGRA114_CLK_OSC_DIV4 }, 814 821 { .con_id = "pll_c", .dt_id = TEGRA114_CLK_PLL_C }, 815 822 { .con_id = "pll_c_out1", .dt_id = TEGRA114_CLK_PLL_C_OUT1 }, 816 823 { .con_id = "pll_c2", .dt_id = TEGRA114_CLK_PLL_C2 }, ··· 858 863 { .con_id = "audio3_2x", .dt_id = TEGRA114_CLK_AUDIO3_2X }, 859 864 { .con_id = "audio4_2x", .dt_id = TEGRA114_CLK_AUDIO4_2X }, 860 865 { .con_id = "spdif_2x", .dt_id = TEGRA114_CLK_SPDIF_2X }, 861 - { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA114_CLK_EXTERN1 }, 862 - { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA114_CLK_EXTERN2 }, 863 - { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA114_CLK_EXTERN3 }, 864 - { .con_id = "blink", .dt_id = TEGRA114_CLK_BLINK }, 866 + { .con_id = "extern1", .dt_id = TEGRA114_CLK_EXTERN1 }, 867 + { .con_id = "extern2", .dt_id = TEGRA114_CLK_EXTERN2 }, 868 + { .con_id = "extern3", .dt_id = TEGRA114_CLK_EXTERN3 }, 865 869 { .con_id = "cclk_g", .dt_id = TEGRA114_CLK_CCLK_G }, 866 870 { .con_id = "cclk_lp", .dt_id = TEGRA114_CLK_CCLK_LP }, 867 871 { .con_id = "sclk", .dt_id = TEGRA114_CLK_SCLK }, ··· 894 900 /* clk_32k */ 895 901 clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, 0, 32768); 896 902 clks[TEGRA114_CLK_CLK_32K] = clk; 897 - 898 - /* clk_m_div2 */ 899 - clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m", 900 - CLK_SET_RATE_PARENT, 1, 2); 901 - clks[TEGRA114_CLK_CLK_M_DIV2] = clk; 902 - 903 - /* clk_m_div4 */ 904 - clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m", 905 - CLK_SET_RATE_PARENT, 1, 4); 906 - clks[TEGRA114_CLK_CLK_M_DIV4] = clk; 907 - 908 903 } 909 904 910 905 static void __init tegra114_pll_init(void __iomem *clk_base, ··· 1136 1153 { TEGRA114_CLK_UARTB, TEGRA114_CLK_PLL_P, 408000000, 0 }, 1137 1154 { TEGRA114_CLK_UARTC, TEGRA114_CLK_PLL_P, 408000000, 0 }, 1138 1155 { TEGRA114_CLK_UARTD, TEGRA114_CLK_PLL_P, 408000000, 0 }, 1139 - { TEGRA114_CLK_PLL_A, TEGRA114_CLK_CLK_MAX, 564480000, 1 }, 1140 - { TEGRA114_CLK_PLL_A_OUT0, TEGRA114_CLK_CLK_MAX, 11289600, 1 }, 1141 - { TEGRA114_CLK_EXTERN1, TEGRA114_CLK_PLL_A_OUT0, 0, 1 }, 1142 - { TEGRA114_CLK_CLK_OUT_1_MUX, TEGRA114_CLK_EXTERN1, 0, 1 }, 1143 - { TEGRA114_CLK_CLK_OUT_1, TEGRA114_CLK_CLK_MAX, 0, 1 }, 1156 + { TEGRA114_CLK_PLL_A, TEGRA114_CLK_CLK_MAX, 564480000, 0 }, 1157 + { TEGRA114_CLK_PLL_A_OUT0, TEGRA114_CLK_CLK_MAX, 11289600, 0 }, 1144 1158 { TEGRA114_CLK_I2S0, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 }, 1145 1159 { TEGRA114_CLK_I2S1, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 }, 1146 1160 { TEGRA114_CLK_I2S2, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 }, ··· 1339 1359 tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks, 1340 1360 tegra114_audio_plls, 1341 1361 ARRAY_SIZE(tegra114_audio_plls), 24000000); 1342 - tegra_pmc_clk_init(pmc_base, tegra114_clks); 1343 1362 tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks, 1344 1363 &pll_x_params); 1345 1364
+18 -30
drivers/clk/tegra/clk-tegra124.c
··· 860 860 [tegra_clk_fuse_burn] = { .dt_id = TEGRA124_CLK_FUSE_BURN, .present = true }, 861 861 [tegra_clk_clk_32k] = { .dt_id = TEGRA124_CLK_CLK_32K, .present = true }, 862 862 [tegra_clk_clk_m] = { .dt_id = TEGRA124_CLK_CLK_M, .present = true }, 863 - [tegra_clk_clk_m_div2] = { .dt_id = TEGRA124_CLK_CLK_M_DIV2, .present = true }, 864 - [tegra_clk_clk_m_div4] = { .dt_id = TEGRA124_CLK_CLK_M_DIV4, .present = true }, 863 + [tegra_clk_osc] = { .dt_id = TEGRA124_CLK_OSC, .present = true }, 864 + [tegra_clk_osc_div2] = { .dt_id = TEGRA124_CLK_OSC_DIV2, .present = true }, 865 + [tegra_clk_osc_div4] = { .dt_id = TEGRA124_CLK_OSC_DIV4, .present = true }, 865 866 [tegra_clk_pll_ref] = { .dt_id = TEGRA124_CLK_PLL_REF, .present = true }, 866 867 [tegra_clk_pll_c] = { .dt_id = TEGRA124_CLK_PLL_C, .present = true }, 867 868 [tegra_clk_pll_c_out1] = { .dt_id = TEGRA124_CLK_PLL_C_OUT1, .present = true }, ··· 903 902 [tegra_clk_audio3] = { .dt_id = TEGRA124_CLK_AUDIO3, .present = true }, 904 903 [tegra_clk_audio4] = { .dt_id = TEGRA124_CLK_AUDIO4, .present = true }, 905 904 [tegra_clk_spdif] = { .dt_id = TEGRA124_CLK_SPDIF, .present = true }, 906 - [tegra_clk_clk_out_1] = { .dt_id = TEGRA124_CLK_CLK_OUT_1, .present = true }, 907 - [tegra_clk_clk_out_2] = { .dt_id = TEGRA124_CLK_CLK_OUT_2, .present = true }, 908 - [tegra_clk_clk_out_3] = { .dt_id = TEGRA124_CLK_CLK_OUT_3, .present = true }, 909 - [tegra_clk_blink] = { .dt_id = TEGRA124_CLK_BLINK, .present = true }, 910 905 [tegra_clk_xusb_host_src] = { .dt_id = TEGRA124_CLK_XUSB_HOST_SRC, .present = true }, 911 906 [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA124_CLK_XUSB_FALCON_SRC, .present = true }, 912 907 [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA124_CLK_XUSB_FS_SRC, .present = true }, ··· 928 931 [tegra_clk_audio3_mux] = { .dt_id = TEGRA124_CLK_AUDIO3_MUX, .present = true }, 929 932 [tegra_clk_audio4_mux] = { .dt_id = TEGRA124_CLK_AUDIO4_MUX, .present = true }, 930 933 [tegra_clk_spdif_mux] = { .dt_id = TEGRA124_CLK_SPDIF_MUX, .present = true }, 931 - [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_1_MUX, .present = true }, 932 - [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_2_MUX, .present = true }, 933 - [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true }, 934 934 [tegra_clk_cec] = { .dt_id = TEGRA124_CLK_CEC, .present = true }, 935 935 }; 936 936 ··· 935 941 { .con_id = "clk_m", .dt_id = TEGRA124_CLK_CLK_M }, 936 942 { .con_id = "pll_ref", .dt_id = TEGRA124_CLK_PLL_REF }, 937 943 { .con_id = "clk_32k", .dt_id = TEGRA124_CLK_CLK_32K }, 938 - { .con_id = "clk_m_div2", .dt_id = TEGRA124_CLK_CLK_M_DIV2 }, 939 - { .con_id = "clk_m_div4", .dt_id = TEGRA124_CLK_CLK_M_DIV4 }, 944 + { .con_id = "osc", .dt_id = TEGRA124_CLK_OSC }, 945 + { .con_id = "osc_div2", .dt_id = TEGRA124_CLK_OSC_DIV2 }, 946 + { .con_id = "osc_div4", .dt_id = TEGRA124_CLK_OSC_DIV4 }, 940 947 { .con_id = "pll_c", .dt_id = TEGRA124_CLK_PLL_C }, 941 948 { .con_id = "pll_c_out1", .dt_id = TEGRA124_CLK_PLL_C_OUT1 }, 942 949 { .con_id = "pll_c2", .dt_id = TEGRA124_CLK_PLL_C2 }, ··· 983 988 { .con_id = "audio3_2x", .dt_id = TEGRA124_CLK_AUDIO3_2X }, 984 989 { .con_id = "audio4_2x", .dt_id = TEGRA124_CLK_AUDIO4_2X }, 985 990 { .con_id = "spdif_2x", .dt_id = TEGRA124_CLK_SPDIF_2X }, 986 - { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA124_CLK_EXTERN1 }, 987 - { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA124_CLK_EXTERN2 }, 988 - { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA124_CLK_EXTERN3 }, 989 - { .con_id = "blink", .dt_id = TEGRA124_CLK_BLINK }, 991 + { .con_id = "extern1", .dt_id = TEGRA124_CLK_EXTERN1 }, 992 + { .con_id = "extern2", .dt_id = TEGRA124_CLK_EXTERN2 }, 993 + { .con_id = "extern3", .dt_id = TEGRA124_CLK_EXTERN3 }, 990 994 { .con_id = "cclk_g", .dt_id = TEGRA124_CLK_CCLK_G }, 991 995 { .con_id = "cclk_lp", .dt_id = TEGRA124_CLK_CCLK_LP }, 992 996 { .con_id = "sclk", .dt_id = TEGRA124_CLK_SCLK }, ··· 1292 1298 { TEGRA124_CLK_UARTB, TEGRA124_CLK_PLL_P, 408000000, 0 }, 1293 1299 { TEGRA124_CLK_UARTC, TEGRA124_CLK_PLL_P, 408000000, 0 }, 1294 1300 { TEGRA124_CLK_UARTD, TEGRA124_CLK_PLL_P, 408000000, 0 }, 1295 - { TEGRA124_CLK_PLL_A, TEGRA124_CLK_CLK_MAX, 564480000, 1 }, 1296 - { TEGRA124_CLK_PLL_A_OUT0, TEGRA124_CLK_CLK_MAX, 11289600, 1 }, 1297 - { TEGRA124_CLK_EXTERN1, TEGRA124_CLK_PLL_A_OUT0, 0, 1 }, 1298 - { TEGRA124_CLK_CLK_OUT_1_MUX, TEGRA124_CLK_EXTERN1, 0, 1 }, 1299 - { TEGRA124_CLK_CLK_OUT_1, TEGRA124_CLK_CLK_MAX, 0, 1 }, 1301 + { TEGRA124_CLK_PLL_A, TEGRA124_CLK_CLK_MAX, 564480000, 0 }, 1302 + { TEGRA124_CLK_PLL_A_OUT0, TEGRA124_CLK_CLK_MAX, 11289600, 0 }, 1300 1303 { TEGRA124_CLK_I2S0, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 }, 1301 1304 { TEGRA124_CLK_I2S1, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 }, 1302 1305 { TEGRA124_CLK_I2S2, TEGRA124_CLK_PLL_A_OUT0, 11289600, 0 }, ··· 1448 1457 * tegra124_132_clock_init_pre - clock initialization preamble for T124/T132 1449 1458 * @np: struct device_node * of the DT node for the SoC CAR IP block 1450 1459 * 1451 - * Register most of the clocks controlled by the CAR IP block, along 1452 - * with a few clocks controlled by the PMC IP block. Everything in 1453 - * this function should be common to Tegra124 and Tegra132. XXX The 1454 - * PMC clock initialization should probably be moved to PMC-specific 1455 - * driver code. No return value. 1460 + * Register most of the clocks controlled by the CAR IP block. 1461 + * Everything in this function should be common to Tegra124 and Tegra132. 1462 + * No return value. 1456 1463 */ 1457 1464 static void __init tegra124_132_clock_init_pre(struct device_node *np) 1458 1465 { ··· 1493 1504 tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks, 1494 1505 tegra124_audio_plls, 1495 1506 ARRAY_SIZE(tegra124_audio_plls), 24576000); 1496 - tegra_pmc_clk_init(pmc_base, tegra124_clks); 1497 1507 1498 1508 /* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */ 1499 1509 plld_base = readl(clk_base + PLLD_BASE); ··· 1504 1516 * tegra124_132_clock_init_post - clock initialization postamble for T124/T132 1505 1517 * @np: struct device_node * of the DT node for the SoC CAR IP block 1506 1518 * 1507 - * Register most of the along with a few clocks controlled by the PMC 1508 - * IP block. Everything in this function should be common to Tegra124 1519 + * Register most of the clocks controlled by the CAR IP block. 1520 + * Everything in this function should be common to Tegra124 1509 1521 * and Tegra132. This function must be called after 1510 - * tegra124_132_clock_init_pre(), otherwise clk_base and pmc_base will 1511 - * not be set. No return value. 1522 + * tegra124_132_clock_init_pre(), otherwise clk_base will not be set. 1523 + * No return value. 1512 1524 */ 1513 1525 static void __init tegra124_132_clock_init_post(struct device_node *np) 1514 1526 {
+2 -7
drivers/clk/tegra/clk-tegra20.c
··· 458 458 { .con_id = "cdev1", .dt_id = TEGRA20_CLK_CDEV1 }, 459 459 { .con_id = "cdev2", .dt_id = TEGRA20_CLK_CDEV2 }, 460 460 { .con_id = "clk_32k", .dt_id = TEGRA20_CLK_CLK_32K }, 461 - { .con_id = "blink", .dt_id = TEGRA20_CLK_BLINK }, 462 461 { .con_id = "clk_m", .dt_id = TEGRA20_CLK_CLK_M }, 463 462 { .con_id = "pll_ref", .dt_id = TEGRA20_CLK_PLL_REF }, 464 463 { .dev_id = "tegra20-i2s.0", .dt_id = TEGRA20_CLK_I2S1 }, ··· 536 537 [tegra_clk_csi] = { .dt_id = TEGRA20_CLK_CSI, .present = true }, 537 538 [tegra_clk_isp] = { .dt_id = TEGRA20_CLK_ISP, .present = true }, 538 539 [tegra_clk_clk_32k] = { .dt_id = TEGRA20_CLK_CLK_32K, .present = true }, 539 - [tegra_clk_blink] = { .dt_id = TEGRA20_CLK_BLINK, .present = true }, 540 540 [tegra_clk_hclk] = { .dt_id = TEGRA20_CLK_HCLK, .present = true }, 541 541 [tegra_clk_pclk] = { .dt_id = TEGRA20_CLK_PCLK, .present = true }, 542 542 [tegra_clk_pll_p_out1] = { .dt_id = TEGRA20_CLK_PLL_P_OUT1, .present = true }, ··· 1029 1031 { TEGRA20_CLK_UARTC, TEGRA20_CLK_PLL_P, 0, 0 }, 1030 1032 { TEGRA20_CLK_UARTD, TEGRA20_CLK_PLL_P, 0, 0 }, 1031 1033 { TEGRA20_CLK_UARTE, TEGRA20_CLK_PLL_P, 0, 0 }, 1032 - { TEGRA20_CLK_PLL_A, TEGRA20_CLK_CLK_MAX, 56448000, 1 }, 1033 - { TEGRA20_CLK_PLL_A_OUT0, TEGRA20_CLK_CLK_MAX, 11289600, 1 }, 1034 - { TEGRA20_CLK_CDEV1, TEGRA20_CLK_CLK_MAX, 0, 1 }, 1035 - { TEGRA20_CLK_BLINK, TEGRA20_CLK_CLK_MAX, 32768, 1 }, 1034 + { TEGRA20_CLK_PLL_A, TEGRA20_CLK_CLK_MAX, 56448000, 0 }, 1035 + { TEGRA20_CLK_PLL_A_OUT0, TEGRA20_CLK_CLK_MAX, 11289600, 0 }, 1036 1036 { TEGRA20_CLK_I2S1, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0 }, 1037 1037 { TEGRA20_CLK_I2S2, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0 }, 1038 1038 { TEGRA20_CLK_SDMMC1, TEGRA20_CLK_PLL_P, 48000000, 0 }, ··· 1142 1146 tegra_super_clk_gen4_init(clk_base, pmc_base, tegra20_clks, NULL); 1143 1147 tegra20_periph_clk_init(); 1144 1148 tegra20_audio_clk_init(); 1145 - tegra_pmc_clk_init(pmc_base, tegra20_clks); 1146 1149 1147 1150 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA20_CLK_CLK_MAX); 1148 1151
+12 -22
drivers/clk/tegra/clk-tegra210.c
··· 2371 2371 [tegra_clk_fuse_burn] = { .dt_id = TEGRA210_CLK_FUSE_BURN, .present = true }, 2372 2372 [tegra_clk_clk_32k] = { .dt_id = TEGRA210_CLK_CLK_32K, .present = true }, 2373 2373 [tegra_clk_clk_m] = { .dt_id = TEGRA210_CLK_CLK_M, .present = true }, 2374 - [tegra_clk_clk_m_div2] = { .dt_id = TEGRA210_CLK_CLK_M_DIV2, .present = true }, 2375 - [tegra_clk_clk_m_div4] = { .dt_id = TEGRA210_CLK_CLK_M_DIV4, .present = true }, 2374 + [tegra_clk_osc] = { .dt_id = TEGRA210_CLK_OSC, .present = true }, 2375 + [tegra_clk_osc_div2] = { .dt_id = TEGRA210_CLK_OSC_DIV2, .present = true }, 2376 + [tegra_clk_osc_div4] = { .dt_id = TEGRA210_CLK_OSC_DIV4, .present = true }, 2376 2377 [tegra_clk_pll_ref] = { .dt_id = TEGRA210_CLK_PLL_REF, .present = true }, 2377 2378 [tegra_clk_pll_c] = { .dt_id = TEGRA210_CLK_PLL_C, .present = true }, 2378 2379 [tegra_clk_pll_c_out1] = { .dt_id = TEGRA210_CLK_PLL_C_OUT1, .present = true }, ··· 2418 2417 [tegra_clk_audio3] = { .dt_id = TEGRA210_CLK_AUDIO3, .present = true }, 2419 2418 [tegra_clk_audio4] = { .dt_id = TEGRA210_CLK_AUDIO4, .present = true }, 2420 2419 [tegra_clk_spdif] = { .dt_id = TEGRA210_CLK_SPDIF, .present = true }, 2421 - [tegra_clk_clk_out_1] = { .dt_id = TEGRA210_CLK_CLK_OUT_1, .present = true }, 2422 - [tegra_clk_clk_out_2] = { .dt_id = TEGRA210_CLK_CLK_OUT_2, .present = true }, 2423 - [tegra_clk_clk_out_3] = { .dt_id = TEGRA210_CLK_CLK_OUT_3, .present = true }, 2424 - [tegra_clk_blink] = { .dt_id = TEGRA210_CLK_BLINK, .present = true }, 2425 2420 [tegra_clk_xusb_gate] = { .dt_id = TEGRA210_CLK_XUSB_GATE, .present = true }, 2426 2421 [tegra_clk_xusb_host_src_8] = { .dt_id = TEGRA210_CLK_XUSB_HOST_SRC, .present = true }, 2427 2422 [tegra_clk_xusb_falcon_src_8] = { .dt_id = TEGRA210_CLK_XUSB_FALCON_SRC, .present = true }, ··· 2449 2452 [tegra_clk_audio3_mux] = { .dt_id = TEGRA210_CLK_AUDIO3_MUX, .present = true }, 2450 2453 [tegra_clk_audio4_mux] = { .dt_id = TEGRA210_CLK_AUDIO4_MUX, .present = true }, 2451 2454 [tegra_clk_spdif_mux] = { .dt_id = TEGRA210_CLK_SPDIF_MUX, .present = true }, 2452 - [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA210_CLK_CLK_OUT_1_MUX, .present = true }, 2453 - [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA210_CLK_CLK_OUT_2_MUX, .present = true }, 2454 - [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA210_CLK_CLK_OUT_3_MUX, .present = true }, 2455 2455 [tegra_clk_maud] = { .dt_id = TEGRA210_CLK_MAUD, .present = true }, 2456 2456 [tegra_clk_mipibif] = { .dt_id = TEGRA210_CLK_MIPIBIF, .present = true }, 2457 2457 [tegra_clk_qspi] = { .dt_id = TEGRA210_CLK_QSPI, .present = true }, ··· 2491 2497 { .con_id = "clk_m", .dt_id = TEGRA210_CLK_CLK_M }, 2492 2498 { .con_id = "pll_ref", .dt_id = TEGRA210_CLK_PLL_REF }, 2493 2499 { .con_id = "clk_32k", .dt_id = TEGRA210_CLK_CLK_32K }, 2494 - { .con_id = "clk_m_div2", .dt_id = TEGRA210_CLK_CLK_M_DIV2 }, 2495 - { .con_id = "clk_m_div4", .dt_id = TEGRA210_CLK_CLK_M_DIV4 }, 2500 + { .con_id = "osc", .dt_id = TEGRA210_CLK_OSC }, 2501 + { .con_id = "osc_div2", .dt_id = TEGRA210_CLK_OSC_DIV2 }, 2502 + { .con_id = "osc_div4", .dt_id = TEGRA210_CLK_OSC_DIV4 }, 2496 2503 { .con_id = "pll_c", .dt_id = TEGRA210_CLK_PLL_C }, 2497 2504 { .con_id = "pll_c_out1", .dt_id = TEGRA210_CLK_PLL_C_OUT1 }, 2498 2505 { .con_id = "pll_c2", .dt_id = TEGRA210_CLK_PLL_C2 }, ··· 2535 2540 { .con_id = "audio4", .dt_id = TEGRA210_CLK_AUDIO4 }, 2536 2541 { .con_id = "spdif", .dt_id = TEGRA210_CLK_SPDIF }, 2537 2542 { .con_id = "spdif_2x", .dt_id = TEGRA210_CLK_SPDIF_2X }, 2538 - { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA210_CLK_EXTERN1 }, 2539 - { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA210_CLK_EXTERN2 }, 2540 - { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA210_CLK_EXTERN3 }, 2541 - { .con_id = "blink", .dt_id = TEGRA210_CLK_BLINK }, 2543 + { .con_id = "extern1", .dt_id = TEGRA210_CLK_EXTERN1 }, 2544 + { .con_id = "extern2", .dt_id = TEGRA210_CLK_EXTERN2 }, 2545 + { .con_id = "extern3", .dt_id = TEGRA210_CLK_EXTERN3 }, 2542 2546 { .con_id = "cclk_g", .dt_id = TEGRA210_CLK_CCLK_G }, 2543 2547 { .con_id = "cclk_lp", .dt_id = TEGRA210_CLK_CCLK_LP }, 2544 2548 { .con_id = "sclk", .dt_id = TEGRA210_CLK_SCLK }, ··· 2993 2999 }; 2994 3000 2995 3001 static struct tegra_clk_periph tegra210_la = 2996 - TEGRA_CLK_PERIPH(29, 7, 9, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, 76, 0, NULL, 0); 3002 + TEGRA_CLK_PERIPH(29, 7, 9, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, 76, 0, NULL, NULL); 2997 3003 2998 3004 static __init void tegra210_periph_clk_init(void __iomem *clk_base, 2999 3005 void __iomem *pmc_base) ··· 3442 3448 { TEGRA210_CLK_UARTB, TEGRA210_CLK_PLL_P, 408000000, 0 }, 3443 3449 { TEGRA210_CLK_UARTC, TEGRA210_CLK_PLL_P, 408000000, 0 }, 3444 3450 { TEGRA210_CLK_UARTD, TEGRA210_CLK_PLL_P, 408000000, 0 }, 3445 - { TEGRA210_CLK_PLL_A, TEGRA210_CLK_CLK_MAX, 564480000, 1 }, 3446 - { TEGRA210_CLK_PLL_A_OUT0, TEGRA210_CLK_CLK_MAX, 11289600, 1 }, 3447 - { TEGRA210_CLK_EXTERN1, TEGRA210_CLK_PLL_A_OUT0, 0, 1 }, 3448 - { TEGRA210_CLK_CLK_OUT_1_MUX, TEGRA210_CLK_EXTERN1, 0, 1 }, 3449 - { TEGRA210_CLK_CLK_OUT_1, TEGRA210_CLK_CLK_MAX, 0, 1 }, 3451 + { TEGRA210_CLK_PLL_A, TEGRA210_CLK_CLK_MAX, 564480000, 0 }, 3452 + { TEGRA210_CLK_PLL_A_OUT0, TEGRA210_CLK_CLK_MAX, 11289600, 0 }, 3450 3453 { TEGRA210_CLK_I2S0, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, 3451 3454 { TEGRA210_CLK_I2S1, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, 3452 3455 { TEGRA210_CLK_I2S2, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, ··· 3684 3693 tegra_audio_clk_init(clk_base, pmc_base, tegra210_clks, 3685 3694 tegra210_audio_plls, 3686 3695 ARRAY_SIZE(tegra210_audio_plls), 24576000); 3687 - tegra_pmc_clk_init(pmc_base, tegra210_clks); 3688 3696 3689 3697 /* For Tegra210, PLLD is the only source for DSIA & DSIB */ 3690 3698 value = readl(clk_base + PLLD_BASE);
+11 -22
drivers/clk/tegra/clk-tegra30.c
··· 569 569 { .con_id = "audio3_2x", .dt_id = TEGRA30_CLK_AUDIO3_2X }, 570 570 { .con_id = "audio4_2x", .dt_id = TEGRA30_CLK_AUDIO4_2X }, 571 571 { .con_id = "spdif_2x", .dt_id = TEGRA30_CLK_SPDIF_2X }, 572 - { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA30_CLK_EXTERN1 }, 573 - { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA30_CLK_EXTERN2 }, 574 - { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA30_CLK_EXTERN3 }, 575 - { .con_id = "blink", .dt_id = TEGRA30_CLK_BLINK }, 572 + { .con_id = "extern1", .dt_id = TEGRA30_CLK_EXTERN1 }, 573 + { .con_id = "extern2", .dt_id = TEGRA30_CLK_EXTERN2 }, 574 + { .con_id = "extern3", .dt_id = TEGRA30_CLK_EXTERN3 }, 576 575 { .con_id = "cclk_g", .dt_id = TEGRA30_CLK_CCLK_G }, 577 576 { .con_id = "cclk_lp", .dt_id = TEGRA30_CLK_CCLK_LP }, 578 577 { .con_id = "sclk", .dt_id = TEGRA30_CLK_SCLK }, ··· 580 581 { .con_id = "twd", .dt_id = TEGRA30_CLK_TWD }, 581 582 { .con_id = "emc", .dt_id = TEGRA30_CLK_EMC }, 582 583 { .con_id = "clk_32k", .dt_id = TEGRA30_CLK_CLK_32K }, 583 - { .con_id = "clk_m_div2", .dt_id = TEGRA30_CLK_CLK_M_DIV2 }, 584 - { .con_id = "clk_m_div4", .dt_id = TEGRA30_CLK_CLK_M_DIV4 }, 584 + { .con_id = "osc", .dt_id = TEGRA30_CLK_OSC }, 585 + { .con_id = "osc_div2", .dt_id = TEGRA30_CLK_OSC_DIV2 }, 586 + { .con_id = "osc_div4", .dt_id = TEGRA30_CLK_OSC_DIV4 }, 585 587 { .con_id = "cml0", .dt_id = TEGRA30_CLK_CML0 }, 586 588 { .con_id = "cml1", .dt_id = TEGRA30_CLK_CML1 }, 587 589 { .con_id = "clk_m", .dt_id = TEGRA30_CLK_CLK_M }, ··· 683 683 static struct tegra_clk tegra30_clks[tegra_clk_max] __initdata = { 684 684 [tegra_clk_clk_32k] = { .dt_id = TEGRA30_CLK_CLK_32K, .present = true }, 685 685 [tegra_clk_clk_m] = { .dt_id = TEGRA30_CLK_CLK_M, .present = true }, 686 - [tegra_clk_clk_m_div2] = { .dt_id = TEGRA30_CLK_CLK_M_DIV2, .present = true }, 687 - [tegra_clk_clk_m_div4] = { .dt_id = TEGRA30_CLK_CLK_M_DIV4, .present = true }, 686 + [tegra_clk_osc] = { .dt_id = TEGRA30_CLK_OSC, .present = true }, 687 + [tegra_clk_osc_div2] = { .dt_id = TEGRA30_CLK_OSC_DIV2, .present = true }, 688 + [tegra_clk_osc_div4] = { .dt_id = TEGRA30_CLK_OSC_DIV4, .present = true }, 688 689 [tegra_clk_pll_ref] = { .dt_id = TEGRA30_CLK_PLL_REF, .present = true }, 689 690 [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA30_CLK_SPDIF_IN_SYNC, .present = true }, 690 691 [tegra_clk_i2s0_sync] = { .dt_id = TEGRA30_CLK_I2S0_SYNC, .present = true }, ··· 712 711 [tegra_clk_audio3_2x] = { .dt_id = TEGRA30_CLK_AUDIO3_2X, .present = true }, 713 712 [tegra_clk_audio4_2x] = { .dt_id = TEGRA30_CLK_AUDIO4_2X, .present = true }, 714 713 [tegra_clk_spdif_2x] = { .dt_id = TEGRA30_CLK_SPDIF_2X, .present = true }, 715 - [tegra_clk_clk_out_1] = { .dt_id = TEGRA30_CLK_CLK_OUT_1, .present = true }, 716 - [tegra_clk_clk_out_2] = { .dt_id = TEGRA30_CLK_CLK_OUT_2, .present = true }, 717 - [tegra_clk_clk_out_3] = { .dt_id = TEGRA30_CLK_CLK_OUT_3, .present = true }, 718 - [tegra_clk_blink] = { .dt_id = TEGRA30_CLK_BLINK, .present = true }, 719 - [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA30_CLK_CLK_OUT_1_MUX, .present = true }, 720 - [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA30_CLK_CLK_OUT_2_MUX, .present = true }, 721 - [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA30_CLK_CLK_OUT_3_MUX, .present = true }, 722 714 [tegra_clk_hclk] = { .dt_id = TEGRA30_CLK_HCLK, .present = true }, 723 715 [tegra_clk_pclk] = { .dt_id = TEGRA30_CLK_PCLK, .present = true }, 724 716 [tegra_clk_i2s0] = { .dt_id = TEGRA30_CLK_I2S0, .present = true }, ··· 1221 1227 { TEGRA30_CLK_UARTC, TEGRA30_CLK_PLL_P, 408000000, 0 }, 1222 1228 { TEGRA30_CLK_UARTD, TEGRA30_CLK_PLL_P, 408000000, 0 }, 1223 1229 { TEGRA30_CLK_UARTE, TEGRA30_CLK_PLL_P, 408000000, 0 }, 1224 - { TEGRA30_CLK_PLL_A, TEGRA30_CLK_CLK_MAX, 564480000, 1 }, 1225 - { TEGRA30_CLK_PLL_A_OUT0, TEGRA30_CLK_CLK_MAX, 11289600, 1 }, 1226 - { TEGRA30_CLK_EXTERN1, TEGRA30_CLK_PLL_A_OUT0, 0, 1 }, 1227 - { TEGRA30_CLK_CLK_OUT_1_MUX, TEGRA30_CLK_EXTERN1, 0, 0 }, 1228 - { TEGRA30_CLK_CLK_OUT_1, TEGRA30_CLK_CLK_MAX, 0, 1 }, 1229 - { TEGRA30_CLK_BLINK, TEGRA30_CLK_CLK_MAX, 0, 1 }, 1230 + { TEGRA30_CLK_PLL_A, TEGRA30_CLK_CLK_MAX, 564480000, 0 }, 1231 + { TEGRA30_CLK_PLL_A_OUT0, TEGRA30_CLK_CLK_MAX, 11289600, 0 }, 1230 1232 { TEGRA30_CLK_I2S0, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0 }, 1231 1233 { TEGRA30_CLK_I2S1, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0 }, 1232 1234 { TEGRA30_CLK_I2S2, TEGRA30_CLK_PLL_A_OUT0, 11289600, 0 }, ··· 1352 1362 tegra_audio_clk_init(clk_base, pmc_base, tegra30_clks, 1353 1363 tegra30_audio_plls, 1354 1364 ARRAY_SIZE(tegra30_audio_plls), 24000000); 1355 - tegra_pmc_clk_init(pmc_base, tegra30_clks); 1356 1365 1357 1366 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX); 1358 1367
-1
drivers/clk/tegra/clk.h
··· 854 854 struct tegra_clk *tegra_clks, 855 855 struct tegra_clk_pll_params *pll_params); 856 856 857 - void tegra_pmc_clk_init(void __iomem *pmc_base, struct tegra_clk *tegra_clks); 858 857 void tegra_fixed_clk_init(struct tegra_clk *tegra_clks); 859 858 int tegra_osc_clk_init(void __iomem *clk_base, struct tegra_clk *clks, 860 859 unsigned long *input_freqs, unsigned int num,
+7 -18
drivers/clk/versatile/clk-icst.c
··· 34 34 #define INTEGRATOR_AP_PCI_25_33_MHZ BIT(8) 35 35 36 36 /** 37 - * enum icst_control_type - the type of ICST control register 38 - */ 39 - enum icst_control_type { 40 - ICST_VERSATILE, /* The standard type, all control bits available */ 41 - ICST_INTEGRATOR_AP_CM, /* Only 8 bits of VDW available */ 42 - ICST_INTEGRATOR_AP_SYS, /* Only 8 bits of VDW available */ 43 - ICST_INTEGRATOR_AP_PCI, /* Odd bit pattern storage */ 44 - ICST_INTEGRATOR_CP_CM_CORE, /* Only 8 bits of VDW and 3 bits of OD */ 45 - ICST_INTEGRATOR_CP_CM_MEM, /* Only 8 bits of VDW and 3 bits of OD */ 46 - }; 47 - 48 - /** 49 37 * struct clk_icst - ICST VCO clock wrapper 50 38 * @hw: corresponding clock hardware entry 51 39 * @vcoreg: VCO register address ··· 332 344 .set_rate = icst_set_rate, 333 345 }; 334 346 335 - static struct clk *icst_clk_setup(struct device *dev, 336 - const struct clk_icst_desc *desc, 337 - const char *name, 338 - const char *parent_name, 339 - struct regmap *map, 340 - enum icst_control_type ctype) 347 + struct clk *icst_clk_setup(struct device *dev, 348 + const struct clk_icst_desc *desc, 349 + const char *name, 350 + const char *parent_name, 351 + struct regmap *map, 352 + enum icst_control_type ctype) 341 353 { 342 354 struct clk *clk; 343 355 struct clk_icst *icst; ··· 374 386 375 387 return clk; 376 388 } 389 + EXPORT_SYMBOL_GPL(icst_clk_setup); 377 390 378 391 struct clk *icst_clk_register(struct device *dev, 379 392 const struct clk_icst_desc *desc,
+22
drivers/clk/versatile/clk-icst.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 + struct regmap; 3 + 4 + /** 5 + * enum icst_control_type - the type of ICST control register 6 + */ 7 + enum icst_control_type { 8 + ICST_VERSATILE, /* The standard type, all control bits available */ 9 + ICST_INTEGRATOR_AP_CM, /* Only 8 bits of VDW available */ 10 + ICST_INTEGRATOR_AP_SYS, /* Only 8 bits of VDW available */ 11 + ICST_INTEGRATOR_AP_PCI, /* Odd bit pattern storage */ 12 + ICST_INTEGRATOR_CP_CM_CORE, /* Only 8 bits of VDW and 3 bits of OD */ 13 + ICST_INTEGRATOR_CP_CM_MEM, /* Only 8 bits of VDW and 3 bits of OD */ 14 + ICST_INTEGRATOR_IM_PD1, /* Like the Versatile, all control bits */ 15 + }; 16 + 2 17 /** 3 18 * struct clk_icst_desc - descriptor for the ICST VCO 4 19 * @params: ICST parameters ··· 32 17 const char *name, 33 18 const char *parent_name, 34 19 void __iomem *base); 20 + 21 + struct clk *icst_clk_setup(struct device *dev, 22 + const struct clk_icst_desc *desc, 23 + const char *name, 24 + const char *parent_name, 25 + struct regmap *map, 26 + enum icst_control_type ctype);
+79
drivers/clk/versatile/clk-impd1.c
··· 7 7 #include <linux/clkdev.h> 8 8 #include <linux/err.h> 9 9 #include <linux/io.h> 10 + #include <linux/platform_device.h> 10 11 #include <linux/platform_data/clk-integrator.h> 12 + #include <linux/module.h> 13 + #include <linux/mfd/syscon.h> 14 + #include <linux/regmap.h> 11 15 12 16 #include "icst.h" 13 17 #include "clk-icst.h" ··· 179 175 kfree(imc->pclkname); 180 176 } 181 177 EXPORT_SYMBOL_GPL(integrator_impd1_clk_exit); 178 + 179 + static int integrator_impd1_clk_spawn(struct device *dev, 180 + struct device_node *parent, 181 + struct device_node *np) 182 + { 183 + struct regmap *map; 184 + struct clk *clk = ERR_PTR(-EINVAL); 185 + const char *name = np->name; 186 + const char *parent_name; 187 + const struct clk_icst_desc *desc; 188 + int ret; 189 + 190 + map = syscon_node_to_regmap(parent); 191 + if (IS_ERR(map)) { 192 + pr_err("no regmap for syscon IM-PD1 ICST clock parent\n"); 193 + return PTR_ERR(map); 194 + } 195 + 196 + if (of_device_is_compatible(np, "arm,impd1-vco1")) { 197 + desc = &impd1_icst1_desc; 198 + } else if (of_device_is_compatible(np, "arm,impd1-vco2")) { 199 + desc = &impd1_icst2_desc; 200 + } else { 201 + dev_err(dev, "not a clock node %s\n", name); 202 + return -ENODEV; 203 + } 204 + 205 + parent_name = of_clk_get_parent_name(np, 0); 206 + clk = icst_clk_setup(NULL, desc, name, parent_name, map, 207 + ICST_INTEGRATOR_IM_PD1); 208 + if (!IS_ERR(clk)) { 209 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 210 + ret = 0; 211 + } else { 212 + dev_err(dev, "error setting up IM-PD1 ICST clock\n"); 213 + ret = PTR_ERR(clk); 214 + } 215 + 216 + return ret; 217 + } 218 + 219 + static int integrator_impd1_clk_probe(struct platform_device *pdev) 220 + { 221 + struct device *dev = &pdev->dev; 222 + struct device_node *np = dev->of_node; 223 + struct device_node *child; 224 + int ret = 0; 225 + 226 + for_each_available_child_of_node(np, child) { 227 + ret = integrator_impd1_clk_spawn(dev, np, child); 228 + if (ret) 229 + break; 230 + } 231 + 232 + return ret; 233 + } 234 + 235 + static const struct of_device_id impd1_syscon_match[] = { 236 + { .compatible = "arm,im-pd1-syscon", }, 237 + {} 238 + }; 239 + MODULE_DEVICE_TABLE(of, impd1_syscon_match); 240 + 241 + static struct platform_driver impd1_clk_driver = { 242 + .driver = { 243 + .name = "impd1-clk", 244 + .of_match_table = impd1_syscon_match, 245 + }, 246 + .probe = integrator_impd1_clk_probe, 247 + }; 248 + builtin_platform_driver(impd1_clk_driver); 249 + 250 + MODULE_AUTHOR("Linus Walleij <linusw@kernel.org>"); 251 + MODULE_DESCRIPTION("Arm IM-PD1 module clock driver"); 252 + MODULE_LICENSE("GPL v2");
+2 -1
include/dt-bindings/clock/imx7d-clock.h
··· 451 451 #define IMX7D_SNVS_CLK 442 452 452 #define IMX7D_CAAM_CLK 443 453 453 #define IMX7D_KPP_ROOT_CLK 444 454 - #define IMX7D_CLK_END 445 454 + #define IMX7D_PXP_CLK 445 455 + #define IMX7D_CLK_END 446 455 456 #endif /* __DT_BINDINGS_CLOCK_IMX7D_H */
+10 -1
include/dt-bindings/clock/imx8mm-clock.h
··· 265 265 #define IMX8MM_SYS_PLL2_333M_CG 244 266 266 #define IMX8MM_SYS_PLL2_500M_CG 245 267 267 268 - #define IMX8MM_CLK_END 246 268 + #define IMX8MM_CLK_M4_CORE 246 269 + #define IMX8MM_CLK_VPU_CORE 247 270 + #define IMX8MM_CLK_GPU3D_CORE 248 271 + #define IMX8MM_CLK_GPU2D_CORE 249 272 + 273 + #define IMX8MM_CLK_CLKO2 250 274 + 275 + #define IMX8MM_CLK_A53_CORE 251 276 + 277 + #define IMX8MM_CLK_END 252 269 278 270 279 #endif
+5 -1
include/dt-bindings/clock/imx8mn-clock.h
··· 229 229 #define IMX8MN_SYS_PLL2_500M_CG 210 230 230 231 231 #define IMX8MN_CLK_SNVS_ROOT 211 232 + #define IMX8MN_CLK_GPU_CORE 212 233 + #define IMX8MN_CLK_GPU_SHADER 213 232 234 233 - #define IMX8MN_CLK_END 212 235 + #define IMX8MN_CLK_A53_CORE 214 236 + 237 + #define IMX8MN_CLK_END 215 234 238 235 239 #endif
+3 -2
include/dt-bindings/clock/imx8mp-clock.h
··· 173 173 #define IMX8MP_CLK_IPP_DO_CLKO1 164 174 174 #define IMX8MP_CLK_IPP_DO_CLKO2 165 175 175 #define IMX8MP_CLK_HDMI_FDCC_TST 166 176 - #define IMX8MP_CLK_HDMI_27M 167 176 + #define IMX8MP_CLK_HDMI_24M 167 177 177 #define IMX8MP_CLK_HDMI_REF_266M 168 178 178 #define IMX8MP_CLK_USDHC3 169 179 179 #define IMX8MP_CLK_MEDIA_CAM1_PIX 170 ··· 294 294 #define IMX8MP_CLK_DRAM_ALT_ROOT 285 295 295 #define IMX8MP_CLK_DRAM_CORE 286 296 296 #define IMX8MP_CLK_ARM 287 297 + #define IMX8MP_CLK_A53_CORE 288 297 298 298 - #define IMX8MP_CLK_END 288 299 + #define IMX8MP_CLK_END 289 299 300 300 301 #endif
+8 -1
include/dt-bindings/clock/imx8mq-clock.h
··· 424 424 #define IMX8MQ_SYS2_PLL_500M_CG 283 425 425 #define IMX8MQ_SYS2_PLL_1000M_CG 284 426 426 427 - #define IMX8MQ_CLK_END 285 427 + #define IMX8MQ_CLK_GPU_CORE 285 428 + #define IMX8MQ_CLK_GPU_SHADER 286 429 + #define IMX8MQ_CLK_M4_CORE 287 430 + #define IMX8MQ_CLK_VPU_CORE 288 431 + 432 + #define IMX8MQ_CLK_A53_CORE 289 433 + 434 + #define IMX8MQ_CLK_END 290 428 435 429 436 #endif /* __DT_BINDINGS_CLOCK_IMX8MQ_H */
+13
include/dt-bindings/clock/marvell,mmp2.h
··· 26 26 #define MMP2_CLK_VCTCXO_4 25 27 27 #define MMP2_CLK_UART_PLL 26 28 28 #define MMP2_CLK_USB_PLL 27 29 + #define MMP3_CLK_PLL1_P 28 30 + #define MMP3_CLK_PLL2_P 29 31 + #define MMP3_CLK_PLL3 30 29 32 30 33 /* apb periphrals */ 31 34 #define MMP2_CLK_TWSI0 60 ··· 53 50 #define MMP2_CLK_SSP2 79 54 51 #define MMP2_CLK_SSP3 80 55 52 #define MMP2_CLK_TIMER 81 53 + #define MMP2_CLK_THERMAL0 82 54 + #define MMP3_CLK_THERMAL1 83 55 + #define MMP3_CLK_THERMAL2 84 56 + #define MMP3_CLK_THERMAL3 85 56 57 57 58 /* axi periphrals */ 58 59 #define MMP2_CLK_SDH0 101 ··· 81 74 #define MMP2_CLK_DISP0_LCDC 120 82 75 #define MMP2_CLK_USBHSIC0 121 83 76 #define MMP2_CLK_USBHSIC1 122 77 + #define MMP2_CLK_GPU_BUS 123 78 + #define MMP3_CLK_GPU_BUS MMP2_CLK_GPU_BUS 79 + #define MMP2_CLK_GPU_3D 124 80 + #define MMP3_CLK_GPU_3D MMP2_CLK_GPU_3D 81 + #define MMP3_CLK_GPU_2D 125 82 + #define MMP3_CLK_SDH4 126 84 83 85 84 #define MMP2_NR_CLKS 200 86 85 #endif
+6 -1
include/dt-bindings/clock/qcom,gcc-sc7180.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 2 /* 3 - * Copyright (c) 2019, The Linux Foundation. All rights reserved. 3 + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. 4 4 */ 5 5 6 6 #ifndef _DT_BINDINGS_CLK_QCOM_GCC_SC7180_H ··· 132 132 #define GCC_VIDEO_GPLL0_DIV_CLK_SRC 122 133 133 #define GCC_VIDEO_THROTTLE_AXI_CLK 123 134 134 #define GCC_VIDEO_XO_CLK 124 135 + #define GCC_MSS_CFG_AHB_CLK 125 136 + #define GCC_MSS_MFAB_AXIS_CLK 126 137 + #define GCC_MSS_NAV_AXI_CLK 127 138 + #define GCC_MSS_Q6_MEMNOC_AXI_CLK 128 139 + #define GCC_MSS_SNOC_AXI_CLK 129 135 140 136 141 /* GCC resets */ 137 142 #define GCC_QUSB2PHY_PRIM_BCR 0
+4
include/dt-bindings/clock/qcom,gcc-sm8150.h
··· 240 240 #define GCC_USB30_SEC_BCR 27 241 241 #define GCC_USB_PHY_CFG_AHB2PHY_BCR 28 242 242 243 + /* GCC GDSCRs */ 244 + #define USB30_PRIM_GDSC 4 245 + #define USB30_SEC_GDSC 5 246 + 243 247 #endif
+271
include/dt-bindings/clock/qcom,gcc-sm8250.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2020, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_GCC_SM8250_H 7 + #define _DT_BINDINGS_CLK_QCOM_GCC_SM8250_H 8 + 9 + /* GCC clocks */ 10 + #define GPLL0 0 11 + #define GPLL0_OUT_EVEN 1 12 + #define GPLL4 2 13 + #define GPLL9 3 14 + #define GCC_AGGRE_NOC_PCIE_TBU_CLK 4 15 + #define GCC_AGGRE_UFS_CARD_AXI_CLK 5 16 + #define GCC_AGGRE_UFS_PHY_AXI_CLK 6 17 + #define GCC_AGGRE_USB3_PRIM_AXI_CLK 7 18 + #define GCC_AGGRE_USB3_SEC_AXI_CLK 8 19 + #define GCC_BOOT_ROM_AHB_CLK 9 20 + #define GCC_CAMERA_AHB_CLK 10 21 + #define GCC_CAMERA_HF_AXI_CLK 11 22 + #define GCC_CAMERA_SF_AXI_CLK 12 23 + #define GCC_CAMERA_XO_CLK 13 24 + #define GCC_CFG_NOC_USB3_PRIM_AXI_CLK 14 25 + #define GCC_CFG_NOC_USB3_SEC_AXI_CLK 15 26 + #define GCC_CPUSS_AHB_CLK 16 27 + #define GCC_CPUSS_AHB_CLK_SRC 17 28 + #define GCC_CPUSS_AHB_POSTDIV_CLK_SRC 18 29 + #define GCC_CPUSS_DVM_BUS_CLK 19 30 + #define GCC_CPUSS_RBCPR_CLK 20 31 + #define GCC_DDRSS_GPU_AXI_CLK 21 32 + #define GCC_DDRSS_PCIE_SF_TBU_CLK 22 33 + #define GCC_DISP_AHB_CLK 23 34 + #define GCC_DISP_HF_AXI_CLK 24 35 + #define GCC_DISP_SF_AXI_CLK 25 36 + #define GCC_DISP_XO_CLK 26 37 + #define GCC_GP1_CLK 27 38 + #define GCC_GP1_CLK_SRC 28 39 + #define GCC_GP2_CLK 29 40 + #define GCC_GP2_CLK_SRC 30 41 + #define GCC_GP3_CLK 31 42 + #define GCC_GP3_CLK_SRC 32 43 + #define GCC_GPU_CFG_AHB_CLK 33 44 + #define GCC_GPU_GPLL0_CLK_SRC 34 45 + #define GCC_GPU_GPLL0_DIV_CLK_SRC 35 46 + #define GCC_GPU_IREF_EN 36 47 + #define GCC_GPU_MEMNOC_GFX_CLK 37 48 + #define GCC_GPU_SNOC_DVM_GFX_CLK 38 49 + #define GCC_NPU_AXI_CLK 39 50 + #define GCC_NPU_BWMON_AXI_CLK 40 51 + #define GCC_NPU_BWMON_CFG_AHB_CLK 41 52 + #define GCC_NPU_CFG_AHB_CLK 42 53 + #define GCC_NPU_DMA_CLK 43 54 + #define GCC_NPU_GPLL0_CLK_SRC 44 55 + #define GCC_NPU_GPLL0_DIV_CLK_SRC 45 56 + #define GCC_PCIE0_PHY_REFGEN_CLK 46 57 + #define GCC_PCIE1_PHY_REFGEN_CLK 47 58 + #define GCC_PCIE2_PHY_REFGEN_CLK 48 59 + #define GCC_PCIE_0_AUX_CLK 49 60 + #define GCC_PCIE_0_AUX_CLK_SRC 50 61 + #define GCC_PCIE_0_CFG_AHB_CLK 51 62 + #define GCC_PCIE_0_MSTR_AXI_CLK 52 63 + #define GCC_PCIE_0_PIPE_CLK 53 64 + #define GCC_PCIE_0_SLV_AXI_CLK 54 65 + #define GCC_PCIE_0_SLV_Q2A_AXI_CLK 55 66 + #define GCC_PCIE_1_AUX_CLK 56 67 + #define GCC_PCIE_1_AUX_CLK_SRC 57 68 + #define GCC_PCIE_1_CFG_AHB_CLK 58 69 + #define GCC_PCIE_1_MSTR_AXI_CLK 59 70 + #define GCC_PCIE_1_PIPE_CLK 60 71 + #define GCC_PCIE_1_SLV_AXI_CLK 61 72 + #define GCC_PCIE_1_SLV_Q2A_AXI_CLK 62 73 + #define GCC_PCIE_2_AUX_CLK 63 74 + #define GCC_PCIE_2_AUX_CLK_SRC 64 75 + #define GCC_PCIE_2_CFG_AHB_CLK 65 76 + #define GCC_PCIE_2_MSTR_AXI_CLK 66 77 + #define GCC_PCIE_2_PIPE_CLK 67 78 + #define GCC_PCIE_2_SLV_AXI_CLK 68 79 + #define GCC_PCIE_2_SLV_Q2A_AXI_CLK 69 80 + #define GCC_PCIE_MDM_CLKREF_EN 70 81 + #define GCC_PCIE_PHY_AUX_CLK 71 82 + #define GCC_PCIE_PHY_REFGEN_CLK_SRC 72 83 + #define GCC_PCIE_WIFI_CLKREF_EN 73 84 + #define GCC_PCIE_WIGIG_CLKREF_EN 74 85 + #define GCC_PDM2_CLK 75 86 + #define GCC_PDM2_CLK_SRC 76 87 + #define GCC_PDM_AHB_CLK 77 88 + #define GCC_PDM_XO4_CLK 78 89 + #define GCC_PRNG_AHB_CLK 79 90 + #define GCC_QMIP_CAMERA_NRT_AHB_CLK 80 91 + #define GCC_QMIP_CAMERA_RT_AHB_CLK 81 92 + #define GCC_QMIP_DISP_AHB_CLK 82 93 + #define GCC_QMIP_VIDEO_CVP_AHB_CLK 83 94 + #define GCC_QMIP_VIDEO_VCODEC_AHB_CLK 84 95 + #define GCC_QUPV3_WRAP0_CORE_2X_CLK 85 96 + #define GCC_QUPV3_WRAP0_CORE_CLK 86 97 + #define GCC_QUPV3_WRAP0_S0_CLK 87 98 + #define GCC_QUPV3_WRAP0_S0_CLK_SRC 88 99 + #define GCC_QUPV3_WRAP0_S1_CLK 89 100 + #define GCC_QUPV3_WRAP0_S1_CLK_SRC 90 101 + #define GCC_QUPV3_WRAP0_S2_CLK 91 102 + #define GCC_QUPV3_WRAP0_S2_CLK_SRC 92 103 + #define GCC_QUPV3_WRAP0_S3_CLK 93 104 + #define GCC_QUPV3_WRAP0_S3_CLK_SRC 94 105 + #define GCC_QUPV3_WRAP0_S4_CLK 95 106 + #define GCC_QUPV3_WRAP0_S4_CLK_SRC 96 107 + #define GCC_QUPV3_WRAP0_S5_CLK 97 108 + #define GCC_QUPV3_WRAP0_S5_CLK_SRC 98 109 + #define GCC_QUPV3_WRAP0_S6_CLK 99 110 + #define GCC_QUPV3_WRAP0_S6_CLK_SRC 100 111 + #define GCC_QUPV3_WRAP0_S7_CLK 101 112 + #define GCC_QUPV3_WRAP0_S7_CLK_SRC 102 113 + #define GCC_QUPV3_WRAP1_CORE_2X_CLK 103 114 + #define GCC_QUPV3_WRAP1_CORE_CLK 104 115 + #define GCC_QUPV3_WRAP1_S0_CLK 105 116 + #define GCC_QUPV3_WRAP1_S0_CLK_SRC 106 117 + #define GCC_QUPV3_WRAP1_S1_CLK 107 118 + #define GCC_QUPV3_WRAP1_S1_CLK_SRC 108 119 + #define GCC_QUPV3_WRAP1_S2_CLK 109 120 + #define GCC_QUPV3_WRAP1_S2_CLK_SRC 110 121 + #define GCC_QUPV3_WRAP1_S3_CLK 111 122 + #define GCC_QUPV3_WRAP1_S3_CLK_SRC 112 123 + #define GCC_QUPV3_WRAP1_S4_CLK 113 124 + #define GCC_QUPV3_WRAP1_S4_CLK_SRC 114 125 + #define GCC_QUPV3_WRAP1_S5_CLK 115 126 + #define GCC_QUPV3_WRAP1_S5_CLK_SRC 116 127 + #define GCC_QUPV3_WRAP2_CORE_2X_CLK 117 128 + #define GCC_QUPV3_WRAP2_CORE_CLK 118 129 + #define GCC_QUPV3_WRAP2_S0_CLK 119 130 + #define GCC_QUPV3_WRAP2_S0_CLK_SRC 120 131 + #define GCC_QUPV3_WRAP2_S1_CLK 121 132 + #define GCC_QUPV3_WRAP2_S1_CLK_SRC 122 133 + #define GCC_QUPV3_WRAP2_S2_CLK 123 134 + #define GCC_QUPV3_WRAP2_S2_CLK_SRC 124 135 + #define GCC_QUPV3_WRAP2_S3_CLK 125 136 + #define GCC_QUPV3_WRAP2_S3_CLK_SRC 126 137 + #define GCC_QUPV3_WRAP2_S4_CLK 127 138 + #define GCC_QUPV3_WRAP2_S4_CLK_SRC 128 139 + #define GCC_QUPV3_WRAP2_S5_CLK 129 140 + #define GCC_QUPV3_WRAP2_S5_CLK_SRC 130 141 + #define GCC_QUPV3_WRAP_0_M_AHB_CLK 131 142 + #define GCC_QUPV3_WRAP_0_S_AHB_CLK 132 143 + #define GCC_QUPV3_WRAP_1_M_AHB_CLK 133 144 + #define GCC_QUPV3_WRAP_1_S_AHB_CLK 134 145 + #define GCC_QUPV3_WRAP_2_M_AHB_CLK 135 146 + #define GCC_QUPV3_WRAP_2_S_AHB_CLK 136 147 + #define GCC_SDCC2_AHB_CLK 137 148 + #define GCC_SDCC2_APPS_CLK 138 149 + #define GCC_SDCC2_APPS_CLK_SRC 139 150 + #define GCC_SDCC4_AHB_CLK 140 151 + #define GCC_SDCC4_APPS_CLK 141 152 + #define GCC_SDCC4_APPS_CLK_SRC 142 153 + #define GCC_SYS_NOC_CPUSS_AHB_CLK 143 154 + #define GCC_TSIF_AHB_CLK 144 155 + #define GCC_TSIF_INACTIVITY_TIMERS_CLK 145 156 + #define GCC_TSIF_REF_CLK 146 157 + #define GCC_TSIF_REF_CLK_SRC 147 158 + #define GCC_UFS_1X_CLKREF_EN 148 159 + #define GCC_UFS_CARD_AHB_CLK 149 160 + #define GCC_UFS_CARD_AXI_CLK 150 161 + #define GCC_UFS_CARD_AXI_CLK_SRC 151 162 + #define GCC_UFS_CARD_ICE_CORE_CLK 152 163 + #define GCC_UFS_CARD_ICE_CORE_CLK_SRC 153 164 + #define GCC_UFS_CARD_PHY_AUX_CLK 154 165 + #define GCC_UFS_CARD_PHY_AUX_CLK_SRC 155 166 + #define GCC_UFS_CARD_RX_SYMBOL_0_CLK 156 167 + #define GCC_UFS_CARD_RX_SYMBOL_1_CLK 157 168 + #define GCC_UFS_CARD_TX_SYMBOL_0_CLK 158 169 + #define GCC_UFS_CARD_UNIPRO_CORE_CLK 159 170 + #define GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC 160 171 + #define GCC_UFS_PHY_AHB_CLK 161 172 + #define GCC_UFS_PHY_AXI_CLK 162 173 + #define GCC_UFS_PHY_AXI_CLK_SRC 163 174 + #define GCC_UFS_PHY_ICE_CORE_CLK 164 175 + #define GCC_UFS_PHY_ICE_CORE_CLK_SRC 165 176 + #define GCC_UFS_PHY_PHY_AUX_CLK 166 177 + #define GCC_UFS_PHY_PHY_AUX_CLK_SRC 167 178 + #define GCC_UFS_PHY_RX_SYMBOL_0_CLK 168 179 + #define GCC_UFS_PHY_RX_SYMBOL_1_CLK 169 180 + #define GCC_UFS_PHY_TX_SYMBOL_0_CLK 170 181 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK 171 182 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC 172 183 + #define GCC_USB30_PRIM_MASTER_CLK 173 184 + #define GCC_USB30_PRIM_MASTER_CLK_SRC 174 185 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK 175 186 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC 176 187 + #define GCC_USB30_PRIM_MOCK_UTMI_POSTDIV_CLK_SRC 177 188 + #define GCC_USB30_PRIM_SLEEP_CLK 178 189 + #define GCC_USB30_SEC_MASTER_CLK 179 190 + #define GCC_USB30_SEC_MASTER_CLK_SRC 180 191 + #define GCC_USB30_SEC_MOCK_UTMI_CLK 181 192 + #define GCC_USB30_SEC_MOCK_UTMI_CLK_SRC 182 193 + #define GCC_USB30_SEC_MOCK_UTMI_POSTDIV_CLK_SRC 183 194 + #define GCC_USB30_SEC_SLEEP_CLK 184 195 + #define GCC_USB3_PRIM_PHY_AUX_CLK 185 196 + #define GCC_USB3_PRIM_PHY_AUX_CLK_SRC 186 197 + #define GCC_USB3_PRIM_PHY_COM_AUX_CLK 187 198 + #define GCC_USB3_PRIM_PHY_PIPE_CLK 188 199 + #define GCC_USB3_PRIM_PHY_PIPE_CLK_SRC 189 200 + #define GCC_USB3_SEC_CLKREF_EN 190 201 + #define GCC_USB3_SEC_PHY_AUX_CLK 191 202 + #define GCC_USB3_SEC_PHY_AUX_CLK_SRC 192 203 + #define GCC_USB3_SEC_PHY_COM_AUX_CLK 193 204 + #define GCC_USB3_SEC_PHY_PIPE_CLK 194 205 + #define GCC_USB3_SEC_PHY_PIPE_CLK_SRC 195 206 + #define GCC_VIDEO_AHB_CLK 196 207 + #define GCC_VIDEO_AXI0_CLK 197 208 + #define GCC_VIDEO_AXI1_CLK 198 209 + #define GCC_VIDEO_XO_CLK 199 210 + 211 + /* GCC resets */ 212 + #define GCC_GPU_BCR 0 213 + #define GCC_MMSS_BCR 1 214 + #define GCC_NPU_BWMON_BCR 2 215 + #define GCC_NPU_BCR 3 216 + #define GCC_PCIE_0_BCR 4 217 + #define GCC_PCIE_0_LINK_DOWN_BCR 5 218 + #define GCC_PCIE_0_NOCSR_COM_PHY_BCR 6 219 + #define GCC_PCIE_0_PHY_BCR 7 220 + #define GCC_PCIE_0_PHY_NOCSR_COM_PHY_BCR 8 221 + #define GCC_PCIE_1_BCR 9 222 + #define GCC_PCIE_1_LINK_DOWN_BCR 10 223 + #define GCC_PCIE_1_NOCSR_COM_PHY_BCR 11 224 + #define GCC_PCIE_1_PHY_BCR 12 225 + #define GCC_PCIE_1_PHY_NOCSR_COM_PHY_BCR 13 226 + #define GCC_PCIE_2_BCR 14 227 + #define GCC_PCIE_2_LINK_DOWN_BCR 15 228 + #define GCC_PCIE_2_NOCSR_COM_PHY_BCR 16 229 + #define GCC_PCIE_2_PHY_BCR 17 230 + #define GCC_PCIE_2_PHY_NOCSR_COM_PHY_BCR 18 231 + #define GCC_PCIE_PHY_BCR 19 232 + #define GCC_PCIE_PHY_CFG_AHB_BCR 20 233 + #define GCC_PCIE_PHY_COM_BCR 21 234 + #define GCC_PDM_BCR 22 235 + #define GCC_PRNG_BCR 23 236 + #define GCC_QUPV3_WRAPPER_0_BCR 24 237 + #define GCC_QUPV3_WRAPPER_1_BCR 25 238 + #define GCC_QUPV3_WRAPPER_2_BCR 26 239 + #define GCC_QUSB2PHY_PRIM_BCR 27 240 + #define GCC_QUSB2PHY_SEC_BCR 28 241 + #define GCC_SDCC2_BCR 29 242 + #define GCC_SDCC4_BCR 30 243 + #define GCC_TSIF_BCR 31 244 + #define GCC_UFS_CARD_BCR 32 245 + #define GCC_UFS_PHY_BCR 33 246 + #define GCC_USB30_PRIM_BCR 34 247 + #define GCC_USB30_SEC_BCR 35 248 + #define GCC_USB3_DP_PHY_PRIM_BCR 36 249 + #define GCC_USB3_DP_PHY_SEC_BCR 37 250 + #define GCC_USB3_PHY_PRIM_BCR 38 251 + #define GCC_USB3_PHY_SEC_BCR 39 252 + #define GCC_USB3PHY_PHY_PRIM_BCR 40 253 + #define GCC_USB3PHY_PHY_SEC_BCR 41 254 + #define GCC_USB_PHY_CFG_AHB2PHY_BCR 42 255 + #define GCC_VIDEO_AXI0_CLK_ARES 43 256 + #define GCC_VIDEO_AXI1_CLK_ARES 44 257 + 258 + /* GCC power domains */ 259 + #define PCIE_0_GDSC 0 260 + #define PCIE_1_GDSC 1 261 + #define PCIE_2_GDSC 2 262 + #define UFS_CARD_GDSC 3 263 + #define UFS_PHY_GDSC 4 264 + #define USB30_PRIM_GDSC 5 265 + #define USB30_SEC_GDSC 6 266 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC 7 267 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC 8 268 + #define HLOS1_VOTE_MMNOC_MMU_TBU_SF0_GDSC 9 269 + #define HLOS1_VOTE_MMNOC_MMU_TBU_SF1_GDSC 10 270 + 271 + #endif
+2 -1
include/dt-bindings/clock/qcom,gpucc-sc7180.h
··· 15 15 #define GPU_CC_CXO_CLK 6 16 16 #define GPU_CC_GMU_CLK_SRC 7 17 17 18 - /* CAM_CC GDSCRs */ 18 + /* GPU_CC GDSCRs */ 19 19 #define CX_GDSC 0 20 + #define GX_GDSC 1 20 21 21 22 #endif
+12
include/dt-bindings/clock/qcom,mss-sc7180.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2020, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_MSS_SC7180_H 7 + #define _DT_BINDINGS_CLK_QCOM_MSS_SC7180_H 8 + 9 + #define MSS_AXI_CRYPTO_CLK 0 10 + #define MSS_AXI_NAV_CLK 1 11 + 12 + #endif
+4
include/dt-bindings/clock/qcom,rpmcc.h
··· 37 37 #define RPM_XO_A0 27 38 38 #define RPM_XO_A1 28 39 39 #define RPM_XO_A2 29 40 + #define RPM_NSS_FABRIC_0_CLK 30 41 + #define RPM_NSS_FABRIC_0_A_CLK 31 42 + #define RPM_NSS_FABRIC_1_CLK 32 43 + #define RPM_NSS_FABRIC_1_A_CLK 33 40 44 41 45 /* SMD RPM clocks */ 42 46 #define RPM_SMD_XO_CLK_SRC 0
+3 -1
include/dt-bindings/clock/qcom,rpmh.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 - /* Copyright (c) 2018, The Linux Foundation. All rights reserved. */ 2 + /* Copyright (c) 2018, 2020, The Linux Foundation. All rights reserved. */ 3 3 4 4 5 5 #ifndef _DT_BINDINGS_CLK_MSM_RPMH_H ··· 19 19 #define RPMH_RF_CLK3 10 20 20 #define RPMH_RF_CLK3_A 11 21 21 #define RPMH_IPA_CLK 12 22 + #define RPMH_LN_BB_CLK1 13 23 + #define RPMH_LN_BB_CLK1_A 14 22 24 23 25 #endif
+334
include/dt-bindings/clock/sprd,sc9863a-clk.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Unisoc SC9863A platform clocks 4 + * 5 + * Copyright (C) 2019, Unisoc Communications Inc. 6 + */ 7 + 8 + #ifndef _DT_BINDINGS_CLK_SC9863A_H_ 9 + #define _DT_BINDINGS_CLK_SC9863A_H_ 10 + 11 + #define CLK_MPLL0_GATE 0 12 + #define CLK_DPLL0_GATE 1 13 + #define CLK_LPLL_GATE 2 14 + #define CLK_GPLL_GATE 3 15 + #define CLK_DPLL1_GATE 4 16 + #define CLK_MPLL1_GATE 5 17 + #define CLK_MPLL2_GATE 6 18 + #define CLK_ISPPLL_GATE 7 19 + #define CLK_PMU_APB_NUM (CLK_ISPPLL_GATE + 1) 20 + 21 + #define CLK_AUDIO_GATE 0 22 + #define CLK_RPLL 1 23 + #define CLK_RPLL_390M 2 24 + #define CLK_RPLL_260M 3 25 + #define CLK_RPLL_195M 4 26 + #define CLK_RPLL_26M 5 27 + #define CLK_ANLG_PHY_G5_NUM (CLK_RPLL_26M + 1) 28 + 29 + #define CLK_TWPLL 0 30 + #define CLK_TWPLL_768M 1 31 + #define CLK_TWPLL_384M 2 32 + #define CLK_TWPLL_192M 3 33 + #define CLK_TWPLL_96M 4 34 + #define CLK_TWPLL_48M 5 35 + #define CLK_TWPLL_24M 6 36 + #define CLK_TWPLL_12M 7 37 + #define CLK_TWPLL_512M 8 38 + #define CLK_TWPLL_256M 9 39 + #define CLK_TWPLL_128M 10 40 + #define CLK_TWPLL_64M 11 41 + #define CLK_TWPLL_307M2 12 42 + #define CLK_TWPLL_219M4 13 43 + #define CLK_TWPLL_170M6 14 44 + #define CLK_TWPLL_153M6 15 45 + #define CLK_TWPLL_76M8 16 46 + #define CLK_TWPLL_51M2 17 47 + #define CLK_TWPLL_38M4 18 48 + #define CLK_TWPLL_19M2 19 49 + #define CLK_LPLL 20 50 + #define CLK_LPLL_409M6 21 51 + #define CLK_LPLL_245M76 22 52 + #define CLK_GPLL 23 53 + #define CLK_ISPPLL 24 54 + #define CLK_ISPPLL_468M 25 55 + #define CLK_ANLG_PHY_G1_NUM (CLK_ISPPLL_468M + 1) 56 + 57 + #define CLK_DPLL0 0 58 + #define CLK_DPLL1 1 59 + #define CLK_DPLL0_933M 2 60 + #define CLK_DPLL0_622M3 3 61 + #define CLK_DPLL0_400M 4 62 + #define CLK_DPLL0_266M7 5 63 + #define CLK_DPLL0_123M1 6 64 + #define CLK_DPLL0_50M 7 65 + #define CLK_ANLG_PHY_G7_NUM (CLK_DPLL0_50M + 1) 66 + 67 + #define CLK_MPLL0 0 68 + #define CLK_MPLL1 1 69 + #define CLK_MPLL2 2 70 + #define CLK_MPLL2_675M 3 71 + #define CLK_ANLG_PHY_G4_NUM (CLK_MPLL2_675M + 1) 72 + 73 + #define CLK_AP_APB 0 74 + #define CLK_AP_CE 1 75 + #define CLK_NANDC_ECC 2 76 + #define CLK_NANDC_26M 3 77 + #define CLK_EMMC_32K 4 78 + #define CLK_SDIO0_32K 5 79 + #define CLK_SDIO1_32K 6 80 + #define CLK_SDIO2_32K 7 81 + #define CLK_OTG_UTMI 8 82 + #define CLK_AP_UART0 9 83 + #define CLK_AP_UART1 10 84 + #define CLK_AP_UART2 11 85 + #define CLK_AP_UART3 12 86 + #define CLK_AP_UART4 13 87 + #define CLK_AP_I2C0 14 88 + #define CLK_AP_I2C1 15 89 + #define CLK_AP_I2C2 16 90 + #define CLK_AP_I2C3 17 91 + #define CLK_AP_I2C4 18 92 + #define CLK_AP_I2C5 19 93 + #define CLK_AP_I2C6 20 94 + #define CLK_AP_SPI0 21 95 + #define CLK_AP_SPI1 22 96 + #define CLK_AP_SPI2 23 97 + #define CLK_AP_SPI3 24 98 + #define CLK_AP_IIS0 25 99 + #define CLK_AP_IIS1 26 100 + #define CLK_AP_IIS2 27 101 + #define CLK_SIM0 28 102 + #define CLK_SIM0_32K 29 103 + #define CLK_AP_CLK_NUM (CLK_SIM0_32K + 1) 104 + 105 + #define CLK_13M 0 106 + #define CLK_6M5 1 107 + #define CLK_4M3 2 108 + #define CLK_2M 3 109 + #define CLK_250K 4 110 + #define CLK_RCO_25M 5 111 + #define CLK_RCO_4M 6 112 + #define CLK_RCO_2M 7 113 + #define CLK_EMC 8 114 + #define CLK_AON_APB 9 115 + #define CLK_ADI 10 116 + #define CLK_AUX0 11 117 + #define CLK_AUX1 12 118 + #define CLK_AUX2 13 119 + #define CLK_PROBE 14 120 + #define CLK_PWM0 15 121 + #define CLK_PWM1 16 122 + #define CLK_PWM2 17 123 + #define CLK_AON_THM 18 124 + #define CLK_AUDIF 19 125 + #define CLK_CPU_DAP 20 126 + #define CLK_CPU_TS 21 127 + #define CLK_DJTAG_TCK 22 128 + #define CLK_EMC_REF 23 129 + #define CLK_CSSYS 24 130 + #define CLK_AON_PMU 25 131 + #define CLK_PMU_26M 26 132 + #define CLK_AON_TMR 27 133 + #define CLK_POWER_CPU 28 134 + #define CLK_AP_AXI 29 135 + #define CLK_SDIO0_2X 30 136 + #define CLK_SDIO1_2X 31 137 + #define CLK_SDIO2_2X 32 138 + #define CLK_EMMC_2X 33 139 + #define CLK_DPU 34 140 + #define CLK_DPU_DPI 35 141 + #define CLK_OTG_REF 36 142 + #define CLK_SDPHY_APB 37 143 + #define CLK_ALG_IO_APB 38 144 + #define CLK_GPU_CORE 39 145 + #define CLK_GPU_SOC 40 146 + #define CLK_MM_EMC 41 147 + #define CLK_MM_AHB 42 148 + #define CLK_BPC 43 149 + #define CLK_DCAM_IF 44 150 + #define CLK_ISP 45 151 + #define CLK_JPG 46 152 + #define CLK_CPP 47 153 + #define CLK_SENSOR0 48 154 + #define CLK_SENSOR1 49 155 + #define CLK_SENSOR2 50 156 + #define CLK_MM_VEMC 51 157 + #define CLK_MM_VAHB 52 158 + #define CLK_VSP 53 159 + #define CLK_CORE0 54 160 + #define CLK_CORE1 55 161 + #define CLK_CORE2 56 162 + #define CLK_CORE3 57 163 + #define CLK_CORE4 58 164 + #define CLK_CORE5 59 165 + #define CLK_CORE6 60 166 + #define CLK_CORE7 61 167 + #define CLK_SCU 62 168 + #define CLK_ACE 63 169 + #define CLK_AXI_PERIPH 64 170 + #define CLK_AXI_ACP 65 171 + #define CLK_ATB 66 172 + #define CLK_DEBUG_APB 67 173 + #define CLK_GIC 68 174 + #define CLK_PERIPH 69 175 + #define CLK_AON_CLK_NUM (CLK_VSP + 1) 176 + 177 + #define CLK_OTG_EB 0 178 + #define CLK_DMA_EB 1 179 + #define CLK_CE_EB 2 180 + #define CLK_NANDC_EB 3 181 + #define CLK_SDIO0_EB 4 182 + #define CLK_SDIO1_EB 5 183 + #define CLK_SDIO2_EB 6 184 + #define CLK_EMMC_EB 7 185 + #define CLK_EMMC_32K_EB 8 186 + #define CLK_SDIO0_32K_EB 9 187 + #define CLK_SDIO1_32K_EB 10 188 + #define CLK_SDIO2_32K_EB 11 189 + #define CLK_NANDC_26M_EB 12 190 + #define CLK_DMA_EB2 13 191 + #define CLK_CE_EB2 14 192 + #define CLK_AP_AHB_GATE_NUM (CLK_CE_EB2 + 1) 193 + 194 + #define CLK_GPIO_EB 0 195 + #define CLK_PWM0_EB 1 196 + #define CLK_PWM1_EB 2 197 + #define CLK_PWM2_EB 3 198 + #define CLK_PWM3_EB 4 199 + #define CLK_KPD_EB 5 200 + #define CLK_AON_SYST_EB 6 201 + #define CLK_AP_SYST_EB 7 202 + #define CLK_AON_TMR_EB 8 203 + #define CLK_EFUSE_EB 9 204 + #define CLK_EIC_EB 10 205 + #define CLK_INTC_EB 11 206 + #define CLK_ADI_EB 12 207 + #define CLK_AUDIF_EB 13 208 + #define CLK_AUD_EB 14 209 + #define CLK_VBC_EB 15 210 + #define CLK_PIN_EB 16 211 + #define CLK_AP_WDG_EB 17 212 + #define CLK_MM_EB 18 213 + #define CLK_AON_APB_CKG_EB 19 214 + #define CLK_CA53_TS0_EB 20 215 + #define CLK_CA53_TS1_EB 21 216 + #define CLK_CS53_DAP_EB 22 217 + #define CLK_PMU_EB 23 218 + #define CLK_THM_EB 24 219 + #define CLK_AUX0_EB 25 220 + #define CLK_AUX1_EB 26 221 + #define CLK_AUX2_EB 27 222 + #define CLK_PROBE_EB 28 223 + #define CLK_EMC_REF_EB 29 224 + #define CLK_CA53_WDG_EB 30 225 + #define CLK_AP_TMR1_EB 31 226 + #define CLK_AP_TMR2_EB 32 227 + #define CLK_DISP_EMC_EB 33 228 + #define CLK_ZIP_EMC_EB 34 229 + #define CLK_GSP_EMC_EB 35 230 + #define CLK_MM_VSP_EB 36 231 + #define CLK_MDAR_EB 37 232 + #define CLK_RTC4M0_CAL_EB 38 233 + #define CLK_RTC4M1_CAL_EB 39 234 + #define CLK_DJTAG_EB 40 235 + #define CLK_MBOX_EB 41 236 + #define CLK_AON_DMA_EB 42 237 + #define CLK_AON_APB_DEF_EB 43 238 + #define CLK_CA5_TS0_EB 44 239 + #define CLK_DBG_EB 45 240 + #define CLK_DBG_EMC_EB 46 241 + #define CLK_CROSS_TRIG_EB 47 242 + #define CLK_SERDES_DPHY_EB 48 243 + #define CLK_ARCH_RTC_EB 49 244 + #define CLK_KPD_RTC_EB 50 245 + #define CLK_AON_SYST_RTC_EB 51 246 + #define CLK_AP_SYST_RTC_EB 52 247 + #define CLK_AON_TMR_RTC_EB 53 248 + #define CLK_AP_TMR0_RTC_EB 54 249 + #define CLK_EIC_RTC_EB 55 250 + #define CLK_EIC_RTCDV5_EB 56 251 + #define CLK_AP_WDG_RTC_EB 57 252 + #define CLK_CA53_WDG_RTC_EB 58 253 + #define CLK_THM_RTC_EB 59 254 + #define CLK_ATHMA_RTC_EB 60 255 + #define CLK_GTHMA_RTC_EB 61 256 + #define CLK_ATHMA_RTC_A_EB 62 257 + #define CLK_GTHMA_RTC_A_EB 63 258 + #define CLK_AP_TMR1_RTC_EB 64 259 + #define CLK_AP_TMR2_RTC_EB 65 260 + #define CLK_DXCO_LC_RTC_EB 66 261 + #define CLK_BB_CAL_RTC_EB 67 262 + #define CLK_GNU_EB 68 263 + #define CLK_DISP_EB 69 264 + #define CLK_MM_EMC_EB 70 265 + #define CLK_POWER_CPU_EB 71 266 + #define CLK_HW_I2C_EB 72 267 + #define CLK_MM_VSP_EMC_EB 73 268 + #define CLK_VSP_EB 74 269 + #define CLK_CSSYS_EB 75 270 + #define CLK_DMC_EB 76 271 + #define CLK_ROSC_EB 77 272 + #define CLK_S_D_CFG_EB 78 273 + #define CLK_S_D_REF_EB 79 274 + #define CLK_B_DMA_EB 80 275 + #define CLK_ANLG_EB 81 276 + #define CLK_ANLG_APB_EB 82 277 + #define CLK_BSMTMR_EB 83 278 + #define CLK_AP_AXI_EB 84 279 + #define CLK_AP_INTC0_EB 85 280 + #define CLK_AP_INTC1_EB 86 281 + #define CLK_AP_INTC2_EB 87 282 + #define CLK_AP_INTC3_EB 88 283 + #define CLK_AP_INTC4_EB 89 284 + #define CLK_AP_INTC5_EB 90 285 + #define CLK_SCC_EB 91 286 + #define CLK_DPHY_CFG_EB 92 287 + #define CLK_DPHY_REF_EB 93 288 + #define CLK_CPHY_CFG_EB 94 289 + #define CLK_OTG_REF_EB 95 290 + #define CLK_SERDES_EB 96 291 + #define CLK_AON_AP_EMC_EB 97 292 + #define CLK_AON_APB_GATE_NUM (CLK_AON_AP_EMC_EB + 1) 293 + 294 + #define CLK_MAHB_CKG_EB 0 295 + #define CLK_MDCAM_EB 1 296 + #define CLK_MISP_EB 2 297 + #define CLK_MAHBCSI_EB 3 298 + #define CLK_MCSI_S_EB 4 299 + #define CLK_MCSI_T_EB 5 300 + #define CLK_DCAM_AXI_EB 6 301 + #define CLK_ISP_AXI_EB 7 302 + #define CLK_MCSI_EB 8 303 + #define CLK_MCSI_S_CKG_EB 9 304 + #define CLK_MCSI_T_CKG_EB 10 305 + #define CLK_SENSOR0_EB 11 306 + #define CLK_SENSOR1_EB 12 307 + #define CLK_SENSOR2_EB 13 308 + #define CLK_MCPHY_CFG_EB 14 309 + #define CLK_MM_GATE_NUM (CLK_MCPHY_CFG_EB + 1) 310 + 311 + #define CLK_SIM0_EB 0 312 + #define CLK_IIS0_EB 1 313 + #define CLK_IIS1_EB 2 314 + #define CLK_IIS2_EB 3 315 + #define CLK_SPI0_EB 4 316 + #define CLK_SPI1_EB 5 317 + #define CLK_SPI2_EB 6 318 + #define CLK_I2C0_EB 7 319 + #define CLK_I2C1_EB 8 320 + #define CLK_I2C2_EB 9 321 + #define CLK_I2C3_EB 10 322 + #define CLK_I2C4_EB 11 323 + #define CLK_UART0_EB 12 324 + #define CLK_UART1_EB 13 325 + #define CLK_UART2_EB 14 326 + #define CLK_UART3_EB 15 327 + #define CLK_UART4_EB 16 328 + #define CLK_SIM0_32K_EB 17 329 + #define CLK_SPI3_EB 18 330 + #define CLK_I2C5_EB 19 331 + #define CLK_I2C6_EB 20 332 + #define CLK_AP_APB_GATE_NUM (CLK_I2C6_EB + 1) 333 + 334 + #endif /* _DT_BINDINGS_CLK_SC9863A_H_ */
+1 -1
include/dt-bindings/clock/sun50i-a64-ccu.h
··· 131 131 #define CLK_AVS 109 132 132 #define CLK_HDMI 110 133 133 #define CLK_HDMI_DDC 111 134 - 134 + #define CLK_MBUS 112 135 135 #define CLK_DSI_DPHY 113 136 136 #define CLK_GPU 114 137 137