mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 13:43:51 +00:00
Only a couple new SoCs have support added this time, primarily for Qualcomm
SM8650 based on the diffstat. Otherwise this is a collection of non-critical fixes and cleanups to various clk drivers and their DT bindings. Nothing is changed in the core clk framework this time, although there's a patch to fix a basic clk type initialization function. In general, this pile looks to be on the smaller side. New Drivers: - Global, display, gpu, tcsr, and rpmh clocks on Qualcomm SM8650 - Mediatek MT7988 SoC clocks Updates: - Update Zynqmp driver for Versal NET platforms - Add clk driver for Versal clocking wizard IP - Support for stm32mp25 clks - Add glitch free PLL setting support to si5351 clk driver - Add DSI clocks on Amlogic g12/sm1 - Add CSI and ISP clocks on Amlogic g12/sm1 - Document bindings for i.MX93 ANATOP clock driver - Free clk_node in i.MX SCU driver for resource with different owner - Update the LVDS clocks to be compatible with i.MX SCU firmware 1.15 - Fix the name of the fvco in i.MX pll14xx by renaming it to fout - Add EtherNet TSN and PCIe clocks on the Renesas R-Car V4H SoC - Add interrupt controller and Ethernet clocks and resets on Renesas RZ/G3S - Check reset monitor registers on Renesas RZ/G2L-alike SoCs - Reuse reset functionality in the Renesas RZ/G2L clock driver - Global and RPMh clock support for the Qualcomm X1E80100 SoC - Support for the Stromer APCS PLL found in Qualcomm IPQ5018 - Add a new type of branch clock, with support for controlling separate memory control bits, to the Qualcomm clk driver - Use above new branch type in Qualcomm ECPRI clk driver for QDU1000 and QRU1000 - Add a number of missing clocks related to CSI2 on Qualcomm MSM8939 - Add support for the camera clock controller on Qualcomm SC8280XP - Correct PLL configuration in GPU and video clock controllers for Qualcomm SM8150 - Add runtime PM support and a few missing resets to Qualcomm SM8150 video clock controller - Fix configuration of various GCC GDSCs on Qualcomm SM8550 - Mark shared RCGs appropriately in the Qualcomm SM8550 GCC driver - Fix up GPU and display clock controllers PLL configuration settings on Qualcomm SM8550 - Cleanup variable init in Allwinner nkm module - Convert various DT bindings to YAML - A few kernel-doc fixes for Samsung SoC clock controllers -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAmWdydURHHNib3lkQGtl cm5lbC5vcmcACgkQrQKIl8bklSXvtQ//eoF6kwlLT9knQIE9sYQAPJrHytObVpSl 3htHQBvSMKwJNTmzWbKWIUw9T7JliYU+aho768zKqVMVLd6PWk1eOL0NIKB/jSSz /OIWxS9hrcTXm/GAKX+0jyAxw97pq0Qb82PNpD+QuLAcVw/5rMVl/+pMNqeVeqjK 2aN4QfaL7B1F1vV/rBtniG1//Hwwr7IMIT3wIBE6W4jlw84N2gayqEl/EaXabF6F +9Wh8bPS1ny206XGtI8KNcFkv/uFoqWjO7g/hPgXMQcVSd50oV02iJPf6HaWBx4L 9podF3uhNuNk5v02fp1nCygzRn2YDa4eMwMjJtSxU0Inq9s01u8dWNkIgwuCJMjv jSKMMgxa9rHhJ7+xiYi1pQ23fHG1tx600u1zKWMkO1a0U80KeeynGFpdfhUzsD6E ZNUkEee2Ehw1nDMfrUqUt9dWLnRutCXa5jTvgKBWFM7hs9W+ErudAKwP0x2hNl3Z q8Z6RpCoGNnb1e0nw407j3AsXJkbzg9D4KGMlNNEVmuP0iZY3IsVIWrhszx0Zmi4 M3sNNtTskbD4nX42JADhZgVpql2rSikxjfnaBsSXYSJu9SGkCF9clOSb1lKGgKmk gCWcGpmxdmVbTNYCgsZ/jUBs8QDgOxcyFJYLys7/tkjDec9IuxeB37vkaXv2rqU8 t0VzUVWUqYw= =t0CI -----END PGP SIGNATURE----- Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux Pull clk updates from Stephen Boyd: "Only a couple new SoCs have support added this time, primarily for Qualcomm SM8650 based on the diffstat. Otherwise this is a collection of non-critical fixes and cleanups to various clk drivers and their DT bindings. Nothing is changed in the core clk framework this time, although there's a patch to fix a basic clk type initialization function. In general, this pile looks to be on the smaller side. New Drivers: - Global, display, gpu, tcsr, and rpmh clocks on Qualcomm SM8650 - Mediatek MT7988 SoC clocks Updates: - Update Zynqmp driver for Versal NET platforms - Add clk driver for Versal clocking wizard IP - Support for stm32mp25 clks - Add glitch free PLL setting support to si5351 clk driver - Add DSI clocks on Amlogic g12/sm1 - Add CSI and ISP clocks on Amlogic g12/sm1 - Document bindings for i.MX93 ANATOP clock driver - Free clk_node in i.MX SCU driver for resource with different owner - Update the LVDS clocks to be compatible with i.MX SCU firmware 1.15 - Fix the name of the fvco in i.MX pll14xx by renaming it to fout - Add EtherNet TSN and PCIe clocks on the Renesas R-Car V4H SoC - Add interrupt controller and Ethernet clocks and resets on Renesas RZ/G3S - Check reset monitor registers on Renesas RZ/G2L-alike SoCs - Reuse reset functionality in the Renesas RZ/G2L clock driver - Global and RPMh clock support for the Qualcomm X1E80100 SoC - Support for the Stromer APCS PLL found in Qualcomm IPQ5018 - Add a new type of branch clock, with support for controlling separate memory control bits, to the Qualcomm clk driver - Use above new branch type in Qualcomm ECPRI clk driver for QDU1000 and QRU1000 - Add a number of missing clocks related to CSI2 on Qualcomm MSM8939 - Add support for the camera clock controller on Qualcomm SC8280XP - Correct PLL configuration in GPU and video clock controllers for Qualcomm SM8150 - Add runtime PM support and a few missing resets to Qualcomm SM8150 video clock controller - Fix configuration of various GCC GDSCs on Qualcomm SM8550 - Mark shared RCGs appropriately in the Qualcomm SM8550 GCC driver - Fix up GPU and display clock controllers PLL configuration settings on Qualcomm SM8550 - Cleanup variable init in Allwinner nkm module - Convert various DT bindings to YAML - A few kernel-doc fixes for Samsung SoC clock controllers" * tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (93 commits) clk: mediatek: add drivers for MT7988 SoC clk: mediatek: add pcw_chg_bit control for PLLs of MT7988 dt-bindings: clock: mediatek: add clock controllers of MT7988 dt-bindings: reset: mediatek: add MT7988 ethwarp reset IDs dt-bindings: clock: mediatek: add MT7988 clock IDs clk: mediatek: mt8188-topckgen: Refactor parents for top_dp/edp muxes clk: mediatek: mt8195-topckgen: Refactor parents for top_dp/edp muxes clk: mediatek: clk-mux: Support custom parent indices for muxes dt-bindings: clock: sophgo: Add clock controller of CV1800 series SoC clk: starfive: jh7100: Add CLK_SET_RATE_PARENT to gmac_tx clk: starfive: Add flags argument to JH71X0__MUX macro clk: imx: pll14xx: change naming of fvco to fout clk: imx: clk-imx8qxp: fix LVDS bypass, pixel and phy clocks clk: imx: scu: Fix memory leak in __imx_clk_gpr_scu() clk: fixed-rate: fix clk_hw_register_fixed_rate_with_accuracy_parent_hw clk: qcom: dispcc-sm8650: Add test_ctl parameters to PLL config clk: qcom: gpucc-sm8650: Add test_ctl parameters to PLL config clk: qcom: dispcc-sm8550: Use the correct PLL configuration function clk: qcom: dispcc-sm8550: Update disp PLL settings clk: qcom: gpucc-sm8550: Update GPU PLL settings ...
This commit is contained in:
commit
c736c9a955
@ -1,29 +0,0 @@
|
||||
Mediatek ethsys controller
|
||||
============================
|
||||
|
||||
The Mediatek ethsys controller provides various clocks to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt2701-ethsys", "syscon"
|
||||
- "mediatek,mt7622-ethsys", "syscon"
|
||||
- "mediatek,mt7623-ethsys", "mediatek,mt2701-ethsys", "syscon"
|
||||
- "mediatek,mt7629-ethsys", "syscon"
|
||||
- "mediatek,mt7981-ethsys", "syscon"
|
||||
- "mediatek,mt7986-ethsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
- #reset-cells: Must be 1
|
||||
|
||||
The ethsys controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
ethsys: clock-controller@1b000000 {
|
||||
compatible = "mediatek,mt2701-ethsys", "syscon";
|
||||
reg = <0 0x1b000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -30,6 +30,7 @@ properties:
|
||||
- mediatek,mt7629-infracfg
|
||||
- mediatek,mt7981-infracfg
|
||||
- mediatek,mt7986-infracfg
|
||||
- mediatek,mt7988-infracfg
|
||||
- mediatek,mt8135-infracfg
|
||||
- mediatek,mt8167-infracfg
|
||||
- mediatek,mt8173-infracfg
|
||||
|
@ -1,138 +0,0 @@
|
||||
Broadcom Kona Family Clocks
|
||||
|
||||
This binding is associated with Broadcom SoCs having "Kona" style
|
||||
clock control units (CCUs). A CCU is a clock provider that manages
|
||||
a set of clock signals. Each CCU is represented by a node in the
|
||||
device tree.
|
||||
|
||||
This binding uses the common clock binding:
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
|
||||
Required properties:
|
||||
- compatible
|
||||
Shall have a value of the form "brcm,<model>-<which>-ccu",
|
||||
where <model> is a Broadcom SoC model number and <which> is
|
||||
the name of a defined CCU. For example:
|
||||
"brcm,bcm11351-root-ccu"
|
||||
The compatible strings used for each supported SoC family
|
||||
are defined below.
|
||||
- reg
|
||||
Shall define the base and range of the address space
|
||||
containing clock control registers
|
||||
- #clock-cells
|
||||
Shall have value <1>. The permitted clock-specifier values
|
||||
are defined below.
|
||||
- clock-output-names
|
||||
Shall be an ordered list of strings defining the names of
|
||||
the clocks provided by the CCU.
|
||||
|
||||
Device tree example:
|
||||
|
||||
slave_ccu: slave_ccu {
|
||||
compatible = "brcm,bcm11351-slave-ccu";
|
||||
reg = <0x3e011000 0x0f00>;
|
||||
#clock-cells = <1>;
|
||||
clock-output-names = "uartb",
|
||||
"uartb2",
|
||||
"uartb3",
|
||||
"uartb4";
|
||||
};
|
||||
|
||||
ref_crystal_clk: ref_crystal {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <26000000>;
|
||||
};
|
||||
|
||||
uart@3e002000 {
|
||||
compatible = "brcm,bcm11351-dw-apb-uart", "snps,dw-apb-uart";
|
||||
reg = <0x3e002000 0x1000>;
|
||||
clocks = <&slave_ccu BCM281XX_SLAVE_CCU_UARTB3>;
|
||||
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
};
|
||||
|
||||
BCM281XX family
|
||||
---------------
|
||||
CCU compatible string values for SoCs in the BCM281XX family are:
|
||||
"brcm,bcm11351-root-ccu"
|
||||
"brcm,bcm11351-aon-ccu"
|
||||
"brcm,bcm11351-hub-ccu"
|
||||
"brcm,bcm11351-master-ccu"
|
||||
"brcm,bcm11351-slave-ccu"
|
||||
|
||||
The following table defines the set of CCUs and clock specifiers for
|
||||
BCM281XX family clocks. When a clock consumer references a clocks,
|
||||
its symbolic specifier (rather than its numeric index value) should
|
||||
be used. These specifiers are defined in:
|
||||
"include/dt-bindings/clock/bcm281xx.h"
|
||||
|
||||
CCU Clock Type Index Specifier
|
||||
--- ----- ---- ----- ---------
|
||||
root frac_1m peri 0 BCM281XX_ROOT_CCU_FRAC_1M
|
||||
|
||||
aon hub_timer peri 0 BCM281XX_AON_CCU_HUB_TIMER
|
||||
aon pmu_bsc peri 1 BCM281XX_AON_CCU_PMU_BSC
|
||||
aon pmu_bsc_var peri 2 BCM281XX_AON_CCU_PMU_BSC_VAR
|
||||
|
||||
hub tmon_1m peri 0 BCM281XX_HUB_CCU_TMON_1M
|
||||
|
||||
master sdio1 peri 0 BCM281XX_MASTER_CCU_SDIO1
|
||||
master sdio2 peri 1 BCM281XX_MASTER_CCU_SDIO2
|
||||
master sdio3 peri 2 BCM281XX_MASTER_CCU_SDIO3
|
||||
master sdio4 peri 3 BCM281XX_MASTER_CCU_SDIO4
|
||||
master dmac peri 4 BCM281XX_MASTER_CCU_DMAC
|
||||
master usb_ic peri 5 BCM281XX_MASTER_CCU_USB_IC
|
||||
master hsic2_48m peri 6 BCM281XX_MASTER_CCU_HSIC_48M
|
||||
master hsic2_12m peri 7 BCM281XX_MASTER_CCU_HSIC_12M
|
||||
|
||||
slave uartb peri 0 BCM281XX_SLAVE_CCU_UARTB
|
||||
slave uartb2 peri 1 BCM281XX_SLAVE_CCU_UARTB2
|
||||
slave uartb3 peri 2 BCM281XX_SLAVE_CCU_UARTB3
|
||||
slave uartb4 peri 3 BCM281XX_SLAVE_CCU_UARTB4
|
||||
slave ssp0 peri 4 BCM281XX_SLAVE_CCU_SSP0
|
||||
slave ssp2 peri 5 BCM281XX_SLAVE_CCU_SSP2
|
||||
slave bsc1 peri 6 BCM281XX_SLAVE_CCU_BSC1
|
||||
slave bsc2 peri 7 BCM281XX_SLAVE_CCU_BSC2
|
||||
slave bsc3 peri 8 BCM281XX_SLAVE_CCU_BSC3
|
||||
slave pwm peri 9 BCM281XX_SLAVE_CCU_PWM
|
||||
|
||||
|
||||
BCM21664 family
|
||||
---------------
|
||||
CCU compatible string values for SoCs in the BCM21664 family are:
|
||||
"brcm,bcm21664-root-ccu"
|
||||
"brcm,bcm21664-aon-ccu"
|
||||
"brcm,bcm21664-master-ccu"
|
||||
"brcm,bcm21664-slave-ccu"
|
||||
|
||||
The following table defines the set of CCUs and clock specifiers for
|
||||
BCM21664 family clocks. When a clock consumer references a clocks,
|
||||
its symbolic specifier (rather than its numeric index value) should
|
||||
be used. These specifiers are defined in:
|
||||
"include/dt-bindings/clock/bcm21664.h"
|
||||
|
||||
CCU Clock Type Index Specifier
|
||||
--- ----- ---- ----- ---------
|
||||
root frac_1m peri 0 BCM21664_ROOT_CCU_FRAC_1M
|
||||
|
||||
aon hub_timer peri 0 BCM21664_AON_CCU_HUB_TIMER
|
||||
|
||||
master sdio1 peri 0 BCM21664_MASTER_CCU_SDIO1
|
||||
master sdio2 peri 1 BCM21664_MASTER_CCU_SDIO2
|
||||
master sdio3 peri 2 BCM21664_MASTER_CCU_SDIO3
|
||||
master sdio4 peri 3 BCM21664_MASTER_CCU_SDIO4
|
||||
master sdio1_sleep peri 4 BCM21664_MASTER_CCU_SDIO1_SLEEP
|
||||
master sdio2_sleep peri 5 BCM21664_MASTER_CCU_SDIO2_SLEEP
|
||||
master sdio3_sleep peri 6 BCM21664_MASTER_CCU_SDIO3_SLEEP
|
||||
master sdio4_sleep peri 7 BCM21664_MASTER_CCU_SDIO4_SLEEP
|
||||
|
||||
slave uartb peri 0 BCM21664_SLAVE_CCU_UARTB
|
||||
slave uartb2 peri 1 BCM21664_SLAVE_CCU_UARTB2
|
||||
slave uartb3 peri 2 BCM21664_SLAVE_CCU_UARTB3
|
||||
slave uartb4 peri 3 BCM21664_SLAVE_CCU_UARTB4
|
||||
slave bsc1 peri 4 BCM21664_SLAVE_CCU_BSC1
|
||||
slave bsc2 peri 5 BCM21664_SLAVE_CCU_BSC2
|
||||
slave bsc3 peri 6 BCM21664_SLAVE_CCU_BSC3
|
||||
slave bsc4 peri 7 BCM21664_SLAVE_CCU_BSC4
|
181
Documentation/devicetree/bindings/clock/brcm,kona-ccu.yaml
Normal file
181
Documentation/devicetree/bindings/clock/brcm,kona-ccu.yaml
Normal file
@ -0,0 +1,181 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/brcm,kona-ccu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Broadcom Kona family clock control units (CCU)
|
||||
|
||||
maintainers:
|
||||
- Florian Fainelli <florian.fainelli@broadcom.com>
|
||||
- Ray Jui <rjui@broadcom.com>
|
||||
- Scott Branden <sbranden@broadcom.com>
|
||||
|
||||
description: |
|
||||
Broadcom "Kona" style clock control unit (CCU) is a clock provider that
|
||||
manages a set of clock signals.
|
||||
|
||||
All available clock IDs are defined in
|
||||
- include/dt-bindings/clock/bcm281xx.h for BCM281XX family
|
||||
- include/dt-bindings/clock/bcm21664.h for BCM21664 family
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- brcm,bcm11351-aon-ccu
|
||||
- brcm,bcm11351-hub-ccu
|
||||
- brcm,bcm11351-master-ccu
|
||||
- brcm,bcm11351-root-ccu
|
||||
- brcm,bcm11351-slave-ccu
|
||||
- brcm,bcm21664-aon-ccu
|
||||
- brcm,bcm21664-master-ccu
|
||||
- brcm,bcm21664-root-ccu
|
||||
- brcm,bcm21664-slave-ccu
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
clock-output-names:
|
||||
minItems: 1
|
||||
maxItems: 10
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#clock-cells'
|
||||
- clock-output-names
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm11351-aon-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
items:
|
||||
- const: hub_timer
|
||||
- const: pmu_bsc
|
||||
- const: pmu_bsc_var
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm11351-hub-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
const: tmon_1m
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm11351-master-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
items:
|
||||
- const: sdio1
|
||||
- const: sdio2
|
||||
- const: sdio3
|
||||
- const: sdio4
|
||||
- const: usb_ic
|
||||
- const: hsic2_48m
|
||||
- const: hsic2_12m
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- brcm,bcm11351-root-ccu
|
||||
- brcm,bcm21664-root-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
const: frac_1m
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm11351-slave-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
items:
|
||||
- const: uartb
|
||||
- const: uartb2
|
||||
- const: uartb3
|
||||
- const: uartb4
|
||||
- const: ssp0
|
||||
- const: ssp2
|
||||
- const: bsc1
|
||||
- const: bsc2
|
||||
- const: bsc3
|
||||
- const: pwm
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm21664-aon-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
const: hub_timer
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm21664-master-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
items:
|
||||
- const: sdio1
|
||||
- const: sdio2
|
||||
- const: sdio3
|
||||
- const: sdio4
|
||||
- const: sdio1_sleep
|
||||
- const: sdio2_sleep
|
||||
- const: sdio3_sleep
|
||||
- const: sdio4_sleep
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: brcm,bcm21664-slave-ccu
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
items:
|
||||
- const: uartb
|
||||
- const: uartb2
|
||||
- const: uartb3
|
||||
- const: bsc1
|
||||
- const: bsc2
|
||||
- const: bsc3
|
||||
- const: bsc4
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@3e011000 {
|
||||
compatible = "brcm,bcm11351-slave-ccu";
|
||||
reg = <0x3e011000 0x0f00>;
|
||||
#clock-cells = <1>;
|
||||
clock-output-names = "uartb",
|
||||
"uartb2",
|
||||
"uartb3",
|
||||
"uartb4",
|
||||
"ssp0",
|
||||
"ssp2",
|
||||
"bsc1",
|
||||
"bsc2",
|
||||
"bsc3",
|
||||
"pwm";
|
||||
};
|
||||
...
|
@ -0,0 +1,42 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/fsl,imx93-anatop.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NXP i.MX93 ANATOP Clock Module
|
||||
|
||||
maintainers:
|
||||
- Peng Fan <peng.fan@nxp.com>
|
||||
|
||||
description: |
|
||||
NXP i.MX93 ANATOP module which contains PLL and OSC to Clock Controller
|
||||
Module.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: fsl,imx93-anatop
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#clock-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@44480000 {
|
||||
compatible = "fsl,imx93-anatop";
|
||||
reg = <0x44480000 0x2000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
...
|
@ -22,6 +22,7 @@ properties:
|
||||
- mediatek,mt7622-apmixedsys
|
||||
- mediatek,mt7981-apmixedsys
|
||||
- mediatek,mt7986-apmixedsys
|
||||
- mediatek,mt7988-apmixedsys
|
||||
- mediatek,mt8135-apmixedsys
|
||||
- mediatek,mt8173-apmixedsys
|
||||
- mediatek,mt8516-apmixedsys
|
||||
|
55
Documentation/devicetree/bindings/clock/mediatek,ethsys.yaml
Normal file
55
Documentation/devicetree/bindings/clock/mediatek,ethsys.yaml
Normal file
@ -0,0 +1,55 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,ethsys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mediatek ethsys controller
|
||||
|
||||
description:
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
maintainers:
|
||||
- James Liao <jamesjj.liao@mediatek.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt2701-ethsys
|
||||
- mediatek,mt7622-ethsys
|
||||
- mediatek,mt7629-ethsys
|
||||
- mediatek,mt7981-ethsys
|
||||
- mediatek,mt7986-ethsys
|
||||
- mediatek,mt7988-ethsys
|
||||
- const: syscon
|
||||
- items:
|
||||
- const: mediatek,mt7623-ethsys
|
||||
- const: mediatek,mt2701-ethsys
|
||||
- const: syscon
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1b000000 {
|
||||
compatible = "mediatek,mt2701-ethsys", "syscon";
|
||||
reg = <0x1b000000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,52 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt7988-ethwarp.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek MT7988 ethwarp Controller
|
||||
|
||||
maintainers:
|
||||
- Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
description:
|
||||
The Mediatek MT7988 ethwarp controller provides clocks and resets for the
|
||||
Ethernet related subsystems found the MT7988 SoC.
|
||||
The clock values can be found in <dt-bindings/clock/mt*-clk.h>.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: mediatek,mt7988-ethwarp
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/reset/ti-syscon.h>
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
clock-controller@15031000 {
|
||||
compatible = "mediatek,mt7988-ethwarp";
|
||||
reg = <0 0x15031000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
};
|
@ -0,0 +1,48 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt7988-xfi-pll.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek MT7988 XFI PLL Clock Controller
|
||||
|
||||
maintainers:
|
||||
- Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
description:
|
||||
The MediaTek XFI PLL controller provides the 156.25MHz clock for the
|
||||
Ethernet SerDes PHY from the 40MHz top_xtal clock.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt7988-xfi-pll
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- resets
|
||||
- '#clock-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
clock-controller@11f40000 {
|
||||
compatible = "mediatek,mt7988-xfi-pll";
|
||||
reg = <0 0x11f40000 0 0x1000>;
|
||||
resets = <&watchdog 16>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
};
|
@ -37,6 +37,8 @@ properties:
|
||||
- mediatek,mt7629-topckgen
|
||||
- mediatek,mt7981-topckgen
|
||||
- mediatek,mt7986-topckgen
|
||||
- mediatek,mt7988-mcusys
|
||||
- mediatek,mt7988-topckgen
|
||||
- mediatek,mt8167-topckgen
|
||||
- mediatek,mt8183-topckgen
|
||||
- const: syscon
|
||||
|
@ -16,6 +16,7 @@ description:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,ipq5018-a53pll
|
||||
- qcom,ipq5332-a53pll
|
||||
- qcom,ipq6018-a53pll
|
||||
- qcom,ipq8074-a53pll
|
||||
|
@ -0,0 +1,57 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,gcc-ipq6018.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Global Clock & Reset Controller on IPQ6018
|
||||
|
||||
maintainers:
|
||||
- Stephen Boyd <sboyd@kernel.org>
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
- Robert Marko <robimarko@gmail.com>
|
||||
|
||||
description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on IPQ6018.
|
||||
|
||||
See also::
|
||||
include/dt-bindings/clock/qcom,gcc-ipq6018.h
|
||||
include/dt-bindings/reset/qcom,gcc-ipq6018.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,gcc-ipq6018
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: board XO clock
|
||||
- description: sleep clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: xo
|
||||
- const: sleep_clk
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1800000 {
|
||||
compatible = "qcom,gcc-ipq6018";
|
||||
reg = <0x01800000 0x80000>;
|
||||
clocks = <&xo>, <&sleep_clk>;
|
||||
clock-names = "xo", "sleep_clk";
|
||||
#clock-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
...
|
@ -15,8 +15,6 @@ description: |
|
||||
domains.
|
||||
|
||||
See also::
|
||||
include/dt-bindings/clock/qcom,gcc-ipq6018.h
|
||||
include/dt-bindings/reset/qcom,gcc-ipq6018.h
|
||||
include/dt-bindings/clock/qcom,gcc-msm8953.h
|
||||
include/dt-bindings/clock/qcom,gcc-mdm9607.h
|
||||
|
||||
@ -26,7 +24,6 @@ allOf:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,gcc-ipq6018
|
||||
- qcom,gcc-mdm9607
|
||||
|
||||
required:
|
||||
|
@ -0,0 +1,68 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,qdu1000-ecpricc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm ECPRI Clock & Reset Controller for QDU1000 and QRU1000
|
||||
|
||||
maintainers:
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
- Imran Shaik <quic_imrashai@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm ECPRI Specification V2.0 Common Public Radio Interface clock control
|
||||
module which supports the clocks, resets on QDU1000 and QRU1000
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,qdu1000-ecpricc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,qdu1000-ecpricc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: GPLL0 source from GCC
|
||||
- description: GPLL1 source from GCC
|
||||
- description: GPLL2 source from GCC
|
||||
- description: GPLL3 source from GCC
|
||||
- description: GPLL4 source from GCC
|
||||
- description: GPLL5 source from GCC
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,qdu1000-gcc.h>
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
clock-controller@280000 {
|
||||
compatible = "qcom,qdu1000-ecpricc";
|
||||
reg = <0x00280000 0x31c00>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_ECPRI_CC_GPLL0_CLK_SRC>,
|
||||
<&gcc GCC_ECPRI_CC_GPLL1_EVEN_CLK_SRC>,
|
||||
<&gcc GCC_ECPRI_CC_GPLL2_EVEN_CLK_SRC>,
|
||||
<&gcc GCC_ECPRI_CC_GPLL3_CLK_SRC>,
|
||||
<&gcc GCC_ECPRI_CC_GPLL4_CLK_SRC>,
|
||||
<&gcc GCC_ECPRI_CC_GPLL5_EVEN_CLK_SRC>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -21,6 +21,15 @@ description: |
|
||||
1 -- DIF1
|
||||
2 -- DIF2
|
||||
3 -- DIF3
|
||||
- 9FGV0841:
|
||||
0 -- DIF0
|
||||
1 -- DIF1
|
||||
2 -- DIF2
|
||||
3 -- DIF3
|
||||
4 -- DIF4
|
||||
5 -- DIF5
|
||||
6 -- DIF6
|
||||
7 -- DIF7
|
||||
|
||||
maintainers:
|
||||
- Marek Vasut <marex@denx.de>
|
||||
@ -30,6 +39,7 @@ properties:
|
||||
enum:
|
||||
- renesas,9fgv0241
|
||||
- renesas,9fgv0441
|
||||
- renesas,9fgv0841
|
||||
|
||||
reg:
|
||||
description: I2C device address
|
||||
|
@ -1,126 +0,0 @@
|
||||
Binding for Silicon Labs Si5351a/b/c programmable i2c clock generator.
|
||||
|
||||
Reference
|
||||
[1] Si5351A/B/C Data Sheet
|
||||
https://www.skyworksinc.com/-/media/Skyworks/SL/documents/public/data-sheets/Si5351-B.pdf
|
||||
|
||||
The Si5351a/b/c are programmable i2c clock generators with up to 8 output
|
||||
clocks. Si5351a also has a reduced pin-count package (MSOP10) where only
|
||||
3 output clocks are accessible. The internal structure of the clock
|
||||
generators can be found in [1].
|
||||
|
||||
==I2C device node==
|
||||
|
||||
Required properties:
|
||||
- compatible: shall be one of the following:
|
||||
"silabs,si5351a" - Si5351a, QFN20 package
|
||||
"silabs,si5351a-msop" - Si5351a, MSOP10 package
|
||||
"silabs,si5351b" - Si5351b, QFN20 package
|
||||
"silabs,si5351c" - Si5351c, QFN20 package
|
||||
- reg: i2c device address, shall be 0x60 or 0x61.
|
||||
- #clock-cells: from common clock binding; shall be set to 1.
|
||||
- clocks: from common clock binding; list of parent clock
|
||||
handles, shall be xtal reference clock or xtal and clkin for
|
||||
si5351c only. Corresponding clock input names are "xtal" and
|
||||
"clkin" respectively.
|
||||
- #address-cells: shall be set to 1.
|
||||
- #size-cells: shall be set to 0.
|
||||
|
||||
Optional properties:
|
||||
- silabs,pll-source: pair of (number, source) for each pll. Allows
|
||||
to overwrite clock source of pll A (number=0) or B (number=1).
|
||||
|
||||
==Child nodes==
|
||||
|
||||
Each of the clock outputs can be overwritten individually by
|
||||
using a child node to the I2C device node. If a child node for a clock
|
||||
output is not set, the eeprom configuration is not overwritten.
|
||||
|
||||
Required child node properties:
|
||||
- reg: number of clock output.
|
||||
|
||||
Optional child node properties:
|
||||
- silabs,clock-source: source clock of the output divider stage N, shall be
|
||||
0 = multisynth N
|
||||
1 = multisynth 0 for output clocks 0-3, else multisynth4
|
||||
2 = xtal
|
||||
3 = clkin (si5351c only)
|
||||
- silabs,drive-strength: output drive strength in mA, shall be one of {2,4,6,8}.
|
||||
- silabs,multisynth-source: source pll A(0) or B(1) of corresponding multisynth
|
||||
divider.
|
||||
- silabs,pll-master: boolean, multisynth can change pll frequency.
|
||||
- silabs,pll-reset: boolean, clock output can reset its pll.
|
||||
- silabs,disable-state : clock output disable state, shall be
|
||||
0 = clock output is driven LOW when disabled
|
||||
1 = clock output is driven HIGH when disabled
|
||||
2 = clock output is FLOATING (HIGH-Z) when disabled
|
||||
3 = clock output is NEVER disabled
|
||||
|
||||
==Example==
|
||||
|
||||
/* 25MHz reference crystal */
|
||||
ref25: ref25M {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <25000000>;
|
||||
};
|
||||
|
||||
i2c-master-node {
|
||||
|
||||
/* Si5351a msop10 i2c clock generator */
|
||||
si5351a: clock-generator@60 {
|
||||
compatible = "silabs,si5351a-msop";
|
||||
reg = <0x60>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#clock-cells = <1>;
|
||||
|
||||
/* connect xtal input to 25MHz reference */
|
||||
clocks = <&ref25>;
|
||||
clock-names = "xtal";
|
||||
|
||||
/* connect xtal input as source of pll0 and pll1 */
|
||||
silabs,pll-source = <0 0>, <1 0>;
|
||||
|
||||
/*
|
||||
* overwrite clkout0 configuration with:
|
||||
* - 8mA output drive strength
|
||||
* - pll0 as clock source of multisynth0
|
||||
* - multisynth0 as clock source of output divider
|
||||
* - multisynth0 can change pll0
|
||||
* - set initial clock frequency of 74.25MHz
|
||||
*/
|
||||
clkout0 {
|
||||
reg = <0>;
|
||||
silabs,drive-strength = <8>;
|
||||
silabs,multisynth-source = <0>;
|
||||
silabs,clock-source = <0>;
|
||||
silabs,pll-master;
|
||||
clock-frequency = <74250000>;
|
||||
};
|
||||
|
||||
/*
|
||||
* overwrite clkout1 configuration with:
|
||||
* - 4mA output drive strength
|
||||
* - pll1 as clock source of multisynth1
|
||||
* - multisynth1 as clock source of output divider
|
||||
* - multisynth1 can change pll1
|
||||
*/
|
||||
clkout1 {
|
||||
reg = <1>;
|
||||
silabs,drive-strength = <4>;
|
||||
silabs,multisynth-source = <1>;
|
||||
silabs,clock-source = <0>;
|
||||
pll-master;
|
||||
};
|
||||
|
||||
/*
|
||||
* overwrite clkout2 configuration with:
|
||||
* - xtal as clock source of output divider
|
||||
*/
|
||||
clkout2 {
|
||||
reg = <2>;
|
||||
silabs,clock-source = <2>;
|
||||
};
|
||||
};
|
||||
};
|
265
Documentation/devicetree/bindings/clock/silabs,si5351.yaml
Normal file
265
Documentation/devicetree/bindings/clock/silabs,si5351.yaml
Normal file
@ -0,0 +1,265 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/silabs,si5351.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Silicon Labs Si5351A/B/C programmable I2C clock generators
|
||||
|
||||
description: |
|
||||
The Silicon Labs Si5351A/B/C are programmable I2C clock generators with up to
|
||||
8 outputs. Si5351A also has a reduced pin-count package (10-MSOP) where only 3
|
||||
output clocks are accessible. The internal structure of the clock generators
|
||||
can be found in [1].
|
||||
|
||||
[1] Si5351A/B/C Data Sheet
|
||||
https://www.skyworksinc.com/-/media/Skyworks/SL/documents/public/data-sheets/Si5351-B.pdf
|
||||
|
||||
maintainers:
|
||||
- Alvin Šipraga <alsi@bang-olufsen.dk>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- silabs,si5351a # Si5351A, 20-QFN package
|
||||
- silabs,si5351a-msop # Si5351A, 10-MSOP package
|
||||
- silabs,si5351b # Si5351B, 20-QFN package
|
||||
- silabs,si5351c # Si5351C, 20-QFN package
|
||||
|
||||
reg:
|
||||
enum:
|
||||
- 0x60
|
||||
- 0x61
|
||||
|
||||
"#address-cells":
|
||||
const: 1
|
||||
|
||||
"#size-cells":
|
||||
const: 0
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: xtal
|
||||
- const: clkin
|
||||
|
||||
silabs,pll-source:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-matrix
|
||||
description: |
|
||||
A list of cell pairs containing a PLL index and its source. Allows to
|
||||
overwrite clock source of the internal PLLs.
|
||||
items:
|
||||
items:
|
||||
- description: PLL A (0) or PLL B (1)
|
||||
enum: [ 0, 1 ]
|
||||
- description: PLL source, XTAL (0) or CLKIN (1, Si5351C only).
|
||||
enum: [ 0, 1 ]
|
||||
|
||||
silabs,pll-reset-mode:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-matrix
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
description: A list of cell pairs containing a PLL index and its reset mode.
|
||||
items:
|
||||
items:
|
||||
- description: PLL A (0) or PLL B (1)
|
||||
enum: [ 0, 1 ]
|
||||
- description: |
|
||||
Reset mode for the PLL. Mode can be one of:
|
||||
|
||||
0 - reset whenever PLL rate is adjusted (default mode)
|
||||
1 - do not reset when PLL rate is adjusted
|
||||
|
||||
In mode 1, the PLL is only reset if the silabs,pll-reset is
|
||||
specified in one of the clock output child nodes that also sources
|
||||
the PLL. This mode may be preferable if output clocks are expected
|
||||
to be adjusted without glitches.
|
||||
enum: [ 0, 1 ]
|
||||
|
||||
patternProperties:
|
||||
"^clkout@[0-7]$":
|
||||
type: object
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
reg:
|
||||
description: Clock output number.
|
||||
|
||||
clock-frequency: true
|
||||
|
||||
silabs,clock-source:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: |
|
||||
Source clock of the this output's divider stage.
|
||||
|
||||
0 - use multisynth N for this output, where N is the output number
|
||||
1 - use either multisynth 0 (if output number is 0-3) or multisynth 4
|
||||
(otherwise) for this output
|
||||
2 - use XTAL for this output
|
||||
3 - use CLKIN for this output (Si5351C only)
|
||||
|
||||
silabs,drive-strength:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [ 2, 4, 6, 8 ]
|
||||
description: Output drive strength in mA.
|
||||
|
||||
silabs,multisynth-source:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [ 0, 1 ]
|
||||
description:
|
||||
Source PLL A (0) or B (1) for the corresponding multisynth divider.
|
||||
|
||||
silabs,pll-master:
|
||||
type: boolean
|
||||
description: |
|
||||
The frequency of the source PLL is allowed to be changed by the
|
||||
multisynth when setting the rate of this clock output.
|
||||
|
||||
silabs,pll-reset:
|
||||
type: boolean
|
||||
description: Reset the source PLL when enabling this clock output.
|
||||
|
||||
silabs,disable-state:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [ 0, 1, 2, 3 ]
|
||||
description: |
|
||||
Clock output disable state. The state can be one of:
|
||||
|
||||
0 - clock output is driven LOW when disabled
|
||||
1 - clock output is driven HIGH when disabled
|
||||
2 - clock output is FLOATING (HIGH-Z) when disabled
|
||||
3 - clock output is never disabled
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: silabs,si5351a-msop
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
maximum: 2
|
||||
else:
|
||||
properties:
|
||||
reg:
|
||||
maximum: 7
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: silabs,si5351c
|
||||
then:
|
||||
properties:
|
||||
silabs,clock-source:
|
||||
enum: [ 0, 1, 2, 3 ]
|
||||
else:
|
||||
properties:
|
||||
silabs,clock-source:
|
||||
enum: [ 0, 1, 2 ]
|
||||
|
||||
required:
|
||||
- reg
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- silabs,si5351a
|
||||
- silabs,si5351a-msop
|
||||
- silabs,si5351b
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 1
|
||||
clock-names:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#address-cells"
|
||||
- "#size-cells"
|
||||
- "#clock-cells"
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
clock-generator@60 {
|
||||
compatible = "silabs,si5351a-msop";
|
||||
reg = <0x60>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#clock-cells = <1>;
|
||||
|
||||
/* Connect XTAL input to 25MHz reference */
|
||||
clocks = <&ref25>;
|
||||
clock-names = "xtal";
|
||||
|
||||
/* Use XTAL input as source of PLL0 and PLL1 */
|
||||
silabs,pll-source = <0 0>, <1 0>;
|
||||
|
||||
/* Don't reset PLL1 on rate adjustment */
|
||||
silabs,pll-reset-mode = <1 1>;
|
||||
|
||||
/*
|
||||
* Overwrite CLK0 configuration with:
|
||||
* - 8 mA output drive strength
|
||||
* - PLL0 as clock source of multisynth 0
|
||||
* - Multisynth 0 as clock source of output divider
|
||||
* - Multisynth 0 can change PLL0
|
||||
* - Set initial clock frequency of 74.25MHz
|
||||
*/
|
||||
clkout@0 {
|
||||
reg = <0>;
|
||||
silabs,drive-strength = <8>;
|
||||
silabs,multisynth-source = <0>;
|
||||
silabs,clock-source = <0>;
|
||||
silabs,pll-master;
|
||||
clock-frequency = <74250000>;
|
||||
};
|
||||
|
||||
/*
|
||||
* Overwrite CLK1 configuration with:
|
||||
* - 4 mA output drive strength
|
||||
* - PLL1 as clock source of multisynth 1
|
||||
* - Multisynth 1 as clock source of output divider
|
||||
* - Multisynth 1 can change PLL1
|
||||
* - Reset PLL1 when enabling this clock output
|
||||
*/
|
||||
clkout@1 {
|
||||
reg = <1>;
|
||||
silabs,drive-strength = <4>;
|
||||
silabs,multisynth-source = <1>;
|
||||
silabs,clock-source = <0>;
|
||||
silabs,pll-master;
|
||||
silabs,pll-reset;
|
||||
};
|
||||
|
||||
/*
|
||||
* Overwrite CLK2 configuration with:
|
||||
* - XTAL as clock source of output divider
|
||||
*/
|
||||
clkout@2 {
|
||||
reg = <2>;
|
||||
silabs,clock-source = <2>;
|
||||
};
|
||||
};
|
||||
};
|
@ -0,0 +1,46 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/sophgo,cv1800-clk.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sophgo CV1800 Series Clock Controller
|
||||
|
||||
maintainers:
|
||||
- Inochi Amaoto <inochiama@outlook.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- sophgo,cv1800-clk
|
||||
- sophgo,cv1810-clk
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description:
|
||||
See <dt-bindings/clock/sophgo,cv1800.h> for valid indices.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- "#clock-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@3002000 {
|
||||
compatible = "sophgo,cv1800-clk";
|
||||
reg = <0x03002000 0x1000>;
|
||||
clocks = <&osc>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
...
|
@ -0,0 +1,76 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/st,stm32mp25-rcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: STM32MP25 Reset Clock Controller
|
||||
|
||||
maintainers:
|
||||
- Gabriel Fernandez <gabriel.fernandez@foss.st.com>
|
||||
|
||||
description: |
|
||||
The RCC hardware block is both a reset and a clock controller.
|
||||
RCC makes also power management (resume/supend).
|
||||
|
||||
See also::
|
||||
include/dt-bindings/clock/st,stm32mp25-rcc.h
|
||||
include/dt-bindings/reset/st,stm32mp25-rcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- st,stm32mp25-rcc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: CK_SCMI_HSE High Speed External oscillator (8 to 48 MHz)
|
||||
- description: CK_SCMI_HSI High Speed Internal oscillator (~ 64 MHz)
|
||||
- description: CK_SCMI_MSI Low Power Internal oscillator (~ 4 MHz or ~ 16 MHz)
|
||||
- description: CK_SCMI_LSE Low Speed External oscillator (32 KHz)
|
||||
- description: CK_SCMI_LSI Low Speed Internal oscillator (~ 32 KHz)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: hse
|
||||
- const: hsi
|
||||
- const: msi
|
||||
- const: lse
|
||||
- const: lsi
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/st,stm32mp25-rcc.h>
|
||||
|
||||
rcc: clock-controller@44200000 {
|
||||
compatible = "st,stm32mp25-rcc";
|
||||
reg = <0x44200000 0x10000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
clock-names = "hse", "hsi", "msi", "lse", "lsi";
|
||||
clocks = <&scmi_clk CK_SCMI_HSE>,
|
||||
<&scmi_clk CK_SCMI_HSI>,
|
||||
<&scmi_clk CK_SCMI_MSI>,
|
||||
<&scmi_clk CK_SCMI_LSE>,
|
||||
<&scmi_clk CK_SCMI_LSI>;
|
||||
};
|
||||
...
|
@ -20,6 +20,7 @@ properties:
|
||||
- xlnx,clocking-wizard
|
||||
- xlnx,clocking-wizard-v5.2
|
||||
- xlnx,clocking-wizard-v6.0
|
||||
- xlnx,versal-clk-wizard
|
||||
|
||||
|
||||
reg:
|
||||
|
@ -31,11 +31,11 @@ properties:
|
||||
clocks:
|
||||
description: List of clock specifiers which are external input
|
||||
clocks to the given clock controller.
|
||||
minItems: 3
|
||||
minItems: 2
|
||||
maxItems: 8
|
||||
|
||||
clock-names:
|
||||
minItems: 3
|
||||
minItems: 2
|
||||
maxItems: 8
|
||||
|
||||
required:
|
||||
@ -59,15 +59,34 @@ allOf:
|
||||
clocks:
|
||||
items:
|
||||
- description: reference clock
|
||||
- description: alternate reference clock
|
||||
- description: alternate reference clock for programmable logic
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ref
|
||||
- const: alt_ref
|
||||
- const: pl_alt_ref
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- xlnx,versal-net-clk
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: reference clock
|
||||
- description: alternate reference clock for programmable logic
|
||||
- description: alternate reference clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ref
|
||||
- const: pl_alt_ref
|
||||
- const: alt_ref
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
@ -110,8 +129,8 @@ examples:
|
||||
versal_clk: clock-controller {
|
||||
#clock-cells = <1>;
|
||||
compatible = "xlnx,versal-clk";
|
||||
clocks = <&ref>, <&alt_ref>, <&pl_alt_ref>;
|
||||
clock-names = "ref", "alt_ref", "pl_alt_ref";
|
||||
clocks = <&ref>, <&pl_alt_ref>;
|
||||
clock-names = "ref", "pl_alt_ref";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -95,8 +95,8 @@ examples:
|
||||
versal_clk: clock-controller {
|
||||
#clock-cells = <1>;
|
||||
compatible = "xlnx,versal-clk";
|
||||
clocks = <&ref>, <&alt_ref>, <&pl_alt_ref>;
|
||||
clock-names = "ref", "alt_ref", "pl_alt_ref";
|
||||
clocks = <&ref>, <&pl_alt_ref>;
|
||||
clock-names = "ref", "pl_alt_ref";
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -15,15 +15,22 @@ description:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- mediatek,mt7622-sgmiisys
|
||||
- mediatek,mt7629-sgmiisys
|
||||
- mediatek,mt7981-sgmiisys_0
|
||||
- mediatek,mt7981-sgmiisys_1
|
||||
- mediatek,mt7986-sgmiisys_0
|
||||
- mediatek,mt7986-sgmiisys_1
|
||||
- const: syscon
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt7622-sgmiisys
|
||||
- mediatek,mt7629-sgmiisys
|
||||
- mediatek,mt7981-sgmiisys_0
|
||||
- mediatek,mt7981-sgmiisys_1
|
||||
- mediatek,mt7986-sgmiisys_0
|
||||
- mediatek,mt7986-sgmiisys_1
|
||||
- const: syscon
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt7988-sgmiisys0
|
||||
- mediatek,mt7988-sgmiisys1
|
||||
- const: simple-mfd
|
||||
- const: syscon
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@ -35,11 +42,51 @@ properties:
|
||||
description: Invert polarity of the SGMII data lanes
|
||||
type: boolean
|
||||
|
||||
pcs:
|
||||
type: object
|
||||
description: MediaTek LynxI HSGMII PCS
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt7988-sgmii
|
||||
|
||||
clocks:
|
||||
maxItems: 3
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: sgmii_sel
|
||||
- const: sgmii_tx
|
||||
- const: sgmii_rx
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#clock-cells'
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- mediatek,mt7988-sgmiisys0
|
||||
- mediatek,mt7988-sgmiisys1
|
||||
|
||||
then:
|
||||
required:
|
||||
- pcs
|
||||
|
||||
else:
|
||||
properties:
|
||||
pcs: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
@ -414,16 +414,6 @@ config COMMON_CLK_VC7
|
||||
Renesas Versaclock7 is a family of configurable clock generator
|
||||
and jitter attenuator ICs with fractional and integer dividers.
|
||||
|
||||
config COMMON_CLK_STM32MP135
|
||||
def_bool COMMON_CLK && MACH_STM32MP13
|
||||
help
|
||||
Support for stm32mp135 SoC family clocks
|
||||
|
||||
config COMMON_CLK_STM32MP157
|
||||
def_bool COMMON_CLK && MACH_STM32MP157
|
||||
help
|
||||
Support for stm32mp157 SoC family clocks
|
||||
|
||||
config COMMON_CLK_STM32F
|
||||
def_bool COMMON_CLK && (MACH_STM32F429 || MACH_STM32F469 || MACH_STM32F746)
|
||||
help
|
||||
@ -504,6 +494,7 @@ source "drivers/clk/starfive/Kconfig"
|
||||
source "drivers/clk/sunxi/Kconfig"
|
||||
source "drivers/clk/sunxi-ng/Kconfig"
|
||||
source "drivers/clk/tegra/Kconfig"
|
||||
source "drivers/clk/stm32/Kconfig"
|
||||
source "drivers/clk/ti/Kconfig"
|
||||
source "drivers/clk/uniphier/Kconfig"
|
||||
source "drivers/clk/visconti/Kconfig"
|
||||
|
@ -70,7 +70,6 @@ obj-$(CONFIG_COMMON_CLK_SI570) += clk-si570.o
|
||||
obj-$(CONFIG_COMMON_CLK_SP7021) += clk-sp7021.o
|
||||
obj-$(CONFIG_COMMON_CLK_STM32F) += clk-stm32f4.o
|
||||
obj-$(CONFIG_COMMON_CLK_STM32H7) += clk-stm32h7.o
|
||||
obj-$(CONFIG_COMMON_CLK_STM32MP157) += clk-stm32mp1.o
|
||||
obj-$(CONFIG_COMMON_CLK_TPS68470) += clk-tps68470.o
|
||||
obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o
|
||||
obj-$(CONFIG_CLK_TWL) += clk-twl.o
|
||||
|
@ -7,6 +7,7 @@
|
||||
* Currently supported:
|
||||
* - 9FGV0241
|
||||
* - 9FGV0441
|
||||
* - 9FGV0841
|
||||
*
|
||||
* Copyright (C) 2022 Marek Vasut <marex@denx.de>
|
||||
*/
|
||||
@ -42,6 +43,7 @@
|
||||
#define RS9_REG_DID 0x6
|
||||
#define RS9_REG_BCP 0x7
|
||||
|
||||
#define RS9_REG_VID_MASK GENMASK(3, 0)
|
||||
#define RS9_REG_VID_IDT 0x01
|
||||
|
||||
#define RS9_REG_DID_TYPE_FGV (0x0 << RS9_REG_DID_TYPE_SHIFT)
|
||||
@ -49,16 +51,10 @@
|
||||
#define RS9_REG_DID_TYPE_DMV (0x2 << RS9_REG_DID_TYPE_SHIFT)
|
||||
#define RS9_REG_DID_TYPE_SHIFT 0x6
|
||||
|
||||
/* Supported Renesas 9-series models. */
|
||||
enum rs9_model {
|
||||
RENESAS_9FGV0241,
|
||||
RENESAS_9FGV0441,
|
||||
};
|
||||
|
||||
/* Structure to describe features of a particular 9-series model */
|
||||
struct rs9_chip_info {
|
||||
const enum rs9_model model;
|
||||
unsigned int num_clks;
|
||||
u8 outshift;
|
||||
u8 did;
|
||||
};
|
||||
|
||||
@ -160,14 +156,12 @@ static const struct regmap_config rs9_regmap_config = {
|
||||
|
||||
static u8 rs9_calc_dif(const struct rs9_driver_data *rs9, int idx)
|
||||
{
|
||||
enum rs9_model model = rs9->chip_info->model;
|
||||
|
||||
if (model == RENESAS_9FGV0241)
|
||||
return BIT(idx) + 1;
|
||||
else if (model == RENESAS_9FGV0441)
|
||||
return BIT(idx);
|
||||
|
||||
return 0;
|
||||
/*
|
||||
* On 9FGV0241, the DIF OE0 is BIT(1) and DIF OE(1) is BIT(2),
|
||||
* on 9FGV0441 and 9FGV0841 the DIF OE0 is BIT(0) and so on.
|
||||
* Increment the index in the 9FGV0241 special case here.
|
||||
*/
|
||||
return BIT(idx + rs9->chip_info->outshift);
|
||||
}
|
||||
|
||||
static int rs9_get_output_config(struct rs9_driver_data *rs9, int idx)
|
||||
@ -333,6 +327,7 @@ static int rs9_probe(struct i2c_client *client)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
vid &= RS9_REG_VID_MASK;
|
||||
if (vid != RS9_REG_VID_IDT || did != rs9->chip_info->did)
|
||||
return dev_err_probe(&client->dev, -ENODEV,
|
||||
"Incorrect VID/DID: %#02x, %#02x. Expected %#02x, %#02x\n",
|
||||
@ -380,20 +375,27 @@ static int __maybe_unused rs9_resume(struct device *dev)
|
||||
}
|
||||
|
||||
static const struct rs9_chip_info renesas_9fgv0241_info = {
|
||||
.model = RENESAS_9FGV0241,
|
||||
.num_clks = 2,
|
||||
.outshift = 1,
|
||||
.did = RS9_REG_DID_TYPE_FGV | 0x02,
|
||||
};
|
||||
|
||||
static const struct rs9_chip_info renesas_9fgv0441_info = {
|
||||
.model = RENESAS_9FGV0441,
|
||||
.num_clks = 4,
|
||||
.outshift = 0,
|
||||
.did = RS9_REG_DID_TYPE_FGV | 0x04,
|
||||
};
|
||||
|
||||
static const struct rs9_chip_info renesas_9fgv0841_info = {
|
||||
.num_clks = 8,
|
||||
.outshift = 0,
|
||||
.did = RS9_REG_DID_TYPE_FGV | 0x08,
|
||||
};
|
||||
|
||||
static const struct i2c_device_id rs9_id[] = {
|
||||
{ "9fgv0241", .driver_data = (kernel_ulong_t)&renesas_9fgv0241_info },
|
||||
{ "9fgv0441", .driver_data = (kernel_ulong_t)&renesas_9fgv0441_info },
|
||||
{ "9fgv0841", .driver_data = (kernel_ulong_t)&renesas_9fgv0841_info },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, rs9_id);
|
||||
@ -401,6 +403,7 @@ MODULE_DEVICE_TABLE(i2c, rs9_id);
|
||||
static const struct of_device_id clk_rs9_of_match[] = {
|
||||
{ .compatible = "renesas,9fgv0241", .data = &renesas_9fgv0241_info },
|
||||
{ .compatible = "renesas,9fgv0441", .data = &renesas_9fgv0441_info },
|
||||
{ .compatible = "renesas,9fgv0841", .data = &renesas_9fgv0841_info },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clk_rs9_of_match);
|
||||
|
@ -895,10 +895,8 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
r[0] = r_div ? (r_div & 0xff) : 1;
|
||||
r[1] = (r_div >> 8) & 0xff;
|
||||
r[2] = (r_div >> 16) & 0xff;
|
||||
err = regmap_bulk_write(output->data->regmap,
|
||||
return regmap_bulk_write(output->data->regmap,
|
||||
SI5341_OUT_R_REG(output), r, 3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int si5341_output_reparent(struct clk_si5341_output *output, u8 index)
|
||||
|
@ -506,6 +506,8 @@ static int si5351_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
{
|
||||
struct si5351_hw_data *hwdata =
|
||||
container_of(hw, struct si5351_hw_data, hw);
|
||||
struct si5351_platform_data *pdata =
|
||||
hwdata->drvdata->client->dev.platform_data;
|
||||
u8 reg = (hwdata->num == 0) ? SI5351_PLLA_PARAMETERS :
|
||||
SI5351_PLLB_PARAMETERS;
|
||||
|
||||
@ -518,9 +520,10 @@ static int si5351_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
(hwdata->params.p2 == 0) ? SI5351_CLK_INTEGER_MODE : 0);
|
||||
|
||||
/* Do a pll soft reset on the affected pll */
|
||||
si5351_reg_write(hwdata->drvdata, SI5351_PLL_RESET,
|
||||
hwdata->num == 0 ? SI5351_PLL_RESET_A :
|
||||
SI5351_PLL_RESET_B);
|
||||
if (pdata->pll_reset[hwdata->num])
|
||||
si5351_reg_write(hwdata->drvdata, SI5351_PLL_RESET,
|
||||
hwdata->num == 0 ? SI5351_PLL_RESET_A :
|
||||
SI5351_PLL_RESET_B);
|
||||
|
||||
dev_dbg(&hwdata->drvdata->client->dev,
|
||||
"%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, parent_rate = %lu, rate = %lu\n",
|
||||
@ -1222,6 +1225,44 @@ static int si5351_dt_parse(struct i2c_client *client,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse PLL reset mode. For compatibility with older device trees, the
|
||||
* default is to always reset a PLL after setting its rate.
|
||||
*/
|
||||
pdata->pll_reset[0] = true;
|
||||
pdata->pll_reset[1] = true;
|
||||
|
||||
of_property_for_each_u32(np, "silabs,pll-reset-mode", prop, p, num) {
|
||||
if (num >= 2) {
|
||||
dev_err(&client->dev,
|
||||
"invalid pll %d on pll-reset-mode prop\n", num);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
p = of_prop_next_u32(prop, p, &val);
|
||||
if (!p) {
|
||||
dev_err(&client->dev,
|
||||
"missing pll-reset-mode for pll %d\n", num);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (val) {
|
||||
case 0:
|
||||
/* Reset PLL whenever its rate is adjusted */
|
||||
pdata->pll_reset[num] = true;
|
||||
break;
|
||||
case 1:
|
||||
/* Don't reset PLL whenever its rate is adjusted */
|
||||
pdata->pll_reset[num] = false;
|
||||
break;
|
||||
default:
|
||||
dev_err(&client->dev,
|
||||
"invalid pll-reset-mode %d for pll %d\n", val,
|
||||
num);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* per clkout properties */
|
||||
for_each_child_of_node(np, child) {
|
||||
if (of_property_read_u32(child, "reg", &num)) {
|
||||
|
@ -604,14 +604,14 @@ static int sp7021_clk_probe(struct platform_device *pdev)
|
||||
int i;
|
||||
|
||||
clk_base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (!clk_base)
|
||||
return -ENXIO;
|
||||
if (IS_ERR(clk_base))
|
||||
return PTR_ERR(clk_base);
|
||||
pll_base = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (!pll_base)
|
||||
return -ENXIO;
|
||||
if (IS_ERR(pll_base))
|
||||
return PTR_ERR(pll_base);
|
||||
sys_base = devm_platform_ioremap_resource(pdev, 2);
|
||||
if (!sys_base)
|
||||
return -ENXIO;
|
||||
if (IS_ERR(sys_base))
|
||||
return PTR_ERR(sys_base);
|
||||
|
||||
/* enable default clks */
|
||||
for (i = 0; i < ARRAY_SIZE(sp_clken); i++)
|
||||
|
@ -37,7 +37,7 @@
|
||||
#define VC3_PLL1_M_DIV(n) ((n) & GENMASK(5, 0))
|
||||
|
||||
#define VC3_PLL1_VCO_N_DIVIDER 0x9
|
||||
#define VC3_PLL1_LOOP_FILTER_N_DIV_MSB 0x0a
|
||||
#define VC3_PLL1_LOOP_FILTER_N_DIV_MSB 0xa
|
||||
|
||||
#define VC3_OUT_DIV1_DIV2_CTRL 0xf
|
||||
|
||||
@ -148,16 +148,16 @@ struct vc3_pfd_data {
|
||||
};
|
||||
|
||||
struct vc3_pll_data {
|
||||
unsigned long vco_min;
|
||||
unsigned long vco_max;
|
||||
u8 num;
|
||||
u8 int_div_msb_offs;
|
||||
u8 int_div_lsb_offs;
|
||||
unsigned long vco_min;
|
||||
unsigned long vco_max;
|
||||
};
|
||||
|
||||
struct vc3_div_data {
|
||||
u8 offs;
|
||||
const struct clk_div_table *table;
|
||||
u8 offs;
|
||||
u8 shift;
|
||||
u8 width;
|
||||
u8 flags;
|
||||
@ -210,7 +210,7 @@ static const struct clk_div_table div3_divs[] = {
|
||||
|
||||
static struct clk_hw *clk_out[6];
|
||||
|
||||
static unsigned char vc3_pfd_mux_get_parent(struct clk_hw *hw)
|
||||
static u8 vc3_pfd_mux_get_parent(struct clk_hw *hw)
|
||||
{
|
||||
struct vc3_hw_data *vc3 = container_of(hw, struct vc3_hw_data, hw);
|
||||
const struct vc3_clk_data *pfd_mux = vc3->data;
|
||||
@ -226,9 +226,8 @@ static int vc3_pfd_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
struct vc3_hw_data *vc3 = container_of(hw, struct vc3_hw_data, hw);
|
||||
const struct vc3_clk_data *pfd_mux = vc3->data;
|
||||
|
||||
regmap_update_bits(vc3->regmap, pfd_mux->offs, pfd_mux->bitmsk,
|
||||
index ? pfd_mux->bitmsk : 0);
|
||||
return 0;
|
||||
return regmap_update_bits(vc3->regmap, pfd_mux->offs, pfd_mux->bitmsk,
|
||||
index ? pfd_mux->bitmsk : 0);
|
||||
}
|
||||
|
||||
static const struct clk_ops vc3_pfd_mux_ops = {
|
||||
@ -440,7 +439,7 @@ static const struct clk_ops vc3_pll_ops = {
|
||||
.set_rate = vc3_pll_set_rate,
|
||||
};
|
||||
|
||||
static unsigned char vc3_div_mux_get_parent(struct clk_hw *hw)
|
||||
static u8 vc3_div_mux_get_parent(struct clk_hw *hw)
|
||||
{
|
||||
struct vc3_hw_data *vc3 = container_of(hw, struct vc3_hw_data, hw);
|
||||
const struct vc3_clk_data *div_mux = vc3->data;
|
||||
@ -456,10 +455,8 @@ static int vc3_div_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
struct vc3_hw_data *vc3 = container_of(hw, struct vc3_hw_data, hw);
|
||||
const struct vc3_clk_data *div_mux = vc3->data;
|
||||
|
||||
regmap_update_bits(vc3->regmap, div_mux->offs, div_mux->bitmsk,
|
||||
index ? div_mux->bitmsk : 0);
|
||||
|
||||
return 0;
|
||||
return regmap_update_bits(vc3->regmap, div_mux->offs, div_mux->bitmsk,
|
||||
index ? div_mux->bitmsk : 0);
|
||||
}
|
||||
|
||||
static const struct clk_ops vc3_div_mux_ops = {
|
||||
@ -477,7 +474,7 @@ static unsigned int vc3_get_div(const struct clk_div_table *table,
|
||||
if (clkt->val == val)
|
||||
return clkt->div;
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned long vc3_div_recalc_rate(struct clk_hw *hw,
|
||||
@ -524,10 +521,9 @@ static int vc3_div_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
||||
value = divider_get_val(rate, parent_rate, div_data->table,
|
||||
div_data->width, div_data->flags);
|
||||
regmap_update_bits(vc3->regmap, div_data->offs,
|
||||
VC3_DIV_MASK(div_data->width) << div_data->shift,
|
||||
value << div_data->shift);
|
||||
return 0;
|
||||
return regmap_update_bits(vc3->regmap, div_data->offs,
|
||||
VC3_DIV_MASK(div_data->width) << div_data->shift,
|
||||
value << div_data->shift);
|
||||
}
|
||||
|
||||
static const struct clk_ops vc3_div_ops = {
|
||||
@ -539,11 +535,9 @@ static const struct clk_ops vc3_div_ops = {
|
||||
static int vc3_clk_mux_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
int ret;
|
||||
int frc;
|
||||
|
||||
ret = clk_mux_determine_rate_flags(hw, req, CLK_SET_RATE_PARENT);
|
||||
if (ret) {
|
||||
if (clk_mux_determine_rate_flags(hw, req, CLK_SET_RATE_PARENT)) {
|
||||
/* The below check is equivalent to (best_parent_rate/rate) */
|
||||
if (req->best_parent_rate >= req->rate) {
|
||||
frc = DIV_ROUND_CLOSEST_ULL(req->best_parent_rate,
|
||||
@ -552,13 +546,12 @@ static int vc3_clk_mux_determine_rate(struct clk_hw *hw,
|
||||
return clk_mux_determine_rate_flags(hw, req,
|
||||
CLK_SET_RATE_PARENT);
|
||||
}
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned char vc3_clk_mux_get_parent(struct clk_hw *hw)
|
||||
static u8 vc3_clk_mux_get_parent(struct clk_hw *hw)
|
||||
{
|
||||
struct vc3_hw_data *vc3 = container_of(hw, struct vc3_hw_data, hw);
|
||||
const struct vc3_clk_data *clk_mux = vc3->data;
|
||||
@ -574,9 +567,8 @@ static int vc3_clk_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
struct vc3_hw_data *vc3 = container_of(hw, struct vc3_hw_data, hw);
|
||||
const struct vc3_clk_data *clk_mux = vc3->data;
|
||||
|
||||
regmap_update_bits(vc3->regmap, clk_mux->offs,
|
||||
clk_mux->bitmsk, index ? clk_mux->bitmsk : 0);
|
||||
return 0;
|
||||
return regmap_update_bits(vc3->regmap, clk_mux->offs, clk_mux->bitmsk,
|
||||
index ? clk_mux->bitmsk : 0);
|
||||
}
|
||||
|
||||
static const struct clk_ops vc3_clk_mux_ops = {
|
||||
@ -605,7 +597,7 @@ static struct vc3_hw_data clk_pfd_mux[] = {
|
||||
.offs = VC3_PLL_OP_CTRL,
|
||||
.bitmsk = BIT(VC3_PLL_OP_CTRL_PLL2_REFIN_SEL)
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pfd2_mux",
|
||||
.ops = &vc3_pfd_mux_ops,
|
||||
.parent_data = pfd_mux_parent_data,
|
||||
@ -618,7 +610,7 @@ static struct vc3_hw_data clk_pfd_mux[] = {
|
||||
.offs = VC3_GENERAL_CTR,
|
||||
.bitmsk = BIT(VC3_GENERAL_CTR_PLL3_REFIN_SEL)
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pfd3_mux",
|
||||
.ops = &vc3_pfd_mux_ops,
|
||||
.parent_data = pfd_mux_parent_data,
|
||||
@ -636,7 +628,7 @@ static struct vc3_hw_data clk_pfd[] = {
|
||||
.mdiv1_bitmsk = VC3_PLL1_M_DIV1,
|
||||
.mdiv2_bitmsk = VC3_PLL1_M_DIV2
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pfd1",
|
||||
.ops = &vc3_pfd_ops,
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
@ -653,7 +645,7 @@ static struct vc3_hw_data clk_pfd[] = {
|
||||
.mdiv1_bitmsk = VC3_PLL2_M_DIV1,
|
||||
.mdiv2_bitmsk = VC3_PLL2_M_DIV2
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pfd2",
|
||||
.ops = &vc3_pfd_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -670,7 +662,7 @@ static struct vc3_hw_data clk_pfd[] = {
|
||||
.mdiv1_bitmsk = VC3_PLL3_M_DIV1,
|
||||
.mdiv2_bitmsk = VC3_PLL3_M_DIV2
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pfd3",
|
||||
.ops = &vc3_pfd_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -691,7 +683,7 @@ static struct vc3_hw_data clk_pll[] = {
|
||||
.vco_min = VC3_PLL1_VCO_MIN,
|
||||
.vco_max = VC3_PLL1_VCO_MAX
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pll1",
|
||||
.ops = &vc3_pll_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -709,7 +701,7 @@ static struct vc3_hw_data clk_pll[] = {
|
||||
.vco_min = VC3_PLL2_VCO_MIN,
|
||||
.vco_max = VC3_PLL2_VCO_MAX
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pll2",
|
||||
.ops = &vc3_pll_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -727,7 +719,7 @@ static struct vc3_hw_data clk_pll[] = {
|
||||
.vco_min = VC3_PLL3_VCO_MIN,
|
||||
.vco_max = VC3_PLL3_VCO_MAX
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "pll3",
|
||||
.ops = &vc3_pll_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -760,7 +752,7 @@ static struct vc3_hw_data clk_div_mux[] = {
|
||||
.offs = VC3_GENERAL_CTR,
|
||||
.bitmsk = VC3_GENERAL_CTR_DIV1_SRC_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div1_mux",
|
||||
.ops = &vc3_div_mux_ops,
|
||||
.parent_data = div_mux_parent_data[VC3_DIV1_MUX],
|
||||
@ -773,7 +765,7 @@ static struct vc3_hw_data clk_div_mux[] = {
|
||||
.offs = VC3_PLL3_CHARGE_PUMP_CTRL,
|
||||
.bitmsk = VC3_PLL3_CHARGE_PUMP_CTRL_OUTDIV3_SRC_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div3_mux",
|
||||
.ops = &vc3_div_mux_ops,
|
||||
.parent_data = div_mux_parent_data[VC3_DIV3_MUX],
|
||||
@ -786,7 +778,7 @@ static struct vc3_hw_data clk_div_mux[] = {
|
||||
.offs = VC3_OUTPUT_CTR,
|
||||
.bitmsk = VC3_OUTPUT_CTR_DIV4_SRC_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div4_mux",
|
||||
.ops = &vc3_div_mux_ops,
|
||||
.parent_data = div_mux_parent_data[VC3_DIV4_MUX],
|
||||
@ -805,7 +797,7 @@ static struct vc3_hw_data clk_div[] = {
|
||||
.width = 4,
|
||||
.flags = CLK_DIVIDER_READ_ONLY
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div1",
|
||||
.ops = &vc3_div_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -823,7 +815,7 @@ static struct vc3_hw_data clk_div[] = {
|
||||
.width = 4,
|
||||
.flags = CLK_DIVIDER_READ_ONLY
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div2",
|
||||
.ops = &vc3_div_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -841,7 +833,7 @@ static struct vc3_hw_data clk_div[] = {
|
||||
.width = 4,
|
||||
.flags = CLK_DIVIDER_READ_ONLY
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div3",
|
||||
.ops = &vc3_div_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -859,7 +851,7 @@ static struct vc3_hw_data clk_div[] = {
|
||||
.width = 4,
|
||||
.flags = CLK_DIVIDER_READ_ONLY
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div4",
|
||||
.ops = &vc3_div_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -877,7 +869,7 @@ static struct vc3_hw_data clk_div[] = {
|
||||
.width = 4,
|
||||
.flags = CLK_DIVIDER_READ_ONLY
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "div5",
|
||||
.ops = &vc3_div_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -895,7 +887,7 @@ static struct vc3_hw_data clk_mux[] = {
|
||||
.offs = VC3_SE1_DIV4_CTRL,
|
||||
.bitmsk = VC3_SE1_DIV4_CTRL_SE1_CLK_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "se1_mux",
|
||||
.ops = &vc3_clk_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -911,7 +903,7 @@ static struct vc3_hw_data clk_mux[] = {
|
||||
.offs = VC3_SE2_CTRL_REG0,
|
||||
.bitmsk = VC3_SE2_CTRL_REG0_SE2_CLK_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "se2_mux",
|
||||
.ops = &vc3_clk_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -927,7 +919,7 @@ static struct vc3_hw_data clk_mux[] = {
|
||||
.offs = VC3_SE3_DIFF1_CTRL_REG,
|
||||
.bitmsk = VC3_SE3_DIFF1_CTRL_REG_SE3_CLK_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "se3_mux",
|
||||
.ops = &vc3_clk_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -943,7 +935,7 @@ static struct vc3_hw_data clk_mux[] = {
|
||||
.offs = VC3_DIFF1_CTRL_REG,
|
||||
.bitmsk = VC3_DIFF1_CTRL_REG_DIFF1_CLK_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "diff1_mux",
|
||||
.ops = &vc3_clk_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
@ -959,7 +951,7 @@ static struct vc3_hw_data clk_mux[] = {
|
||||
.offs = VC3_DIFF2_CTRL_REG,
|
||||
.bitmsk = VC3_DIFF2_CTRL_REG_DIFF2_CLK_SEL
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "diff2_mux",
|
||||
.ops = &vc3_clk_mux_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
|
@ -466,8 +466,10 @@ static void __init hi3620_mmc_clk_init(struct device_node *node)
|
||||
return;
|
||||
|
||||
clk_data->clks = kcalloc(num, sizeof(*clk_data->clks), GFP_KERNEL);
|
||||
if (!clk_data->clks)
|
||||
if (!clk_data->clks) {
|
||||
kfree(clk_data);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
struct hisi_mmc_clock *mmc_clk = &hi3620_mmc_clks[i];
|
||||
|
@ -66,6 +66,22 @@ static const char * const lcd_pxl_sels[] = {
|
||||
"lcd_pxl_bypass_div_clk",
|
||||
};
|
||||
|
||||
static const char *const lvds0_sels[] = {
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
"mipi0_lvds_bypass_clk",
|
||||
};
|
||||
|
||||
static const char *const lvds1_sels[] = {
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
"mipi1_lvds_bypass_clk",
|
||||
};
|
||||
|
||||
static const char * const mipi_sels[] = {
|
||||
"clk_dummy",
|
||||
"clk_dummy",
|
||||
@ -207,9 +223,9 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)
|
||||
/* MIPI-LVDS SS */
|
||||
imx_clk_scu("mipi0_bypass_clk", IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_BYPASS);
|
||||
imx_clk_scu("mipi0_pixel_clk", IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_PER);
|
||||
imx_clk_scu("mipi0_lvds_pixel_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC2);
|
||||
imx_clk_scu("mipi0_lvds_bypass_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_BYPASS);
|
||||
imx_clk_scu("mipi0_lvds_phy_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC3);
|
||||
imx_clk_scu2("mipi0_lvds_pixel_clk", lvds0_sels, ARRAY_SIZE(lvds0_sels), IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC2);
|
||||
imx_clk_scu2("mipi0_lvds_phy_clk", lvds0_sels, ARRAY_SIZE(lvds0_sels), IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC3);
|
||||
imx_clk_scu2("mipi0_dsi_tx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_MST_BUS);
|
||||
imx_clk_scu2("mipi0_dsi_rx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_SLV_BUS);
|
||||
imx_clk_scu2("mipi0_dsi_phy_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_PHY);
|
||||
@ -219,9 +235,9 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)
|
||||
|
||||
imx_clk_scu("mipi1_bypass_clk", IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_BYPASS);
|
||||
imx_clk_scu("mipi1_pixel_clk", IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_PER);
|
||||
imx_clk_scu("mipi1_lvds_pixel_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC2);
|
||||
imx_clk_scu("mipi1_lvds_bypass_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_BYPASS);
|
||||
imx_clk_scu("mipi1_lvds_phy_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC3);
|
||||
imx_clk_scu2("mipi1_lvds_pixel_clk", lvds1_sels, ARRAY_SIZE(lvds1_sels), IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC2);
|
||||
imx_clk_scu2("mipi1_lvds_phy_clk", lvds1_sels, ARRAY_SIZE(lvds1_sels), IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC3);
|
||||
|
||||
imx_clk_scu2("mipi1_dsi_tx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_MST_BUS);
|
||||
imx_clk_scu2("mipi1_dsi_rx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_SLV_BUS);
|
||||
|
@ -104,15 +104,15 @@ static const struct imx_pll14xx_rate_table *imx_get_pll_settings(
|
||||
static long pll14xx_calc_rate(struct clk_pll14xx *pll, int mdiv, int pdiv,
|
||||
int sdiv, int kdiv, unsigned long prate)
|
||||
{
|
||||
u64 fvco = prate;
|
||||
u64 fout = prate;
|
||||
|
||||
/* fvco = (m * 65536 + k) * Fin / (p * 65536) */
|
||||
fvco *= (mdiv * 65536 + kdiv);
|
||||
/* fout = (m * 65536 + k) * Fin / (p * 65536) / (1 << sdiv) */
|
||||
fout *= (mdiv * 65536 + kdiv);
|
||||
pdiv *= 65536;
|
||||
|
||||
do_div(fvco, pdiv << sdiv);
|
||||
do_div(fout, pdiv << sdiv);
|
||||
|
||||
return fvco;
|
||||
return fout;
|
||||
}
|
||||
|
||||
static long pll1443x_calc_kdiv(int mdiv, int pdiv, int sdiv,
|
||||
@ -131,7 +131,7 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
|
||||
{
|
||||
u32 pll_div_ctl0, pll_div_ctl1;
|
||||
int mdiv, pdiv, sdiv, kdiv;
|
||||
long fvco, rate_min, rate_max, dist, best = LONG_MAX;
|
||||
long fout, rate_min, rate_max, dist, best = LONG_MAX;
|
||||
const struct imx_pll14xx_rate_table *tt;
|
||||
|
||||
/*
|
||||
@ -143,6 +143,7 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
|
||||
* d) -32768 <= k <= 32767
|
||||
*
|
||||
* fvco = (m * 65536 + k) * prate / (p * 65536)
|
||||
* fout = (m * 65536 + k) * prate / (p * 65536) / (1 << sdiv)
|
||||
*/
|
||||
|
||||
/* First try if we can get the desired rate from one of the static entries */
|
||||
@ -173,8 +174,8 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
|
||||
pr_debug("%s: in=%ld, want=%ld Only adjust kdiv %ld -> %d\n",
|
||||
clk_hw_get_name(&pll->hw), prate, rate,
|
||||
FIELD_GET(KDIV_MASK, pll_div_ctl1), kdiv);
|
||||
fvco = pll14xx_calc_rate(pll, mdiv, pdiv, sdiv, kdiv, prate);
|
||||
t->rate = (unsigned int)fvco;
|
||||
fout = pll14xx_calc_rate(pll, mdiv, pdiv, sdiv, kdiv, prate);
|
||||
t->rate = (unsigned int)fout;
|
||||
t->mdiv = mdiv;
|
||||
t->pdiv = pdiv;
|
||||
t->sdiv = sdiv;
|
||||
@ -190,13 +191,13 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
|
||||
mdiv = clamp(mdiv, 64, 1023);
|
||||
|
||||
kdiv = pll1443x_calc_kdiv(mdiv, pdiv, sdiv, rate, prate);
|
||||
fvco = pll14xx_calc_rate(pll, mdiv, pdiv, sdiv, kdiv, prate);
|
||||
fout = pll14xx_calc_rate(pll, mdiv, pdiv, sdiv, kdiv, prate);
|
||||
|
||||
/* best match */
|
||||
dist = abs((long)rate - (long)fvco);
|
||||
dist = abs((long)rate - (long)fout);
|
||||
if (dist < best) {
|
||||
best = dist;
|
||||
t->rate = (unsigned int)fvco;
|
||||
t->rate = (unsigned int)fout;
|
||||
t->mdiv = mdiv;
|
||||
t->pdiv = pdiv;
|
||||
t->sdiv = sdiv;
|
||||
|
@ -886,8 +886,10 @@ struct clk_hw *__imx_clk_gpr_scu(const char *name, const char * const *parent_na
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
if (!imx_clk_is_resource_owned(rsrc_id))
|
||||
if (!imx_clk_is_resource_owned(rsrc_id)) {
|
||||
kfree(clk_node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
clk = kzalloc(sizeof(*clk), GFP_KERNEL);
|
||||
if (!clk) {
|
||||
|
@ -423,6 +423,15 @@ config COMMON_CLK_MT7986_ETHSYS
|
||||
This driver adds support for clocks for Ethernet and SGMII
|
||||
required on MediaTek MT7986 SoC.
|
||||
|
||||
config COMMON_CLK_MT7988
|
||||
tristate "Clock driver for MediaTek MT7988"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
select COMMON_CLK_MEDIATEK
|
||||
default ARCH_MEDIATEK
|
||||
help
|
||||
This driver supports MediaTek MT7988 basic clocks and clocks
|
||||
required for various periperals found on this SoC.
|
||||
|
||||
config COMMON_CLK_MT8135
|
||||
tristate "Clock driver for MediaTek MT8135"
|
||||
depends on (ARCH_MEDIATEK && ARM) || COMPILE_TEST
|
||||
|
@ -62,6 +62,11 @@ obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-apmixed.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-topckgen.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-infracfg.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7986_ETHSYS) += clk-mt7986-eth.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7988) += clk-mt7988-apmixed.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7988) += clk-mt7988-topckgen.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7988) += clk-mt7988-infracfg.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7988) += clk-mt7988-eth.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7988) += clk-mt7988-xfipll.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8135) += clk-mt8135-apmixedsys.o clk-mt8135.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8167) += clk-mt8167-apmixedsys.o clk-mt8167.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8167_AUDSYS) += clk-mt8167-aud.o
|
||||
|
114
drivers/clk/mediatek/clk-mt7988-apmixed.c
Normal file
114
drivers/clk/mediatek/clk-mt7988-apmixed.c
Normal file
@ -0,0 +1,114 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2023 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Xiufeng Li <Xiufeng.Li@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
#include "clk-pll.h"
|
||||
#include <dt-bindings/clock/mediatek,mt7988-clk.h>
|
||||
|
||||
#define MT7988_PLL_FMAX (2500UL * MHZ)
|
||||
#define MT7988_PCW_CHG_BIT 2
|
||||
|
||||
#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _rst_bar_mask, _pcwbits, _pd_reg, \
|
||||
_pd_shift, _tuner_reg, _tuner_en_reg, _tuner_en_bit, _pcw_reg, _pcw_shift, \
|
||||
_pcw_chg_reg) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.reg = _reg, \
|
||||
.pwr_reg = _pwr_reg, \
|
||||
.en_mask = _en_mask, \
|
||||
.flags = _flags, \
|
||||
.rst_bar_mask = BIT(_rst_bar_mask), \
|
||||
.fmax = MT7988_PLL_FMAX, \
|
||||
.pcwbits = _pcwbits, \
|
||||
.pd_reg = _pd_reg, \
|
||||
.pd_shift = _pd_shift, \
|
||||
.tuner_reg = _tuner_reg, \
|
||||
.tuner_en_reg = _tuner_en_reg, \
|
||||
.tuner_en_bit = _tuner_en_bit, \
|
||||
.pcw_reg = _pcw_reg, \
|
||||
.pcw_shift = _pcw_shift, \
|
||||
.pcw_chg_reg = _pcw_chg_reg, \
|
||||
.pcw_chg_bit = MT7988_PCW_CHG_BIT, \
|
||||
.parent_name = "clkxtal", \
|
||||
}
|
||||
|
||||
static const struct mtk_pll_data plls[] = {
|
||||
PLL(CLK_APMIXED_NETSYSPLL, "netsyspll", 0x0104, 0x0110, 0x00000001, 0, 0, 32, 0x0104, 4, 0,
|
||||
0, 0, 0x0108, 0, 0x0104),
|
||||
PLL(CLK_APMIXED_MPLL, "mpll", 0x0114, 0x0120, 0xff000001, HAVE_RST_BAR, 23, 32, 0x0114, 4,
|
||||
0, 0, 0, 0x0118, 0, 0x0114),
|
||||
PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0124, 0x0130, 0xff000001, HAVE_RST_BAR, 23, 32, 0x0124, 4,
|
||||
0, 0, 0, 0x0128, 0, 0x0124),
|
||||
PLL(CLK_APMIXED_APLL2, "apll2", 0x0134, 0x0140, 0x00000001, 0, 0, 32, 0x0134, 4, 0x0704,
|
||||
0x0700, 1, 0x0138, 0, 0x0134),
|
||||
PLL(CLK_APMIXED_NET1PLL, "net1pll", 0x0144, 0x0150, 0xff000001, HAVE_RST_BAR, 23, 32,
|
||||
0x0144, 4, 0, 0, 0, 0x0148, 0, 0x0144),
|
||||
PLL(CLK_APMIXED_NET2PLL, "net2pll", 0x0154, 0x0160, 0xff000001, (HAVE_RST_BAR | PLL_AO), 23,
|
||||
32, 0x0154, 4, 0, 0, 0, 0x0158, 0, 0x0154),
|
||||
PLL(CLK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0164, 0x0170, 0x00000001, 0, 0, 32, 0x0164, 4, 0,
|
||||
0, 0, 0x0168, 0, 0x0164),
|
||||
PLL(CLK_APMIXED_SGMPLL, "sgmpll", 0x0174, 0x0180, 0x00000001, 0, 0, 32, 0x0174, 4, 0, 0, 0,
|
||||
0x0178, 0, 0x0174),
|
||||
PLL(CLK_APMIXED_ARM_B, "arm_b", 0x0204, 0x0210, 0xff000001, (HAVE_RST_BAR | PLL_AO), 23, 32,
|
||||
0x0204, 4, 0, 0, 0, 0x0208, 0, 0x0204),
|
||||
PLL(CLK_APMIXED_CCIPLL2_B, "ccipll2_b", 0x0214, 0x0220, 0xff000001, HAVE_RST_BAR, 23, 32,
|
||||
0x0214, 4, 0, 0, 0, 0x0218, 0, 0x0214),
|
||||
PLL(CLK_APMIXED_USXGMIIPLL, "usxgmiipll", 0x0304, 0x0310, 0xff000001, HAVE_RST_BAR, 23, 32,
|
||||
0x0304, 4, 0, 0, 0, 0x0308, 0, 0x0304),
|
||||
PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0314, 0x0320, 0x00000001, 0, 0, 32, 0x0314, 4, 0, 0,
|
||||
0, 0x0318, 0, 0x0314),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7988_apmixed[] = {
|
||||
{ .compatible = "mediatek,mt7988-apmixedsys" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int clk_mt7988_apmixed_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls));
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
r = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
if (r)
|
||||
goto free_apmixed_data;
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
goto unregister_plls;
|
||||
|
||||
return r;
|
||||
|
||||
unregister_plls:
|
||||
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
|
||||
free_apmixed_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
return r;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt7988_apmixed_drv = {
|
||||
.probe = clk_mt7988_apmixed_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt7988-apmixed",
|
||||
.of_match_table = of_match_clk_mt7988_apmixed,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(clk_mt7988_apmixed_drv);
|
||||
MODULE_LICENSE("GPL");
|
150
drivers/clk/mediatek/clk-mt7988-eth.c
Normal file
150
drivers/clk/mediatek/clk-mt7988-eth.c
Normal file
@ -0,0 +1,150 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2023 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Xiufeng Li <Xiufeng.Li@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "reset.h"
|
||||
#include <dt-bindings/clock/mediatek,mt7988-clk.h>
|
||||
#include <dt-bindings/reset/mediatek,mt7988-resets.h>
|
||||
|
||||
static const struct mtk_gate_regs ethdma_cg_regs = {
|
||||
.set_ofs = 0x30,
|
||||
.clr_ofs = 0x30,
|
||||
.sta_ofs = 0x30,
|
||||
};
|
||||
|
||||
#define GATE_ETHDMA(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = ðdma_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate ethdma_clks[] = {
|
||||
GATE_ETHDMA(CLK_ETHDMA_XGP1_EN, "ethdma_xgp1_en", "top_xtal", 0),
|
||||
GATE_ETHDMA(CLK_ETHDMA_XGP2_EN, "ethdma_xgp2_en", "top_xtal", 1),
|
||||
GATE_ETHDMA(CLK_ETHDMA_XGP3_EN, "ethdma_xgp3_en", "top_xtal", 2),
|
||||
GATE_ETHDMA(CLK_ETHDMA_FE_EN, "ethdma_fe_en", "netsys_2x_sel", 6),
|
||||
GATE_ETHDMA(CLK_ETHDMA_GP2_EN, "ethdma_gp2_en", "top_xtal", 7),
|
||||
GATE_ETHDMA(CLK_ETHDMA_GP1_EN, "ethdma_gp1_en", "top_xtal", 8),
|
||||
GATE_ETHDMA(CLK_ETHDMA_GP3_EN, "ethdma_gp3_en", "top_xtal", 10),
|
||||
GATE_ETHDMA(CLK_ETHDMA_ESW_EN, "ethdma_esw_en", "netsys_gsw_sel", 16),
|
||||
GATE_ETHDMA(CLK_ETHDMA_CRYPT0_EN, "ethdma_crypt0_en", "eip197_sel", 29),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc ethdma_desc = {
|
||||
.clks = ethdma_clks,
|
||||
.num_clks = ARRAY_SIZE(ethdma_clks),
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs sgmii_cg_regs = {
|
||||
.set_ofs = 0xe4,
|
||||
.clr_ofs = 0xe4,
|
||||
.sta_ofs = 0xe4,
|
||||
};
|
||||
|
||||
#define GATE_SGMII(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = &sgmii_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate sgmii0_clks[] = {
|
||||
GATE_SGMII(CLK_SGM0_TX_EN, "sgm0_tx_en", "top_xtal", 2),
|
||||
GATE_SGMII(CLK_SGM0_RX_EN, "sgm0_rx_en", "top_xtal", 3),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc sgmii0_desc = {
|
||||
.clks = sgmii0_clks,
|
||||
.num_clks = ARRAY_SIZE(sgmii0_clks),
|
||||
};
|
||||
|
||||
static const struct mtk_gate sgmii1_clks[] = {
|
||||
GATE_SGMII(CLK_SGM1_TX_EN, "sgm1_tx_en", "top_xtal", 2),
|
||||
GATE_SGMII(CLK_SGM1_RX_EN, "sgm1_rx_en", "top_xtal", 3),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc sgmii1_desc = {
|
||||
.clks = sgmii1_clks,
|
||||
.num_clks = ARRAY_SIZE(sgmii1_clks),
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs ethwarp_cg_regs = {
|
||||
.set_ofs = 0x14,
|
||||
.clr_ofs = 0x14,
|
||||
.sta_ofs = 0x14,
|
||||
};
|
||||
|
||||
#define GATE_ETHWARP(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = ðwarp_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate ethwarp_clks[] = {
|
||||
GATE_ETHWARP(CLK_ETHWARP_WOCPU2_EN, "ethwarp_wocpu2_en", "netsys_mcu_sel", 13),
|
||||
GATE_ETHWARP(CLK_ETHWARP_WOCPU1_EN, "ethwarp_wocpu1_en", "netsys_mcu_sel", 14),
|
||||
GATE_ETHWARP(CLK_ETHWARP_WOCPU0_EN, "ethwarp_wocpu0_en", "netsys_mcu_sel", 15),
|
||||
};
|
||||
|
||||
static u16 ethwarp_rst_ofs[] = { 0x8 };
|
||||
|
||||
static u16 ethwarp_idx_map[] = {
|
||||
[MT7988_ETHWARP_RST_SWITCH] = 9,
|
||||
};
|
||||
|
||||
static const struct mtk_clk_rst_desc ethwarp_rst_desc = {
|
||||
.version = MTK_RST_SIMPLE,
|
||||
.rst_bank_ofs = ethwarp_rst_ofs,
|
||||
.rst_bank_nr = ARRAY_SIZE(ethwarp_rst_ofs),
|
||||
.rst_idx_map = ethwarp_idx_map,
|
||||
.rst_idx_map_nr = ARRAY_SIZE(ethwarp_idx_map),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc ethwarp_desc = {
|
||||
.clks = ethwarp_clks,
|
||||
.num_clks = ARRAY_SIZE(ethwarp_clks),
|
||||
.rst_desc = ðwarp_rst_desc,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7988_eth[] = {
|
||||
{ .compatible = "mediatek,mt7988-ethsys", .data = ðdma_desc },
|
||||
{ .compatible = "mediatek,mt7988-sgmiisys0", .data = &sgmii0_desc },
|
||||
{ .compatible = "mediatek,mt7988-sgmiisys1", .data = &sgmii1_desc },
|
||||
{ .compatible = "mediatek,mt7988-ethwarp", .data = ðwarp_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_eth);
|
||||
|
||||
static struct platform_driver clk_mt7988_eth_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt7988-eth",
|
||||
.of_match_table = of_match_clk_mt7988_eth,
|
||||
},
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove_new = mtk_clk_simple_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt7988_eth_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7988 Ethernet clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
275
drivers/clk/mediatek/clk-mt7988-infracfg.c
Normal file
275
drivers/clk/mediatek/clk-mt7988-infracfg.c
Normal file
@ -0,0 +1,275 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2023 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Xiufeng Li <Xiufeng.Li@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
#include <dt-bindings/clock/mediatek,mt7988-clk.h>
|
||||
|
||||
static DEFINE_SPINLOCK(mt7988_clk_lock);
|
||||
|
||||
static const char *const infra_mux_uart0_parents[] __initconst = { "csw_infra_f26m_sel",
|
||||
"uart_sel" };
|
||||
|
||||
static const char *const infra_mux_uart1_parents[] __initconst = { "csw_infra_f26m_sel",
|
||||
"uart_sel" };
|
||||
|
||||
static const char *const infra_mux_uart2_parents[] __initconst = { "csw_infra_f26m_sel",
|
||||
"uart_sel" };
|
||||
|
||||
static const char *const infra_mux_spi0_parents[] __initconst = { "i2c_sel", "spi_sel" };
|
||||
|
||||
static const char *const infra_mux_spi1_parents[] __initconst = { "i2c_sel", "spim_mst_sel" };
|
||||
|
||||
static const char *const infra_pwm_bck_parents[] __initconst = { "top_rtc_32p7k",
|
||||
"csw_infra_f26m_sel", "sysaxi_sel",
|
||||
"pwm_sel" };
|
||||
|
||||
static const char *const infra_pcie_gfmux_tl_ck_o_p0_parents[] __initconst = {
|
||||
"top_rtc_32p7k", "csw_infra_f26m_sel", "csw_infra_f26m_sel", "pextp_tl_sel"
|
||||
};
|
||||
|
||||
static const char *const infra_pcie_gfmux_tl_ck_o_p1_parents[] __initconst = {
|
||||
"top_rtc_32p7k", "csw_infra_f26m_sel", "csw_infra_f26m_sel", "pextp_tl_p1_sel"
|
||||
};
|
||||
|
||||
static const char *const infra_pcie_gfmux_tl_ck_o_p2_parents[] __initconst = {
|
||||
"top_rtc_32p7k", "csw_infra_f26m_sel", "csw_infra_f26m_sel", "pextp_tl_p2_sel"
|
||||
};
|
||||
|
||||
static const char *const infra_pcie_gfmux_tl_ck_o_p3_parents[] __initconst = {
|
||||
"top_rtc_32p7k", "csw_infra_f26m_sel", "csw_infra_f26m_sel", "pextp_tl_p3_sel"
|
||||
};
|
||||
|
||||
static const struct mtk_mux infra_muxes[] = {
|
||||
/* MODULE_CLK_SEL_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_MUX_UART0_SEL, "infra_mux_uart0_sel",
|
||||
infra_mux_uart0_parents, 0x0018, 0x0010, 0x0014, 0, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_MUX_UART1_SEL, "infra_mux_uart1_sel",
|
||||
infra_mux_uart1_parents, 0x0018, 0x0010, 0x0014, 1, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_MUX_UART2_SEL, "infra_mux_uart2_sel",
|
||||
infra_mux_uart2_parents, 0x0018, 0x0010, 0x0014, 2, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_MUX_SPI0_SEL, "infra_mux_spi0_sel", infra_mux_spi0_parents,
|
||||
0x0018, 0x0010, 0x0014, 4, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_MUX_SPI1_SEL, "infra_mux_spi1_sel", infra_mux_spi1_parents,
|
||||
0x0018, 0x0010, 0x0014, 5, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_MUX_SPI2_SEL, "infra_mux_spi2_sel", infra_mux_spi0_parents,
|
||||
0x0018, 0x0010, 0x0014, 6, 1, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_SEL, "infra_pwm_sel", infra_pwm_bck_parents, 0x0018,
|
||||
0x0010, 0x0014, 14, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK1_SEL, "infra_pwm_ck1_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 16, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK2_SEL, "infra_pwm_ck2_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 18, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK3_SEL, "infra_pwm_ck3_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 20, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK4_SEL, "infra_pwm_ck4_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 22, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK5_SEL, "infra_pwm_ck5_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 24, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK6_SEL, "infra_pwm_ck6_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 26, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK7_SEL, "infra_pwm_ck7_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 28, 2, -1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_CK8_SEL, "infra_pwm_ck8_sel", infra_pwm_bck_parents,
|
||||
0x0018, 0x0010, 0x0014, 30, 2, -1, -1, -1),
|
||||
/* MODULE_CLK_SEL_1 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_GFMUX_TL_O_P0_SEL, "infra_pcie_gfmux_tl_o_p0_sel",
|
||||
infra_pcie_gfmux_tl_ck_o_p0_parents, 0x0028, 0x0020, 0x0024, 0, 2, -1,
|
||||
-1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_GFMUX_TL_O_P1_SEL, "infra_pcie_gfmux_tl_o_p1_sel",
|
||||
infra_pcie_gfmux_tl_ck_o_p1_parents, 0x0028, 0x0020, 0x0024, 2, 2, -1,
|
||||
-1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_GFMUX_TL_O_P2_SEL, "infra_pcie_gfmux_tl_o_p2_sel",
|
||||
infra_pcie_gfmux_tl_ck_o_p2_parents, 0x0028, 0x0020, 0x0024, 4, 2, -1,
|
||||
-1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_GFMUX_TL_O_P3_SEL, "infra_pcie_gfmux_tl_o_p3_sel",
|
||||
infra_pcie_gfmux_tl_ck_o_p3_parents, 0x0028, 0x0020, 0x0024, 6, 2, -1,
|
||||
-1, -1),
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra0_cg_regs = {
|
||||
.set_ofs = 0x10,
|
||||
.clr_ofs = 0x14,
|
||||
.sta_ofs = 0x18,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra1_cg_regs = {
|
||||
.set_ofs = 0x40,
|
||||
.clr_ofs = 0x44,
|
||||
.sta_ofs = 0x48,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra2_cg_regs = {
|
||||
.set_ofs = 0x50,
|
||||
.clr_ofs = 0x54,
|
||||
.sta_ofs = 0x58,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra3_cg_regs = {
|
||||
.set_ofs = 0x60,
|
||||
.clr_ofs = 0x64,
|
||||
.sta_ofs = 0x68,
|
||||
};
|
||||
|
||||
#define GATE_INFRA0_FLAGS(_id, _name, _parent, _shift, _flags) \
|
||||
GATE_MTK_FLAGS(_id, _name, _parent, &infra0_cg_regs, _shift, &mtk_clk_gate_ops_setclr, \
|
||||
_flags)
|
||||
|
||||
#define GATE_INFRA1_FLAGS(_id, _name, _parent, _shift, _flags) \
|
||||
GATE_MTK_FLAGS(_id, _name, _parent, &infra1_cg_regs, _shift, &mtk_clk_gate_ops_setclr, \
|
||||
_flags)
|
||||
|
||||
#define GATE_INFRA2_FLAGS(_id, _name, _parent, _shift, _flags) \
|
||||
GATE_MTK_FLAGS(_id, _name, _parent, &infra2_cg_regs, _shift, &mtk_clk_gate_ops_setclr, \
|
||||
_flags)
|
||||
|
||||
#define GATE_INFRA3_FLAGS(_id, _name, _parent, _shift, _flags) \
|
||||
GATE_MTK_FLAGS(_id, _name, _parent, &infra3_cg_regs, _shift, &mtk_clk_gate_ops_setclr, \
|
||||
_flags)
|
||||
|
||||
#define GATE_INFRA0(_id, _name, _parent, _shift) GATE_INFRA0_FLAGS(_id, _name, _parent, _shift, 0)
|
||||
|
||||
#define GATE_INFRA1(_id, _name, _parent, _shift) GATE_INFRA1_FLAGS(_id, _name, _parent, _shift, 0)
|
||||
|
||||
#define GATE_INFRA2(_id, _name, _parent, _shift) GATE_INFRA2_FLAGS(_id, _name, _parent, _shift, 0)
|
||||
|
||||
#define GATE_INFRA3(_id, _name, _parent, _shift) GATE_INFRA3_FLAGS(_id, _name, _parent, _shift, 0)
|
||||
|
||||
static const struct mtk_gate infra_clks[] = {
|
||||
/* INFRA0 */
|
||||
GATE_INFRA0(CLK_INFRA_PCIE_PERI_26M_CK_P0, "infra_pcie_peri_ck_26m_ck_p0",
|
||||
"csw_infra_f26m_sel", 7),
|
||||
GATE_INFRA0(CLK_INFRA_PCIE_PERI_26M_CK_P1, "infra_pcie_peri_ck_26m_ck_p1",
|
||||
"csw_infra_f26m_sel", 8),
|
||||
GATE_INFRA0(CLK_INFRA_PCIE_PERI_26M_CK_P2, "infra_pcie_peri_ck_26m_ck_p2",
|
||||
"csw_infra_f26m_sel", 9),
|
||||
GATE_INFRA0(CLK_INFRA_PCIE_PERI_26M_CK_P3, "infra_pcie_peri_ck_26m_ck_p3",
|
||||
"csw_infra_f26m_sel", 10),
|
||||
/* INFRA1 */
|
||||
GATE_INFRA1(CLK_INFRA_66M_GPT_BCK, "infra_hf_66m_gpt_bck", "sysaxi_sel", 0),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_HCK, "infra_hf_66m_pwm_hck", "sysaxi_sel", 1),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_BCK, "infra_hf_66m_pwm_bck", "infra_pwm_sel", 2),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK1, "infra_hf_66m_pwm_ck1", "infra_pwm_ck1_sel", 3),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK2, "infra_hf_66m_pwm_ck2", "infra_pwm_ck2_sel", 4),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK3, "infra_hf_66m_pwm_ck3", "infra_pwm_ck3_sel", 5),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK4, "infra_hf_66m_pwm_ck4", "infra_pwm_ck4_sel", 6),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK5, "infra_hf_66m_pwm_ck5", "infra_pwm_ck5_sel", 7),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK6, "infra_hf_66m_pwm_ck6", "infra_pwm_ck6_sel", 8),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK7, "infra_hf_66m_pwm_ck7", "infra_pwm_ck7_sel", 9),
|
||||
GATE_INFRA1(CLK_INFRA_66M_PWM_CK8, "infra_hf_66m_pwm_ck8", "infra_pwm_ck8_sel", 10),
|
||||
GATE_INFRA1(CLK_INFRA_133M_CQDMA_BCK, "infra_hf_133m_cqdma_bck", "sysaxi_sel", 12),
|
||||
GATE_INFRA1(CLK_INFRA_66M_AUD_SLV_BCK, "infra_66m_aud_slv_bck", "sysaxi_sel", 13),
|
||||
GATE_INFRA1(CLK_INFRA_AUD_26M, "infra_f_faud_26m", "csw_infra_f26m_sel", 14),
|
||||
GATE_INFRA1(CLK_INFRA_AUD_L, "infra_f_faud_l", "aud_l_sel", 15),
|
||||
GATE_INFRA1(CLK_INFRA_AUD_AUD, "infra_f_aud_aud", "a1sys_sel", 16),
|
||||
GATE_INFRA1(CLK_INFRA_AUD_EG2, "infra_f_faud_eg2", "a_tuner_sel", 18),
|
||||
GATE_INFRA1_FLAGS(CLK_INFRA_DRAMC_F26M, "infra_dramc_f26m", "csw_infra_f26m_sel", 19,
|
||||
CLK_IS_CRITICAL),
|
||||
/* JTAG */
|
||||
GATE_INFRA1_FLAGS(CLK_INFRA_133M_DBG_ACKM, "infra_hf_133m_dbg_ackm", "sysaxi_sel", 20,
|
||||
CLK_IS_CRITICAL),
|
||||
GATE_INFRA1(CLK_INFRA_66M_AP_DMA_BCK, "infra_66m_ap_dma_bck", "sysaxi_sel", 21),
|
||||
GATE_INFRA1(CLK_INFRA_66M_SEJ_BCK, "infra_hf_66m_sej_bck", "sysaxi_sel", 29),
|
||||
GATE_INFRA1(CLK_INFRA_PRE_CK_SEJ_F13M, "infra_pre_ck_sej_f13m", "csw_infra_f26m_sel", 30),
|
||||
/* INFRA2 */
|
||||
GATE_INFRA2(CLK_INFRA_26M_THERM_SYSTEM, "infra_hf_26m_therm_system", "csw_infra_f26m_sel",
|
||||
0),
|
||||
GATE_INFRA2(CLK_INFRA_I2C_BCK, "infra_i2c_bck", "i2c_sel", 1),
|
||||
GATE_INFRA2(CLK_INFRA_52M_UART0_CK, "infra_f_52m_uart0", "infra_mux_uart0_sel", 3),
|
||||
GATE_INFRA2(CLK_INFRA_52M_UART1_CK, "infra_f_52m_uart1", "infra_mux_uart1_sel", 4),
|
||||
GATE_INFRA2(CLK_INFRA_52M_UART2_CK, "infra_f_52m_uart2", "infra_mux_uart2_sel", 5),
|
||||
GATE_INFRA2(CLK_INFRA_NFI, "infra_f_fnfi", "nfi1x_sel", 9),
|
||||
GATE_INFRA2(CLK_INFRA_SPINFI, "infra_f_fspinfi", "spinfi_sel", 10),
|
||||
GATE_INFRA2_FLAGS(CLK_INFRA_66M_NFI_HCK, "infra_hf_66m_nfi_hck", "sysaxi_sel", 11,
|
||||
CLK_IS_CRITICAL),
|
||||
GATE_INFRA2_FLAGS(CLK_INFRA_104M_SPI0, "infra_hf_104m_spi0", "infra_mux_spi0_sel", 12,
|
||||
CLK_IS_CRITICAL),
|
||||
GATE_INFRA2(CLK_INFRA_104M_SPI1, "infra_hf_104m_spi1", "infra_mux_spi1_sel", 13),
|
||||
GATE_INFRA2(CLK_INFRA_104M_SPI2_BCK, "infra_hf_104m_spi2_bck", "infra_mux_spi2_sel", 14),
|
||||
GATE_INFRA2_FLAGS(CLK_INFRA_66M_SPI0_HCK, "infra_hf_66m_spi0_hck", "sysaxi_sel", 15,
|
||||
CLK_IS_CRITICAL),
|
||||
GATE_INFRA2(CLK_INFRA_66M_SPI1_HCK, "infra_hf_66m_spi1_hck", "sysaxi_sel", 16),
|
||||
GATE_INFRA2(CLK_INFRA_66M_SPI2_HCK, "infra_hf_66m_spi2_hck", "sysaxi_sel", 17),
|
||||
GATE_INFRA2(CLK_INFRA_66M_FLASHIF_AXI, "infra_hf_66m_flashif_axi", "sysaxi_sel", 18),
|
||||
GATE_INFRA2_FLAGS(CLK_INFRA_RTC, "infra_f_frtc", "top_rtc_32k", 19, CLK_IS_CRITICAL),
|
||||
GATE_INFRA2(CLK_INFRA_26M_ADC_BCK, "infra_f_26m_adc_bck", "csw_infra_f26m_sel", 20),
|
||||
GATE_INFRA2(CLK_INFRA_RC_ADC, "infra_f_frc_adc", "infra_f_26m_adc_bck", 21),
|
||||
GATE_INFRA2(CLK_INFRA_MSDC400, "infra_f_fmsdc400", "emmc_400m_sel", 22),
|
||||
GATE_INFRA2(CLK_INFRA_MSDC2_HCK, "infra_f_fmsdc2_hck", "emmc_250m_sel", 23),
|
||||
GATE_INFRA2(CLK_INFRA_133M_MSDC_0_HCK, "infra_hf_133m_msdc_0_hck", "sysaxi_sel", 24),
|
||||
GATE_INFRA2(CLK_INFRA_66M_MSDC_0_HCK, "infra_66m_msdc_0_hck", "sysaxi_sel", 25),
|
||||
GATE_INFRA2(CLK_INFRA_133M_CPUM_BCK, "infra_hf_133m_cpum_bck", "sysaxi_sel", 26),
|
||||
GATE_INFRA2(CLK_INFRA_BIST2FPC, "infra_hf_fbist2fpc", "nfi1x_sel", 27),
|
||||
GATE_INFRA2(CLK_INFRA_I2C_X16W_MCK_CK_P1, "infra_hf_i2c_x16w_mck_ck_p1", "sysaxi_sel", 29),
|
||||
GATE_INFRA2(CLK_INFRA_I2C_X16W_PCK_CK_P1, "infra_hf_i2c_x16w_pck_ck_p1", "sysaxi_sel", 31),
|
||||
/* INFRA3 */
|
||||
GATE_INFRA3(CLK_INFRA_133M_USB_HCK, "infra_133m_usb_hck", "sysaxi_sel", 0),
|
||||
GATE_INFRA3(CLK_INFRA_133M_USB_HCK_CK_P1, "infra_133m_usb_hck_ck_p1", "sysaxi_sel", 1),
|
||||
GATE_INFRA3(CLK_INFRA_66M_USB_HCK, "infra_66m_usb_hck", "sysaxi_sel", 2),
|
||||
GATE_INFRA3(CLK_INFRA_66M_USB_HCK_CK_P1, "infra_66m_usb_hck_ck_p1", "sysaxi_sel", 3),
|
||||
GATE_INFRA3(CLK_INFRA_USB_SYS, "infra_usb_sys", "usb_sys_sel", 4),
|
||||
GATE_INFRA3(CLK_INFRA_USB_SYS_CK_P1, "infra_usb_sys_ck_p1", "usb_sys_p1_sel", 5),
|
||||
GATE_INFRA3(CLK_INFRA_USB_REF, "infra_usb_ref", "top_xtal", 6),
|
||||
GATE_INFRA3(CLK_INFRA_USB_CK_P1, "infra_usb_ck_p1", "top_xtal", 7),
|
||||
GATE_INFRA3_FLAGS(CLK_INFRA_USB_FRMCNT, "infra_usb_frmcnt", "usb_frmcnt_sel", 8,
|
||||
CLK_IS_CRITICAL),
|
||||
GATE_INFRA3_FLAGS(CLK_INFRA_USB_FRMCNT_CK_P1, "infra_usb_frmcnt_ck_p1", "usb_frmcnt_p1_sel",
|
||||
9, CLK_IS_CRITICAL),
|
||||
GATE_INFRA3(CLK_INFRA_USB_PIPE, "infra_usb_pipe", "sspxtp_sel", 10),
|
||||
GATE_INFRA3(CLK_INFRA_USB_PIPE_CK_P1, "infra_usb_pipe_ck_p1", "usb_phy_sel", 11),
|
||||
GATE_INFRA3(CLK_INFRA_USB_UTMI, "infra_usb_utmi", "top_xtal", 12),
|
||||
GATE_INFRA3(CLK_INFRA_USB_UTMI_CK_P1, "infra_usb_utmi_ck_p1", "top_xtal", 13),
|
||||
GATE_INFRA3(CLK_INFRA_USB_XHCI, "infra_usb_xhci", "usb_xhci_sel", 14),
|
||||
GATE_INFRA3(CLK_INFRA_USB_XHCI_CK_P1, "infra_usb_xhci_ck_p1", "usb_xhci_p1_sel", 15),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_GFMUX_TL_P0, "infra_pcie_gfmux_tl_ck_p0",
|
||||
"infra_pcie_gfmux_tl_o_p0_sel", 20),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_GFMUX_TL_P1, "infra_pcie_gfmux_tl_ck_p1",
|
||||
"infra_pcie_gfmux_tl_o_p1_sel", 21),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_GFMUX_TL_P2, "infra_pcie_gfmux_tl_ck_p2",
|
||||
"infra_pcie_gfmux_tl_o_p2_sel", 22),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_GFMUX_TL_P3, "infra_pcie_gfmux_tl_ck_p3",
|
||||
"infra_pcie_gfmux_tl_o_p3_sel", 23),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_PIPE_P0, "infra_pcie_pipe_ck_p0", "top_xtal", 24),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_PIPE_P1, "infra_pcie_pipe_ck_p1", "top_xtal", 25),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_PIPE_P2, "infra_pcie_pipe_ck_p2", "top_xtal", 26),
|
||||
GATE_INFRA3(CLK_INFRA_PCIE_PIPE_P3, "infra_pcie_pipe_ck_p3", "top_xtal", 27),
|
||||
GATE_INFRA3(CLK_INFRA_133M_PCIE_CK_P0, "infra_133m_pcie_ck_p0", "sysaxi_sel", 28),
|
||||
GATE_INFRA3(CLK_INFRA_133M_PCIE_CK_P1, "infra_133m_pcie_ck_p1", "sysaxi_sel", 29),
|
||||
GATE_INFRA3(CLK_INFRA_133M_PCIE_CK_P2, "infra_133m_pcie_ck_p2", "sysaxi_sel", 30),
|
||||
GATE_INFRA3(CLK_INFRA_133M_PCIE_CK_P3, "infra_133m_pcie_ck_p3", "sysaxi_sel", 31),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc infra_desc = {
|
||||
.clks = infra_clks,
|
||||
.num_clks = ARRAY_SIZE(infra_clks),
|
||||
.mux_clks = infra_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(infra_muxes),
|
||||
.clk_lock = &mt7988_clk_lock,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7988_infracfg[] = {
|
||||
{ .compatible = "mediatek,mt7988-infracfg", .data = &infra_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_infracfg);
|
||||
|
||||
static struct platform_driver clk_mt7988_infracfg_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt7988-infracfg",
|
||||
.of_match_table = of_match_clk_mt7988_infracfg,
|
||||
},
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove_new = mtk_clk_simple_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt7988_infracfg_drv);
|
||||
MODULE_LICENSE("GPL");
|
325
drivers/clk/mediatek/clk-mt7988-topckgen.c
Normal file
325
drivers/clk/mediatek/clk-mt7988-topckgen.c
Normal file
@ -0,0 +1,325 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2023 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Xiufeng Li <Xiufeng.Li@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
#include <dt-bindings/clock/mediatek,mt7988-clk.h>
|
||||
|
||||
static DEFINE_SPINLOCK(mt7988_clk_lock);
|
||||
|
||||
static const struct mtk_fixed_clk top_fixed_clks[] = {
|
||||
FIXED_CLK(CLK_TOP_XTAL, "top_xtal", "clkxtal", 40000000),
|
||||
};
|
||||
|
||||
static const struct mtk_fixed_factor top_divs[] = {
|
||||
FACTOR(CLK_TOP_XTAL_D2, "top_xtal_d2", "top_xtal", 1, 2),
|
||||
FACTOR(CLK_TOP_RTC_32K, "top_rtc_32k", "top_xtal", 1, 1250),
|
||||
FACTOR(CLK_TOP_RTC_32P7K, "top_rtc_32p7k", "top_xtal", 1, 1220),
|
||||
FACTOR(CLK_TOP_MPLL_D2, "mpll_d2", "mpll", 1, 2),
|
||||
FACTOR(CLK_TOP_MPLL_D3_D2, "mpll_d3_d2", "mpll", 1, 2),
|
||||
FACTOR(CLK_TOP_MPLL_D4, "mpll_d4", "mpll", 1, 4),
|
||||
FACTOR(CLK_TOP_MPLL_D8, "mpll_d8", "mpll", 1, 8),
|
||||
FACTOR(CLK_TOP_MPLL_D8_D2, "mpll_d8_d2", "mpll", 1, 16),
|
||||
FACTOR(CLK_TOP_MMPLL_D2, "mmpll_d2", "mmpll", 1, 2),
|
||||
FACTOR(CLK_TOP_MMPLL_D3_D5, "mmpll_d3_d5", "mmpll", 1, 15),
|
||||
FACTOR(CLK_TOP_MMPLL_D4, "mmpll_d4", "mmpll", 1, 4),
|
||||
FACTOR(CLK_TOP_MMPLL_D6_D2, "mmpll_d6_d2", "mmpll", 1, 12),
|
||||
FACTOR(CLK_TOP_MMPLL_D8, "mmpll_d8", "mmpll", 1, 8),
|
||||
FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
|
||||
FACTOR(CLK_TOP_NET1PLL_D4, "net1pll_d4", "net1pll", 1, 4),
|
||||
FACTOR(CLK_TOP_NET1PLL_D5, "net1pll_d5", "net1pll", 1, 5),
|
||||
FACTOR(CLK_TOP_NET1PLL_D5_D2, "net1pll_d5_d2", "net1pll", 1, 10),
|
||||
FACTOR(CLK_TOP_NET1PLL_D5_D4, "net1pll_d5_d4", "net1pll", 1, 20),
|
||||
FACTOR(CLK_TOP_NET1PLL_D8, "net1pll_d8", "net1pll", 1, 8),
|
||||
FACTOR(CLK_TOP_NET1PLL_D8_D2, "net1pll_d8_d2", "net1pll", 1, 16),
|
||||
FACTOR(CLK_TOP_NET1PLL_D8_D4, "net1pll_d8_d4", "net1pll", 1, 32),
|
||||
FACTOR(CLK_TOP_NET1PLL_D8_D8, "net1pll_d8_d8", "net1pll", 1, 64),
|
||||
FACTOR(CLK_TOP_NET1PLL_D8_D16, "net1pll_d8_d16", "net1pll", 1, 128),
|
||||
FACTOR(CLK_TOP_NET2PLL_D2, "net2pll_d2", "net2pll", 1, 2),
|
||||
FACTOR(CLK_TOP_NET2PLL_D4, "net2pll_d4", "net2pll", 1, 4),
|
||||
FACTOR(CLK_TOP_NET2PLL_D4_D4, "net2pll_d4_d4", "net2pll", 1, 16),
|
||||
FACTOR(CLK_TOP_NET2PLL_D4_D8, "net2pll_d4_d8", "net2pll", 1, 32),
|
||||
FACTOR(CLK_TOP_NET2PLL_D6, "net2pll_d6", "net2pll", 1, 6),
|
||||
FACTOR(CLK_TOP_NET2PLL_D8, "net2pll_d8", "net2pll", 1, 8),
|
||||
};
|
||||
|
||||
static const char *const netsys_parents[] = { "top_xtal", "net2pll_d2", "mmpll_d2" };
|
||||
static const char *const netsys_500m_parents[] = { "top_xtal", "net1pll_d5", "net1pll_d5_d2" };
|
||||
static const char *const netsys_2x_parents[] = { "top_xtal", "net2pll", "mmpll" };
|
||||
static const char *const netsys_gsw_parents[] = { "top_xtal", "net1pll_d4", "net1pll_d5" };
|
||||
static const char *const eth_gmii_parents[] = { "top_xtal", "net1pll_d5_d4" };
|
||||
static const char *const netsys_mcu_parents[] = { "top_xtal", "net2pll", "mmpll",
|
||||
"net1pll_d4", "net1pll_d5", "mpll" };
|
||||
static const char *const eip197_parents[] = { "top_xtal", "netsyspll", "net2pll",
|
||||
"mmpll", "net1pll_d4", "net1pll_d5" };
|
||||
static const char *const axi_infra_parents[] = { "top_xtal", "net1pll_d8_d2" };
|
||||
static const char *const uart_parents[] = { "top_xtal", "mpll_d8", "mpll_d8_d2" };
|
||||
static const char *const emmc_250m_parents[] = { "top_xtal", "net1pll_d5_d2", "mmpll_d4" };
|
||||
static const char *const emmc_400m_parents[] = { "top_xtal", "msdcpll", "mmpll_d2",
|
||||
"mpll_d2", "mmpll_d4", "net1pll_d8_d2" };
|
||||
static const char *const spi_parents[] = { "top_xtal", "mpll_d2", "mmpll_d4",
|
||||
"net1pll_d8_d2", "net2pll_d6", "net1pll_d5_d4",
|
||||
"mpll_d4", "net1pll_d8_d4" };
|
||||
static const char *const nfi1x_parents[] = { "top_xtal", "mmpll_d4", "net1pll_d8_d2", "net2pll_d6",
|
||||
"mpll_d4", "mmpll_d8", "net1pll_d8_d4", "mpll_d8" };
|
||||
static const char *const spinfi_parents[] = { "top_xtal_d2", "top_xtal", "net1pll_d5_d4",
|
||||
"mpll_d4", "mmpll_d8", "net1pll_d8_d4",
|
||||
"mmpll_d6_d2", "mpll_d8" };
|
||||
static const char *const pwm_parents[] = { "top_xtal", "net1pll_d8_d2", "net1pll_d5_d4",
|
||||
"mpll_d4", "mpll_d8_d2", "top_rtc_32k" };
|
||||
static const char *const i2c_parents[] = { "top_xtal", "net1pll_d5_d4", "mpll_d4",
|
||||
"net1pll_d8_d4" };
|
||||
static const char *const pcie_mbist_250m_parents[] = { "top_xtal", "net1pll_d5_d2" };
|
||||
static const char *const pextp_tl_ck_parents[] = { "top_xtal", "net2pll_d6", "mmpll_d8",
|
||||
"mpll_d8_d2", "top_rtc_32k" };
|
||||
static const char *const usb_frmcnt_parents[] = { "top_xtal", "mmpll_d3_d5" };
|
||||
static const char *const aud_parents[] = { "top_xtal", "apll2" };
|
||||
static const char *const a1sys_parents[] = { "top_xtal", "apll2_d4" };
|
||||
static const char *const aud_l_parents[] = { "top_xtal", "apll2", "mpll_d8_d2" };
|
||||
static const char *const sspxtp_parents[] = { "top_xtal_d2", "mpll_d8_d2" };
|
||||
static const char *const usxgmii_sbus_0_parents[] = { "top_xtal", "net1pll_d8_d4" };
|
||||
static const char *const sgm_0_parents[] = { "top_xtal", "sgmpll" };
|
||||
static const char *const sysapb_parents[] = { "top_xtal", "mpll_d3_d2" };
|
||||
static const char *const eth_refck_50m_parents[] = { "top_xtal", "net2pll_d4_d4" };
|
||||
static const char *const eth_sys_200m_parents[] = { "top_xtal", "net2pll_d4" };
|
||||
static const char *const eth_xgmii_parents[] = { "top_xtal_d2", "net1pll_d8_d8", "net1pll_d8_d16" };
|
||||
static const char *const bus_tops_parents[] = { "top_xtal", "net1pll_d5", "net2pll_d2" };
|
||||
static const char *const npu_tops_parents[] = { "top_xtal", "net2pll" };
|
||||
static const char *const dramc_md32_parents[] = { "top_xtal", "mpll_d2", "wedmcupll" };
|
||||
static const char *const da_xtp_glb_p0_parents[] = { "top_xtal", "net2pll_d8" };
|
||||
static const char *const mcusys_backup_625m_parents[] = { "top_xtal", "net1pll_d4" };
|
||||
static const char *const macsec_parents[] = { "top_xtal", "sgmpll", "net1pll_d8" };
|
||||
static const char *const netsys_tops_400m_parents[] = { "top_xtal", "net2pll_d2" };
|
||||
static const char *const eth_mii_parents[] = { "top_xtal_d2", "net2pll_d4_d8" };
|
||||
|
||||
static const struct mtk_mux top_muxes[] = {
|
||||
/* CLK_CFG_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_SEL, "netsys_sel", netsys_parents, 0x000, 0x004, 0x008,
|
||||
0, 2, 7, 0x1c0, 0),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_500M_SEL, "netsys_500m_sel", netsys_500m_parents, 0x000,
|
||||
0x004, 0x008, 8, 2, 15, 0x1C0, 1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_2X_SEL, "netsys_2x_sel", netsys_2x_parents, 0x000,
|
||||
0x004, 0x008, 16, 2, 23, 0x1C0, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_GSW_SEL, "netsys_gsw_sel", netsys_gsw_parents, 0x000,
|
||||
0x004, 0x008, 24, 2, 31, 0x1C0, 3),
|
||||
/* CLK_CFG_1 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_GMII_SEL, "eth_gmii_sel", eth_gmii_parents, 0x010, 0x014,
|
||||
0x018, 0, 1, 7, 0x1C0, 4),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel", netsys_mcu_parents, 0x010,
|
||||
0x014, 0x018, 8, 3, 15, 0x1C0, 5),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_PAO_2X_SEL, "netsys_pao_2x_sel", netsys_mcu_parents,
|
||||
0x010, 0x014, 0x018, 16, 3, 23, 0x1C0, 6),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP197_SEL, "eip197_sel", eip197_parents, 0x010, 0x014, 0x018,
|
||||
24, 3, 31, 0x1c0, 7),
|
||||
/* CLK_CFG_2 */
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI_INFRA_SEL, "axi_infra_sel", axi_infra_parents, 0x020,
|
||||
0x024, 0x028, 0, 1, 7, 0x1C0, 8, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x020, 0x024, 0x028, 8, 2,
|
||||
15, 0x1c0, 9),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_250M_SEL, "emmc_250m_sel", emmc_250m_parents, 0x020,
|
||||
0x024, 0x028, 16, 2, 23, 0x1C0, 10),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_400M_SEL, "emmc_400m_sel", emmc_400m_parents, 0x020,
|
||||
0x024, 0x028, 24, 3, 31, 0x1C0, 11),
|
||||
/* CLK_CFG_3 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x030, 0x034, 0x038, 0, 3, 7,
|
||||
0x1c0, 12),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIM_MST_SEL, "spim_mst_sel", spi_parents, 0x030, 0x034, 0x038,
|
||||
8, 3, 15, 0x1c0, 13),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X_SEL, "nfi1x_sel", nfi1x_parents, 0x030, 0x034, 0x038, 16,
|
||||
3, 23, 0x1c0, 14),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_SEL, "spinfi_sel", spinfi_parents, 0x030, 0x034, 0x038,
|
||||
24, 3, 31, 0x1c0, 15),
|
||||
/* CLK_CFG_4 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x040, 0x044, 0x048, 0, 3, 7,
|
||||
0x1c0, 16),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", i2c_parents, 0x040, 0x044, 0x048, 8, 2, 15,
|
||||
0x1c0, 17),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PCIE_MBIST_250M_SEL, "pcie_mbist_250m_sel",
|
||||
pcie_mbist_250m_parents, 0x040, 0x044, 0x048, 16, 1, 23, 0x1C0, 18),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_SEL, "pextp_tl_sel", pextp_tl_ck_parents, 0x040,
|
||||
0x044, 0x048, 24, 3, 31, 0x1C0, 19),
|
||||
/* CLK_CFG_5 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_P1_SEL, "pextp_tl_p1_sel", pextp_tl_ck_parents, 0x050,
|
||||
0x054, 0x058, 0, 3, 7, 0x1C0, 20),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_P2_SEL, "pextp_tl_p2_sel", pextp_tl_ck_parents, 0x050,
|
||||
0x054, 0x058, 8, 3, 15, 0x1C0, 21),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_P3_SEL, "pextp_tl_p3_sel", pextp_tl_ck_parents, 0x050,
|
||||
0x054, 0x058, 16, 3, 23, 0x1C0, 22),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_SYS_SEL, "usb_sys_sel", eth_gmii_parents, 0x050, 0x054,
|
||||
0x058, 24, 1, 31, 0x1C0, 23),
|
||||
/* CLK_CFG_6 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_SYS_P1_SEL, "usb_sys_p1_sel", eth_gmii_parents, 0x060,
|
||||
0x064, 0x068, 0, 1, 7, 0x1C0, 24),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_SEL, "usb_xhci_sel", eth_gmii_parents, 0x060, 0x064,
|
||||
0x068, 8, 1, 15, 0x1C0, 25),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_P1_SEL, "usb_xhci_p1_sel", eth_gmii_parents, 0x060,
|
||||
0x064, 0x068, 16, 1, 23, 0x1C0, 26),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_FRMCNT_SEL, "usb_frmcnt_sel", usb_frmcnt_parents, 0x060,
|
||||
0x064, 0x068, 24, 1, 31, 0x1C0, 27),
|
||||
/* CLK_CFG_7 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_FRMCNT_P1_SEL, "usb_frmcnt_p1_sel", usb_frmcnt_parents,
|
||||
0x070, 0x074, 0x078, 0, 1, 7, 0x1C0, 28),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_SEL, "aud_sel", aud_parents, 0x070, 0x074, 0x078, 8, 1, 15,
|
||||
0x1c0, 29),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents, 0x070, 0x074, 0x078, 16,
|
||||
1, 23, 0x1c0, 30),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents, 0x070, 0x074, 0x078, 24,
|
||||
2, 31, 0x1c4, 0),
|
||||
/* CLK_CFG_8 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_A_TUNER_SEL, "a_tuner_sel", a1sys_parents, 0x080, 0x084, 0x088,
|
||||
0, 1, 7, 0x1c4, 1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SSPXTP_SEL, "sspxtp_sel", sspxtp_parents, 0x080, 0x084, 0x088,
|
||||
8, 1, 15, 0x1c4, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_PHY_SEL, "usb_phy_sel", sspxtp_parents, 0x080, 0x084,
|
||||
0x088, 16, 1, 23, 0x1c4, 3),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USXGMII_SBUS_0_SEL, "usxgmii_sbus_0_sel",
|
||||
usxgmii_sbus_0_parents, 0x080, 0x084, 0x088, 24, 1, 31, 0x1C4, 4),
|
||||
/* CLK_CFG_9 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USXGMII_SBUS_1_SEL, "usxgmii_sbus_1_sel",
|
||||
usxgmii_sbus_0_parents, 0x090, 0x094, 0x098, 0, 1, 7, 0x1C4, 5),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_0_SEL, "sgm_0_sel", sgm_0_parents, 0x090, 0x094, 0x098, 8,
|
||||
1, 15, 0x1c4, 6),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SGM_SBUS_0_SEL, "sgm_sbus_0_sel", usxgmii_sbus_0_parents,
|
||||
0x090, 0x094, 0x098, 16, 1, 23, 0x1C4, 7, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_1_SEL, "sgm_1_sel", sgm_0_parents, 0x090, 0x094, 0x098, 24,
|
||||
1, 31, 0x1c4, 8),
|
||||
/* CLK_CFG_10 */
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SGM_SBUS_1_SEL, "sgm_sbus_1_sel", usxgmii_sbus_0_parents,
|
||||
0x0a0, 0x0a4, 0x0a8, 0, 1, 7, 0x1C4, 9, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_XFI_PHY_0_XTAL_SEL, "xfi_phy_0_xtal_sel", sspxtp_parents,
|
||||
0x0a0, 0x0a4, 0x0a8, 8, 1, 15, 0x1C4, 10),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_XFI_PHY_1_XTAL_SEL, "xfi_phy_1_xtal_sel", sspxtp_parents,
|
||||
0x0a0, 0x0a4, 0x0a8, 16, 1, 23, 0x1C4, 11),
|
||||
/* CLK_CFG_11 */
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAXI_SEL, "sysaxi_sel", axi_infra_parents, 0x0a0,
|
||||
0x0a4, 0x0a8, 24, 1, 31, 0x1C4, 12, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAPB_SEL, "sysapb_sel", sysapb_parents, 0x0b0, 0x0b4,
|
||||
0x0b8, 0, 1, 7, 0x1c4, 13, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_REFCK_50M_SEL, "eth_refck_50m_sel", eth_refck_50m_parents,
|
||||
0x0b0, 0x0b4, 0x0b8, 8, 1, 15, 0x1C4, 14),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_SYS_200M_SEL, "eth_sys_200m_sel", eth_sys_200m_parents,
|
||||
0x0b0, 0x0b4, 0x0b8, 16, 1, 23, 0x1C4, 15),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_SYS_SEL, "eth_sys_sel", pcie_mbist_250m_parents, 0x0b0,
|
||||
0x0b4, 0x0b8, 24, 1, 31, 0x1C4, 16),
|
||||
/* CLK_CFG_12 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_XGMII_SEL, "eth_xgmii_sel", eth_xgmii_parents, 0x0c0,
|
||||
0x0c4, 0x0c8, 0, 2, 7, 0x1C4, 17),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_BUS_TOPS_SEL, "bus_tops_sel", bus_tops_parents, 0x0c0, 0x0c4,
|
||||
0x0c8, 8, 2, 15, 0x1C4, 18),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NPU_TOPS_SEL, "npu_tops_sel", npu_tops_parents, 0x0c0, 0x0c4,
|
||||
0x0c8, 16, 1, 23, 0x1C4, 19),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_SEL, "dramc_sel", sspxtp_parents, 0x0c0, 0x0c4,
|
||||
0x0c8, 24, 1, 31, 0x1C4, 20, CLK_IS_CRITICAL),
|
||||
/* CLK_CFG_13 */
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel", dramc_md32_parents,
|
||||
0x0d0, 0x0d4, 0x0d8, 0, 2, 7, 0x1C4, 21, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_INFRA_F26M_SEL, "csw_infra_f26m_sel", sspxtp_parents,
|
||||
0x0d0, 0x0d4, 0x0d8, 8, 1, 15, 0x1C4, 22, CLK_IS_CRITICAL),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_P0_SEL, "pextp_p0_sel", sspxtp_parents, 0x0d0, 0x0d4,
|
||||
0x0d8, 16, 1, 23, 0x1C4, 23),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_P1_SEL, "pextp_p1_sel", sspxtp_parents, 0x0d0, 0x0d4,
|
||||
0x0d8, 24, 1, 31, 0x1C4, 24),
|
||||
/* CLK_CFG_14 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_P2_SEL, "pextp_p2_sel", sspxtp_parents, 0x0e0, 0x0e4,
|
||||
0x0e8, 0, 1, 7, 0x1C4, 25),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_P3_SEL, "pextp_p3_sel", sspxtp_parents, 0x0e0, 0x0e4,
|
||||
0x0e8, 8, 1, 15, 0x1C4, 26),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_XTP_GLB_P0_SEL, "da_xtp_glb_p0_sel", da_xtp_glb_p0_parents,
|
||||
0x0e0, 0x0e4, 0x0e8, 16, 1, 23, 0x1C4, 27),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_XTP_GLB_P1_SEL, "da_xtp_glb_p1_sel", da_xtp_glb_p0_parents,
|
||||
0x0e0, 0x0e4, 0x0e8, 24, 1, 31, 0x1C4, 28),
|
||||
/* CLK_CFG_15 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_XTP_GLB_P2_SEL, "da_xtp_glb_p2_sel", da_xtp_glb_p0_parents,
|
||||
0x0f0, 0x0f4, 0x0f8, 0, 1, 7, 0x1C4, 29),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_XTP_GLB_P3_SEL, "da_xtp_glb_p3_sel", da_xtp_glb_p0_parents,
|
||||
0x0f0, 0x0f4, 0x0f8, 8, 1, 15, 0x1C4, 30),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_CKM_SEL, "ckm_sel", sspxtp_parents, 0x0F0, 0x0f4, 0x0f8, 16, 1,
|
||||
23, 0x1c8, 0),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_SEL, "da_sel", sspxtp_parents, 0x0f0, 0x0f4, 0x0f8, 24, 1,
|
||||
31, 0x1C8, 1),
|
||||
/* CLK_CFG_16 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_SEL, "pextp_sel", sspxtp_parents, 0x0100, 0x104, 0x108,
|
||||
0, 1, 7, 0x1c8, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_TOPS_P2_26M_SEL, "tops_p2_26m_sel", sspxtp_parents, 0x0100,
|
||||
0x104, 0x108, 8, 1, 15, 0x1C8, 3),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_MCUSYS_BACKUP_625M_SEL, "mcusys_backup_625m_sel",
|
||||
mcusys_backup_625m_parents, 0x0100, 0x104, 0x108, 16, 1, 23, 0x1C8, 4),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_SYNC_250M_SEL, "netsys_sync_250m_sel",
|
||||
pcie_mbist_250m_parents, 0x0100, 0x104, 0x108, 24, 1, 31, 0x1c8, 5),
|
||||
/* CLK_CFG_17 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_MACSEC_SEL, "macsec_sel", macsec_parents, 0x0110, 0x114, 0x118,
|
||||
0, 2, 7, 0x1c8, 6),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_TOPS_400M_SEL, "netsys_tops_400m_sel",
|
||||
netsys_tops_400m_parents, 0x0110, 0x114, 0x118, 8, 1, 15, 0x1c8, 7),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_PPEFB_250M_SEL, "netsys_ppefb_250m_sel",
|
||||
pcie_mbist_250m_parents, 0x0110, 0x114, 0x118, 16, 1, 23, 0x1c8, 8),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_WARP_SEL, "netsys_warp_sel", netsys_parents, 0x0110,
|
||||
0x114, 0x118, 24, 2, 31, 0x1C8, 9),
|
||||
/* CLK_CFG_18 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_MII_SEL, "eth_mii_sel", eth_mii_parents, 0x0120, 0x124,
|
||||
0x128, 0, 1, 7, 0x1c8, 10),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NPU_SEL, "ck_npu_sel", netsys_2x_parents, 0x0120, 0x124, 0x128,
|
||||
8, 2, 15, 0x1c8, 11),
|
||||
};
|
||||
|
||||
static const struct mtk_composite top_aud_divs[] = {
|
||||
DIV_GATE(CLK_TOP_AUD_I2S_M, "aud_i2s_m", "aud_sel", 0x0420, 0, 0x0420, 8, 8),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc topck_desc = {
|
||||
.fixed_clks = top_fixed_clks,
|
||||
.num_fixed_clks = ARRAY_SIZE(top_fixed_clks),
|
||||
.factor_clks = top_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(top_divs),
|
||||
.mux_clks = top_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(top_muxes),
|
||||
.composite_clks = top_aud_divs,
|
||||
.num_composite_clks = ARRAY_SIZE(top_aud_divs),
|
||||
.clk_lock = &mt7988_clk_lock,
|
||||
};
|
||||
|
||||
static const char *const mcu_bus_div_parents[] = { "top_xtal", "ccipll2_b", "net1pll_d4" };
|
||||
|
||||
static const char *const mcu_arm_div_parents[] = { "top_xtal", "arm_b", "net1pll_d4" };
|
||||
|
||||
static struct mtk_composite mcu_muxes[] = {
|
||||
/* bus_pll_divider_cfg */
|
||||
MUX_GATE_FLAGS(CLK_MCU_BUS_DIV_SEL, "mcu_bus_div_sel", mcu_bus_div_parents, 0x7C0, 9, 2, -1,
|
||||
CLK_IS_CRITICAL),
|
||||
/* mp2_pll_divider_cfg */
|
||||
MUX_GATE_FLAGS(CLK_MCU_ARM_DIV_SEL, "mcu_arm_div_sel", mcu_arm_div_parents, 0x7A8, 9, 2, -1,
|
||||
CLK_IS_CRITICAL),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc mcusys_desc = {
|
||||
.composite_clks = mcu_muxes,
|
||||
.num_composite_clks = ARRAY_SIZE(mcu_muxes),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7988_topckgen[] = {
|
||||
{ .compatible = "mediatek,mt7988-topckgen", .data = &topck_desc },
|
||||
{ .compatible = "mediatek,mt7988-mcusys", .data = &mcusys_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_topckgen);
|
||||
|
||||
static struct platform_driver clk_mt7988_topckgen_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove_new = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7988-topckgen",
|
||||
.of_match_table = of_match_clk_mt7988_topckgen,
|
||||
},
|
||||
};
|
||||
module_platform_driver(clk_mt7988_topckgen_drv);
|
||||
MODULE_LICENSE("GPL");
|
82
drivers/clk/mediatek/clk-mt7988-xfipll.c
Normal file
82
drivers/clk/mediatek/clk-mt7988-xfipll.c
Normal file
@ -0,0 +1,82 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2023 Daniel Golle <daniel@makrotopia.org>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include <dt-bindings/clock/mediatek,mt7988-clk.h>
|
||||
|
||||
/* Register to control USXGMII XFI PLL analog */
|
||||
#define XFI_PLL_ANA_GLB8 0x108
|
||||
#define RG_XFI_PLL_ANA_SWWA 0x02283248
|
||||
|
||||
static const struct mtk_gate_regs xfipll_cg_regs = {
|
||||
.set_ofs = 0x8,
|
||||
.clr_ofs = 0x8,
|
||||
.sta_ofs = 0x8,
|
||||
};
|
||||
|
||||
#define GATE_XFIPLL(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = &xfipll_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_fixed_factor xfipll_divs[] = {
|
||||
FACTOR(CLK_XFIPLL_PLL, "xfipll_pll", "top_xtal", 125, 32),
|
||||
};
|
||||
|
||||
static const struct mtk_gate xfipll_clks[] = {
|
||||
GATE_XFIPLL(CLK_XFIPLL_PLL_EN, "xfipll_pll_en", "xfipll_pll", 31),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc xfipll_desc = {
|
||||
.clks = xfipll_clks,
|
||||
.num_clks = ARRAY_SIZE(xfipll_clks),
|
||||
.factor_clks = xfipll_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(xfipll_divs),
|
||||
};
|
||||
|
||||
static int clk_mt7988_xfipll_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
void __iomem *base = of_iomap(node, 0);
|
||||
|
||||
if (!base)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Apply software workaround for USXGMII PLL TCL issue */
|
||||
writel(RG_XFI_PLL_ANA_SWWA, base + XFI_PLL_ANA_GLB8);
|
||||
iounmap(base);
|
||||
|
||||
return mtk_clk_simple_probe(pdev);
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7988_xfipll[] = {
|
||||
{ .compatible = "mediatek,mt7988-xfi-pll", .data = &xfipll_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_xfipll);
|
||||
|
||||
static struct platform_driver clk_mt7988_xfipll_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt7988-xfipll",
|
||||
.of_match_table = of_match_clk_mt7988_xfipll,
|
||||
},
|
||||
.probe = clk_mt7988_xfipll_probe,
|
||||
.remove_new = mtk_clk_simple_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt7988_xfipll_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7988 XFI PLL clock driver");
|
||||
MODULE_LICENSE("GPL");
|
@ -475,29 +475,28 @@ static const char * const sspm_parents[] = {
|
||||
"mainpll_d4_d2"
|
||||
};
|
||||
|
||||
/*
|
||||
* Both DP/eDP can be parented to TVDPLL1 and TVDPLL2, but we force using
|
||||
* TVDPLL1 on eDP and TVDPLL2 on DP to avoid changing the "other" PLL rate
|
||||
* in dual output case, which would lead to corruption of functionality loss.
|
||||
*/
|
||||
static const char * const dp_parents[] = {
|
||||
"clk26m",
|
||||
"tvdpll1_d2",
|
||||
"tvdpll2_d2",
|
||||
"tvdpll1_d4",
|
||||
"tvdpll2_d4",
|
||||
"tvdpll1_d8",
|
||||
"tvdpll2_d8",
|
||||
"tvdpll1_d16",
|
||||
"tvdpll2_d16"
|
||||
};
|
||||
static const u8 dp_parents_idx[] = { 0, 2, 4, 6, 8 };
|
||||
|
||||
static const char * const edp_parents[] = {
|
||||
"clk26m",
|
||||
"tvdpll1_d2",
|
||||
"tvdpll2_d2",
|
||||
"tvdpll1_d4",
|
||||
"tvdpll2_d4",
|
||||
"tvdpll1_d8",
|
||||
"tvdpll2_d8",
|
||||
"tvdpll1_d16",
|
||||
"tvdpll2_d16"
|
||||
"tvdpll1_d16"
|
||||
};
|
||||
static const u8 edp_parents_idx[] = { 0, 1, 3, 5, 7 };
|
||||
|
||||
static const char * const dpi_parents[] = {
|
||||
"clk26m",
|
||||
@ -1038,10 +1037,12 @@ static const struct mtk_mux top_mtk_muxes[] = {
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SSPM, "top_sspm",
|
||||
sspm_parents, 0x080, 0x084, 0x088, 24, 4, 31, 0x08, 3),
|
||||
/* CLK_CFG_9 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DP, "top_dp",
|
||||
dp_parents, 0x08C, 0x090, 0x094, 0, 4, 7, 0x08, 4),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EDP, "top_edp",
|
||||
edp_parents, 0x08C, 0x090, 0x094, 8, 4, 15, 0x08, 5),
|
||||
MUX_GATE_CLR_SET_UPD_INDEXED(CLK_TOP_DP, "top_dp",
|
||||
dp_parents, dp_parents_idx, 0x08C, 0x090, 0x094,
|
||||
0, 4, 7, 0x08, 4),
|
||||
MUX_GATE_CLR_SET_UPD_INDEXED(CLK_TOP_EDP, "top_edp",
|
||||
edp_parents, edp_parents_idx, 0x08C, 0x090, 0x094,
|
||||
8, 4, 15, 0x08, 5),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI, "top_dpi",
|
||||
dpi_parents, 0x08C, 0x090, 0x094, 16, 4, 23, 0x08, 6),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM0, "top_disp_pwm0",
|
||||
|
@ -415,17 +415,28 @@ static const char * const pwrmcu_parents[] = {
|
||||
"mainpll_d4_d2"
|
||||
};
|
||||
|
||||
/*
|
||||
* Both DP/eDP can be parented to TVDPLL1 and TVDPLL2, but we force using
|
||||
* TVDPLL1 on eDP and TVDPLL2 on DP to avoid changing the "other" PLL rate
|
||||
* in dual output case, which would lead to corruption of functionality loss.
|
||||
*/
|
||||
static const char * const dp_parents[] = {
|
||||
"clk26m",
|
||||
"tvdpll1_d2",
|
||||
"tvdpll2_d2",
|
||||
"tvdpll1_d4",
|
||||
"tvdpll2_d4",
|
||||
"tvdpll1_d8",
|
||||
"tvdpll2_d8",
|
||||
"tvdpll1_d16",
|
||||
"tvdpll2_d16"
|
||||
};
|
||||
static const u8 dp_parents_idx[] = { 0, 2, 4, 6, 8 };
|
||||
|
||||
static const char * const edp_parents[] = {
|
||||
"clk26m",
|
||||
"tvdpll1_d2",
|
||||
"tvdpll1_d4",
|
||||
"tvdpll1_d8",
|
||||
"tvdpll1_d16"
|
||||
};
|
||||
static const u8 edp_parents_idx[] = { 0, 1, 3, 5, 7 };
|
||||
|
||||
static const char * const disp_pwm_parents[] = {
|
||||
"clk26m",
|
||||
@ -957,11 +968,11 @@ static const struct mtk_mux top_mtk_muxes[] = {
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_PWRMCU, "top_pwrmcu",
|
||||
pwrmcu_parents, 0x08C, 0x090, 0x094, 16, 3, 23, 0x08, 6,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DP, "top_dp",
|
||||
dp_parents, 0x08C, 0x090, 0x094, 24, 4, 31, 0x08, 7),
|
||||
MUX_GATE_CLR_SET_UPD_INDEXED(CLK_TOP_DP, "top_dp",
|
||||
dp_parents, dp_parents_idx, 0x08C, 0x090, 0x094, 24, 4, 31, 0x08, 7),
|
||||
/* CLK_CFG_10 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EDP, "top_edp",
|
||||
dp_parents, 0x098, 0x09C, 0x0A0, 0, 4, 7, 0x08, 8),
|
||||
MUX_GATE_CLR_SET_UPD_INDEXED(CLK_TOP_EDP, "top_edp",
|
||||
edp_parents, edp_parents_idx, 0x098, 0x09C, 0x0A0, 0, 4, 7, 0x08, 8),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI, "top_dpi",
|
||||
dp_parents, 0x098, 0x09C, 0x0A0, 8, 4, 15, 0x08, 9),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM0, "top_disp_pwm0",
|
||||
|
@ -89,6 +89,17 @@ static u8 mtk_clk_mux_get_parent(struct clk_hw *hw)
|
||||
regmap_read(mux->regmap, mux->data->mux_ofs, &val);
|
||||
val = (val >> mux->data->mux_shift) & mask;
|
||||
|
||||
if (mux->data->parent_index) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mux->data->num_parents; i++)
|
||||
if (mux->data->parent_index[i] == val)
|
||||
return i;
|
||||
|
||||
/* Not found: return an impossible index to generate error */
|
||||
return mux->data->num_parents + 1;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
@ -104,6 +115,9 @@ static int mtk_clk_mux_set_parent_setclr_lock(struct clk_hw *hw, u8 index)
|
||||
else
|
||||
__acquire(mux->lock);
|
||||
|
||||
if (mux->data->parent_index)
|
||||
index = mux->data->parent_index[index];
|
||||
|
||||
regmap_read(mux->regmap, mux->data->mux_ofs, &orig);
|
||||
val = (orig & ~(mask << mux->data->mux_shift))
|
||||
| (index << mux->data->mux_shift);
|
||||
|
@ -21,6 +21,7 @@ struct mtk_mux {
|
||||
int id;
|
||||
const char *name;
|
||||
const char * const *parent_names;
|
||||
const u8 *parent_index;
|
||||
unsigned int flags;
|
||||
|
||||
u32 mux_ofs;
|
||||
@ -37,9 +38,10 @@ struct mtk_mux {
|
||||
signed char num_parents;
|
||||
};
|
||||
|
||||
#define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||
_gate, _upd_ofs, _upd, _flags, _ops) { \
|
||||
#define __GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _paridx, \
|
||||
_num_parents, _mux_ofs, _mux_set_ofs, \
|
||||
_mux_clr_ofs, _shift, _width, _gate, _upd_ofs, \
|
||||
_upd, _flags, _ops) { \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.mux_ofs = _mux_ofs, \
|
||||
@ -51,11 +53,28 @@ struct mtk_mux {
|
||||
.gate_shift = _gate, \
|
||||
.upd_shift = _upd, \
|
||||
.parent_names = _parents, \
|
||||
.num_parents = ARRAY_SIZE(_parents), \
|
||||
.parent_index = _paridx, \
|
||||
.num_parents = _num_parents, \
|
||||
.flags = _flags, \
|
||||
.ops = &_ops, \
|
||||
}
|
||||
|
||||
#define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||
_gate, _upd_ofs, _upd, _flags, _ops) \
|
||||
__GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, \
|
||||
NULL, ARRAY_SIZE(_parents), _mux_ofs, \
|
||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||
_gate, _upd_ofs, _upd, _flags, _ops) \
|
||||
|
||||
#define GATE_CLR_SET_UPD_FLAGS_INDEXED(_id, _name, _parents, _paridx, \
|
||||
_mux_ofs, _mux_set_ofs, _mux_clr_ofs, _shift, \
|
||||
_width, _gate, _upd_ofs, _upd, _flags, _ops) \
|
||||
__GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, \
|
||||
_paridx, ARRAY_SIZE(_paridx), _mux_ofs, \
|
||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||
_gate, _upd_ofs, _upd, _flags, _ops) \
|
||||
|
||||
extern const struct clk_ops mtk_mux_clr_set_upd_ops;
|
||||
extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
|
||||
|
||||
@ -67,6 +86,14 @@ extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
|
||||
_gate, _upd_ofs, _upd, _flags, \
|
||||
mtk_mux_gate_clr_set_upd_ops)
|
||||
|
||||
#define MUX_GATE_CLR_SET_UPD_FLAGS_INDEXED(_id, _name, _parents, \
|
||||
_paridx, _mux_ofs, _mux_set_ofs, _mux_clr_ofs, \
|
||||
_shift, _width, _gate, _upd_ofs, _upd, _flags) \
|
||||
GATE_CLR_SET_UPD_FLAGS_INDEXED(_id, _name, _parents, \
|
||||
_paridx, _mux_ofs, _mux_set_ofs, _mux_clr_ofs, \
|
||||
_shift, _width, _gate, _upd_ofs, _upd, _flags, \
|
||||
mtk_mux_gate_clr_set_upd_ops)
|
||||
|
||||
#define MUX_GATE_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \
|
||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||
_gate, _upd_ofs, _upd) \
|
||||
@ -75,6 +102,14 @@ extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
|
||||
_width, _gate, _upd_ofs, _upd, \
|
||||
CLK_SET_RATE_PARENT)
|
||||
|
||||
#define MUX_GATE_CLR_SET_UPD_INDEXED(_id, _name, _parents, _paridx, \
|
||||
_mux_ofs, _mux_set_ofs, _mux_clr_ofs, _shift, \
|
||||
_width, _gate, _upd_ofs, _upd) \
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS_INDEXED(_id, _name, \
|
||||
_parents, _paridx, _mux_ofs, _mux_set_ofs, \
|
||||
_mux_clr_ofs, _shift, _width, _gate, _upd_ofs, \
|
||||
_upd, CLK_SET_RATE_PARENT)
|
||||
|
||||
#define MUX_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \
|
||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||
_upd_ofs, _upd) \
|
||||
|
@ -23,7 +23,7 @@
|
||||
#define CON0_BASE_EN BIT(0)
|
||||
#define CON0_PWR_ON BIT(0)
|
||||
#define CON0_ISO_EN BIT(1)
|
||||
#define PCW_CHG_MASK BIT(31)
|
||||
#define PCW_CHG_BIT 31
|
||||
|
||||
#define AUDPLL_TUNER_EN BIT(31)
|
||||
|
||||
@ -114,7 +114,8 @@ static void mtk_pll_set_rate_regs(struct mtk_clk_pll *pll, u32 pcw,
|
||||
pll->data->pcw_shift);
|
||||
val |= pcw << pll->data->pcw_shift;
|
||||
writel(val, pll->pcw_addr);
|
||||
chg = readl(pll->pcw_chg_addr) | PCW_CHG_MASK;
|
||||
chg = readl(pll->pcw_chg_addr) |
|
||||
BIT(pll->data->pcw_chg_bit ? : PCW_CHG_BIT);
|
||||
writel(chg, pll->pcw_chg_addr);
|
||||
if (pll->tuner_addr)
|
||||
writel(val + 1, pll->tuner_addr);
|
||||
|
@ -48,6 +48,7 @@ struct mtk_pll_data {
|
||||
const char *parent_name;
|
||||
u32 en_reg;
|
||||
u8 pll_en_bit; /* Assume 0, indicates BIT(0) by default */
|
||||
u8 pcw_chg_bit;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -3549,6 +3549,22 @@ static struct clk_regmap g12a_cts_encp_sel = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_cts_encl_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VIID_CLK_DIV,
|
||||
.mask = 0xf,
|
||||
.shift = 12,
|
||||
.table = mux_table_cts_sel,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cts_encl_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_hws = g12a_cts_parent_hws,
|
||||
.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
|
||||
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_cts_vdac_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_VIID_CLK_DIV,
|
||||
@ -3628,6 +3644,22 @@ static struct clk_regmap g12a_cts_encp = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_cts_encl = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL2,
|
||||
.bit_idx = 3,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "cts_encl",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cts_encl_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12a_cts_vdac = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_VID_CLK_CNTL2,
|
||||
@ -3722,6 +3754,66 @@ static struct clk_regmap g12a_mipi_dsi_pxclk = {
|
||||
},
|
||||
};
|
||||
|
||||
/* MIPI ISP Clocks */
|
||||
|
||||
static const struct clk_parent_data g12b_mipi_isp_parent_data[] = {
|
||||
{ .fw_name = "xtal", },
|
||||
{ .hw = &g12a_gp0_pll.hw },
|
||||
{ .hw = &g12a_hifi_pll.hw },
|
||||
{ .hw = &g12a_fclk_div2p5.hw },
|
||||
{ .hw = &g12a_fclk_div3.hw },
|
||||
{ .hw = &g12a_fclk_div4.hw },
|
||||
{ .hw = &g12a_fclk_div5.hw },
|
||||
{ .hw = &g12a_fclk_div7.hw },
|
||||
};
|
||||
|
||||
static struct clk_regmap g12b_mipi_isp_sel = {
|
||||
.data = &(struct clk_regmap_mux_data){
|
||||
.offset = HHI_ISP_CLK_CNTL,
|
||||
.mask = 7,
|
||||
.shift = 9,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mipi_isp_sel",
|
||||
.ops = &clk_regmap_mux_ops,
|
||||
.parent_data = g12b_mipi_isp_parent_data,
|
||||
.num_parents = ARRAY_SIZE(g12b_mipi_isp_parent_data),
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12b_mipi_isp_div = {
|
||||
.data = &(struct clk_regmap_div_data){
|
||||
.offset = HHI_ISP_CLK_CNTL,
|
||||
.shift = 0,
|
||||
.width = 7,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mipi_isp_div",
|
||||
.ops = &clk_regmap_divider_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_mipi_isp_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap g12b_mipi_isp = {
|
||||
.data = &(struct clk_regmap_gate_data){
|
||||
.offset = HHI_ISP_CLK_CNTL,
|
||||
.bit_idx = 8,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "mipi_isp",
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12b_mipi_isp_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
/* HDMI Clocks */
|
||||
|
||||
static const struct clk_parent_data g12a_hdmi_parent_data[] = {
|
||||
@ -4214,9 +4306,12 @@ static MESON_GATE(g12a_htx_hdcp22, HHI_GCLK_MPEG2, 3);
|
||||
static MESON_GATE(g12a_htx_pclk, HHI_GCLK_MPEG2, 4);
|
||||
static MESON_GATE(g12a_bt656, HHI_GCLK_MPEG2, 6);
|
||||
static MESON_GATE(g12a_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
|
||||
static MESON_GATE(g12b_mipi_isp_gate, HHI_GCLK_MPEG2, 17);
|
||||
static MESON_GATE(g12a_mmc_pclk, HHI_GCLK_MPEG2, 11);
|
||||
static MESON_GATE(g12a_uart2, HHI_GCLK_MPEG2, 15);
|
||||
static MESON_GATE(g12a_vpu_intr, HHI_GCLK_MPEG2, 25);
|
||||
static MESON_GATE(g12b_csi_phy1, HHI_GCLK_MPEG2, 28);
|
||||
static MESON_GATE(g12b_csi_phy0, HHI_GCLK_MPEG2, 29);
|
||||
static MESON_GATE(g12a_gic, HHI_GCLK_MPEG2, 30);
|
||||
|
||||
static MESON_GATE(g12a_vclk2_venci0, HHI_GCLK_OTHER, 1);
|
||||
@ -4407,10 +4502,12 @@ static struct clk_hw *g12a_hw_clks[] = {
|
||||
[CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
|
||||
[CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
|
||||
[CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
|
||||
[CLKID_CTS_ENCL_SEL] = &g12a_cts_encl_sel.hw,
|
||||
[CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
|
||||
[CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
|
||||
[CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
|
||||
[CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
|
||||
[CLKID_CTS_ENCL] = &g12a_cts_encl.hw,
|
||||
[CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
|
||||
[CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
|
||||
[CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
|
||||
@ -4632,10 +4729,12 @@ static struct clk_hw *g12b_hw_clks[] = {
|
||||
[CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
|
||||
[CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
|
||||
[CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
|
||||
[CLKID_CTS_ENCL_SEL] = &g12a_cts_encl_sel.hw,
|
||||
[CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
|
||||
[CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
|
||||
[CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
|
||||
[CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
|
||||
[CLKID_CTS_ENCL] = &g12a_cts_encl.hw,
|
||||
[CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
|
||||
[CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
|
||||
[CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
|
||||
@ -4729,6 +4828,12 @@ static struct clk_hw *g12b_hw_clks[] = {
|
||||
[CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
|
||||
[CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
|
||||
[CLKID_MIPI_ISP_SEL] = &g12b_mipi_isp_sel.hw,
|
||||
[CLKID_MIPI_ISP_DIV] = &g12b_mipi_isp_div.hw,
|
||||
[CLKID_MIPI_ISP] = &g12b_mipi_isp.hw,
|
||||
[CLKID_MIPI_ISP_GATE] = &g12b_mipi_isp_gate.hw,
|
||||
[CLKID_MIPI_ISP_CSI_PHY0] = &g12b_csi_phy0.hw,
|
||||
[CLKID_MIPI_ISP_CSI_PHY1] = &g12b_csi_phy1.hw,
|
||||
};
|
||||
|
||||
static struct clk_hw *sm1_hw_clks[] = {
|
||||
@ -4892,10 +4997,12 @@ static struct clk_hw *sm1_hw_clks[] = {
|
||||
[CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
|
||||
[CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
|
||||
[CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
|
||||
[CLKID_CTS_ENCL_SEL] = &g12a_cts_encl_sel.hw,
|
||||
[CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
|
||||
[CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
|
||||
[CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
|
||||
[CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
|
||||
[CLKID_CTS_ENCL] = &g12a_cts_encl.hw,
|
||||
[CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
|
||||
[CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
|
||||
[CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
|
||||
@ -5123,10 +5230,12 @@ static struct clk_regmap *const g12a_clk_regmaps[] = {
|
||||
&g12a_vclk2_div12_en,
|
||||
&g12a_cts_enci_sel,
|
||||
&g12a_cts_encp_sel,
|
||||
&g12a_cts_encl_sel,
|
||||
&g12a_cts_vdac_sel,
|
||||
&g12a_hdmi_tx_sel,
|
||||
&g12a_cts_enci,
|
||||
&g12a_cts_encp,
|
||||
&g12a_cts_encl,
|
||||
&g12a_cts_vdac,
|
||||
&g12a_hdmi_tx,
|
||||
&g12a_hdmi_sel,
|
||||
@ -5221,6 +5330,12 @@ static struct clk_regmap *const g12a_clk_regmaps[] = {
|
||||
&g12a_mipi_dsi_pxclk_sel,
|
||||
&g12a_mipi_dsi_pxclk_div,
|
||||
&g12a_mipi_dsi_pxclk,
|
||||
&g12b_mipi_isp_sel,
|
||||
&g12b_mipi_isp_div,
|
||||
&g12b_mipi_isp,
|
||||
&g12b_mipi_isp_gate,
|
||||
&g12b_csi_phy1,
|
||||
&g12b_csi_phy0,
|
||||
};
|
||||
|
||||
static const struct reg_sequence g12a_init_regs[] = {
|
||||
|
@ -70,6 +70,7 @@
|
||||
#define HHI_MALI_CLK_CNTL 0x1b0
|
||||
#define HHI_VPU_CLKC_CNTL 0x1b4
|
||||
#define HHI_VPU_CLK_CNTL 0x1bC
|
||||
#define HHI_ISP_CLK_CNTL 0x1C0
|
||||
#define HHI_NNA_CLK_CNTL 0x1C8
|
||||
#define HHI_HDMI_CLK_CNTL 0x1CC
|
||||
#define HHI_VDEC_CLK_CNTL 0x1E0
|
||||
|
@ -4,8 +4,8 @@
|
||||
*
|
||||
* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries
|
||||
*/
|
||||
#include "asm-generic/errno-base.h"
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -308,18 +308,21 @@ static void __init pxa168_clk_init(struct device_node *np)
|
||||
pxa_unit->mpmu_base = of_iomap(np, 0);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
pr_err("failed to map mpmu registers\n");
|
||||
kfree(pxa_unit);
|
||||
return;
|
||||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
kfree(pxa_unit);
|
||||
return;
|
||||
}
|
||||
|
||||
pxa_unit->apbc_base = of_iomap(np, 2);
|
||||
if (!pxa_unit->apbc_base) {
|
||||
pr_err("failed to map apbc registers\n");
|
||||
kfree(pxa_unit);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,16 @@ menuconfig COMMON_CLK_QCOM
|
||||
|
||||
if COMMON_CLK_QCOM
|
||||
|
||||
config CLK_X1E80100_GCC
|
||||
tristate "X1E80100 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the global clock controller on Qualcomm Technologies, Inc
|
||||
X1E80100 devices.
|
||||
Say Y if you want to use peripheral devices such as UART, SPI, I2C,
|
||||
USB, UFS, SD/eMMC, PCIe, etc.
|
||||
|
||||
config QCOM_A53PLL
|
||||
tristate "MSM8916 A53 PLL"
|
||||
help
|
||||
@ -427,6 +437,15 @@ config SC_CAMCC_7280
|
||||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config SC_CAMCC_8280XP
|
||||
tristate "SC8280XP Camera Clock Controller"
|
||||
select SC_GCC_8280XP
|
||||
help
|
||||
Support for the camera clock controller on Qualcomm Technologies, Inc
|
||||
SC8280XP devices.
|
||||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config SC_DISPCC_7180
|
||||
tristate "SC7180 Display Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
@ -668,6 +687,15 @@ config QDU_GCC_1000
|
||||
QRU1000 devices. Say Y if you want to use peripheral
|
||||
devices such as UART, SPI, I2C, USB, SD, PCIe, etc.
|
||||
|
||||
config QDU_ECPRICC_1000
|
||||
tristate "QDU1000/QRU1000 ECPRI Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QDU_GCC_1000
|
||||
help
|
||||
Support for the ECPRI clock controller on QDU1000 and
|
||||
QRU1000 devices. Say Y if you want to support the ECPRI
|
||||
clock controller functionality such as Ethernet.
|
||||
|
||||
config SDM_GCC_845
|
||||
tristate "SDM845/SDM670 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
@ -843,6 +871,16 @@ config SM_DISPCC_8550
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config SM_DISPCC_8650
|
||||
tristate "SM8650 Display Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select SM_GCC_8650
|
||||
help
|
||||
Support for the display clock controller on Qualcomm Technologies, Inc
|
||||
SM8650 devices.
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config SM_GCC_4450
|
||||
tristate "SM4450 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
@ -939,6 +977,15 @@ config SM_GCC_8550
|
||||
Say Y if you want to use peripheral devices such as UART,
|
||||
SPI, I2C, USB, SD/UFS, PCIe etc.
|
||||
|
||||
config SM_GCC_8650
|
||||
tristate "SM8650 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the global clock controller on SM8650 devices.
|
||||
Say Y if you want to use peripheral devices such as UART,
|
||||
SPI, I2C, USB, SD/UFS, PCIe etc.
|
||||
|
||||
config SM_GPUCC_6115
|
||||
tristate "SM6115 Graphics Clock Controller"
|
||||
select SM_GCC_6115
|
||||
@ -1020,6 +1067,14 @@ config SM_GPUCC_8550
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config SM_GPUCC_8650
|
||||
tristate "SM8650 Graphics Clock Controller"
|
||||
select SM_GCC_8650
|
||||
help
|
||||
Support for the graphics clock controller on SM8650 devices.
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config SM_TCSRCC_8550
|
||||
tristate "SM8550 TCSR Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
@ -1028,6 +1083,14 @@ config SM_TCSRCC_8550
|
||||
Support for the TCSR clock controller on SM8550 devices.
|
||||
Say Y if you want to use peripheral devices such as SD/UFS.
|
||||
|
||||
config SM_TCSRCC_8650
|
||||
tristate "SM8650 TCSR Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the TCSR clock controller on SM8650 devices.
|
||||
Say Y if you want to use peripheral devices such as SD/UFS.
|
||||
|
||||
config SM_VIDEOCC_8150
|
||||
tristate "SM8150 Video Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
@ -21,6 +21,7 @@ clk-qcom-$(CONFIG_QCOM_GDSC) += gdsc.o
|
||||
obj-$(CONFIG_APQ_GCC_8084) += gcc-apq8084.o
|
||||
obj-$(CONFIG_APQ_MMCC_8084) += mmcc-apq8084.o
|
||||
obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o
|
||||
obj-$(CONFIG_CLK_X1E80100_GCC) += gcc-x1e80100.o
|
||||
obj-$(CONFIG_IPQ_APSS_PLL) += apss-ipq-pll.o
|
||||
obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o
|
||||
obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o
|
||||
@ -65,9 +66,11 @@ obj-$(CONFIG_QCM_DISPCC_2290) += dispcc-qcm2290.o
|
||||
obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o
|
||||
obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o
|
||||
obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
|
||||
obj-$(CONFIG_QDU_ECPRICC_1000) += ecpricc-qdu1000.o
|
||||
obj-$(CONFIG_QDU_GCC_1000) += gcc-qdu1000.o
|
||||
obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o
|
||||
obj-$(CONFIG_SC_CAMCC_7280) += camcc-sc7280.o
|
||||
obj-$(CONFIG_SC_CAMCC_8280XP) += camcc-sc8280xp.o
|
||||
obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
|
||||
obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o
|
||||
obj-$(CONFIG_SC_DISPCC_8280XP) += dispcc-sc8280xp.o
|
||||
@ -110,6 +113,7 @@ obj-$(CONFIG_SM_DISPCC_6375) += dispcc-sm6375.o
|
||||
obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
|
||||
obj-$(CONFIG_SM_DISPCC_8450) += dispcc-sm8450.o
|
||||
obj-$(CONFIG_SM_DISPCC_8550) += dispcc-sm8550.o
|
||||
obj-$(CONFIG_SM_DISPCC_8650) += dispcc-sm8650.o
|
||||
obj-$(CONFIG_SM_GCC_4450) += gcc-sm4450.o
|
||||
obj-$(CONFIG_SM_GCC_6115) += gcc-sm6115.o
|
||||
obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o
|
||||
@ -121,6 +125,7 @@ obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o
|
||||
obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o
|
||||
obj-$(CONFIG_SM_GCC_8450) += gcc-sm8450.o
|
||||
obj-$(CONFIG_SM_GCC_8550) += gcc-sm8550.o
|
||||
obj-$(CONFIG_SM_GCC_8650) += gcc-sm8650.o
|
||||
obj-$(CONFIG_SM_GPUCC_6115) += gpucc-sm6115.o
|
||||
obj-$(CONFIG_SM_GPUCC_6125) += gpucc-sm6125.o
|
||||
obj-$(CONFIG_SM_GPUCC_6350) += gpucc-sm6350.o
|
||||
@ -130,7 +135,9 @@ obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o
|
||||
obj-$(CONFIG_SM_GPUCC_8350) += gpucc-sm8350.o
|
||||
obj-$(CONFIG_SM_GPUCC_8450) += gpucc-sm8450.o
|
||||
obj-$(CONFIG_SM_GPUCC_8550) += gpucc-sm8550.o
|
||||
obj-$(CONFIG_SM_GPUCC_8650) += gpucc-sm8650.o
|
||||
obj-$(CONFIG_SM_TCSRCC_8550) += tcsrcc-sm8550.o
|
||||
obj-$(CONFIG_SM_TCSRCC_8650) += tcsrcc-sm8650.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8250) += videocc-sm8250.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8350) += videocc-sm8350.o
|
||||
|
@ -73,6 +73,20 @@ static struct clk_alpha_pll ipq_pll_stromer_plus = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config ipq5018_pll_config = {
|
||||
.l = 0x32,
|
||||
.config_ctl_val = 0x4001075b,
|
||||
.config_ctl_hi_val = 0x304,
|
||||
.main_output_mask = BIT(0),
|
||||
.aux_output_mask = BIT(1),
|
||||
.early_output_mask = BIT(3),
|
||||
.alpha_en_mask = BIT(24),
|
||||
.status_val = 0x3,
|
||||
.status_mask = GENMASK(10, 8),
|
||||
.lock_det = BIT(2),
|
||||
.test_ctl_hi_val = 0x00400003,
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config ipq5332_pll_config = {
|
||||
.l = 0x2d,
|
||||
.config_ctl_val = 0x4001075b,
|
||||
@ -129,6 +143,12 @@ struct apss_pll_data {
|
||||
const struct alpha_pll_config *pll_config;
|
||||
};
|
||||
|
||||
static const struct apss_pll_data ipq5018_pll_data = {
|
||||
.pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||
.pll = &ipq_pll_stromer_plus,
|
||||
.pll_config = &ipq5018_pll_config,
|
||||
};
|
||||
|
||||
static struct apss_pll_data ipq5332_pll_data = {
|
||||
.pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||
.pll = &ipq_pll_stromer_plus,
|
||||
@ -195,6 +215,7 @@ static int apss_ipq_pll_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static const struct of_device_id apss_ipq_pll_match_table[] = {
|
||||
{ .compatible = "qcom,ipq5018-a53pll", .data = &ipq5018_pll_data },
|
||||
{ .compatible = "qcom,ipq5332-a53pll", .data = &ipq5332_pll_data },
|
||||
{ .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data },
|
||||
{ .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data },
|
||||
|
3045
drivers/clk/qcom/camcc-sc8280xp.c
Normal file
3045
drivers/clk/qcom/camcc-sc8280xp.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@ -134,6 +135,43 @@ static void clk_branch2_disable(struct clk_hw *hw)
|
||||
clk_branch_toggle(hw, false, clk_branch2_check_halt);
|
||||
}
|
||||
|
||||
static int clk_branch2_mem_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_mem_branch *mem_br = to_clk_mem_branch(hw);
|
||||
struct clk_branch branch = mem_br->branch;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
regmap_update_bits(branch.clkr.regmap, mem_br->mem_enable_reg,
|
||||
mem_br->mem_enable_ack_mask, mem_br->mem_enable_ack_mask);
|
||||
|
||||
ret = regmap_read_poll_timeout(branch.clkr.regmap, mem_br->mem_ack_reg,
|
||||
val, val & mem_br->mem_enable_ack_mask, 0, 200);
|
||||
if (ret) {
|
||||
WARN(1, "%s mem enable failed\n", clk_hw_get_name(&branch.clkr.hw));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return clk_branch2_enable(hw);
|
||||
}
|
||||
|
||||
static void clk_branch2_mem_disable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_mem_branch *mem_br = to_clk_mem_branch(hw);
|
||||
|
||||
regmap_update_bits(mem_br->branch.clkr.regmap, mem_br->mem_enable_reg,
|
||||
mem_br->mem_enable_ack_mask, 0);
|
||||
|
||||
return clk_branch2_disable(hw);
|
||||
}
|
||||
|
||||
const struct clk_ops clk_branch2_mem_ops = {
|
||||
.enable = clk_branch2_mem_enable,
|
||||
.disable = clk_branch2_mem_disable,
|
||||
.is_enabled = clk_is_enabled_regmap,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_branch2_mem_ops);
|
||||
|
||||
const struct clk_ops clk_branch2_ops = {
|
||||
.enable = clk_branch2_enable,
|
||||
.disable = clk_branch2_disable,
|
||||
|
@ -38,6 +38,23 @@ struct clk_branch {
|
||||
struct clk_regmap clkr;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct clk_mem_branch - gating clock which are associated with memories
|
||||
*
|
||||
* @mem_enable_reg: branch clock memory gating register
|
||||
* @mem_ack_reg: branch clock memory ack register
|
||||
* @mem_enable_ack_mask: branch clock memory enable and ack field in @mem_ack_reg
|
||||
* @branch: branch clock gating handle
|
||||
*
|
||||
* Clock which can gate its memories.
|
||||
*/
|
||||
struct clk_mem_branch {
|
||||
u32 mem_enable_reg;
|
||||
u32 mem_ack_reg;
|
||||
u32 mem_enable_ack_mask;
|
||||
struct clk_branch branch;
|
||||
};
|
||||
|
||||
/* Branch clock common bits for HLOS-owned clocks */
|
||||
#define CBCR_CLK_OFF BIT(31)
|
||||
#define CBCR_NOC_FSM_STATUS GENMASK(30, 28)
|
||||
@ -85,8 +102,12 @@ extern const struct clk_ops clk_branch_ops;
|
||||
extern const struct clk_ops clk_branch2_ops;
|
||||
extern const struct clk_ops clk_branch_simple_ops;
|
||||
extern const struct clk_ops clk_branch2_aon_ops;
|
||||
extern const struct clk_ops clk_branch2_mem_ops;
|
||||
|
||||
#define to_clk_branch(_hw) \
|
||||
container_of(to_clk_regmap(_hw), struct clk_branch, clkr)
|
||||
|
||||
#define to_clk_mem_branch(_hw) \
|
||||
container_of(to_clk_branch(_hw), struct clk_mem_branch, branch)
|
||||
|
||||
#endif
|
||||
|
@ -372,6 +372,9 @@ DEFINE_CLK_RPMH_VRM(clk3, _a1, "clka3", 1);
|
||||
DEFINE_CLK_RPMH_VRM(clk4, _a1, "clka4", 1);
|
||||
DEFINE_CLK_RPMH_VRM(clk5, _a1, "clka5", 1);
|
||||
|
||||
DEFINE_CLK_RPMH_VRM(clk3, _a2, "clka3", 2);
|
||||
DEFINE_CLK_RPMH_VRM(clk4, _a2, "clka4", 2);
|
||||
DEFINE_CLK_RPMH_VRM(clk5, _a2, "clka5", 2);
|
||||
DEFINE_CLK_RPMH_VRM(clk6, _a2, "clka6", 2);
|
||||
DEFINE_CLK_RPMH_VRM(clk7, _a2, "clka7", 2);
|
||||
DEFINE_CLK_RPMH_VRM(clk8, _a2, "clka8", 2);
|
||||
@ -630,6 +633,37 @@ static const struct clk_rpmh_desc clk_rpmh_sm8550 = {
|
||||
.num_clks = ARRAY_SIZE(sm8550_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *sm8650_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw,
|
||||
[RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw,
|
||||
[RPMH_LN_BB_CLK1] = &clk_rpmh_clk6_a2.hw,
|
||||
[RPMH_LN_BB_CLK1_A] = &clk_rpmh_clk6_a2_ao.hw,
|
||||
[RPMH_LN_BB_CLK2] = &clk_rpmh_clk7_a2.hw,
|
||||
[RPMH_LN_BB_CLK2_A] = &clk_rpmh_clk7_a2_ao.hw,
|
||||
[RPMH_LN_BB_CLK3] = &clk_rpmh_clk8_a2.hw,
|
||||
[RPMH_LN_BB_CLK3_A] = &clk_rpmh_clk8_a2_ao.hw,
|
||||
[RPMH_RF_CLK1] = &clk_rpmh_clk1_a1.hw,
|
||||
[RPMH_RF_CLK1_A] = &clk_rpmh_clk1_a1_ao.hw,
|
||||
[RPMH_RF_CLK2] = &clk_rpmh_clk2_a1.hw,
|
||||
[RPMH_RF_CLK2_A] = &clk_rpmh_clk2_a1_ao.hw,
|
||||
/*
|
||||
* The clka3 RPMh resource is missing in cmd-db
|
||||
* for current platforms, while the clka3 exists
|
||||
* on the PMK8550, the clock is unconnected and
|
||||
* unused.
|
||||
*/
|
||||
[RPMH_RF_CLK4] = &clk_rpmh_clk4_a2.hw,
|
||||
[RPMH_RF_CLK4_A] = &clk_rpmh_clk4_a2_ao.hw,
|
||||
[RPMH_RF_CLK5] = &clk_rpmh_clk5_a2.hw,
|
||||
[RPMH_RF_CLK5_A] = &clk_rpmh_clk5_a2_ao.hw,
|
||||
[RPMH_IPA_CLK] = &clk_rpmh_ipa.hw,
|
||||
};
|
||||
|
||||
static const struct clk_rpmh_desc clk_rpmh_sm8650 = {
|
||||
.clks = sm8650_rpmh_clocks,
|
||||
.num_clks = ARRAY_SIZE(sm8650_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *sc7280_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw,
|
||||
[RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw,
|
||||
@ -737,6 +771,28 @@ static const struct clk_rpmh_desc clk_rpmh_sm4450 = {
|
||||
.num_clks = ARRAY_SIZE(sm4450_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *x1e80100_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw,
|
||||
[RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw,
|
||||
[RPMH_LN_BB_CLK1] = &clk_rpmh_clk6_a2.hw,
|
||||
[RPMH_LN_BB_CLK1_A] = &clk_rpmh_clk6_a2_ao.hw,
|
||||
[RPMH_LN_BB_CLK2] = &clk_rpmh_clk7_a2.hw,
|
||||
[RPMH_LN_BB_CLK2_A] = &clk_rpmh_clk7_a2_ao.hw,
|
||||
[RPMH_LN_BB_CLK3] = &clk_rpmh_clk8_a2.hw,
|
||||
[RPMH_LN_BB_CLK3_A] = &clk_rpmh_clk8_a2_ao.hw,
|
||||
[RPMH_RF_CLK3] = &clk_rpmh_clk3_a2.hw,
|
||||
[RPMH_RF_CLK3_A] = &clk_rpmh_clk3_a2_ao.hw,
|
||||
[RPMH_RF_CLK4] = &clk_rpmh_clk4_a2.hw,
|
||||
[RPMH_RF_CLK4_A] = &clk_rpmh_clk4_a2_ao.hw,
|
||||
[RPMH_RF_CLK5] = &clk_rpmh_clk5_a2.hw,
|
||||
[RPMH_RF_CLK5_A] = &clk_rpmh_clk5_a2_ao.hw,
|
||||
};
|
||||
|
||||
static const struct clk_rpmh_desc clk_rpmh_x1e80100 = {
|
||||
.clks = x1e80100_rpmh_clocks,
|
||||
.num_clks = ARRAY_SIZE(x1e80100_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec,
|
||||
void *data)
|
||||
{
|
||||
@ -837,7 +893,9 @@ static const struct of_device_id clk_rpmh_match_table[] = {
|
||||
{ .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350},
|
||||
{ .compatible = "qcom,sm8450-rpmh-clk", .data = &clk_rpmh_sm8450},
|
||||
{ .compatible = "qcom,sm8550-rpmh-clk", .data = &clk_rpmh_sm8550},
|
||||
{ .compatible = "qcom,sm8650-rpmh-clk", .data = &clk_rpmh_sm8650},
|
||||
{ .compatible = "qcom,sc7280-rpmh-clk", .data = &clk_rpmh_sc7280},
|
||||
{ .compatible = "qcom,x1e80100-rpmh-clk", .data = &clk_rpmh_x1e80100},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clk_rpmh_match_table);
|
||||
|
@ -81,6 +81,10 @@ static const struct alpha_pll_config disp_cc_pll0_config = {
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00182261,
|
||||
.config_ctl_hi1_val = 0x82aa299c,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000003,
|
||||
.test_ctl_hi1_val = 0x00009000,
|
||||
.test_ctl_hi2_val = 0x00000034,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000005,
|
||||
};
|
||||
@ -108,6 +112,10 @@ static const struct alpha_pll_config disp_cc_pll1_config = {
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00182261,
|
||||
.config_ctl_hi1_val = 0x82aa299c,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000003,
|
||||
.test_ctl_hi1_val = 0x00009000,
|
||||
.test_ctl_hi2_val = 0x00000034,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000005,
|
||||
};
|
||||
@ -1766,8 +1774,8 @@ static int disp_cc_sm8550_probe(struct platform_device *pdev)
|
||||
goto err_put_rpm;
|
||||
}
|
||||
|
||||
clk_lucid_evo_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
|
||||
clk_lucid_evo_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
|
||||
clk_lucid_ole_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
|
||||
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
|
||||
|
1818
drivers/clk/qcom/dispcc-sm8650.c
Normal file
1818
drivers/clk/qcom/dispcc-sm8650.c
Normal file
File diff suppressed because it is too large
Load Diff
2456
drivers/clk/qcom/ecpricc-qdu1000.c
Normal file
2456
drivers/clk/qcom/ecpricc-qdu1000.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -696,7 +696,7 @@ static struct clk_rcg2 apss_ahb_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gcc_camss_csi0_1_clk[] = {
|
||||
static const struct freq_tbl ftbl_gcc_camss_csi0_1_2_clk[] = {
|
||||
F(100000000, P_GPLL0, 8, 0, 0),
|
||||
F(200000000, P_GPLL0, 4, 0, 0),
|
||||
{ }
|
||||
@ -706,7 +706,7 @@ static struct clk_rcg2 csi0_clk_src = {
|
||||
.cmd_rcgr = 0x4e020,
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_xo_gpll0_map,
|
||||
.freq_tbl = ftbl_gcc_camss_csi0_1_clk,
|
||||
.freq_tbl = ftbl_gcc_camss_csi0_1_2_clk,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "csi0_clk_src",
|
||||
.parent_data = gcc_xo_gpll0_parent_data,
|
||||
@ -719,7 +719,7 @@ static struct clk_rcg2 csi1_clk_src = {
|
||||
.cmd_rcgr = 0x4f020,
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_xo_gpll0_map,
|
||||
.freq_tbl = ftbl_gcc_camss_csi0_1_clk,
|
||||
.freq_tbl = ftbl_gcc_camss_csi0_1_2_clk,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "csi1_clk_src",
|
||||
.parent_data = gcc_xo_gpll0_parent_data,
|
||||
@ -728,6 +728,19 @@ static struct clk_rcg2 csi1_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 csi2_clk_src = {
|
||||
.cmd_rcgr = 0x3c020,
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_xo_gpll0_map,
|
||||
.freq_tbl = ftbl_gcc_camss_csi0_1_2_clk,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "csi2_clk_src",
|
||||
.parent_data = gcc_xo_gpll0_parent_data,
|
||||
.num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gcc_oxili_gfx3d_clk[] = {
|
||||
F(19200000, P_XO, 1, 0, 0),
|
||||
F(50000000, P_GPLL0, 16, 0, 0),
|
||||
@ -2385,6 +2398,91 @@ static struct clk_branch gcc_camss_csi1rdi_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi2_ahb_clk = {
|
||||
.halt_reg = 0x3c040,
|
||||
.clkr = {
|
||||
.enable_reg = 0x3c040,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi2_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&camss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi2_clk = {
|
||||
.halt_reg = 0x3c03c,
|
||||
.clkr = {
|
||||
.enable_reg = 0x3c03c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi2_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&csi2_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi2phy_clk = {
|
||||
.halt_reg = 0x3c048,
|
||||
.clkr = {
|
||||
.enable_reg = 0x3c048,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi2phy_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&csi2_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi2pix_clk = {
|
||||
.halt_reg = 0x3c058,
|
||||
.clkr = {
|
||||
.enable_reg = 0x3c058,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi2pix_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&csi2_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi2rdi_clk = {
|
||||
.halt_reg = 0x3c050,
|
||||
.clkr = {
|
||||
.enable_reg = 0x3c050,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi2rdi_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&csi2_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi_vfe0_clk = {
|
||||
.halt_reg = 0x58050,
|
||||
.clkr = {
|
||||
@ -3682,6 +3780,7 @@ static struct clk_regmap *gcc_msm8939_clocks[] = {
|
||||
[APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
|
||||
[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
|
||||
[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
|
||||
[CSI2_CLK_SRC] = &csi2_clk_src.clkr,
|
||||
[GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
|
||||
[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
|
||||
[BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
|
||||
@ -3751,6 +3850,11 @@ static struct clk_regmap *gcc_msm8939_clocks[] = {
|
||||
[GCC_CAMSS_CSI1PHY_CLK] = &gcc_camss_csi1phy_clk.clkr,
|
||||
[GCC_CAMSS_CSI1PIX_CLK] = &gcc_camss_csi1pix_clk.clkr,
|
||||
[GCC_CAMSS_CSI1RDI_CLK] = &gcc_camss_csi1rdi_clk.clkr,
|
||||
[GCC_CAMSS_CSI2_AHB_CLK] = &gcc_camss_csi2_ahb_clk.clkr,
|
||||
[GCC_CAMSS_CSI2_CLK] = &gcc_camss_csi2_clk.clkr,
|
||||
[GCC_CAMSS_CSI2PHY_CLK] = &gcc_camss_csi2phy_clk.clkr,
|
||||
[GCC_CAMSS_CSI2PIX_CLK] = &gcc_camss_csi2pix_clk.clkr,
|
||||
[GCC_CAMSS_CSI2RDI_CLK] = &gcc_camss_csi2rdi_clk.clkr,
|
||||
[GCC_CAMSS_CSI_VFE0_CLK] = &gcc_camss_csi_vfe0_clk.clkr,
|
||||
[GCC_CAMSS_GP0_CLK] = &gcc_camss_gp0_clk.clkr,
|
||||
[GCC_CAMSS_GP1_CLK] = &gcc_camss_gp1_clk.clkr,
|
||||
|
@ -401,7 +401,7 @@ static struct clk_rcg2 gcc_gp1_clk_src = {
|
||||
.parent_data = gcc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -416,7 +416,7 @@ static struct clk_rcg2 gcc_gp2_clk_src = {
|
||||
.parent_data = gcc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -431,7 +431,7 @@ static struct clk_rcg2 gcc_gp3_clk_src = {
|
||||
.parent_data = gcc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -451,7 +451,7 @@ static struct clk_rcg2 gcc_pcie_0_aux_clk_src = {
|
||||
.parent_data = gcc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -471,7 +471,7 @@ static struct clk_rcg2 gcc_pcie_0_phy_rchng_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -486,7 +486,7 @@ static struct clk_rcg2 gcc_pcie_1_aux_clk_src = {
|
||||
.parent_data = gcc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -501,7 +501,7 @@ static struct clk_rcg2 gcc_pcie_1_phy_rchng_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -521,7 +521,7 @@ static struct clk_rcg2 gcc_pdm2_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -536,7 +536,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s0_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -551,7 +551,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s1_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -566,7 +566,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s2_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -581,7 +581,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s3_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -596,7 +596,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s4_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -611,7 +611,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s5_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -626,7 +626,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s6_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -641,7 +641,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s7_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -656,7 +656,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s8_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -671,7 +671,7 @@ static struct clk_rcg2 gcc_qupv3_i2c_s9_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -700,7 +700,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
|
||||
@ -717,7 +717,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
|
||||
@ -750,7 +750,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
|
||||
@ -767,7 +767,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
|
||||
@ -784,7 +784,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
|
||||
@ -801,7 +801,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
|
||||
@ -818,7 +818,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s6_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = {
|
||||
@ -835,7 +835,7 @@ static struct clk_init_data gcc_qupv3_wrap1_s7_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
|
||||
@ -852,7 +852,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = {
|
||||
@ -869,7 +869,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = {
|
||||
@ -886,7 +886,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = {
|
||||
@ -903,7 +903,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = {
|
||||
@ -920,7 +920,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = {
|
||||
@ -937,7 +937,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = {
|
||||
@ -975,7 +975,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s6_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_8,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_8),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s6_clk_src = {
|
||||
@ -992,7 +992,7 @@ static struct clk_init_data gcc_qupv3_wrap2_s7_clk_src_init = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s7_clk_src = {
|
||||
@ -1025,7 +1025,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
|
||||
.parent_data = gcc_parent_data_9,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_9),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1048,7 +1048,7 @@ static struct clk_rcg2 gcc_sdcc4_apps_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1071,7 +1071,7 @@ static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1093,7 +1093,7 @@ static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
|
||||
.parent_data = gcc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_3),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1114,7 +1114,7 @@ static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
|
||||
.parent_data = gcc_parent_data_4,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_4),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1136,7 +1136,7 @@ static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1159,7 +1159,7 @@ static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1174,7 +1174,7 @@ static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
|
||||
.parent_data = gcc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1189,7 +1189,7 @@ static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
|
||||
.parent_data = gcc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(gcc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@ -2998,38 +2998,46 @@ static struct clk_branch gcc_video_axi1_clk = {
|
||||
|
||||
static struct gdsc pcie_0_gdsc = {
|
||||
.gdscr = 0x6b004,
|
||||
.collapse_ctrl = 0x52020,
|
||||
.collapse_mask = BIT(0),
|
||||
.pd = {
|
||||
.name = "pcie_0_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc pcie_0_phy_gdsc = {
|
||||
.gdscr = 0x6c000,
|
||||
.collapse_ctrl = 0x52020,
|
||||
.collapse_mask = BIT(3),
|
||||
.pd = {
|
||||
.name = "pcie_0_phy_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc pcie_1_gdsc = {
|
||||
.gdscr = 0x8d004,
|
||||
.collapse_ctrl = 0x52020,
|
||||
.collapse_mask = BIT(1),
|
||||
.pd = {
|
||||
.name = "pcie_1_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc pcie_1_phy_gdsc = {
|
||||
.gdscr = 0x8e000,
|
||||
.collapse_ctrl = 0x52020,
|
||||
.collapse_mask = BIT(4),
|
||||
.pd = {
|
||||
.name = "pcie_1_phy_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc ufs_phy_gdsc = {
|
||||
@ -3038,7 +3046,7 @@ static struct gdsc ufs_phy_gdsc = {
|
||||
.name = "ufs_phy_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc ufs_mem_phy_gdsc = {
|
||||
@ -3047,7 +3055,7 @@ static struct gdsc ufs_mem_phy_gdsc = {
|
||||
.name = "ufs_mem_phy_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc usb30_prim_gdsc = {
|
||||
@ -3056,7 +3064,7 @@ static struct gdsc usb30_prim_gdsc = {
|
||||
.name = "usb30_prim_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc usb3_phy_gdsc = {
|
||||
@ -3065,7 +3073,7 @@ static struct gdsc usb3_phy_gdsc = {
|
||||
.name = "usb3_phy_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct clk_regmap *gcc_sm8550_clocks[] = {
|
||||
|
3849
drivers/clk/qcom/gcc-sm8650.c
Normal file
3849
drivers/clk/qcom/gcc-sm8650.c
Normal file
File diff suppressed because it is too large
Load Diff
6807
drivers/clk/qcom/gcc-x1e80100.c
Normal file
6807
drivers/clk/qcom/gcc-x1e80100.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -37,8 +37,8 @@ static struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.config_ctl_hi_val = 0x00002267,
|
||||
.config_ctl_hi1_val = 0x00000024,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.test_ctl_hi1_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x00000020,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x000000d0,
|
||||
|
@ -35,12 +35,12 @@ enum {
|
||||
};
|
||||
|
||||
static const struct pll_vco lucid_ole_vco[] = {
|
||||
{ 249600000, 2300000000, 0 },
|
||||
{ 249600000, 2000000000, 0 },
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x0d,
|
||||
.alpha = 0x0,
|
||||
.l = 0x1e,
|
||||
.alpha = 0xbaaa,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00182261,
|
||||
.config_ctl_hi1_val = 0x82aa299c,
|
||||
|
663
drivers/clk/qcom/gpucc-sm8650.c
Normal file
663
drivers/clk/qcom/gpucc-sm8650.c
Normal file
@ -0,0 +1,663 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved
|
||||
* Copyright (c) 2023, Linaro Limited
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm8650-gpucc.h>
|
||||
#include <dt-bindings/reset/qcom,sm8650-gpucc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "clk-regmap-phy-mux.h"
|
||||
#include "gdsc.h"
|
||||
#include "reset.h"
|
||||
|
||||
enum {
|
||||
DT_BI_TCXO,
|
||||
DT_GPLL0_OUT_MAIN,
|
||||
DT_GPLL0_OUT_MAIN_DIV,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_GPLL0_OUT_MAIN,
|
||||
P_GPLL0_OUT_MAIN_DIV,
|
||||
P_GPU_CC_PLL0_OUT_MAIN,
|
||||
P_GPU_CC_PLL1_OUT_MAIN,
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_ole_vco[] = {
|
||||
{ 249600000, 2100000000, 0 },
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x20,
|
||||
.alpha = 0x4aaa,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00182261,
|
||||
.config_ctl_hi1_val = 0x82aa299c,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000003,
|
||||
.test_ctl_hi1_val = 0x00009000,
|
||||
.test_ctl_hi2_val = 0x00000034,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000005,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_pll0",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_evo_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.l = 0x1b,
|
||||
.alpha = 0x1555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00182261,
|
||||
.config_ctl_hi1_val = 0x82aa299c,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000003,
|
||||
.test_ctl_hi1_val = 0x00009000,
|
||||
.test_ctl_hi2_val = 0x00000034,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000005,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_pll1",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_evo_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_0[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_2[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = {
|
||||
F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_ff_clk_src = {
|
||||
.cmd_rcgr = 0x9474,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_gpu_cc_ff_clk_src,
|
||||
.hw_clk_ctrl = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_ff_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(260000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
|
||||
F(625000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||
.cmd_rcgr = 0x9318,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
|
||||
.hw_clk_ctrl = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gmu_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
|
||||
F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_hub_clk_src = {
|
||||
.cmd_rcgr = 0x93ec,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_gpu_cc_hub_clk_src,
|
||||
.hw_clk_ctrl = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gpu_cc_hub_div_clk_src = {
|
||||
.reg = 0x942c,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_ahb_clk = {
|
||||
.halt_reg = 0x911c,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x911c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_hub_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_crc_ahb_clk = {
|
||||
.halt_reg = 0x9120,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9120,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_crc_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_accu_shift_clk = {
|
||||
.halt_reg = 0x9160,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9160,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data){
|
||||
.name = "gpu_cc_cx_accu_shift_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_ff_clk = {
|
||||
.halt_reg = 0x914c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x914c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_ff_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_ff_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||
.halt_reg = 0x913c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x913c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_gmu_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_aon_clk = {
|
||||
.halt_reg = 0x9004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_aon_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_clk = {
|
||||
.halt_reg = 0x9144,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9144,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_demet_clk = {
|
||||
.halt_reg = 0x900c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x900c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_demet_clk",
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_freq_measure_clk = {
|
||||
.halt_reg = 0x9008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_freq_measure_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gfx3d_clk = {
|
||||
.halt_reg = 0x90a8,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90a8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gfx3d_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gfx3d_rdvm_clk = {
|
||||
.halt_reg = 0x90c8,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90c8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gfx3d_rdvm_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gmu_clk = {
|
||||
.halt_reg = 0x90bc,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90bc,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gmu_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_vsense_clk = {
|
||||
.halt_reg = 0x90b0,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90b0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_vsense_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_accu_shift_clk = {
|
||||
.halt_reg = 0x90d0,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90d0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data){
|
||||
.name = "gpu_cc_gx_accu_shift_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_ff_clk = {
|
||||
.halt_reg = 0x90c0,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90c0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data){
|
||||
.name = "gpu_cc_gx_ff_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_ff_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
|
||||
.halt_reg = 0x7000,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x7000,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hub_aon_clk = {
|
||||
.halt_reg = 0x93e8,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x93e8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_aon_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hub_cx_int_clk = {
|
||||
.halt_reg = 0x9148,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9148,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_cx_int_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_memnoc_gfx_clk = {
|
||||
.halt_reg = 0x9150,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9150,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_memnoc_gfx_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_sleep_clk = {
|
||||
.halt_reg = 0x9134,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9134,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_sleep_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_dpm_clk = {
|
||||
.halt_reg = 0x9164,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9164,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data){
|
||||
.name = "gpu_cc_dpm_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc gpu_cx_gdsc = {
|
||||
.gdscr = 0x9108,
|
||||
.gds_hw_ctrl = 0x9168,
|
||||
.clk_dis_wait_val = 8,
|
||||
.pd = {
|
||||
.name = "gpu_cx_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc gpu_gx_gdsc = {
|
||||
.gdscr = 0x905c,
|
||||
.clamp_io_ctrl = 0x9504,
|
||||
.resets = (unsigned int []){ GPUCC_GPU_CC_GX_BCR,
|
||||
GPUCC_GPU_CC_ACD_BCR,
|
||||
GPUCC_GPU_CC_GX_ACD_IROOT_BCR },
|
||||
.reset_count = 3,
|
||||
.pd = {
|
||||
.name = "gpu_gx_gdsc",
|
||||
.power_on = gdsc_gx_do_nothing_enable,
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = CLAMP_IO | AON_RESET | SW_RESET | POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct clk_regmap *gpu_cc_sm8650_clocks[] = {
|
||||
[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
|
||||
[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
|
||||
[GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr,
|
||||
[GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr,
|
||||
[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
|
||||
[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
|
||||
[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||
[GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr,
|
||||
[GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.clkr,
|
||||
[GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr,
|
||||
[GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr,
|
||||
[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
|
||||
[GPU_CC_GX_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr,
|
||||
[GPU_CC_GX_FF_CLK] = &gpu_cc_gx_ff_clk.clkr,
|
||||
[GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
|
||||
[GPU_CC_GX_GFX3D_RDVM_CLK] = &gpu_cc_gx_gfx3d_rdvm_clk.clkr,
|
||||
[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
|
||||
[GPU_CC_GX_VSENSE_CLK] = &gpu_cc_gx_vsense_clk.clkr,
|
||||
[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
|
||||
[GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
|
||||
[GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
|
||||
[GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
|
||||
[GPU_CC_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr,
|
||||
[GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
|
||||
[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
|
||||
[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
|
||||
[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map gpu_cc_sm8650_resets[] = {
|
||||
[GPUCC_GPU_CC_XO_BCR] = { 0x9000 },
|
||||
[GPUCC_GPU_CC_GX_BCR] = { 0x9058 },
|
||||
[GPUCC_GPU_CC_CX_BCR] = { 0x9104 },
|
||||
[GPUCC_GPU_CC_GFX3D_AON_BCR] = { 0x9198 },
|
||||
[GPUCC_GPU_CC_ACD_BCR] = { 0x9358 },
|
||||
[GPUCC_GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
|
||||
[GPUCC_GPU_CC_FF_BCR] = { 0x9470 },
|
||||
[GPUCC_GPU_CC_GMU_BCR] = { 0x9314 },
|
||||
[GPUCC_GPU_CC_GX_ACD_IROOT_BCR] = { 0x958c },
|
||||
};
|
||||
|
||||
static struct gdsc *gpu_cc_sm8650_gdscs[] = {
|
||||
[GPU_CX_GDSC] = &gpu_cx_gdsc,
|
||||
[GPU_GX_GDSC] = &gpu_gx_gdsc,
|
||||
};
|
||||
|
||||
static const struct regmap_config gpu_cc_sm8650_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0xa000,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gpu_cc_sm8650_desc = {
|
||||
.config = &gpu_cc_sm8650_regmap_config,
|
||||
.clks = gpu_cc_sm8650_clocks,
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_sm8650_clocks),
|
||||
.resets = gpu_cc_sm8650_resets,
|
||||
.num_resets = ARRAY_SIZE(gpu_cc_sm8650_resets),
|
||||
.gdscs = gpu_cc_sm8650_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(gpu_cc_sm8650_gdscs),
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_sm8650_match_table[] = {
|
||||
{ .compatible = "qcom,sm8650-gpucc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gpu_cc_sm8650_match_table);
|
||||
|
||||
static int gpu_cc_sm8650_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gpu_cc_sm8650_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk_lucid_ole_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_sm8650_desc, regmap);
|
||||
}
|
||||
|
||||
static struct platform_driver gpu_cc_sm8650_driver = {
|
||||
.probe = gpu_cc_sm8650_probe,
|
||||
.driver = {
|
||||
.name = "sm8650-gpucc",
|
||||
.of_match_table = gpu_cc_sm8650_match_table,
|
||||
},
|
||||
};
|
||||
module_platform_driver(gpu_cc_sm8650_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC SM8650 Driver");
|
||||
MODULE_LICENSE("GPL");
|
182
drivers/clk/qcom/tcsrcc-sm8650.c
Normal file
182
drivers/clk/qcom/tcsrcc-sm8650.c
Normal file
@ -0,0 +1,182 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2023, Linaro Limited
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm8650-tcsr.h>
|
||||
|
||||
#include "clk-branch.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "common.h"
|
||||
#include "reset.h"
|
||||
|
||||
enum {
|
||||
DT_BI_TCXO_PAD,
|
||||
};
|
||||
|
||||
static struct clk_branch tcsr_pcie_0_clkref_en = {
|
||||
.halt_reg = 0x31100,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x31100,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "tcsr_pcie_0_clkref_en",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO_PAD,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch tcsr_pcie_1_clkref_en = {
|
||||
.halt_reg = 0x31114,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x31114,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "tcsr_pcie_1_clkref_en",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO_PAD,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch tcsr_ufs_clkref_en = {
|
||||
.halt_reg = 0x31110,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x31110,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "tcsr_ufs_clkref_en",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO_PAD,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch tcsr_ufs_pad_clkref_en = {
|
||||
.halt_reg = 0x31104,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x31104,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "tcsr_ufs_pad_clkref_en",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO_PAD,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch tcsr_usb2_clkref_en = {
|
||||
.halt_reg = 0x31118,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x31118,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "tcsr_usb2_clkref_en",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO_PAD,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch tcsr_usb3_clkref_en = {
|
||||
.halt_reg = 0x31108,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x31108,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "tcsr_usb3_clkref_en",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.index = DT_BI_TCXO_PAD,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *tcsr_cc_sm8650_clocks[] = {
|
||||
[TCSR_PCIE_0_CLKREF_EN] = &tcsr_pcie_0_clkref_en.clkr,
|
||||
[TCSR_PCIE_1_CLKREF_EN] = &tcsr_pcie_1_clkref_en.clkr,
|
||||
[TCSR_UFS_CLKREF_EN] = &tcsr_ufs_clkref_en.clkr,
|
||||
[TCSR_UFS_PAD_CLKREF_EN] = &tcsr_ufs_pad_clkref_en.clkr,
|
||||
[TCSR_USB2_CLKREF_EN] = &tcsr_usb2_clkref_en.clkr,
|
||||
[TCSR_USB3_CLKREF_EN] = &tcsr_usb3_clkref_en.clkr,
|
||||
};
|
||||
|
||||
static const struct regmap_config tcsr_cc_sm8650_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x3b000,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc tcsr_cc_sm8650_desc = {
|
||||
.config = &tcsr_cc_sm8650_regmap_config,
|
||||
.clks = tcsr_cc_sm8650_clocks,
|
||||
.num_clks = ARRAY_SIZE(tcsr_cc_sm8650_clocks),
|
||||
};
|
||||
|
||||
static const struct of_device_id tcsr_cc_sm8650_match_table[] = {
|
||||
{ .compatible = "qcom,sm8650-tcsr" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tcsr_cc_sm8650_match_table);
|
||||
|
||||
static int tcsr_cc_sm8650_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &tcsr_cc_sm8650_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver tcsr_cc_sm8650_driver = {
|
||||
.probe = tcsr_cc_sm8650_probe,
|
||||
.driver = {
|
||||
.name = "tcsr_cc-sm8650",
|
||||
.of_match_table = tcsr_cc_sm8650_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init tcsr_cc_sm8650_init(void)
|
||||
{
|
||||
return platform_driver_register(&tcsr_cc_sm8650_driver);
|
||||
}
|
||||
subsys_initcall(tcsr_cc_sm8650_init);
|
||||
|
||||
static void __exit tcsr_cc_sm8650_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&tcsr_cc_sm8650_driver);
|
||||
}
|
||||
module_exit(tcsr_cc_sm8650_exit);
|
||||
|
||||
MODULE_DESCRIPTION("QTI TCSRCC SM8650 Driver");
|
||||
MODULE_LICENSE("GPL");
|
@ -6,6 +6,7 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,videocc-sm8150.h>
|
||||
@ -33,6 +34,7 @@ static struct alpha_pll_config video_pll0_config = {
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002267,
|
||||
.config_ctl_hi1_val = 0x00000024,
|
||||
.test_ctl_hi1_val = 0x00000020,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x000000D0,
|
||||
@ -214,6 +216,10 @@ static const struct regmap_config video_cc_sm8150_regmap_config = {
|
||||
|
||||
static const struct qcom_reset_map video_cc_sm8150_resets[] = {
|
||||
[VIDEO_CC_MVSC_CORE_CLK_BCR] = { 0x850, 2 },
|
||||
[VIDEO_CC_INTERFACE_BCR] = { 0x8f0 },
|
||||
[VIDEO_CC_MVS0_BCR] = { 0x870 },
|
||||
[VIDEO_CC_MVS1_BCR] = { 0x8b0 },
|
||||
[VIDEO_CC_MVSC_BCR] = { 0x810 },
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_sm8150_desc = {
|
||||
@ -235,17 +241,32 @@ MODULE_DEVICE_TABLE(of, video_cc_sm8150_match_table);
|
||||
static int video_cc_sm8150_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &video_cc_sm8150_desc);
|
||||
if (IS_ERR(regmap))
|
||||
if (IS_ERR(regmap)) {
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
clk_trion_pll_configure(&video_pll0, regmap, &video_pll0_config);
|
||||
|
||||
/* Keep VIDEO_CC_XO_CLK ALWAYS-ON */
|
||||
regmap_update_bits(regmap, 0x984, 0x1, 0x1);
|
||||
|
||||
return qcom_cc_really_probe(pdev, &video_cc_sm8150_desc, regmap);
|
||||
ret = qcom_cc_really_probe(pdev, &video_cc_sm8150_desc, regmap);
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_sm8150_driver = {
|
||||
|
@ -192,6 +192,8 @@ static const struct mssr_mod_clk r8a779g0_mod_clks[] __initconst = {
|
||||
DEF_MOD("msi3", 621, R8A779G0_CLK_MSO),
|
||||
DEF_MOD("msi4", 622, R8A779G0_CLK_MSO),
|
||||
DEF_MOD("msi5", 623, R8A779G0_CLK_MSO),
|
||||
DEF_MOD("pciec0", 624, R8A779G0_CLK_S0D2_HSC),
|
||||
DEF_MOD("pscie1", 625, R8A779G0_CLK_S0D2_HSC),
|
||||
DEF_MOD("pwm", 628, R8A779G0_CLK_SASYNCPERD4),
|
||||
DEF_MOD("rpc-if", 629, R8A779G0_CLK_RPCD2),
|
||||
DEF_MOD("scif0", 702, R8A779G0_CLK_SASYNCPERD4),
|
||||
@ -235,6 +237,7 @@ static const struct mssr_mod_clk r8a779g0_mod_clks[] __initconst = {
|
||||
DEF_MOD("pfc2", 917, R8A779G0_CLK_CL16M),
|
||||
DEF_MOD("pfc3", 918, R8A779G0_CLK_CL16M),
|
||||
DEF_MOD("tsc", 919, R8A779G0_CLK_CL16M),
|
||||
DEF_MOD("tsn", 2723, R8A779G0_CLK_S0D4_HSC),
|
||||
DEF_MOD("ssiu", 2926, R8A779G0_CLK_S0D6_PER),
|
||||
DEF_MOD("ssi", 2927, R8A779G0_CLK_S0D6_PER),
|
||||
};
|
||||
|
@ -181,13 +181,16 @@ static const struct cpg_core_clk r9a08g045_core_clks[] __initconst = {
|
||||
DEF_G3S_DIV("P3", R9A08G045_CLK_P3, CLK_PLL3_DIV2_4, DIVPL3C, G3S_DIVPL3C_STS,
|
||||
dtable_1_32, 0, 0, 0, NULL),
|
||||
DEF_FIXED("P3_DIV2", CLK_P3_DIV2, R9A08G045_CLK_P3, 1, 2),
|
||||
DEF_FIXED("ZT", R9A08G045_CLK_ZT, CLK_PLL3_DIV2_8, 1, 1),
|
||||
DEF_FIXED("S0", R9A08G045_CLK_S0, CLK_SEL_PLL4, 1, 2),
|
||||
DEF_FIXED("OSC", R9A08G045_OSCCLK, CLK_EXTAL, 1, 1),
|
||||
DEF_FIXED("OSC2", R9A08G045_OSCCLK2, CLK_EXTAL, 1, 3),
|
||||
DEF_FIXED("HP", R9A08G045_CLK_HP, CLK_PLL6, 1, 2),
|
||||
};
|
||||
|
||||
static const struct rzg2l_mod_clk r9a08g045_mod_clks[] = {
|
||||
DEF_MOD("gic_gicclk", R9A08G045_GIC600_GICCLK, R9A08G045_CLK_P1, 0x514, 0),
|
||||
DEF_MOD("ia55_pclk", R9A08G045_IA55_PCLK, R9A08G045_CLK_P2, 0x518, 0),
|
||||
DEF_MOD("ia55_clk", R9A08G045_IA55_CLK, R9A08G045_CLK_P1, 0x518, 1),
|
||||
DEF_MOD("dmac_aclk", R9A08G045_DMAC_ACLK, R9A08G045_CLK_P3, 0x52c, 0),
|
||||
DEF_MOD("sdhi0_imclk", R9A08G045_SDHI0_IMCLK, CLK_SD0_DIV4, 0x554, 0),
|
||||
@ -202,6 +205,12 @@ static const struct rzg2l_mod_clk r9a08g045_mod_clks[] = {
|
||||
DEF_MOD("sdhi2_imclk2", R9A08G045_SDHI2_IMCLK2, CLK_SD2_DIV4, 0x554, 9),
|
||||
DEF_MOD("sdhi2_clk_hs", R9A08G045_SDHI2_CLK_HS, R9A08G045_CLK_SD2, 0x554, 10),
|
||||
DEF_MOD("sdhi2_aclk", R9A08G045_SDHI2_ACLK, R9A08G045_CLK_P1, 0x554, 11),
|
||||
DEF_COUPLED("eth0_axi", R9A08G045_ETH0_CLK_AXI, R9A08G045_CLK_M0, 0x57c, 0),
|
||||
DEF_COUPLED("eth0_chi", R9A08G045_ETH0_CLK_CHI, R9A08G045_CLK_ZT, 0x57c, 0),
|
||||
DEF_MOD("eth0_refclk", R9A08G045_ETH0_REFCLK, R9A08G045_CLK_HP, 0x57c, 8),
|
||||
DEF_COUPLED("eth1_axi", R9A08G045_ETH1_CLK_AXI, R9A08G045_CLK_M0, 0x57c, 1),
|
||||
DEF_COUPLED("eth1_chi", R9A08G045_ETH1_CLK_CHI, R9A08G045_CLK_ZT, 0x57c, 1),
|
||||
DEF_MOD("eth1_refclk", R9A08G045_ETH1_REFCLK, R9A08G045_CLK_HP, 0x57c, 9),
|
||||
DEF_MOD("scif0_clk_pck", R9A08G045_SCIF0_CLK_PCK, R9A08G045_CLK_P0, 0x584, 0),
|
||||
DEF_MOD("gpio_hclk", R9A08G045_GPIO_HCLK, R9A08G045_OSCCLK, 0x598, 0),
|
||||
};
|
||||
@ -209,9 +218,12 @@ static const struct rzg2l_mod_clk r9a08g045_mod_clks[] = {
|
||||
static const struct rzg2l_reset r9a08g045_resets[] = {
|
||||
DEF_RST(R9A08G045_GIC600_GICRESET_N, 0x814, 0),
|
||||
DEF_RST(R9A08G045_GIC600_DBG_GICRESET_N, 0x814, 1),
|
||||
DEF_RST(R9A08G045_IA55_RESETN, 0x818, 0),
|
||||
DEF_RST(R9A08G045_SDHI0_IXRST, 0x854, 0),
|
||||
DEF_RST(R9A08G045_SDHI1_IXRST, 0x854, 1),
|
||||
DEF_RST(R9A08G045_SDHI2_IXRST, 0x854, 2),
|
||||
DEF_RST(R9A08G045_ETH0_RST_HW_N, 0x87c, 0),
|
||||
DEF_RST(R9A08G045_ETH1_RST_HW_N, 0x87c, 1),
|
||||
DEF_RST(R9A08G045_SCIF0_RST_SYSTEM_N, 0x884, 0),
|
||||
DEF_RST(R9A08G045_GPIO_RSTN, 0x898, 0),
|
||||
DEF_RST(R9A08G045_GPIO_PORT_RESETN, 0x898, 1),
|
||||
@ -220,6 +232,7 @@ static const struct rzg2l_reset r9a08g045_resets[] = {
|
||||
|
||||
static const unsigned int r9a08g045_crit_mod_clks[] __initconst = {
|
||||
MOD_CLK_BASE + R9A08G045_GIC600_GICCLK,
|
||||
MOD_CLK_BASE + R9A08G045_IA55_PCLK,
|
||||
MOD_CLK_BASE + R9A08G045_IA55_CLK,
|
||||
MOD_CLK_BASE + R9A08G045_DMAC_ACLK,
|
||||
};
|
||||
|
@ -1410,41 +1410,33 @@ rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
|
||||
|
||||
#define rcdev_to_priv(x) container_of(x, struct rzg2l_cpg_priv, rcdev)
|
||||
|
||||
static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
|
||||
const struct rzg2l_cpg_info *info = priv->info;
|
||||
unsigned int reg = info->resets[id].off;
|
||||
u32 dis = BIT(info->resets[id].bit);
|
||||
u32 we = dis << 16;
|
||||
|
||||
dev_dbg(rcdev->dev, "reset id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
|
||||
|
||||
/* Reset module */
|
||||
writel(we, priv->base + CLK_RST_R(reg));
|
||||
|
||||
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
|
||||
udelay(35);
|
||||
|
||||
/* Release module from reset state */
|
||||
writel(we | dis, priv->base + CLK_RST_R(reg));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
|
||||
const struct rzg2l_cpg_info *info = priv->info;
|
||||
unsigned int reg = info->resets[id].off;
|
||||
u32 value = BIT(info->resets[id].bit) << 16;
|
||||
u32 mask = BIT(info->resets[id].bit);
|
||||
s8 monbit = info->resets[id].monbit;
|
||||
u32 value = mask << 16;
|
||||
|
||||
dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
|
||||
|
||||
writel(value, priv->base + CLK_RST_R(reg));
|
||||
return 0;
|
||||
|
||||
if (info->has_clk_mon_regs) {
|
||||
reg = CLK_MRST_R(reg);
|
||||
} else if (monbit >= 0) {
|
||||
reg = CPG_RST_MON;
|
||||
mask = BIT(monbit);
|
||||
} else {
|
||||
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
|
||||
udelay(35);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return readl_poll_timeout_atomic(priv->base + reg, value,
|
||||
value & mask, 10, 200);
|
||||
}
|
||||
|
||||
static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
|
||||
@ -1453,14 +1445,40 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
|
||||
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
|
||||
const struct rzg2l_cpg_info *info = priv->info;
|
||||
unsigned int reg = info->resets[id].off;
|
||||
u32 dis = BIT(info->resets[id].bit);
|
||||
u32 value = (dis << 16) | dis;
|
||||
u32 mask = BIT(info->resets[id].bit);
|
||||
s8 monbit = info->resets[id].monbit;
|
||||
u32 value = (mask << 16) | mask;
|
||||
|
||||
dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
|
||||
CLK_RST_R(reg));
|
||||
|
||||
writel(value, priv->base + CLK_RST_R(reg));
|
||||
return 0;
|
||||
|
||||
if (info->has_clk_mon_regs) {
|
||||
reg = CLK_MRST_R(reg);
|
||||
} else if (monbit >= 0) {
|
||||
reg = CPG_RST_MON;
|
||||
mask = BIT(monbit);
|
||||
} else {
|
||||
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
|
||||
udelay(35);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return readl_poll_timeout_atomic(priv->base + reg, value,
|
||||
!(value & mask), 10, 200);
|
||||
}
|
||||
|
||||
static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = rzg2l_cpg_assert(rcdev, id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return rzg2l_cpg_deassert(rcdev, id);
|
||||
}
|
||||
|
||||
static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
|
||||
@ -1468,18 +1486,21 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
|
||||
{
|
||||
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
|
||||
const struct rzg2l_cpg_info *info = priv->info;
|
||||
unsigned int reg = info->resets[id].off;
|
||||
u32 bitmask = BIT(info->resets[id].bit);
|
||||
s8 monbit = info->resets[id].monbit;
|
||||
unsigned int reg;
|
||||
u32 bitmask;
|
||||
|
||||
if (info->has_clk_mon_regs) {
|
||||
return !!(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
|
||||
reg = CLK_MRST_R(info->resets[id].off);
|
||||
bitmask = BIT(info->resets[id].bit);
|
||||
} else if (monbit >= 0) {
|
||||
u32 monbitmask = BIT(monbit);
|
||||
|
||||
return !!(readl(priv->base + CPG_RST_MON) & monbitmask);
|
||||
reg = CPG_RST_MON;
|
||||
bitmask = BIT(monbit);
|
||||
} else {
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
return -ENOTSUPP;
|
||||
|
||||
return !!(readl(priv->base + reg) & bitmask);
|
||||
}
|
||||
|
||||
static const struct reset_control_ops rzg2l_cpg_reset_ops = {
|
||||
|
@ -78,7 +78,9 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = {
|
||||
RK3036_PLL_RATE(200000000, 1, 100, 3, 4, 1, 0),
|
||||
RK3036_PLL_RATE(148500000, 1, 99, 4, 4, 1, 0),
|
||||
RK3036_PLL_RATE(135000000, 2, 45, 4, 1, 1, 0),
|
||||
RK3036_PLL_RATE(126400000, 1, 79, 5, 3, 1, 0),
|
||||
RK3036_PLL_RATE(119000000, 3, 119, 4, 2, 1, 0),
|
||||
RK3036_PLL_RATE(115200000, 1, 24, 5, 1, 1, 0),
|
||||
RK3036_PLL_RATE(108000000, 2, 45, 5, 1, 1, 0),
|
||||
RK3036_PLL_RATE(101000000, 1, 101, 6, 4, 1, 0),
|
||||
RK3036_PLL_RATE(100000000, 1, 150, 6, 6, 1, 0),
|
||||
@ -1593,6 +1595,7 @@ static const char *const rk3568_cru_critical_clocks[] __initconst = {
|
||||
"hclk_php",
|
||||
"pclk_php",
|
||||
"hclk_usb",
|
||||
"pclk_usb",
|
||||
"hclk_vo",
|
||||
};
|
||||
|
||||
|
@ -11,10 +11,10 @@
|
||||
#include "clk.h"
|
||||
|
||||
/**
|
||||
* struct exynos_cpuclk_data: config data to setup cpu clocks.
|
||||
* @prate: frequency of the primary parent clock (in KHz).
|
||||
* @div0: value to be programmed in the div_cpu0 register.
|
||||
* @div1: value to be programmed in the div_cpu1 register.
|
||||
* struct exynos_cpuclk_cfg_data - config data to setup cpu clocks
|
||||
* @prate: frequency of the primary parent clock (in KHz)
|
||||
* @div0: value to be programmed in the div_cpu0 register
|
||||
* @div1: value to be programmed in the div_cpu1 register
|
||||
*
|
||||
* This structure holds the divider configuration data for dividers in the CPU
|
||||
* clock domain. The parent frequency at which these divider values are valid is
|
||||
@ -29,17 +29,17 @@ struct exynos_cpuclk_cfg_data {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct exynos_cpuclk: information about clock supplied to a CPU core.
|
||||
* @hw: handle between CCF and CPU clock.
|
||||
* @alt_parent: alternate parent clock to use when switching the speed
|
||||
* of the primary parent clock.
|
||||
* @ctrl_base: base address of the clock controller.
|
||||
* @lock: cpu clock domain register access lock.
|
||||
* @cfg: cpu clock rate configuration data.
|
||||
* @num_cfgs: number of array elements in @cfg array.
|
||||
* @clk_nb: clock notifier registered for changes in clock speed of the
|
||||
* primary parent clock.
|
||||
* @flags: configuration flags for the CPU clock.
|
||||
* struct exynos_cpuclk - information about clock supplied to a CPU core
|
||||
* @hw: handle between CCF and CPU clock
|
||||
* @alt_parent: alternate parent clock to use when switching the speed
|
||||
* of the primary parent clock
|
||||
* @ctrl_base: base address of the clock controller
|
||||
* @lock: cpu clock domain register access lock
|
||||
* @cfg: cpu clock rate configuration data
|
||||
* @num_cfgs: number of array elements in @cfg array
|
||||
* @clk_nb: clock notifier registered for changes in clock speed of the
|
||||
* primary parent clock
|
||||
* @flags: configuration flags for the CPU clock
|
||||
*
|
||||
* This structure holds information required for programming the CPU clock for
|
||||
* various clock speeds.
|
||||
|
@ -14,11 +14,11 @@
|
||||
#include "clk-pll.h"
|
||||
|
||||
/**
|
||||
* struct samsung_clk_provider: information about clock provider
|
||||
* @reg_base: virtual address for the register base.
|
||||
* @dev: clock provider device needed for runtime PM.
|
||||
* @lock: maintains exclusion between callbacks for a given clock-provider.
|
||||
* @clk_data: holds clock related data like clk_hw* and number of clocks.
|
||||
* struct samsung_clk_provider - information about clock provider
|
||||
* @reg_base: virtual address for the register base
|
||||
* @dev: clock provider device needed for runtime PM
|
||||
* @lock: maintains exclusion between callbacks for a given clock-provider
|
||||
* @clk_data: holds clock related data like clk_hw* and number of clocks
|
||||
*/
|
||||
struct samsung_clk_provider {
|
||||
void __iomem *reg_base;
|
||||
@ -29,10 +29,10 @@ struct samsung_clk_provider {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct samsung_clock_alias: information about mux clock
|
||||
* @id: platform specific id of the clock.
|
||||
* @dev_name: name of the device to which this clock belongs.
|
||||
* @alias: optional clock alias name to be assigned to this clock.
|
||||
* struct samsung_clock_alias - information about mux clock
|
||||
* @id: platform specific id of the clock
|
||||
* @dev_name: name of the device to which this clock belongs
|
||||
* @alias: optional clock alias name to be assigned to this clock
|
||||
*/
|
||||
struct samsung_clock_alias {
|
||||
unsigned int id;
|
||||
@ -50,12 +50,12 @@ struct samsung_clock_alias {
|
||||
#define MHZ (1000 * 1000)
|
||||
|
||||
/**
|
||||
* struct samsung_fixed_rate_clock: information about fixed-rate clock
|
||||
* @id: platform specific id of the clock.
|
||||
* @name: name of this fixed-rate clock.
|
||||
* @parent_name: optional parent clock name.
|
||||
* @flags: optional fixed-rate clock flags.
|
||||
* @fixed-rate: fixed clock rate of this clock.
|
||||
* struct samsung_fixed_rate_clock - information about fixed-rate clock
|
||||
* @id: platform specific id of the clock
|
||||
* @name: name of this fixed-rate clock
|
||||
* @parent_name: optional parent clock name
|
||||
* @flags: optional fixed-rate clock flags
|
||||
* @fixed_rate: fixed clock rate of this clock
|
||||
*/
|
||||
struct samsung_fixed_rate_clock {
|
||||
unsigned int id;
|
||||
@ -74,14 +74,14 @@ struct samsung_fixed_rate_clock {
|
||||
.fixed_rate = frate, \
|
||||
}
|
||||
|
||||
/*
|
||||
* struct samsung_fixed_factor_clock: information about fixed-factor clock
|
||||
* @id: platform specific id of the clock.
|
||||
* @name: name of this fixed-factor clock.
|
||||
* @parent_name: parent clock name.
|
||||
* @mult: fixed multiplication factor.
|
||||
* @div: fixed division factor.
|
||||
* @flags: optional fixed-factor clock flags.
|
||||
/**
|
||||
* struct samsung_fixed_factor_clock - information about fixed-factor clock
|
||||
* @id: platform specific id of the clock
|
||||
* @name: name of this fixed-factor clock
|
||||
* @parent_name: parent clock name
|
||||
* @mult: fixed multiplication factor
|
||||
* @div: fixed division factor
|
||||
* @flags: optional fixed-factor clock flags
|
||||
*/
|
||||
struct samsung_fixed_factor_clock {
|
||||
unsigned int id;
|
||||
@ -103,16 +103,16 @@ struct samsung_fixed_factor_clock {
|
||||
}
|
||||
|
||||
/**
|
||||
* struct samsung_mux_clock: information about mux clock
|
||||
* @id: platform specific id of the clock.
|
||||
* @name: name of this mux clock.
|
||||
* @parent_names: array of pointer to parent clock names.
|
||||
* @num_parents: number of parents listed in @parent_names.
|
||||
* @flags: optional flags for basic clock.
|
||||
* @offset: offset of the register for configuring the mux.
|
||||
* @shift: starting bit location of the mux control bit-field in @reg.
|
||||
* @width: width of the mux control bit-field in @reg.
|
||||
* @mux_flags: flags for mux-type clock.
|
||||
* struct samsung_mux_clock - information about mux clock
|
||||
* @id: platform specific id of the clock
|
||||
* @name: name of this mux clock
|
||||
* @parent_names: array of pointer to parent clock names
|
||||
* @num_parents: number of parents listed in @parent_names
|
||||
* @flags: optional flags for basic clock
|
||||
* @offset: offset of the register for configuring the mux
|
||||
* @shift: starting bit location of the mux control bit-field in @reg
|
||||
* @width: width of the mux control bit-field in @reg
|
||||
* @mux_flags: flags for mux-type clock
|
||||
*/
|
||||
struct samsung_mux_clock {
|
||||
unsigned int id;
|
||||
@ -146,14 +146,16 @@ struct samsung_mux_clock {
|
||||
__MUX(_id, cname, pnames, o, s, w, f, mf)
|
||||
|
||||
/**
|
||||
* @id: platform specific id of the clock.
|
||||
* struct samsung_div_clock: information about div clock
|
||||
* @name: name of this div clock.
|
||||
* @parent_name: name of the parent clock.
|
||||
* @flags: optional flags for basic clock.
|
||||
* @offset: offset of the register for configuring the div.
|
||||
* @shift: starting bit location of the div control bit-field in @reg.
|
||||
* @div_flags: flags for div-type clock.
|
||||
* struct samsung_div_clock - information about div clock
|
||||
* @id: platform specific id of the clock
|
||||
* @name: name of this div clock
|
||||
* @parent_name: name of the parent clock
|
||||
* @flags: optional flags for basic clock
|
||||
* @offset: offset of the register for configuring the div
|
||||
* @shift: starting bit location of the div control bit-field in @reg
|
||||
* @width: width of the bitfield
|
||||
* @div_flags: flags for div-type clock
|
||||
* @table: array of divider/value pairs ending with a div set to 0
|
||||
*/
|
||||
struct samsung_div_clock {
|
||||
unsigned int id;
|
||||
@ -190,14 +192,14 @@ struct samsung_div_clock {
|
||||
__DIV(_id, cname, pname, o, s, w, 0, 0, t)
|
||||
|
||||
/**
|
||||
* struct samsung_gate_clock: information about gate clock
|
||||
* @id: platform specific id of the clock.
|
||||
* @name: name of this gate clock.
|
||||
* @parent_name: name of the parent clock.
|
||||
* @flags: optional flags for basic clock.
|
||||
* @offset: offset of the register for configuring the gate.
|
||||
* @bit_idx: bit index of the gate control bit-field in @reg.
|
||||
* @gate_flags: flags for gate-type clock.
|
||||
* struct samsung_gate_clock - information about gate clock
|
||||
* @id: platform specific id of the clock
|
||||
* @name: name of this gate clock
|
||||
* @parent_name: name of the parent clock
|
||||
* @flags: optional flags for basic clock
|
||||
* @offset: offset of the register for configuring the gate
|
||||
* @bit_idx: bit index of the gate control bit-field in @reg
|
||||
* @gate_flags: flags for gate-type clock
|
||||
*/
|
||||
struct samsung_gate_clock {
|
||||
unsigned int id;
|
||||
@ -226,9 +228,9 @@ struct samsung_gate_clock {
|
||||
#define PNAME(x) static const char * const x[] __initconst
|
||||
|
||||
/**
|
||||
* struct samsung_clk_reg_dump: register dump of clock controller registers.
|
||||
* @offset: clock register offset from the controller base address.
|
||||
* @value: the value to be register at offset.
|
||||
* struct samsung_clk_reg_dump - register dump of clock controller registers
|
||||
* @offset: clock register offset from the controller base address
|
||||
* @value: the value to be register at offset
|
||||
*/
|
||||
struct samsung_clk_reg_dump {
|
||||
u32 offset;
|
||||
@ -236,14 +238,15 @@ struct samsung_clk_reg_dump {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct samsung_pll_clock: information about pll clock
|
||||
* @id: platform specific id of the clock.
|
||||
* @name: name of this pll clock.
|
||||
* @parent_name: name of the parent clock.
|
||||
* @flags: optional flags for basic clock.
|
||||
* @con_offset: offset of the register for configuring the PLL.
|
||||
* @lock_offset: offset of the register for locking the PLL.
|
||||
* @type: Type of PLL to be registered.
|
||||
* struct samsung_pll_clock - information about pll clock
|
||||
* @id: platform specific id of the clock
|
||||
* @name: name of this pll clock
|
||||
* @parent_name: name of the parent clock
|
||||
* @flags: optional flags for basic clock
|
||||
* @con_offset: offset of the register for configuring the PLL
|
||||
* @lock_offset: offset of the register for locking the PLL
|
||||
* @type: type of PLL to be registered
|
||||
* @rate_table: array of PLL settings for possible PLL rates
|
||||
*/
|
||||
struct samsung_pll_clock {
|
||||
unsigned int id;
|
||||
@ -302,39 +305,51 @@ struct samsung_clock_reg_cache {
|
||||
unsigned int rsuspend_num;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct samsung_cmu_info - all clocks information needed for CMU registration
|
||||
* @pll_clks: list of PLL clocks
|
||||
* @nr_pll_clks: count of clocks in @pll_clks
|
||||
* @mux_clks: list of mux clocks
|
||||
* @nr_mux_clks: count of clocks in @mux_clks
|
||||
* @div_clks: list of div clocks
|
||||
* @nr_div_clks: count of clocks in @div_clks
|
||||
* @gate_clks: list of gate clocks
|
||||
* @nr_gate_clks: count of clocks in @gate_clks
|
||||
* @fixed_clks: list of fixed clocks
|
||||
* @nr_fixed_clks: count clocks in @fixed_clks
|
||||
* @fixed_factor_clks: list of fixed factor clocks
|
||||
* @nr_fixed_factor_clks: count of clocks in @fixed_factor_clks
|
||||
* @nr_clk_ids: total number of clocks with IDs assigned
|
||||
* @cpu_clks: list of CPU clocks
|
||||
* @nr_cpu_clks: count of clocks in @cpu_clks
|
||||
* @clk_regs: list of clock registers
|
||||
* @nr_clk_regs: count of clock registers in @clk_regs
|
||||
* @suspend_regs: list of clock registers to set before suspend
|
||||
* @nr_suspend_regs: count of clock registers in @suspend_regs
|
||||
* @clk_name: name of the parent clock needed for CMU register access
|
||||
*/
|
||||
struct samsung_cmu_info {
|
||||
/* list of pll clocks and respective count */
|
||||
const struct samsung_pll_clock *pll_clks;
|
||||
unsigned int nr_pll_clks;
|
||||
/* list of mux clocks and respective count */
|
||||
const struct samsung_mux_clock *mux_clks;
|
||||
unsigned int nr_mux_clks;
|
||||
/* list of div clocks and respective count */
|
||||
const struct samsung_div_clock *div_clks;
|
||||
unsigned int nr_div_clks;
|
||||
/* list of gate clocks and respective count */
|
||||
const struct samsung_gate_clock *gate_clks;
|
||||
unsigned int nr_gate_clks;
|
||||
/* list of fixed clocks and respective count */
|
||||
const struct samsung_fixed_rate_clock *fixed_clks;
|
||||
unsigned int nr_fixed_clks;
|
||||
/* list of fixed factor clocks and respective count */
|
||||
const struct samsung_fixed_factor_clock *fixed_factor_clks;
|
||||
unsigned int nr_fixed_factor_clks;
|
||||
/* total number of clocks with IDs assigned*/
|
||||
unsigned int nr_clk_ids;
|
||||
/* list of cpu clocks and respective count */
|
||||
const struct samsung_cpu_clock *cpu_clks;
|
||||
unsigned int nr_cpu_clks;
|
||||
|
||||
/* list and number of clocks registers */
|
||||
const unsigned long *clk_regs;
|
||||
unsigned int nr_clk_regs;
|
||||
|
||||
/* list and number of clocks registers to set before suspend */
|
||||
const struct samsung_clk_reg_dump *suspend_regs;
|
||||
unsigned int nr_suspend_regs;
|
||||
/* name of the parent clock needed for CMU register access */
|
||||
const char *clk_name;
|
||||
};
|
||||
|
||||
|
@ -79,7 +79,7 @@ static const struct jh71x0_clk_data jh7100_audclk_data[] = {
|
||||
JH71X0_GDIV(JH7100_AUDCLK_USB_LPM, "usb_lpm", CLK_IGNORE_UNUSED, 4, JH7100_AUDCLK_USB_APB),
|
||||
JH71X0_GDIV(JH7100_AUDCLK_USB_STB, "usb_stb", CLK_IGNORE_UNUSED, 3, JH7100_AUDCLK_USB_APB),
|
||||
JH71X0__DIV(JH7100_AUDCLK_APB_EN, "apb_en", 8, JH7100_AUDCLK_DOM7AHB_BUS),
|
||||
JH71X0__MUX(JH7100_AUDCLK_VAD_MEM, "vad_mem", 2,
|
||||
JH71X0__MUX(JH7100_AUDCLK_VAD_MEM, "vad_mem", 0, 2,
|
||||
JH7100_AUDCLK_VAD_INTMEM,
|
||||
JH7100_AUDCLK_AUDIO_12288),
|
||||
};
|
||||
|
@ -24,48 +24,48 @@
|
||||
#define JH7100_CLK_GMAC_GR_MII_RX (JH7100_CLK_END + 3)
|
||||
|
||||
static const struct jh71x0_clk_data jh7100_clk_data[] __initconst = {
|
||||
JH71X0__MUX(JH7100_CLK_CPUNDBUS_ROOT, "cpundbus_root", 4,
|
||||
JH71X0__MUX(JH7100_CLK_CPUNDBUS_ROOT, "cpundbus_root", 0, 4,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL0_OUT,
|
||||
JH7100_CLK_PLL1_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_DLA_ROOT, "dla_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_DLA_ROOT, "dla_root", 0, 3,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL1_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_DSP_ROOT, "dsp_root", 4,
|
||||
JH71X0__MUX(JH7100_CLK_DSP_ROOT, "dsp_root", 0, 4,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL0_OUT,
|
||||
JH7100_CLK_PLL1_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_GMACUSB_ROOT, "gmacusb_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_GMACUSB_ROOT, "gmacusb_root", 0, 3,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL0_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_PERH0_ROOT, "perh0_root", 2,
|
||||
JH71X0__MUX(JH7100_CLK_PERH0_ROOT, "perh0_root", 0, 2,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL0_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_PERH1_ROOT, "perh1_root", 2,
|
||||
JH71X0__MUX(JH7100_CLK_PERH1_ROOT, "perh1_root", 0, 2,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_VIN_ROOT, "vin_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_VIN_ROOT, "vin_root", 0, 3,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL1_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_VOUT_ROOT, "vout_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_VOUT_ROOT, "vout_root", 0, 3,
|
||||
JH7100_CLK_OSC_AUD,
|
||||
JH7100_CLK_PLL0_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0_GDIV(JH7100_CLK_AUDIO_ROOT, "audio_root", 0, 8, JH7100_CLK_PLL0_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_CDECHIFI4_ROOT, "cdechifi4_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_CDECHIFI4_ROOT, "cdechifi4_root", 0, 3,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL1_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_CDEC_ROOT, "cdec_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_CDEC_ROOT, "cdec_root", 0, 3,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_PLL0_OUT,
|
||||
JH7100_CLK_PLL1_OUT),
|
||||
JH71X0__MUX(JH7100_CLK_VOUTBUS_ROOT, "voutbus_root", 3,
|
||||
JH71X0__MUX(JH7100_CLK_VOUTBUS_ROOT, "voutbus_root", 0, 3,
|
||||
JH7100_CLK_OSC_AUD,
|
||||
JH7100_CLK_PLL0_OUT,
|
||||
JH7100_CLK_PLL2_OUT),
|
||||
@ -76,7 +76,7 @@ static const struct jh71x0_clk_data jh7100_clk_data[] __initconst = {
|
||||
JH71X0_GDIV(JH7100_CLK_PLL0_TESTOUT, "pll0_testout", 0, 31, JH7100_CLK_PERH0_SRC),
|
||||
JH71X0_GDIV(JH7100_CLK_PLL1_TESTOUT, "pll1_testout", 0, 31, JH7100_CLK_DLA_ROOT),
|
||||
JH71X0_GDIV(JH7100_CLK_PLL2_TESTOUT, "pll2_testout", 0, 31, JH7100_CLK_PERH1_SRC),
|
||||
JH71X0__MUX(JH7100_CLK_PLL2_REF, "pll2_refclk", 2,
|
||||
JH71X0__MUX(JH7100_CLK_PLL2_REF, "pll2_refclk", 0, 2,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_OSC_AUD),
|
||||
JH71X0__DIV(JH7100_CLK_CPU_CORE, "cpu_core", 8, JH7100_CLK_CPUNBUS_ROOT_DIV),
|
||||
@ -142,7 +142,7 @@ static const struct jh71x0_clk_data jh7100_clk_data[] __initconst = {
|
||||
JH71X0__DIV(JH7100_CLK_NOC_COG, "noc_cog", 8, JH7100_CLK_DLA_ROOT),
|
||||
JH71X0_GATE(JH7100_CLK_NNE_AHB, "nne_ahb", 0, JH7100_CLK_AHB_BUS),
|
||||
JH71X0__DIV(JH7100_CLK_NNEBUS_SRC1, "nnebus_src1", 4, JH7100_CLK_DSP_ROOT),
|
||||
JH71X0__MUX(JH7100_CLK_NNE_BUS, "nne_bus", 2,
|
||||
JH71X0__MUX(JH7100_CLK_NNE_BUS, "nne_bus", 0, 2,
|
||||
JH7100_CLK_CPU_AXI,
|
||||
JH7100_CLK_NNEBUS_SRC1),
|
||||
JH71X0_GATE(JH7100_CLK_NNE_AXI, "nne_axi", 0, JH7100_CLK_NNE_BUS),
|
||||
@ -166,7 +166,7 @@ static const struct jh71x0_clk_data jh7100_clk_data[] __initconst = {
|
||||
JH71X0_GDIV(JH7100_CLK_USBPHY_125M, "usbphy_125m", 0, 8, JH7100_CLK_USBPHY_ROOTDIV),
|
||||
JH71X0_GDIV(JH7100_CLK_USBPHY_PLLDIV25M, "usbphy_plldiv25m", 0, 32,
|
||||
JH7100_CLK_USBPHY_ROOTDIV),
|
||||
JH71X0__MUX(JH7100_CLK_USBPHY_25M, "usbphy_25m", 2,
|
||||
JH71X0__MUX(JH7100_CLK_USBPHY_25M, "usbphy_25m", 0, 2,
|
||||
JH7100_CLK_OSC_SYS,
|
||||
JH7100_CLK_USBPHY_PLLDIV25M),
|
||||
JH71X0_FDIV(JH7100_CLK_AUDIO_DIV, "audio_div", JH7100_CLK_AUDIO_ROOT),
|
||||
@ -200,12 +200,12 @@ static const struct jh71x0_clk_data jh7100_clk_data[] __initconst = {
|
||||
JH71X0_GDIV(JH7100_CLK_GMAC_GTX, "gmac_gtxclk", 0, 255, JH7100_CLK_GMAC_ROOT_DIV),
|
||||
JH71X0_GDIV(JH7100_CLK_GMAC_RMII_TX, "gmac_rmii_txclk", 0, 8, JH7100_CLK_GMAC_RMII_REF),
|
||||
JH71X0_GDIV(JH7100_CLK_GMAC_RMII_RX, "gmac_rmii_rxclk", 0, 8, JH7100_CLK_GMAC_RMII_REF),
|
||||
JH71X0__MUX(JH7100_CLK_GMAC_TX, "gmac_tx", 3,
|
||||
JH71X0__MUX(JH7100_CLK_GMAC_TX, "gmac_tx", CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3,
|
||||
JH7100_CLK_GMAC_GTX,
|
||||
JH7100_CLK_GMAC_TX_INV,
|
||||
JH7100_CLK_GMAC_RMII_TX),
|
||||
JH71X0__INV(JH7100_CLK_GMAC_TX_INV, "gmac_tx_inv", JH7100_CLK_GMAC_TX),
|
||||
JH71X0__MUX(JH7100_CLK_GMAC_RX_PRE, "gmac_rx_pre", 2,
|
||||
JH71X0__MUX(JH7100_CLK_GMAC_RX_PRE, "gmac_rx_pre", 0, 2,
|
||||
JH7100_CLK_GMAC_GR_MII_RX,
|
||||
JH7100_CLK_GMAC_RMII_RX),
|
||||
JH71X0__INV(JH7100_CLK_GMAC_RX_INV, "gmac_rx_inv", JH7100_CLK_GMAC_RX_PRE),
|
||||
|
@ -26,7 +26,7 @@
|
||||
static const struct jh71x0_clk_data jh7110_aonclk_data[] = {
|
||||
/* source */
|
||||
JH71X0__DIV(JH7110_AONCLK_OSC_DIV4, "osc_div4", 4, JH7110_AONCLK_OSC),
|
||||
JH71X0__MUX(JH7110_AONCLK_APB_FUNC, "apb_func", 2,
|
||||
JH71X0__MUX(JH7110_AONCLK_APB_FUNC, "apb_func", 0, 2,
|
||||
JH7110_AONCLK_OSC_DIV4,
|
||||
JH7110_AONCLK_OSC),
|
||||
/* gmac0 */
|
||||
@ -39,7 +39,7 @@ static const struct jh71x0_clk_data jh7110_aonclk_data[] = {
|
||||
JH7110_AONCLK_GMAC0_GTXCLK,
|
||||
JH7110_AONCLK_GMAC0_RMII_RTX),
|
||||
JH71X0__INV(JH7110_AONCLK_GMAC0_TX_INV, "gmac0_tx_inv", JH7110_AONCLK_GMAC0_TX),
|
||||
JH71X0__MUX(JH7110_AONCLK_GMAC0_RX, "gmac0_rx", 2,
|
||||
JH71X0__MUX(JH7110_AONCLK_GMAC0_RX, "gmac0_rx", 0, 2,
|
||||
JH7110_AONCLK_GMAC0_RGMII_RXIN,
|
||||
JH7110_AONCLK_GMAC0_RMII_RTX),
|
||||
JH71X0__INV(JH7110_AONCLK_GMAC0_RX_INV, "gmac0_rx_inv", JH7110_AONCLK_GMAC0_RX),
|
||||
@ -48,7 +48,7 @@ static const struct jh71x0_clk_data jh7110_aonclk_data[] = {
|
||||
/* rtc */
|
||||
JH71X0_GATE(JH7110_AONCLK_RTC_APB, "rtc_apb", 0, JH7110_AONCLK_APB_BUS),
|
||||
JH71X0__DIV(JH7110_AONCLK_RTC_INTERNAL, "rtc_internal", 1022, JH7110_AONCLK_OSC),
|
||||
JH71X0__MUX(JH7110_AONCLK_RTC_32K, "rtc_32k", 2,
|
||||
JH71X0__MUX(JH7110_AONCLK_RTC_32K, "rtc_32k", 0, 2,
|
||||
JH7110_AONCLK_RTC_OSC,
|
||||
JH7110_AONCLK_RTC_INTERNAL),
|
||||
JH71X0_GATE(JH7110_AONCLK_RTC_CAL, "rtc_cal", 0, JH7110_AONCLK_OSC),
|
||||
|
@ -53,7 +53,7 @@ static const struct jh71x0_clk_data jh7110_ispclk_data[] = {
|
||||
JH7110_ISPCLK_MIPI_RX0_PXL),
|
||||
JH71X0_GATE(JH7110_ISPCLK_VIN_PIXEL_IF3, "vin_pixel_if3", 0,
|
||||
JH7110_ISPCLK_MIPI_RX0_PXL),
|
||||
JH71X0__MUX(JH7110_ISPCLK_VIN_P_AXI_WR, "vin_p_axi_wr", 2,
|
||||
JH71X0__MUX(JH7110_ISPCLK_VIN_P_AXI_WR, "vin_p_axi_wr", 0, 2,
|
||||
JH7110_ISPCLK_MIPI_RX0_PXL,
|
||||
JH7110_ISPCLK_DVP_INV),
|
||||
/* ispv2_top_wrapper */
|
||||
|
@ -36,18 +36,18 @@
|
||||
|
||||
static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
/* root */
|
||||
JH71X0__MUX(JH7110_SYSCLK_CPU_ROOT, "cpu_root", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_CPU_ROOT, "cpu_root", 0, 2,
|
||||
JH7110_SYSCLK_OSC,
|
||||
JH7110_SYSCLK_PLL0_OUT),
|
||||
JH71X0__DIV(JH7110_SYSCLK_CPU_CORE, "cpu_core", 7, JH7110_SYSCLK_CPU_ROOT),
|
||||
JH71X0__DIV(JH7110_SYSCLK_CPU_BUS, "cpu_bus", 2, JH7110_SYSCLK_CPU_CORE),
|
||||
JH71X0__MUX(JH7110_SYSCLK_GPU_ROOT, "gpu_root", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_GPU_ROOT, "gpu_root", 0, 2,
|
||||
JH7110_SYSCLK_PLL2_OUT,
|
||||
JH7110_SYSCLK_PLL1_OUT),
|
||||
JH71X0_MDIV(JH7110_SYSCLK_PERH_ROOT, "perh_root", 2, 2,
|
||||
JH7110_SYSCLK_PLL0_OUT,
|
||||
JH7110_SYSCLK_PLL2_OUT),
|
||||
JH71X0__MUX(JH7110_SYSCLK_BUS_ROOT, "bus_root", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_BUS_ROOT, "bus_root", 0, 2,
|
||||
JH7110_SYSCLK_OSC,
|
||||
JH7110_SYSCLK_PLL2_OUT),
|
||||
JH71X0__DIV(JH7110_SYSCLK_NOCSTG_BUS, "nocstg_bus", 3, JH7110_SYSCLK_BUS_ROOT),
|
||||
@ -62,7 +62,7 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0__DIV(JH7110_SYSCLK_PLL2_DIV2, "pll2_div2", 2, JH7110_SYSCLK_PLL2_OUT),
|
||||
JH71X0__DIV(JH7110_SYSCLK_AUDIO_ROOT, "audio_root", 8, JH7110_SYSCLK_PLL2_OUT),
|
||||
JH71X0__DIV(JH7110_SYSCLK_MCLK_INNER, "mclk_inner", 64, JH7110_SYSCLK_AUDIO_ROOT),
|
||||
JH71X0__MUX(JH7110_SYSCLK_MCLK, "mclk", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_MCLK, "mclk", 0, 2,
|
||||
JH7110_SYSCLK_MCLK_INNER,
|
||||
JH7110_SYSCLK_MCLK_EXT),
|
||||
JH71X0_GATE(JH7110_SYSCLK_MCLK_OUT, "mclk_out", 0, JH7110_SYSCLK_MCLK_INNER),
|
||||
@ -96,7 +96,7 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0__DIV(JH7110_SYSCLK_OSC_DIV2, "osc_div2", 2, JH7110_SYSCLK_OSC),
|
||||
JH71X0__DIV(JH7110_SYSCLK_PLL1_DIV4, "pll1_div4", 2, JH7110_SYSCLK_PLL1_DIV2),
|
||||
JH71X0__DIV(JH7110_SYSCLK_PLL1_DIV8, "pll1_div8", 2, JH7110_SYSCLK_PLL1_DIV4),
|
||||
JH71X0__MUX(JH7110_SYSCLK_DDR_BUS, "ddr_bus", 4,
|
||||
JH71X0__MUX(JH7110_SYSCLK_DDR_BUS, "ddr_bus", 0, 4,
|
||||
JH7110_SYSCLK_OSC_DIV2,
|
||||
JH7110_SYSCLK_PLL1_DIV2,
|
||||
JH7110_SYSCLK_PLL1_DIV4,
|
||||
@ -186,7 +186,7 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0__DIV(JH7110_SYSCLK_GMAC1_RMII_RTX, "gmac1_rmii_rtx", 30,
|
||||
JH7110_SYSCLK_GMAC1_RMII_REFIN),
|
||||
JH71X0_GDIV(JH7110_SYSCLK_GMAC1_PTP, "gmac1_ptp", 0, 31, JH7110_SYSCLK_GMAC_SRC),
|
||||
JH71X0__MUX(JH7110_SYSCLK_GMAC1_RX, "gmac1_rx", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_GMAC1_RX, "gmac1_rx", 0, 2,
|
||||
JH7110_SYSCLK_GMAC1_RGMII_RXIN,
|
||||
JH7110_SYSCLK_GMAC1_RMII_RTX),
|
||||
JH71X0__INV(JH7110_SYSCLK_GMAC1_RX_INV, "gmac1_rx_inv", JH7110_SYSCLK_GMAC1_RX),
|
||||
@ -270,11 +270,11 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0_MDIV(JH7110_SYSCLK_I2STX0_LRCK_MST, "i2stx0_lrck_mst", 64, 2,
|
||||
JH7110_SYSCLK_I2STX0_BCLK_MST_INV,
|
||||
JH7110_SYSCLK_I2STX0_BCLK_MST),
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX0_BCLK, "i2stx0_bclk", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX0_BCLK, "i2stx0_bclk", 0, 2,
|
||||
JH7110_SYSCLK_I2STX0_BCLK_MST,
|
||||
JH7110_SYSCLK_I2STX_BCLK_EXT),
|
||||
JH71X0__INV(JH7110_SYSCLK_I2STX0_BCLK_INV, "i2stx0_bclk_inv", JH7110_SYSCLK_I2STX0_BCLK),
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX0_LRCK, "i2stx0_lrck", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX0_LRCK, "i2stx0_lrck", 0, 2,
|
||||
JH7110_SYSCLK_I2STX0_LRCK_MST,
|
||||
JH7110_SYSCLK_I2STX_LRCK_EXT),
|
||||
/* i2stx1 */
|
||||
@ -285,11 +285,11 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0_MDIV(JH7110_SYSCLK_I2STX1_LRCK_MST, "i2stx1_lrck_mst", 64, 2,
|
||||
JH7110_SYSCLK_I2STX1_BCLK_MST_INV,
|
||||
JH7110_SYSCLK_I2STX1_BCLK_MST),
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX1_BCLK, "i2stx1_bclk", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX1_BCLK, "i2stx1_bclk", 0, 2,
|
||||
JH7110_SYSCLK_I2STX1_BCLK_MST,
|
||||
JH7110_SYSCLK_I2STX_BCLK_EXT),
|
||||
JH71X0__INV(JH7110_SYSCLK_I2STX1_BCLK_INV, "i2stx1_bclk_inv", JH7110_SYSCLK_I2STX1_BCLK),
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX1_LRCK, "i2stx1_lrck", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2STX1_LRCK, "i2stx1_lrck", 0, 2,
|
||||
JH7110_SYSCLK_I2STX1_LRCK_MST,
|
||||
JH7110_SYSCLK_I2STX_LRCK_EXT),
|
||||
/* i2srx */
|
||||
@ -300,11 +300,11 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0_MDIV(JH7110_SYSCLK_I2SRX_LRCK_MST, "i2srx_lrck_mst", 64, 2,
|
||||
JH7110_SYSCLK_I2SRX_BCLK_MST_INV,
|
||||
JH7110_SYSCLK_I2SRX_BCLK_MST),
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2SRX_BCLK, "i2srx_bclk", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2SRX_BCLK, "i2srx_bclk", 0, 2,
|
||||
JH7110_SYSCLK_I2SRX_BCLK_MST,
|
||||
JH7110_SYSCLK_I2SRX_BCLK_EXT),
|
||||
JH71X0__INV(JH7110_SYSCLK_I2SRX_BCLK_INV, "i2srx_bclk_inv", JH7110_SYSCLK_I2SRX_BCLK),
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2SRX_LRCK, "i2srx_lrck", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_I2SRX_LRCK, "i2srx_lrck", 0, 2,
|
||||
JH7110_SYSCLK_I2SRX_LRCK_MST,
|
||||
JH7110_SYSCLK_I2SRX_LRCK_EXT),
|
||||
/* pdm */
|
||||
@ -314,7 +314,7 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
|
||||
JH71X0_GATE(JH7110_SYSCLK_TDM_AHB, "tdm_ahb", 0, JH7110_SYSCLK_AHB0),
|
||||
JH71X0_GATE(JH7110_SYSCLK_TDM_APB, "tdm_apb", 0, JH7110_SYSCLK_APB0),
|
||||
JH71X0_GDIV(JH7110_SYSCLK_TDM_INTERNAL, "tdm_internal", 0, 64, JH7110_SYSCLK_MCLK),
|
||||
JH71X0__MUX(JH7110_SYSCLK_TDM_TDM, "tdm_tdm", 2,
|
||||
JH71X0__MUX(JH7110_SYSCLK_TDM_TDM, "tdm_tdm", 0, 2,
|
||||
JH7110_SYSCLK_TDM_INTERNAL,
|
||||
JH7110_SYSCLK_TDM_EXT),
|
||||
JH71X0__INV(JH7110_SYSCLK_TDM_TDM_INV, "tdm_tdm_inv", JH7110_SYSCLK_TDM_TDM),
|
||||
|
@ -61,10 +61,10 @@ struct jh71x0_clk_data {
|
||||
.parents = { [0] = _parent }, \
|
||||
}
|
||||
|
||||
#define JH71X0__MUX(_idx, _name, _nparents, ...) \
|
||||
#define JH71X0__MUX(_idx, _name, _flags, _nparents, ...) \
|
||||
[_idx] = { \
|
||||
.name = _name, \
|
||||
.flags = 0, \
|
||||
.flags = _flags, \
|
||||
.max = ((_nparents) - 1) << JH71X0_CLK_MUX_SHIFT, \
|
||||
.parents = { __VA_ARGS__ }, \
|
||||
}
|
||||
|
29
drivers/clk/stm32/Kconfig
Normal file
29
drivers/clk/stm32/Kconfig
Normal file
@ -0,0 +1,29 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# common clock support for STMicroelectronics SoC family.
|
||||
|
||||
menuconfig COMMON_CLK_STM32MP
|
||||
bool "Clock support for common STM32MP clocks"
|
||||
depends on ARCH_STM32 || COMPILE_TEST
|
||||
default y
|
||||
select RESET_CONTROLLER
|
||||
help
|
||||
Support for STM32MP SoC family clocks.
|
||||
|
||||
if COMMON_CLK_STM32MP
|
||||
|
||||
config COMMON_CLK_STM32MP135
|
||||
bool "Clock driver for stm32mp13x clocks"
|
||||
depends on ARM || COMPILE_TEST
|
||||
default y
|
||||
help
|
||||
Support for stm32mp13x SoC family clocks.
|
||||
|
||||
config COMMON_CLK_STM32MP157
|
||||
bool "Clock driver for stm32mp15x clocks"
|
||||
depends on ARM || COMPILE_TEST
|
||||
default y
|
||||
help
|
||||
Support for stm32mp15x SoC family clocks.
|
||||
|
||||
endif
|
||||
|
@ -1 +1,2 @@
|
||||
obj-$(CONFIG_COMMON_CLK_STM32MP135) += clk-stm32mp13.o clk-stm32-core.o reset-stm32.o
|
||||
obj-$(CONFIG_COMMON_CLK_STM32MP157) += clk-stm32mp1.o reset-stm32.o
|
||||
|
@ -70,6 +70,7 @@ static int stm32_rcc_clock_init(struct device *dev,
|
||||
int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
|
||||
void __iomem *base)
|
||||
{
|
||||
const struct stm32_rcc_match_data *rcc_match_data;
|
||||
const struct of_device_id *match;
|
||||
int err;
|
||||
|
||||
@ -79,8 +80,10 @@ int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rcc_match_data = match->data;
|
||||
|
||||
/* RCC Reset Configuration */
|
||||
err = stm32_rcc_reset_init(dev, match, base);
|
||||
err = stm32_rcc_reset_init(dev, rcc_match_data->reset_data, base);
|
||||
if (err) {
|
||||
pr_err("stm32 reset failed to initialize\n");
|
||||
return err;
|
||||
|
@ -70,15 +70,12 @@ struct stm32_rcc_match_data {
|
||||
const struct clock_config *tab_clocks;
|
||||
unsigned int maxbinding;
|
||||
struct clk_stm32_clock_data *clock_data;
|
||||
u32 clear_offset;
|
||||
struct clk_stm32_reset_data *reset_data;
|
||||
int (*check_security)(void __iomem *base,
|
||||
const struct clock_config *cfg);
|
||||
int (*multi_mux)(void __iomem *base, const struct clock_config *cfg);
|
||||
};
|
||||
|
||||
int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
|
||||
void __iomem *base);
|
||||
|
||||
int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
|
||||
void __iomem *base);
|
||||
|
||||
|
@ -20,6 +20,10 @@
|
||||
|
||||
#include <dt-bindings/clock/stm32mp1-clks.h>
|
||||
|
||||
#include "reset-stm32.h"
|
||||
|
||||
#define STM32MP1_RESET_ID_MASK GENMASK(15, 0)
|
||||
|
||||
static DEFINE_SPINLOCK(rlock);
|
||||
|
||||
#define RCC_OCENSETR 0x0C
|
||||
@ -2137,22 +2141,27 @@ struct stm32_rcc_match_data {
|
||||
const struct clock_config *cfg;
|
||||
unsigned int num;
|
||||
unsigned int maxbinding;
|
||||
u32 clear_offset;
|
||||
struct clk_stm32_reset_data *reset_data;
|
||||
bool (*check_security)(const struct clock_config *cfg);
|
||||
};
|
||||
|
||||
static struct clk_stm32_reset_data stm32mp1_reset_data = {
|
||||
.nr_lines = STM32MP1_RESET_ID_MASK,
|
||||
.clear_offset = RCC_CLR,
|
||||
};
|
||||
|
||||
static struct stm32_rcc_match_data stm32mp1_data = {
|
||||
.cfg = stm32mp1_clock_cfg,
|
||||
.num = ARRAY_SIZE(stm32mp1_clock_cfg),
|
||||
.maxbinding = STM32MP1_LAST_CLK,
|
||||
.clear_offset = RCC_CLR,
|
||||
.reset_data = &stm32mp1_reset_data,
|
||||
};
|
||||
|
||||
static struct stm32_rcc_match_data stm32mp1_data_secure = {
|
||||
.cfg = stm32mp1_clock_cfg,
|
||||
.num = ARRAY_SIZE(stm32mp1_clock_cfg),
|
||||
.maxbinding = STM32MP1_LAST_CLK,
|
||||
.clear_offset = RCC_CLR,
|
||||
.reset_data = &stm32mp1_reset_data,
|
||||
.check_security = &stm32_check_security
|
||||
};
|
||||
|
||||
@ -2193,113 +2202,6 @@ static int stm32_register_hw_clk(struct device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define STM32_RESET_ID_MASK GENMASK(15, 0)
|
||||
|
||||
struct stm32_reset_data {
|
||||
/* reset lock */
|
||||
spinlock_t lock;
|
||||
struct reset_controller_dev rcdev;
|
||||
void __iomem *membase;
|
||||
u32 clear_offset;
|
||||
};
|
||||
|
||||
static inline struct stm32_reset_data *
|
||||
to_stm32_reset_data(struct reset_controller_dev *rcdev)
|
||||
{
|
||||
return container_of(rcdev, struct stm32_reset_data, rcdev);
|
||||
}
|
||||
|
||||
static int stm32_reset_update(struct reset_controller_dev *rcdev,
|
||||
unsigned long id, bool assert)
|
||||
{
|
||||
struct stm32_reset_data *data = to_stm32_reset_data(rcdev);
|
||||
int reg_width = sizeof(u32);
|
||||
int bank = id / (reg_width * BITS_PER_BYTE);
|
||||
int offset = id % (reg_width * BITS_PER_BYTE);
|
||||
|
||||
if (data->clear_offset) {
|
||||
void __iomem *addr;
|
||||
|
||||
addr = data->membase + (bank * reg_width);
|
||||
if (!assert)
|
||||
addr += data->clear_offset;
|
||||
|
||||
writel(BIT(offset), addr);
|
||||
|
||||
} else {
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
|
||||
spin_lock_irqsave(&data->lock, flags);
|
||||
|
||||
reg = readl(data->membase + (bank * reg_width));
|
||||
|
||||
if (assert)
|
||||
reg |= BIT(offset);
|
||||
else
|
||||
reg &= ~BIT(offset);
|
||||
|
||||
writel(reg, data->membase + (bank * reg_width));
|
||||
|
||||
spin_unlock_irqrestore(&data->lock, flags);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stm32_reset_assert(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
return stm32_reset_update(rcdev, id, true);
|
||||
}
|
||||
|
||||
static int stm32_reset_deassert(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
return stm32_reset_update(rcdev, id, false);
|
||||
}
|
||||
|
||||
static int stm32_reset_status(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
struct stm32_reset_data *data = to_stm32_reset_data(rcdev);
|
||||
int reg_width = sizeof(u32);
|
||||
int bank = id / (reg_width * BITS_PER_BYTE);
|
||||
int offset = id % (reg_width * BITS_PER_BYTE);
|
||||
u32 reg;
|
||||
|
||||
reg = readl(data->membase + (bank * reg_width));
|
||||
|
||||
return !!(reg & BIT(offset));
|
||||
}
|
||||
|
||||
static const struct reset_control_ops stm32_reset_ops = {
|
||||
.assert = stm32_reset_assert,
|
||||
.deassert = stm32_reset_deassert,
|
||||
.status = stm32_reset_status,
|
||||
};
|
||||
|
||||
static int stm32_rcc_reset_init(struct device *dev, void __iomem *base,
|
||||
const struct of_device_id *match)
|
||||
{
|
||||
const struct stm32_rcc_match_data *data = match->data;
|
||||
struct stm32_reset_data *reset_data = NULL;
|
||||
|
||||
reset_data = kzalloc(sizeof(*reset_data), GFP_KERNEL);
|
||||
if (!reset_data)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&reset_data->lock);
|
||||
reset_data->membase = base;
|
||||
reset_data->rcdev.owner = THIS_MODULE;
|
||||
reset_data->rcdev.ops = &stm32_reset_ops;
|
||||
reset_data->rcdev.of_node = dev_of_node(dev);
|
||||
reset_data->rcdev.nr_resets = STM32_RESET_ID_MASK;
|
||||
reset_data->clear_offset = data->clear_offset;
|
||||
|
||||
return reset_controller_register(&reset_data->rcdev);
|
||||
}
|
||||
|
||||
static int stm32_rcc_clock_init(struct device *dev, void __iomem *base,
|
||||
const struct of_device_id *match)
|
||||
{
|
||||
@ -2342,6 +2244,7 @@ static int stm32_rcc_clock_init(struct device *dev, void __iomem *base,
|
||||
static int stm32_rcc_init(struct device *dev, void __iomem *base,
|
||||
const struct of_device_id *match_data)
|
||||
{
|
||||
const struct stm32_rcc_match_data *rcc_match_data;
|
||||
const struct of_device_id *match;
|
||||
int err;
|
||||
|
||||
@ -2351,8 +2254,10 @@ static int stm32_rcc_init(struct device *dev, void __iomem *base,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rcc_match_data = match->data;
|
||||
|
||||
/* RCC Reset Configuration */
|
||||
err = stm32_rcc_reset_init(dev, base, match);
|
||||
err = stm32_rcc_reset_init(dev, rcc_match_data->reset_data, base);
|
||||
if (err) {
|
||||
pr_err("stm32mp1 reset failed to initialize\n");
|
||||
return err;
|
@ -10,8 +10,10 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <dt-bindings/clock/stm32mp13-clks.h>
|
||||
#include "clk-stm32-core.h"
|
||||
#include "reset-stm32.h"
|
||||
#include "stm32mp13_rcc.h"
|
||||
|
||||
#define STM32MP1_RESET_ID_MASK GENMASK(15, 0)
|
||||
#define RCC_CLR_OFFSET 0x4
|
||||
|
||||
/* STM32 Gates definition */
|
||||
@ -1511,13 +1513,18 @@ static struct clk_stm32_clock_data stm32mp13_clock_data = {
|
||||
.is_multi_mux = stm32mp13_is_multi_mux,
|
||||
};
|
||||
|
||||
static struct clk_stm32_reset_data stm32mp13_reset_data = {
|
||||
.nr_lines = STM32MP1_RESET_ID_MASK,
|
||||
.clear_offset = RCC_CLR_OFFSET,
|
||||
};
|
||||
|
||||
static const struct stm32_rcc_match_data stm32mp13_data = {
|
||||
.tab_clocks = stm32mp13_clock_cfg,
|
||||
.num_clocks = ARRAY_SIZE(stm32mp13_clock_cfg),
|
||||
.clock_data = &stm32mp13_clock_data,
|
||||
.check_security = &stm32mp13_clock_is_provided_by_secure,
|
||||
.maxbinding = STM32MP1_LAST_CLK,
|
||||
.clear_offset = RCC_CLR_OFFSET,
|
||||
.reset_data = &stm32mp13_reset_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id stm32mp13_match_data[] = {
|
||||
|
@ -11,9 +11,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include "clk-stm32-core.h"
|
||||
|
||||
#define STM32_RESET_ID_MASK GENMASK(15, 0)
|
||||
#include "reset-stm32.h"
|
||||
|
||||
struct stm32_reset_data {
|
||||
/* reset lock */
|
||||
@ -99,24 +97,22 @@ static const struct reset_control_ops stm32_reset_ops = {
|
||||
.status = stm32_reset_status,
|
||||
};
|
||||
|
||||
int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
|
||||
int stm32_rcc_reset_init(struct device *dev, struct clk_stm32_reset_data *data,
|
||||
void __iomem *base)
|
||||
{
|
||||
const struct stm32_rcc_match_data *data = match->data;
|
||||
struct stm32_reset_data *reset_data = NULL;
|
||||
|
||||
data = match->data;
|
||||
struct stm32_reset_data *reset_data;
|
||||
|
||||
reset_data = kzalloc(sizeof(*reset_data), GFP_KERNEL);
|
||||
if (!reset_data)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&reset_data->lock);
|
||||
|
||||
reset_data->membase = base;
|
||||
reset_data->rcdev.owner = THIS_MODULE;
|
||||
reset_data->rcdev.ops = &stm32_reset_ops;
|
||||
reset_data->rcdev.of_node = dev_of_node(dev);
|
||||
reset_data->rcdev.nr_resets = STM32_RESET_ID_MASK;
|
||||
reset_data->rcdev.nr_resets = data->nr_lines;
|
||||
reset_data->clear_offset = data->clear_offset;
|
||||
|
||||
return reset_controller_register(&reset_data->rcdev);
|
||||
|
@ -4,5 +4,11 @@
|
||||
* Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
|
||||
*/
|
||||
|
||||
int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
|
||||
struct clk_stm32_reset_data {
|
||||
const struct reset_control_ops *ops;
|
||||
unsigned int nr_lines;
|
||||
u32 clear_offset;
|
||||
};
|
||||
|
||||
int stm32_rcc_reset_init(struct device *dev, struct clk_stm32_reset_data *data,
|
||||
void __iomem *base);
|
||||
|
@ -21,17 +21,16 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common
|
||||
unsigned long *parent, unsigned long rate,
|
||||
struct _ccu_nkm *nkm)
|
||||
{
|
||||
unsigned long best_rate = 0, best_parent_rate = *parent, tmp_parent = *parent;
|
||||
unsigned long best_rate = 0, best_parent_rate = *parent;
|
||||
unsigned long best_n = 0, best_k = 0, best_m = 0;
|
||||
unsigned long _n, _k, _m;
|
||||
|
||||
for (_k = nkm->min_k; _k <= nkm->max_k; _k++) {
|
||||
for (_n = nkm->min_n; _n <= nkm->max_n; _n++) {
|
||||
for (_m = nkm->min_m; _m <= nkm->max_m; _m++) {
|
||||
unsigned long tmp_rate;
|
||||
unsigned long tmp_rate, tmp_parent;
|
||||
|
||||
tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k));
|
||||
|
||||
tmp_rate = tmp_parent * _n * _k / _m;
|
||||
|
||||
if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) ||
|
||||
|
@ -23,15 +23,41 @@
|
||||
#define WZRD_NUM_OUTPUTS 7
|
||||
#define WZRD_ACLK_MAX_FREQ 250000000UL
|
||||
|
||||
#define WZRD_CLK_CFG_REG(n) (0x200 + 4 * (n))
|
||||
#define WZRD_CLK_CFG_REG(v, n) (0x200 + 0x130 * (v) + 4 * (n))
|
||||
|
||||
#define WZRD_CLKOUT0_FRAC_EN BIT(18)
|
||||
#define WZRD_CLKFBOUT_FRAC_EN BIT(26)
|
||||
#define WZRD_CLKFBOUT_1 0
|
||||
#define WZRD_CLKFBOUT_2 1
|
||||
#define WZRD_CLKOUT0_1 2
|
||||
#define WZRD_CLKOUT0_2 3
|
||||
#define WZRD_DESKEW_2 20
|
||||
#define WZRD_DIVCLK 21
|
||||
#define WZRD_CLKFBOUT_4 51
|
||||
#define WZRD_CLKFBOUT_3 48
|
||||
#define WZRD_DUTY_CYCLE 2
|
||||
#define WZRD_O_DIV 4
|
||||
|
||||
#define WZRD_CLKFBOUT_FRAC_EN BIT(1)
|
||||
#define WZRD_CLKFBOUT_PREDIV2 (BIT(11) | BIT(12) | BIT(9))
|
||||
#define WZRD_MULT_PREDIV2 (BIT(10) | BIT(9) | BIT(12))
|
||||
#define WZRD_CLKFBOUT_EDGE BIT(8)
|
||||
#define WZRD_P5EN BIT(13)
|
||||
#define WZRD_P5EN_SHIFT 13
|
||||
#define WZRD_P5FEDGE BIT(15)
|
||||
#define WZRD_DIVCLK_EDGE BIT(10)
|
||||
#define WZRD_P5FEDGE_SHIFT 15
|
||||
#define WZRD_CLKOUT0_PREDIV2 BIT(11)
|
||||
#define WZRD_EDGE_SHIFT 8
|
||||
|
||||
#define WZRD_CLKFBOUT_MULT_SHIFT 8
|
||||
#define WZRD_CLKFBOUT_MULT_MASK (0xff << WZRD_CLKFBOUT_MULT_SHIFT)
|
||||
#define WZRD_CLKFBOUT_L_SHIFT 0
|
||||
#define WZRD_CLKFBOUT_H_SHIFT 8
|
||||
#define WZRD_CLKFBOUT_L_MASK GENMASK(7, 0)
|
||||
#define WZRD_CLKFBOUT_H_MASK GENMASK(15, 8)
|
||||
#define WZRD_CLKFBOUT_FRAC_SHIFT 16
|
||||
#define WZRD_CLKFBOUT_FRAC_MASK (0x3ff << WZRD_CLKFBOUT_FRAC_SHIFT)
|
||||
#define WZRD_VERSAL_FRAC_MASK GENMASK(5, 0)
|
||||
#define WZRD_DIVCLK_DIVIDE_SHIFT 0
|
||||
#define WZRD_DIVCLK_DIVIDE_MASK (0xff << WZRD_DIVCLK_DIVIDE_SHIFT)
|
||||
#define WZRD_CLKOUT_DIVIDE_SHIFT 0
|
||||
@ -45,6 +71,7 @@
|
||||
#define WZRD_DR_STATUS_REG_OFFSET 0x04
|
||||
#define WZRD_DR_LOCK_BIT_MASK 0x00000001
|
||||
#define WZRD_DR_INIT_REG_OFFSET 0x25C
|
||||
#define WZRD_DR_INIT_VERSAL_OFFSET 0x14
|
||||
#define WZRD_DR_DIV_TO_PHASE_OFFSET 4
|
||||
#define WZRD_DR_BEGIN_DYNA_RECONF 0x03
|
||||
#define WZRD_DR_BEGIN_DYNA_RECONF_5_2 0x07
|
||||
@ -52,6 +79,8 @@
|
||||
|
||||
#define WZRD_USEC_POLL 10
|
||||
#define WZRD_TIMEOUT_POLL 1000
|
||||
#define WZRD_FRAC_GRADIENT 64
|
||||
#define PREDIV2_MULT 2
|
||||
|
||||
/* Divider limits, from UG572 Table 3-4 for Ultrascale+ */
|
||||
#define DIV_O 0x01
|
||||
@ -65,6 +94,14 @@
|
||||
#define WZRD_VCO_MAX 1600000000
|
||||
#define WZRD_O_MIN 1
|
||||
#define WZRD_O_MAX 128
|
||||
#define VER_WZRD_M_MIN 4
|
||||
#define VER_WZRD_M_MAX 432
|
||||
#define VER_WZRD_D_MIN 1
|
||||
#define VER_WZRD_D_MAX 123
|
||||
#define VER_WZRD_VCO_MIN 2160000000ULL
|
||||
#define VER_WZRD_VCO_MAX 4320000000ULL
|
||||
#define VER_WZRD_O_MIN 2
|
||||
#define VER_WZRD_O_MAX 511
|
||||
#define WZRD_MIN_ERR 20000
|
||||
#define WZRD_FRAC_POINTS 1000
|
||||
|
||||
@ -135,6 +172,10 @@ struct clk_wzrd_divider {
|
||||
spinlock_t *lock; /* divider lock */
|
||||
};
|
||||
|
||||
struct versal_clk_data {
|
||||
bool is_versal;
|
||||
};
|
||||
|
||||
#define to_clk_wzrd(_nb) container_of(_nb, struct clk_wzrd, nb)
|
||||
|
||||
/* maximum frequencies for input/output clocks per speed grade */
|
||||
@ -147,6 +188,31 @@ static const unsigned long clk_wzrd_max_freq[] = {
|
||||
/* spin lock variable for clk_wzrd */
|
||||
static DEFINE_SPINLOCK(clkwzrd_lock);
|
||||
|
||||
static unsigned long clk_wzrd_recalc_rate_ver(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
void __iomem *div_addr = divider->base + divider->offset;
|
||||
u32 div, p5en, edge, prediv2, all;
|
||||
unsigned int vall, valh;
|
||||
|
||||
edge = !!(readl(div_addr) & WZRD_CLKFBOUT_EDGE);
|
||||
p5en = !!(readl(div_addr) & WZRD_P5EN);
|
||||
prediv2 = !!(readl(div_addr) & WZRD_CLKOUT0_PREDIV2);
|
||||
vall = readl(div_addr + 4) & WZRD_CLKFBOUT_L_MASK;
|
||||
valh = readl(div_addr + 4) >> WZRD_CLKFBOUT_H_SHIFT;
|
||||
all = valh + vall + edge;
|
||||
if (!all)
|
||||
all = 1;
|
||||
|
||||
if (prediv2)
|
||||
div = 2 * all + prediv2 * p5en;
|
||||
else
|
||||
div = all;
|
||||
|
||||
return DIV_ROUND_UP_ULL((u64)parent_rate, div);
|
||||
}
|
||||
|
||||
static unsigned long clk_wzrd_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
@ -161,19 +227,64 @@ static unsigned long clk_wzrd_recalc_rate(struct clk_hw *hw,
|
||||
divider->flags, divider->width);
|
||||
}
|
||||
|
||||
static int clk_wzrd_ver_dynamic_reconfig(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
void __iomem *div_addr = divider->base + divider->offset;
|
||||
u32 value, regh, edged, p5en, p5fedge, regval, regval1;
|
||||
unsigned long flags;
|
||||
int err;
|
||||
|
||||
spin_lock_irqsave(divider->lock, flags);
|
||||
|
||||
value = DIV_ROUND_CLOSEST(parent_rate, rate);
|
||||
|
||||
regh = (value / 4);
|
||||
regval1 = readl(div_addr);
|
||||
regval1 |= WZRD_CLKFBOUT_PREDIV2;
|
||||
regval1 = regval1 & ~(WZRD_CLKFBOUT_EDGE | WZRD_P5EN | WZRD_P5FEDGE);
|
||||
if (value % 4 > 1) {
|
||||
edged = 1;
|
||||
regval1 |= (edged << WZRD_EDGE_SHIFT);
|
||||
}
|
||||
p5fedge = value % 2;
|
||||
p5en = value % 2;
|
||||
regval1 = regval1 | p5en << WZRD_P5EN_SHIFT | p5fedge << WZRD_P5FEDGE_SHIFT;
|
||||
writel(regval1, div_addr);
|
||||
|
||||
regval = regh | regh << WZRD_CLKFBOUT_H_SHIFT;
|
||||
writel(regval, div_addr + 4);
|
||||
/* Check status register */
|
||||
err = readl_poll_timeout_atomic(divider->base + WZRD_DR_STATUS_REG_OFFSET,
|
||||
value, value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
if (err)
|
||||
goto err_reconfig;
|
||||
|
||||
/* Initiate reconfiguration */
|
||||
writel(WZRD_DR_BEGIN_DYNA_RECONF,
|
||||
divider->base + WZRD_DR_INIT_VERSAL_OFFSET);
|
||||
|
||||
/* Check status register */
|
||||
err = readl_poll_timeout_atomic(divider->base + WZRD_DR_STATUS_REG_OFFSET,
|
||||
value, value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
err_reconfig:
|
||||
spin_unlock_irqrestore(divider->lock, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int clk_wzrd_dynamic_reconfig(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
int err;
|
||||
u32 value;
|
||||
unsigned long flags = 0;
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
void __iomem *div_addr = divider->base + divider->offset;
|
||||
unsigned long flags;
|
||||
u32 value;
|
||||
int err;
|
||||
|
||||
if (divider->lock)
|
||||
spin_lock_irqsave(divider->lock, flags);
|
||||
else
|
||||
__acquire(divider->lock);
|
||||
spin_lock_irqsave(divider->lock, flags);
|
||||
|
||||
value = DIV_ROUND_CLOSEST(parent_rate, rate);
|
||||
|
||||
@ -185,9 +296,9 @@ static int clk_wzrd_dynamic_reconfig(struct clk_hw *hw, unsigned long rate,
|
||||
writel(0x00, div_addr + WZRD_DR_DIV_TO_PHASE_OFFSET);
|
||||
|
||||
/* Check status register */
|
||||
err = readl_poll_timeout(divider->base + WZRD_DR_STATUS_REG_OFFSET,
|
||||
value, value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
err = readl_poll_timeout_atomic(divider->base + WZRD_DR_STATUS_REG_OFFSET,
|
||||
value, value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
if (err)
|
||||
goto err_reconfig;
|
||||
|
||||
@ -198,14 +309,11 @@ static int clk_wzrd_dynamic_reconfig(struct clk_hw *hw, unsigned long rate,
|
||||
divider->base + WZRD_DR_INIT_REG_OFFSET);
|
||||
|
||||
/* Check status register */
|
||||
err = readl_poll_timeout(divider->base + WZRD_DR_STATUS_REG_OFFSET,
|
||||
value, value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
err = readl_poll_timeout_atomic(divider->base + WZRD_DR_STATUS_REG_OFFSET,
|
||||
value, value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
err_reconfig:
|
||||
if (divider->lock)
|
||||
spin_unlock_irqrestore(divider->lock, flags);
|
||||
else
|
||||
__release(divider->lock);
|
||||
spin_unlock_irqrestore(divider->lock, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -223,18 +331,28 @@ static long clk_wzrd_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
return *prate / div;
|
||||
}
|
||||
|
||||
static int clk_wzrd_get_divisors(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
static int clk_wzrd_get_divisors_ver(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
unsigned long vco_freq, freq, diff;
|
||||
u64 vco_freq, freq, diff, vcomin, vcomax;
|
||||
u32 m, d, o;
|
||||
u32 mmin, mmax, dmin, dmax, omin, omax;
|
||||
|
||||
for (m = WZRD_M_MIN; m <= WZRD_M_MAX; m++) {
|
||||
for (d = WZRD_D_MIN; d <= WZRD_D_MAX; d++) {
|
||||
mmin = VER_WZRD_M_MIN;
|
||||
mmax = VER_WZRD_M_MAX;
|
||||
dmin = VER_WZRD_D_MIN;
|
||||
dmax = VER_WZRD_D_MAX;
|
||||
omin = VER_WZRD_O_MIN;
|
||||
omax = VER_WZRD_O_MAX;
|
||||
vcomin = VER_WZRD_VCO_MIN;
|
||||
vcomax = VER_WZRD_VCO_MAX;
|
||||
|
||||
for (m = mmin; m <= mmax; m++) {
|
||||
for (d = dmin; d <= dmax; d++) {
|
||||
vco_freq = DIV_ROUND_CLOSEST((parent_rate * m), d);
|
||||
if (vco_freq >= WZRD_VCO_MIN && vco_freq <= WZRD_VCO_MAX) {
|
||||
for (o = WZRD_O_MIN; o <= WZRD_O_MAX; o++) {
|
||||
if (vco_freq >= vcomin && vco_freq <= vcomax) {
|
||||
for (o = omin; o <= omax; o++) {
|
||||
freq = DIV_ROUND_CLOSEST_ULL(vco_freq, o);
|
||||
diff = abs(freq - rate);
|
||||
|
||||
@ -251,12 +369,137 @@ static int clk_wzrd_get_divisors(struct clk_hw *hw, unsigned long rate,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int clk_wzrd_get_divisors(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
u64 vco_freq, freq, diff, vcomin, vcomax;
|
||||
u32 m, d, o;
|
||||
u32 mmin, mmax, dmin, dmax, omin, omax;
|
||||
|
||||
mmin = WZRD_M_MIN;
|
||||
mmax = WZRD_M_MAX;
|
||||
dmin = WZRD_D_MIN;
|
||||
dmax = WZRD_D_MAX;
|
||||
omin = WZRD_O_MIN;
|
||||
omax = WZRD_O_MAX;
|
||||
vcomin = WZRD_VCO_MIN;
|
||||
vcomax = WZRD_VCO_MAX;
|
||||
|
||||
for (m = mmin; m <= mmax; m++) {
|
||||
for (d = dmin; d <= dmax; d++) {
|
||||
vco_freq = DIV_ROUND_CLOSEST((parent_rate * m), d);
|
||||
if (vco_freq >= vcomin && vco_freq <= vcomax) {
|
||||
for (o = omin; o <= omax; o++) {
|
||||
freq = DIV_ROUND_CLOSEST_ULL(vco_freq, o);
|
||||
diff = abs(freq - rate);
|
||||
|
||||
if (diff < WZRD_MIN_ERR) {
|
||||
divider->m = m;
|
||||
divider->d = d;
|
||||
divider->o = o;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int clk_wzrd_reconfig(struct clk_wzrd_divider *divider, void __iomem *div_addr)
|
||||
{
|
||||
u32 value;
|
||||
int err;
|
||||
|
||||
/* Check status register */
|
||||
err = readl_poll_timeout_atomic(divider->base + WZRD_DR_STATUS_REG_OFFSET, value,
|
||||
value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
if (err)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
/* Initiate reconfiguration */
|
||||
writel(WZRD_DR_BEGIN_DYNA_RECONF, div_addr);
|
||||
/* Check status register */
|
||||
return readl_poll_timeout_atomic(divider->base + WZRD_DR_STATUS_REG_OFFSET, value,
|
||||
value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
}
|
||||
|
||||
static int clk_wzrd_dynamic_ver_all_nolock(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
u32 regh, edged, p5en, p5fedge, value2, m, regval, regval1, value;
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
void __iomem *div_addr;
|
||||
int err;
|
||||
|
||||
err = clk_wzrd_get_divisors_ver(hw, rate, parent_rate);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
writel(0, divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKFBOUT_4));
|
||||
|
||||
m = divider->m;
|
||||
edged = m % WZRD_DUTY_CYCLE;
|
||||
regh = m / WZRD_DUTY_CYCLE;
|
||||
regval1 = readl(divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_CLKFBOUT_1));
|
||||
regval1 |= WZRD_MULT_PREDIV2;
|
||||
if (edged)
|
||||
regval1 = regval1 | WZRD_CLKFBOUT_EDGE;
|
||||
else
|
||||
regval1 = regval1 & ~WZRD_CLKFBOUT_EDGE;
|
||||
|
||||
writel(regval1, divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_CLKFBOUT_1));
|
||||
regval1 = regh | regh << WZRD_CLKFBOUT_H_SHIFT;
|
||||
writel(regval1, divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_CLKFBOUT_2));
|
||||
|
||||
value2 = divider->d;
|
||||
edged = value2 % WZRD_DUTY_CYCLE;
|
||||
regh = (value2 / WZRD_DUTY_CYCLE);
|
||||
regval1 = FIELD_PREP(WZRD_DIVCLK_EDGE, edged);
|
||||
writel(regval1, divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_DESKEW_2));
|
||||
regval1 = regh | regh << WZRD_CLKFBOUT_H_SHIFT;
|
||||
writel(regval1, divider->base + WZRD_CLK_CFG_REG(1, WZRD_DIVCLK));
|
||||
|
||||
value = divider->o;
|
||||
regh = value / WZRD_O_DIV;
|
||||
regval1 = readl(divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_CLKOUT0_1));
|
||||
regval1 |= WZRD_CLKFBOUT_PREDIV2;
|
||||
regval1 = regval1 & ~(WZRD_CLKFBOUT_EDGE | WZRD_P5EN | WZRD_P5FEDGE);
|
||||
|
||||
if (value % WZRD_O_DIV > 1) {
|
||||
edged = 1;
|
||||
regval1 |= edged << WZRD_CLKFBOUT_H_SHIFT;
|
||||
}
|
||||
|
||||
p5fedge = value % WZRD_DUTY_CYCLE;
|
||||
p5en = value % WZRD_DUTY_CYCLE;
|
||||
|
||||
regval1 = regval1 | FIELD_PREP(WZRD_P5EN, p5en) | FIELD_PREP(WZRD_P5FEDGE, p5fedge);
|
||||
writel(regval1, divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_CLKOUT0_1));
|
||||
regval = regh | regh << WZRD_CLKFBOUT_H_SHIFT;
|
||||
writel(regval, divider->base + WZRD_CLK_CFG_REG(1,
|
||||
WZRD_CLKOUT0_2));
|
||||
div_addr = divider->base + WZRD_DR_INIT_VERSAL_OFFSET;
|
||||
|
||||
return clk_wzrd_reconfig(divider, div_addr);
|
||||
}
|
||||
|
||||
static int clk_wzrd_dynamic_all_nolock(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
unsigned long vco_freq, rate_div, clockout0_div;
|
||||
u32 reg, pre, value, f;
|
||||
void __iomem *div_addr = divider->base;
|
||||
u32 reg, pre, f;
|
||||
int err;
|
||||
|
||||
err = clk_wzrd_get_divisors(hw, rate, parent_rate);
|
||||
@ -275,35 +518,22 @@ static int clk_wzrd_dynamic_all_nolock(struct clk_hw *hw, unsigned long rate,
|
||||
reg = FIELD_PREP(WZRD_CLKOUT_DIVIDE_MASK, clockout0_div) |
|
||||
FIELD_PREP(WZRD_CLKOUT0_FRAC_MASK, f);
|
||||
|
||||
writel(reg, divider->base + WZRD_CLK_CFG_REG(2));
|
||||
writel(reg, divider->base + WZRD_CLK_CFG_REG(0, 2));
|
||||
/* Set divisor and clear phase offset */
|
||||
reg = FIELD_PREP(WZRD_CLKFBOUT_MULT_MASK, divider->m) |
|
||||
FIELD_PREP(WZRD_DIVCLK_DIVIDE_MASK, divider->d);
|
||||
writel(reg, divider->base + WZRD_CLK_CFG_REG(0));
|
||||
writel(divider->o, divider->base + WZRD_CLK_CFG_REG(2));
|
||||
writel(0, divider->base + WZRD_CLK_CFG_REG(3));
|
||||
/* Check status register */
|
||||
err = readl_poll_timeout(divider->base + WZRD_DR_STATUS_REG_OFFSET, value,
|
||||
value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
if (err)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
/* Initiate reconfiguration */
|
||||
writel(WZRD_DR_BEGIN_DYNA_RECONF,
|
||||
divider->base + WZRD_DR_INIT_REG_OFFSET);
|
||||
|
||||
/* Check status register */
|
||||
return readl_poll_timeout(divider->base + WZRD_DR_STATUS_REG_OFFSET, value,
|
||||
value & WZRD_DR_LOCK_BIT_MASK,
|
||||
WZRD_USEC_POLL, WZRD_TIMEOUT_POLL);
|
||||
writel(reg, divider->base + WZRD_CLK_CFG_REG(0, 0));
|
||||
writel(divider->o, divider->base + WZRD_CLK_CFG_REG(0, 2));
|
||||
writel(0, divider->base + WZRD_CLK_CFG_REG(0, 3));
|
||||
div_addr = divider->base + WZRD_DR_INIT_REG_OFFSET;
|
||||
return clk_wzrd_reconfig(divider, div_addr);
|
||||
}
|
||||
|
||||
static int clk_wzrd_dynamic_all(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
unsigned long flags = 0;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(divider->lock, flags);
|
||||
@ -315,21 +545,103 @@ static int clk_wzrd_dynamic_all(struct clk_hw *hw, unsigned long rate,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clk_wzrd_dynamic_all_ver(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(divider->lock, flags);
|
||||
|
||||
ret = clk_wzrd_dynamic_ver_all_nolock(hw, rate, parent_rate);
|
||||
|
||||
spin_unlock_irqrestore(divider->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned long clk_wzrd_recalc_rate_all(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
u32 m, d, o, div, reg, f;
|
||||
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(0));
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(0, 0));
|
||||
d = FIELD_GET(WZRD_DIVCLK_DIVIDE_MASK, reg);
|
||||
m = FIELD_GET(WZRD_CLKFBOUT_MULT_MASK, reg);
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(2));
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(0, 2));
|
||||
o = FIELD_GET(WZRD_DIVCLK_DIVIDE_MASK, reg);
|
||||
f = FIELD_GET(WZRD_CLKOUT0_FRAC_MASK, reg);
|
||||
|
||||
div = DIV_ROUND_CLOSEST(d * (WZRD_FRAC_POINTS * o + f), WZRD_FRAC_POINTS);
|
||||
return divider_recalc_rate(hw, parent_rate * m, div, divider->table,
|
||||
divider->flags, divider->width);
|
||||
}
|
||||
|
||||
static unsigned long clk_wzrd_recalc_rate_all_ver(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
|
||||
u32 edged, div2, p5en, edge, prediv2, all, regl, regh, mult;
|
||||
u32 div, reg;
|
||||
|
||||
edge = !!(readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKFBOUT_1)) &
|
||||
WZRD_CLKFBOUT_EDGE);
|
||||
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKFBOUT_2));
|
||||
regl = FIELD_GET(WZRD_CLKFBOUT_L_MASK, reg);
|
||||
regh = FIELD_GET(WZRD_CLKFBOUT_H_MASK, reg);
|
||||
|
||||
mult = regl + regh + edge;
|
||||
if (!mult)
|
||||
mult = 1;
|
||||
|
||||
regl = readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKFBOUT_4)) &
|
||||
WZRD_CLKFBOUT_FRAC_EN;
|
||||
if (regl) {
|
||||
regl = readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKFBOUT_3))
|
||||
& WZRD_VERSAL_FRAC_MASK;
|
||||
mult = mult * WZRD_FRAC_GRADIENT + regl;
|
||||
parent_rate = DIV_ROUND_CLOSEST((parent_rate * mult), WZRD_FRAC_GRADIENT);
|
||||
} else {
|
||||
parent_rate = parent_rate * mult;
|
||||
}
|
||||
|
||||
/* O Calculation */
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKOUT0_1));
|
||||
edged = FIELD_GET(WZRD_CLKFBOUT_EDGE, reg);
|
||||
p5en = FIELD_GET(WZRD_P5EN, reg);
|
||||
prediv2 = FIELD_GET(WZRD_CLKOUT0_PREDIV2, reg);
|
||||
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_CLKOUT0_2));
|
||||
/* Low time */
|
||||
regl = FIELD_GET(WZRD_CLKFBOUT_L_MASK, reg);
|
||||
/* High time */
|
||||
regh = FIELD_GET(WZRD_CLKFBOUT_H_MASK, reg);
|
||||
all = regh + regl + edged;
|
||||
if (!all)
|
||||
all = 1;
|
||||
|
||||
if (prediv2)
|
||||
div2 = PREDIV2_MULT * all + p5en;
|
||||
else
|
||||
div2 = all;
|
||||
|
||||
/* D calculation */
|
||||
edged = !!(readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_DESKEW_2)) &
|
||||
WZRD_DIVCLK_EDGE);
|
||||
reg = readl(divider->base + WZRD_CLK_CFG_REG(1, WZRD_DIVCLK));
|
||||
/* Low time */
|
||||
regl = FIELD_GET(WZRD_CLKFBOUT_L_MASK, reg);
|
||||
/* High time */
|
||||
regh = FIELD_GET(WZRD_CLKFBOUT_H_MASK, reg);
|
||||
div = regl + regh + edged;
|
||||
if (!div)
|
||||
div = 1;
|
||||
|
||||
div = div * div2;
|
||||
return divider_recalc_rate(hw, parent_rate, div, divider->table,
|
||||
divider->flags, divider->width);
|
||||
}
|
||||
|
||||
@ -360,6 +672,18 @@ static long clk_wzrd_round_rate_all(struct clk_hw *hw, unsigned long rate,
|
||||
return rate;
|
||||
}
|
||||
|
||||
static const struct clk_ops clk_wzrd_ver_divider_ops = {
|
||||
.round_rate = clk_wzrd_round_rate,
|
||||
.set_rate = clk_wzrd_ver_dynamic_reconfig,
|
||||
.recalc_rate = clk_wzrd_recalc_rate_ver,
|
||||
};
|
||||
|
||||
static const struct clk_ops clk_wzrd_ver_div_all_ops = {
|
||||
.round_rate = clk_wzrd_round_rate_all,
|
||||
.set_rate = clk_wzrd_dynamic_all_ver,
|
||||
.recalc_rate = clk_wzrd_recalc_rate_all_ver,
|
||||
};
|
||||
|
||||
static const struct clk_ops clk_wzrd_clk_divider_ops = {
|
||||
.round_rate = clk_wzrd_round_rate,
|
||||
.set_rate = clk_wzrd_dynamic_reconfig,
|
||||
@ -484,6 +808,53 @@ static struct clk *clk_wzrd_register_divf(struct device *dev,
|
||||
return hw->clk;
|
||||
}
|
||||
|
||||
static struct clk *clk_wzrd_ver_register_divider(struct device *dev,
|
||||
const char *name,
|
||||
const char *parent_name,
|
||||
unsigned long flags,
|
||||
void __iomem *base,
|
||||
u16 offset,
|
||||
u8 shift, u8 width,
|
||||
u8 clk_divider_flags,
|
||||
u32 div_type,
|
||||
spinlock_t *lock)
|
||||
{
|
||||
struct clk_wzrd_divider *div;
|
||||
struct clk_hw *hw;
|
||||
struct clk_init_data init;
|
||||
int ret;
|
||||
|
||||
div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL);
|
||||
if (!div)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
init.name = name;
|
||||
if (clk_divider_flags & CLK_DIVIDER_READ_ONLY)
|
||||
init.ops = &clk_divider_ro_ops;
|
||||
else if (div_type == DIV_O)
|
||||
init.ops = &clk_wzrd_ver_divider_ops;
|
||||
else
|
||||
init.ops = &clk_wzrd_ver_div_all_ops;
|
||||
init.flags = flags;
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
|
||||
div->base = base;
|
||||
div->offset = offset;
|
||||
div->shift = shift;
|
||||
div->width = width;
|
||||
div->flags = clk_divider_flags;
|
||||
div->lock = lock;
|
||||
div->hw.init = &init;
|
||||
|
||||
hw = &div->hw;
|
||||
ret = devm_clk_hw_register(dev, hw);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return hw->clk;
|
||||
}
|
||||
|
||||
static struct clk *clk_wzrd_register_divider(struct device *dev,
|
||||
const char *name,
|
||||
const char *parent_name,
|
||||
@ -588,18 +959,24 @@ static int __maybe_unused clk_wzrd_resume(struct device *dev)
|
||||
static SIMPLE_DEV_PM_OPS(clk_wzrd_dev_pm_ops, clk_wzrd_suspend,
|
||||
clk_wzrd_resume);
|
||||
|
||||
static const struct versal_clk_data versal_data = {
|
||||
.is_versal = true,
|
||||
};
|
||||
|
||||
static int clk_wzrd_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i, ret;
|
||||
u32 reg, reg_f, mult;
|
||||
unsigned long rate;
|
||||
const char *clk_name;
|
||||
void __iomem *ctrl_reg;
|
||||
struct clk_wzrd *clk_wzrd;
|
||||
const char *clkout_name;
|
||||
const char *clkout_name, *clk_name, *clk_mul_name;
|
||||
u32 regl, regh, edge, regld, reghd, edged, div;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int nr_outputs;
|
||||
const struct versal_clk_data *data;
|
||||
struct clk_wzrd *clk_wzrd;
|
||||
unsigned long flags = 0;
|
||||
void __iomem *ctrl_reg;
|
||||
u32 reg, reg_f, mult;
|
||||
bool is_versal = false;
|
||||
unsigned long rate;
|
||||
int nr_outputs;
|
||||
int i, ret;
|
||||
|
||||
clk_wzrd = devm_kzalloc(&pdev->dev, sizeof(*clk_wzrd), GFP_KERNEL);
|
||||
if (!clk_wzrd)
|
||||
@ -641,6 +1018,10 @@ static int clk_wzrd_probe(struct platform_device *pdev)
|
||||
goto err_disable_clk;
|
||||
}
|
||||
|
||||
data = device_get_match_data(&pdev->dev);
|
||||
if (data)
|
||||
is_versal = data->is_versal;
|
||||
|
||||
ret = of_property_read_u32(np, "xlnx,nr-outputs", &nr_outputs);
|
||||
if (ret || nr_outputs > WZRD_NUM_OUTPUTS) {
|
||||
ret = -EINVAL;
|
||||
@ -653,26 +1034,61 @@ static int clk_wzrd_probe(struct platform_device *pdev)
|
||||
goto err_disable_clk;
|
||||
}
|
||||
|
||||
if (nr_outputs == 1) {
|
||||
clk_wzrd->clkout[0] = clk_wzrd_register_divider
|
||||
if (is_versal) {
|
||||
if (nr_outputs == 1) {
|
||||
clk_wzrd->clkout[0] = clk_wzrd_ver_register_divider
|
||||
(&pdev->dev, clkout_name,
|
||||
__clk_get_name(clk_wzrd->clk_in1), 0,
|
||||
clk_wzrd->base, WZRD_CLK_CFG_REG(3),
|
||||
clk_wzrd->base, WZRD_CLK_CFG_REG(is_versal, 3),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_ALL, &clkwzrd_lock);
|
||||
|
||||
goto out;
|
||||
goto out;
|
||||
}
|
||||
/* register multiplier */
|
||||
edge = !!(readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 0)) &
|
||||
BIT(8));
|
||||
regl = (readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 1)) &
|
||||
WZRD_CLKFBOUT_L_MASK) >> WZRD_CLKFBOUT_L_SHIFT;
|
||||
regh = (readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 1)) &
|
||||
WZRD_CLKFBOUT_H_MASK) >> WZRD_CLKFBOUT_H_SHIFT;
|
||||
mult = regl + regh + edge;
|
||||
if (!mult)
|
||||
mult = 1;
|
||||
mult = mult * WZRD_FRAC_GRADIENT;
|
||||
|
||||
regl = readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 51)) &
|
||||
WZRD_CLKFBOUT_FRAC_EN;
|
||||
if (regl) {
|
||||
regl = readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 48)) &
|
||||
WZRD_VERSAL_FRAC_MASK;
|
||||
mult = mult + regl;
|
||||
}
|
||||
div = 64;
|
||||
} else {
|
||||
if (nr_outputs == 1) {
|
||||
clk_wzrd->clkout[0] = clk_wzrd_register_divider
|
||||
(&pdev->dev, clkout_name,
|
||||
__clk_get_name(clk_wzrd->clk_in1), 0,
|
||||
clk_wzrd->base, WZRD_CLK_CFG_REG(is_versal, 3),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_ALL, &clkwzrd_lock);
|
||||
|
||||
goto out;
|
||||
}
|
||||
reg = readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 0));
|
||||
reg_f = reg & WZRD_CLKFBOUT_FRAC_MASK;
|
||||
reg_f = reg_f >> WZRD_CLKFBOUT_FRAC_SHIFT;
|
||||
|
||||
reg = reg & WZRD_CLKFBOUT_MULT_MASK;
|
||||
reg = reg >> WZRD_CLKFBOUT_MULT_SHIFT;
|
||||
mult = (reg * 1000) + reg_f;
|
||||
div = 1000;
|
||||
}
|
||||
|
||||
reg = readl(clk_wzrd->base + WZRD_CLK_CFG_REG(0));
|
||||
reg_f = reg & WZRD_CLKFBOUT_FRAC_MASK;
|
||||
reg_f = reg_f >> WZRD_CLKFBOUT_FRAC_SHIFT;
|
||||
|
||||
reg = reg & WZRD_CLKFBOUT_MULT_MASK;
|
||||
reg = reg >> WZRD_CLKFBOUT_MULT_SHIFT;
|
||||
mult = (reg * 1000) + reg_f;
|
||||
clk_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_mul", dev_name(&pdev->dev));
|
||||
if (!clk_name) {
|
||||
ret = -ENOMEM;
|
||||
@ -681,7 +1097,7 @@ static int clk_wzrd_probe(struct platform_device *pdev)
|
||||
clk_wzrd->clks_internal[wzrd_clk_mul] = clk_register_fixed_factor
|
||||
(&pdev->dev, clk_name,
|
||||
__clk_get_name(clk_wzrd->clk_in1),
|
||||
0, mult, 1000);
|
||||
0, mult, div);
|
||||
if (IS_ERR(clk_wzrd->clks_internal[wzrd_clk_mul])) {
|
||||
dev_err(&pdev->dev, "unable to register fixed-factor clock\n");
|
||||
ret = PTR_ERR(clk_wzrd->clks_internal[wzrd_clk_mul]);
|
||||
@ -694,13 +1110,29 @@ static int clk_wzrd_probe(struct platform_device *pdev)
|
||||
goto err_rm_int_clk;
|
||||
}
|
||||
|
||||
ctrl_reg = clk_wzrd->base + WZRD_CLK_CFG_REG(0);
|
||||
/* register div */
|
||||
clk_wzrd->clks_internal[wzrd_clk_mul_div] = clk_register_divider
|
||||
if (is_versal) {
|
||||
edged = !!(readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 20)) &
|
||||
BIT(10));
|
||||
regld = (readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 21)) &
|
||||
WZRD_CLKFBOUT_L_MASK) >> WZRD_CLKFBOUT_L_SHIFT;
|
||||
reghd = (readl(clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 21)) &
|
||||
WZRD_CLKFBOUT_H_MASK) >> WZRD_CLKFBOUT_H_SHIFT;
|
||||
div = (regld + reghd + edged);
|
||||
if (!div)
|
||||
div = 1;
|
||||
|
||||
clk_mul_name = __clk_get_name(clk_wzrd->clks_internal[wzrd_clk_mul]);
|
||||
clk_wzrd->clks_internal[wzrd_clk_mul_div] =
|
||||
clk_register_fixed_factor(&pdev->dev, clk_name,
|
||||
clk_mul_name, 0, 1, div);
|
||||
} else {
|
||||
ctrl_reg = clk_wzrd->base + WZRD_CLK_CFG_REG(is_versal, 0);
|
||||
clk_wzrd->clks_internal[wzrd_clk_mul_div] = clk_register_divider
|
||||
(&pdev->dev, clk_name,
|
||||
__clk_get_name(clk_wzrd->clks_internal[wzrd_clk_mul]),
|
||||
flags, ctrl_reg, 0, 8, CLK_DIVIDER_ONE_BASED |
|
||||
CLK_DIVIDER_ALLOW_ZERO, &clkwzrd_lock);
|
||||
}
|
||||
if (IS_ERR(clk_wzrd->clks_internal[wzrd_clk_mul_div])) {
|
||||
dev_err(&pdev->dev, "unable to register divider clock\n");
|
||||
ret = PTR_ERR(clk_wzrd->clks_internal[wzrd_clk_mul_div]);
|
||||
@ -716,24 +1148,35 @@ static int clk_wzrd_probe(struct platform_device *pdev)
|
||||
goto err_rm_int_clk;
|
||||
}
|
||||
|
||||
if (!i)
|
||||
clk_wzrd->clkout[i] = clk_wzrd_register_divf
|
||||
(&pdev->dev, clkout_name,
|
||||
clk_name, flags,
|
||||
clk_wzrd->base, (WZRD_CLK_CFG_REG(2) + i * 12),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_O, &clkwzrd_lock);
|
||||
else
|
||||
clk_wzrd->clkout[i] = clk_wzrd_register_divider
|
||||
(&pdev->dev, clkout_name,
|
||||
clk_name, 0,
|
||||
clk_wzrd->base, (WZRD_CLK_CFG_REG(2) + i * 12),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_O, &clkwzrd_lock);
|
||||
if (is_versal) {
|
||||
clk_wzrd->clkout[i] = clk_wzrd_ver_register_divider
|
||||
(&pdev->dev,
|
||||
clkout_name, clk_name, 0,
|
||||
clk_wzrd->base,
|
||||
(WZRD_CLK_CFG_REG(is_versal, 3) + i * 8),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED |
|
||||
CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_O, &clkwzrd_lock);
|
||||
} else {
|
||||
if (!i)
|
||||
clk_wzrd->clkout[i] = clk_wzrd_register_divf
|
||||
(&pdev->dev, clkout_name, clk_name, flags, clk_wzrd->base,
|
||||
(WZRD_CLK_CFG_REG(is_versal, 2) + i * 12),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_O, &clkwzrd_lock);
|
||||
else
|
||||
clk_wzrd->clkout[i] = clk_wzrd_register_divider
|
||||
(&pdev->dev, clkout_name, clk_name, 0, clk_wzrd->base,
|
||||
(WZRD_CLK_CFG_REG(is_versal, 2) + i * 12),
|
||||
WZRD_CLKOUT_DIVIDE_SHIFT,
|
||||
WZRD_CLKOUT_DIVIDE_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
|
||||
DIV_O, &clkwzrd_lock);
|
||||
}
|
||||
if (IS_ERR(clk_wzrd->clkout[i])) {
|
||||
int j;
|
||||
|
||||
@ -799,9 +1242,10 @@ static void clk_wzrd_remove(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static const struct of_device_id clk_wzrd_ids[] = {
|
||||
{ .compatible = "xlnx,clocking-wizard" },
|
||||
{ .compatible = "xlnx,clocking-wizard-v5.2" },
|
||||
{ .compatible = "xlnx,clocking-wizard-v6.0" },
|
||||
{ .compatible = "xlnx,versal-clk-wizard", .data = &versal_data },
|
||||
{ .compatible = "xlnx,clocking-wizard" },
|
||||
{ .compatible = "xlnx,clocking-wizard-v5.2" },
|
||||
{ .compatible = "xlnx,clocking-wizard-v6.0" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clk_wzrd_ids);
|
||||
|
@ -89,7 +89,7 @@ static int zynqmp_clk_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
static const struct clk_ops zynqmp_clk_mux_ops = {
|
||||
.get_parent = zynqmp_clk_mux_get_parent,
|
||||
.set_parent = zynqmp_clk_mux_set_parent,
|
||||
.determine_rate = __clk_mux_determine_rate,
|
||||
.determine_rate = __clk_mux_determine_rate_closest,
|
||||
};
|
||||
|
||||
static const struct clk_ops zynqmp_clk_mux_ro_ops = {
|
||||
|
@ -110,52 +110,6 @@ static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw,
|
||||
return DIV_ROUND_UP_ULL(parent_rate, value);
|
||||
}
|
||||
|
||||
static void zynqmp_get_divider2_val(struct clk_hw *hw,
|
||||
unsigned long rate,
|
||||
struct zynqmp_clk_divider *divider,
|
||||
u32 *bestdiv)
|
||||
{
|
||||
int div1;
|
||||
int div2;
|
||||
long error = LONG_MAX;
|
||||
unsigned long div1_prate;
|
||||
struct clk_hw *div1_parent_hw;
|
||||
struct zynqmp_clk_divider *pdivider;
|
||||
struct clk_hw *div2_parent_hw = clk_hw_get_parent(hw);
|
||||
|
||||
if (!div2_parent_hw)
|
||||
return;
|
||||
|
||||
pdivider = to_zynqmp_clk_divider(div2_parent_hw);
|
||||
if (!pdivider)
|
||||
return;
|
||||
|
||||
div1_parent_hw = clk_hw_get_parent(div2_parent_hw);
|
||||
if (!div1_parent_hw)
|
||||
return;
|
||||
|
||||
div1_prate = clk_hw_get_rate(div1_parent_hw);
|
||||
*bestdiv = 1;
|
||||
for (div1 = 1; div1 <= pdivider->max_div;) {
|
||||
for (div2 = 1; div2 <= divider->max_div;) {
|
||||
long new_error = ((div1_prate / div1) / div2) - rate;
|
||||
|
||||
if (abs(new_error) < abs(error)) {
|
||||
*bestdiv = div2;
|
||||
error = new_error;
|
||||
}
|
||||
if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
|
||||
div2 = div2 << 1;
|
||||
else
|
||||
div2++;
|
||||
}
|
||||
if (pdivider->flags & CLK_DIVIDER_POWER_OF_TWO)
|
||||
div1 = div1 << 1;
|
||||
else
|
||||
div1++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* zynqmp_clk_divider_round_rate() - Round rate of divider clock
|
||||
* @hw: handle between common and hardware-specific interfaces
|
||||
@ -174,6 +128,7 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,
|
||||
u32 div_type = divider->div_type;
|
||||
u32 bestdiv;
|
||||
int ret;
|
||||
u8 width;
|
||||
|
||||
/* if read only, just return current value */
|
||||
if (divider->flags & CLK_DIVIDER_READ_ONLY) {
|
||||
@ -193,23 +148,12 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,
|
||||
return DIV_ROUND_UP_ULL((u64)*prate, bestdiv);
|
||||
}
|
||||
|
||||
bestdiv = zynqmp_divider_get_val(*prate, rate, divider->flags);
|
||||
width = fls(divider->max_div);
|
||||
|
||||
/*
|
||||
* In case of two divisors, compute best divider values and return
|
||||
* divider2 value based on compute value. div1 will be automatically
|
||||
* set to optimum based on required total divider value.
|
||||
*/
|
||||
if (div_type == TYPE_DIV2 &&
|
||||
(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) {
|
||||
zynqmp_get_divider2_val(hw, rate, divider, &bestdiv);
|
||||
}
|
||||
rate = divider_round_rate(hw, rate, prate, NULL, width, divider->flags);
|
||||
|
||||
if ((clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && divider->is_frac)
|
||||
bestdiv = rate % *prate ? 1 : bestdiv;
|
||||
|
||||
bestdiv = min_t(u32, bestdiv, divider->max_div);
|
||||
*prate = rate * bestdiv;
|
||||
if (divider->is_frac && (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && (rate % *prate))
|
||||
*prate = rate;
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
@ -279,5 +279,13 @@
|
||||
#define CLKID_MIPI_DSI_PXCLK_DIV 268
|
||||
#define CLKID_MIPI_DSI_PXCLK_SEL 269
|
||||
#define CLKID_MIPI_DSI_PXCLK 270
|
||||
#define CLKID_CTS_ENCL 271
|
||||
#define CLKID_CTS_ENCL_SEL 272
|
||||
#define CLKID_MIPI_ISP_DIV 273
|
||||
#define CLKID_MIPI_ISP_SEL 274
|
||||
#define CLKID_MIPI_ISP 275
|
||||
#define CLKID_MIPI_ISP_GATE 276
|
||||
#define CLKID_MIPI_ISP_CSI_PHY0 277
|
||||
#define CLKID_MIPI_ISP_CSI_PHY1 278
|
||||
|
||||
#endif /* __G12A_CLKC_H */
|
||||
|
280
include/dt-bindings/clock/mediatek,mt7988-clk.h
Normal file
280
include/dt-bindings/clock/mediatek,mt7988-clk.h
Normal file
@ -0,0 +1,280 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2023 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Xiufeng Li <Xiufeng.Li@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_MT7988_H
|
||||
#define _DT_BINDINGS_CLK_MT7988_H
|
||||
|
||||
/* APMIXEDSYS */
|
||||
|
||||
#define CLK_APMIXED_NETSYSPLL 0
|
||||
#define CLK_APMIXED_MPLL 1
|
||||
#define CLK_APMIXED_MMPLL 2
|
||||
#define CLK_APMIXED_APLL2 3
|
||||
#define CLK_APMIXED_NET1PLL 4
|
||||
#define CLK_APMIXED_NET2PLL 5
|
||||
#define CLK_APMIXED_WEDMCUPLL 6
|
||||
#define CLK_APMIXED_SGMPLL 7
|
||||
#define CLK_APMIXED_ARM_B 8
|
||||
#define CLK_APMIXED_CCIPLL2_B 9
|
||||
#define CLK_APMIXED_USXGMIIPLL 10
|
||||
#define CLK_APMIXED_MSDCPLL 11
|
||||
|
||||
/* TOPCKGEN */
|
||||
|
||||
#define CLK_TOP_XTAL 0
|
||||
#define CLK_TOP_XTAL_D2 1
|
||||
#define CLK_TOP_RTC_32K 2
|
||||
#define CLK_TOP_RTC_32P7K 3
|
||||
#define CLK_TOP_MPLL_D2 4
|
||||
#define CLK_TOP_MPLL_D3_D2 5
|
||||
#define CLK_TOP_MPLL_D4 6
|
||||
#define CLK_TOP_MPLL_D8 7
|
||||
#define CLK_TOP_MPLL_D8_D2 8
|
||||
#define CLK_TOP_MMPLL_D2 9
|
||||
#define CLK_TOP_MMPLL_D3_D5 10
|
||||
#define CLK_TOP_MMPLL_D4 11
|
||||
#define CLK_TOP_MMPLL_D6_D2 12
|
||||
#define CLK_TOP_MMPLL_D8 13
|
||||
#define CLK_TOP_APLL2_D4 14
|
||||
#define CLK_TOP_NET1PLL_D4 15
|
||||
#define CLK_TOP_NET1PLL_D5 16
|
||||
#define CLK_TOP_NET1PLL_D5_D2 17
|
||||
#define CLK_TOP_NET1PLL_D5_D4 18
|
||||
#define CLK_TOP_NET1PLL_D8 19
|
||||
#define CLK_TOP_NET1PLL_D8_D2 20
|
||||
#define CLK_TOP_NET1PLL_D8_D4 21
|
||||
#define CLK_TOP_NET1PLL_D8_D8 22
|
||||
#define CLK_TOP_NET1PLL_D8_D16 23
|
||||
#define CLK_TOP_NET2PLL_D2 24
|
||||
#define CLK_TOP_NET2PLL_D4 25
|
||||
#define CLK_TOP_NET2PLL_D4_D4 26
|
||||
#define CLK_TOP_NET2PLL_D4_D8 27
|
||||
#define CLK_TOP_NET2PLL_D6 28
|
||||
#define CLK_TOP_NET2PLL_D8 29
|
||||
#define CLK_TOP_NETSYS_SEL 30
|
||||
#define CLK_TOP_NETSYS_500M_SEL 31
|
||||
#define CLK_TOP_NETSYS_2X_SEL 32
|
||||
#define CLK_TOP_NETSYS_GSW_SEL 33
|
||||
#define CLK_TOP_ETH_GMII_SEL 34
|
||||
#define CLK_TOP_NETSYS_MCU_SEL 35
|
||||
#define CLK_TOP_NETSYS_PAO_2X_SEL 36
|
||||
#define CLK_TOP_EIP197_SEL 37
|
||||
#define CLK_TOP_AXI_INFRA_SEL 38
|
||||
#define CLK_TOP_UART_SEL 39
|
||||
#define CLK_TOP_EMMC_250M_SEL 40
|
||||
#define CLK_TOP_EMMC_400M_SEL 41
|
||||
#define CLK_TOP_SPI_SEL 42
|
||||
#define CLK_TOP_SPIM_MST_SEL 43
|
||||
#define CLK_TOP_NFI1X_SEL 44
|
||||
#define CLK_TOP_SPINFI_SEL 45
|
||||
#define CLK_TOP_PWM_SEL 46
|
||||
#define CLK_TOP_I2C_SEL 47
|
||||
#define CLK_TOP_PCIE_MBIST_250M_SEL 48
|
||||
#define CLK_TOP_PEXTP_TL_SEL 49
|
||||
#define CLK_TOP_PEXTP_TL_P1_SEL 50
|
||||
#define CLK_TOP_PEXTP_TL_P2_SEL 51
|
||||
#define CLK_TOP_PEXTP_TL_P3_SEL 52
|
||||
#define CLK_TOP_USB_SYS_SEL 53
|
||||
#define CLK_TOP_USB_SYS_P1_SEL 54
|
||||
#define CLK_TOP_USB_XHCI_SEL 55
|
||||
#define CLK_TOP_USB_XHCI_P1_SEL 56
|
||||
#define CLK_TOP_USB_FRMCNT_SEL 57
|
||||
#define CLK_TOP_USB_FRMCNT_P1_SEL 58
|
||||
#define CLK_TOP_AUD_SEL 59
|
||||
#define CLK_TOP_A1SYS_SEL 60
|
||||
#define CLK_TOP_AUD_L_SEL 61
|
||||
#define CLK_TOP_A_TUNER_SEL 62
|
||||
#define CLK_TOP_SSPXTP_SEL 63
|
||||
#define CLK_TOP_USB_PHY_SEL 64
|
||||
#define CLK_TOP_USXGMII_SBUS_0_SEL 65
|
||||
#define CLK_TOP_USXGMII_SBUS_1_SEL 66
|
||||
#define CLK_TOP_SGM_0_SEL 67
|
||||
#define CLK_TOP_SGM_SBUS_0_SEL 68
|
||||
#define CLK_TOP_SGM_1_SEL 69
|
||||
#define CLK_TOP_SGM_SBUS_1_SEL 70
|
||||
#define CLK_TOP_XFI_PHY_0_XTAL_SEL 71
|
||||
#define CLK_TOP_XFI_PHY_1_XTAL_SEL 72
|
||||
#define CLK_TOP_SYSAXI_SEL 73
|
||||
#define CLK_TOP_SYSAPB_SEL 74
|
||||
#define CLK_TOP_ETH_REFCK_50M_SEL 75
|
||||
#define CLK_TOP_ETH_SYS_200M_SEL 76
|
||||
#define CLK_TOP_ETH_SYS_SEL 77
|
||||
#define CLK_TOP_ETH_XGMII_SEL 78
|
||||
#define CLK_TOP_BUS_TOPS_SEL 79
|
||||
#define CLK_TOP_NPU_TOPS_SEL 80
|
||||
#define CLK_TOP_DRAMC_SEL 81
|
||||
#define CLK_TOP_DRAMC_MD32_SEL 82
|
||||
#define CLK_TOP_INFRA_F26M_SEL 83
|
||||
#define CLK_TOP_PEXTP_P0_SEL 84
|
||||
#define CLK_TOP_PEXTP_P1_SEL 85
|
||||
#define CLK_TOP_PEXTP_P2_SEL 86
|
||||
#define CLK_TOP_PEXTP_P3_SEL 87
|
||||
#define CLK_TOP_DA_XTP_GLB_P0_SEL 88
|
||||
#define CLK_TOP_DA_XTP_GLB_P1_SEL 89
|
||||
#define CLK_TOP_DA_XTP_GLB_P2_SEL 90
|
||||
#define CLK_TOP_DA_XTP_GLB_P3_SEL 91
|
||||
#define CLK_TOP_CKM_SEL 92
|
||||
#define CLK_TOP_DA_SEL 93
|
||||
#define CLK_TOP_PEXTP_SEL 94
|
||||
#define CLK_TOP_TOPS_P2_26M_SEL 95
|
||||
#define CLK_TOP_MCUSYS_BACKUP_625M_SEL 96
|
||||
#define CLK_TOP_NETSYS_SYNC_250M_SEL 97
|
||||
#define CLK_TOP_MACSEC_SEL 98
|
||||
#define CLK_TOP_NETSYS_TOPS_400M_SEL 99
|
||||
#define CLK_TOP_NETSYS_PPEFB_250M_SEL 100
|
||||
#define CLK_TOP_NETSYS_WARP_SEL 101
|
||||
#define CLK_TOP_ETH_MII_SEL 102
|
||||
#define CLK_TOP_NPU_SEL 103
|
||||
#define CLK_TOP_AUD_I2S_M 104
|
||||
|
||||
/* MCUSYS */
|
||||
|
||||
#define CLK_MCU_BUS_DIV_SEL 0
|
||||
#define CLK_MCU_ARM_DIV_SEL 1
|
||||
|
||||
/* INFRACFG_AO */
|
||||
|
||||
#define CLK_INFRA_MUX_UART0_SEL 0
|
||||
#define CLK_INFRA_MUX_UART1_SEL 1
|
||||
#define CLK_INFRA_MUX_UART2_SEL 2
|
||||
#define CLK_INFRA_MUX_SPI0_SEL 3
|
||||
#define CLK_INFRA_MUX_SPI1_SEL 4
|
||||
#define CLK_INFRA_MUX_SPI2_SEL 5
|
||||
#define CLK_INFRA_PWM_SEL 6
|
||||
#define CLK_INFRA_PWM_CK1_SEL 7
|
||||
#define CLK_INFRA_PWM_CK2_SEL 8
|
||||
#define CLK_INFRA_PWM_CK3_SEL 9
|
||||
#define CLK_INFRA_PWM_CK4_SEL 10
|
||||
#define CLK_INFRA_PWM_CK5_SEL 11
|
||||
#define CLK_INFRA_PWM_CK6_SEL 12
|
||||
#define CLK_INFRA_PWM_CK7_SEL 13
|
||||
#define CLK_INFRA_PWM_CK8_SEL 14
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_O_P0_SEL 15
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_O_P1_SEL 16
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_O_P2_SEL 17
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_O_P3_SEL 18
|
||||
|
||||
/* INFRACFG */
|
||||
|
||||
#define CLK_INFRA_PCIE_PERI_26M_CK_P0 19
|
||||
#define CLK_INFRA_PCIE_PERI_26M_CK_P1 20
|
||||
#define CLK_INFRA_PCIE_PERI_26M_CK_P2 21
|
||||
#define CLK_INFRA_PCIE_PERI_26M_CK_P3 22
|
||||
#define CLK_INFRA_66M_GPT_BCK 23
|
||||
#define CLK_INFRA_66M_PWM_HCK 24
|
||||
#define CLK_INFRA_66M_PWM_BCK 25
|
||||
#define CLK_INFRA_66M_PWM_CK1 26
|
||||
#define CLK_INFRA_66M_PWM_CK2 27
|
||||
#define CLK_INFRA_66M_PWM_CK3 28
|
||||
#define CLK_INFRA_66M_PWM_CK4 29
|
||||
#define CLK_INFRA_66M_PWM_CK5 30
|
||||
#define CLK_INFRA_66M_PWM_CK6 31
|
||||
#define CLK_INFRA_66M_PWM_CK7 32
|
||||
#define CLK_INFRA_66M_PWM_CK8 33
|
||||
#define CLK_INFRA_133M_CQDMA_BCK 34
|
||||
#define CLK_INFRA_66M_AUD_SLV_BCK 35
|
||||
#define CLK_INFRA_AUD_26M 36
|
||||
#define CLK_INFRA_AUD_L 37
|
||||
#define CLK_INFRA_AUD_AUD 38
|
||||
#define CLK_INFRA_AUD_EG2 39
|
||||
#define CLK_INFRA_DRAMC_F26M 40
|
||||
#define CLK_INFRA_133M_DBG_ACKM 41
|
||||
#define CLK_INFRA_66M_AP_DMA_BCK 42
|
||||
#define CLK_INFRA_66M_SEJ_BCK 43
|
||||
#define CLK_INFRA_PRE_CK_SEJ_F13M 44
|
||||
#define CLK_INFRA_26M_THERM_SYSTEM 45
|
||||
#define CLK_INFRA_I2C_BCK 46
|
||||
#define CLK_INFRA_52M_UART0_CK 47
|
||||
#define CLK_INFRA_52M_UART1_CK 48
|
||||
#define CLK_INFRA_52M_UART2_CK 49
|
||||
#define CLK_INFRA_NFI 50
|
||||
#define CLK_INFRA_SPINFI 51
|
||||
#define CLK_INFRA_66M_NFI_HCK 52
|
||||
#define CLK_INFRA_104M_SPI0 53
|
||||
#define CLK_INFRA_104M_SPI1 54
|
||||
#define CLK_INFRA_104M_SPI2_BCK 55
|
||||
#define CLK_INFRA_66M_SPI0_HCK 56
|
||||
#define CLK_INFRA_66M_SPI1_HCK 57
|
||||
#define CLK_INFRA_66M_SPI2_HCK 58
|
||||
#define CLK_INFRA_66M_FLASHIF_AXI 59
|
||||
#define CLK_INFRA_RTC 60
|
||||
#define CLK_INFRA_26M_ADC_BCK 61
|
||||
#define CLK_INFRA_RC_ADC 62
|
||||
#define CLK_INFRA_MSDC400 63
|
||||
#define CLK_INFRA_MSDC2_HCK 64
|
||||
#define CLK_INFRA_133M_MSDC_0_HCK 65
|
||||
#define CLK_INFRA_66M_MSDC_0_HCK 66
|
||||
#define CLK_INFRA_133M_CPUM_BCK 67
|
||||
#define CLK_INFRA_BIST2FPC 68
|
||||
#define CLK_INFRA_I2C_X16W_MCK_CK_P1 69
|
||||
#define CLK_INFRA_I2C_X16W_PCK_CK_P1 70
|
||||
#define CLK_INFRA_133M_USB_HCK 71
|
||||
#define CLK_INFRA_133M_USB_HCK_CK_P1 72
|
||||
#define CLK_INFRA_66M_USB_HCK 73
|
||||
#define CLK_INFRA_66M_USB_HCK_CK_P1 74
|
||||
#define CLK_INFRA_USB_SYS 75
|
||||
#define CLK_INFRA_USB_SYS_CK_P1 76
|
||||
#define CLK_INFRA_USB_REF 77
|
||||
#define CLK_INFRA_USB_CK_P1 78
|
||||
#define CLK_INFRA_USB_FRMCNT 79
|
||||
#define CLK_INFRA_USB_FRMCNT_CK_P1 80
|
||||
#define CLK_INFRA_USB_PIPE 81
|
||||
#define CLK_INFRA_USB_PIPE_CK_P1 82
|
||||
#define CLK_INFRA_USB_UTMI 83
|
||||
#define CLK_INFRA_USB_UTMI_CK_P1 84
|
||||
#define CLK_INFRA_USB_XHCI 85
|
||||
#define CLK_INFRA_USB_XHCI_CK_P1 86
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_P0 87
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_P1 88
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_P2 89
|
||||
#define CLK_INFRA_PCIE_GFMUX_TL_P3 90
|
||||
#define CLK_INFRA_PCIE_PIPE_P0 91
|
||||
#define CLK_INFRA_PCIE_PIPE_P1 92
|
||||
#define CLK_INFRA_PCIE_PIPE_P2 93
|
||||
#define CLK_INFRA_PCIE_PIPE_P3 94
|
||||
#define CLK_INFRA_133M_PCIE_CK_P0 95
|
||||
#define CLK_INFRA_133M_PCIE_CK_P1 96
|
||||
#define CLK_INFRA_133M_PCIE_CK_P2 97
|
||||
#define CLK_INFRA_133M_PCIE_CK_P3 98
|
||||
|
||||
/* ETHDMA */
|
||||
|
||||
#define CLK_ETHDMA_XGP1_EN 0
|
||||
#define CLK_ETHDMA_XGP2_EN 1
|
||||
#define CLK_ETHDMA_XGP3_EN 2
|
||||
#define CLK_ETHDMA_FE_EN 3
|
||||
#define CLK_ETHDMA_GP2_EN 4
|
||||
#define CLK_ETHDMA_GP1_EN 5
|
||||
#define CLK_ETHDMA_GP3_EN 6
|
||||
#define CLK_ETHDMA_ESW_EN 7
|
||||
#define CLK_ETHDMA_CRYPT0_EN 8
|
||||
#define CLK_ETHDMA_NR_CLK 9
|
||||
|
||||
/* SGMIISYS_0 */
|
||||
|
||||
#define CLK_SGM0_TX_EN 0
|
||||
#define CLK_SGM0_RX_EN 1
|
||||
#define CLK_SGMII0_NR_CLK 2
|
||||
|
||||
/* SGMIISYS_1 */
|
||||
|
||||
#define CLK_SGM1_TX_EN 0
|
||||
#define CLK_SGM1_RX_EN 1
|
||||
#define CLK_SGMII1_NR_CLK 2
|
||||
|
||||
/* ETHWARP */
|
||||
|
||||
#define CLK_ETHWARP_WOCPU2_EN 0
|
||||
#define CLK_ETHWARP_WOCPU1_EN 1
|
||||
#define CLK_ETHWARP_WOCPU0_EN 2
|
||||
#define CLK_ETHWARP_NR_CLK 3
|
||||
|
||||
/* XFIPLL */
|
||||
#define CLK_XFIPLL_PLL 0
|
||||
#define CLK_XFIPLL_PLL_EN 1
|
||||
|
||||
#endif /* _DT_BINDINGS_CLK_MT7988_H */
|
@ -193,6 +193,12 @@
|
||||
#define GCC_VENUS0_CORE1_VCODEC0_CLK 184
|
||||
#define GCC_OXILI_TIMER_CLK 185
|
||||
#define SYSTEM_MM_NOC_BFDCD_CLK_SRC 186
|
||||
#define CSI2_CLK_SRC 187
|
||||
#define GCC_CAMSS_CSI2_AHB_CLK 188
|
||||
#define GCC_CAMSS_CSI2_CLK 189
|
||||
#define GCC_CAMSS_CSI2PHY_CLK 190
|
||||
#define GCC_CAMSS_CSI2PIX_CLK 191
|
||||
#define GCC_CAMSS_CSI2RDI_CLK 192
|
||||
|
||||
/* Indexes for GDSCs */
|
||||
#define BIMC_GDSC 0
|
||||
|
147
include/dt-bindings/clock/qcom,qdu1000-ecpricc.h
Normal file
147
include/dt-bindings/clock/qcom,qdu1000-ecpricc.h
Normal file
@ -0,0 +1,147 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_ECPRI_CC_QDU1000_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_ECPRI_CC_QDU1000_H
|
||||
|
||||
/* ECPRI_CC clocks */
|
||||
#define ECPRI_CC_PLL0 0
|
||||
#define ECPRI_CC_PLL1 1
|
||||
#define ECPRI_CC_ECPRI_CG_CLK 2
|
||||
#define ECPRI_CC_ECPRI_CLK_SRC 3
|
||||
#define ECPRI_CC_ECPRI_DMA_CLK 4
|
||||
#define ECPRI_CC_ECPRI_DMA_CLK_SRC 5
|
||||
#define ECPRI_CC_ECPRI_DMA_NOC_CLK 6
|
||||
#define ECPRI_CC_ECPRI_FAST_CLK 7
|
||||
#define ECPRI_CC_ECPRI_FAST_CLK_SRC 8
|
||||
#define ECPRI_CC_ECPRI_FAST_DIV2_CLK 9
|
||||
#define ECPRI_CC_ECPRI_FAST_DIV2_CLK_SRC 10
|
||||
#define ECPRI_CC_ECPRI_FAST_DIV2_NOC_CLK 11
|
||||
#define ECPRI_CC_ECPRI_FR_CLK 12
|
||||
#define ECPRI_CC_ECPRI_ORAN_CLK_SRC 13
|
||||
#define ECPRI_CC_ECPRI_ORAN_DIV2_CLK 14
|
||||
#define ECPRI_CC_ETH_100G_C2C0_HM_FF_CLK_SRC 15
|
||||
#define ECPRI_CC_ETH_100G_C2C0_UDP_FIFO_CLK 16
|
||||
#define ECPRI_CC_ETH_100G_C2C1_UDP_FIFO_CLK 17
|
||||
#define ECPRI_CC_ETH_100G_C2C_0_HM_FF_0_CLK 18
|
||||
#define ECPRI_CC_ETH_100G_C2C_0_HM_FF_1_CLK 19
|
||||
#define ECPRI_CC_ETH_100G_C2C_HM_FF_0_DIV_CLK_SRC 20
|
||||
#define ECPRI_CC_ETH_100G_C2C_HM_FF_1_DIV_CLK_SRC 21
|
||||
#define ECPRI_CC_ETH_100G_C2C_HM_MACSEC_CLK 22
|
||||
#define ECPRI_CC_ETH_100G_C2C_HM_MACSEC_CLK_SRC 23
|
||||
#define ECPRI_CC_ETH_100G_DBG_C2C_HM_FF_0_CLK 24
|
||||
#define ECPRI_CC_ETH_100G_DBG_C2C_HM_FF_0_DIV_CLK_SRC 25
|
||||
#define ECPRI_CC_ETH_100G_DBG_C2C_HM_FF_1_CLK 26
|
||||
#define ECPRI_CC_ETH_100G_DBG_C2C_HM_FF_1_DIV_CLK_SRC 27
|
||||
#define ECPRI_CC_ETH_100G_DBG_C2C_HM_FF_CLK_SRC 28
|
||||
#define ECPRI_CC_ETH_100G_DBG_C2C_UDP_FIFO_CLK 29
|
||||
#define ECPRI_CC_ETH_100G_FH0_HM_FF_CLK_SRC 30
|
||||
#define ECPRI_CC_ETH_100G_FH0_MACSEC_CLK_SRC 31
|
||||
#define ECPRI_CC_ETH_100G_FH1_HM_FF_CLK_SRC 32
|
||||
#define ECPRI_CC_ETH_100G_FH1_MACSEC_CLK_SRC 33
|
||||
#define ECPRI_CC_ETH_100G_FH2_HM_FF_CLK_SRC 34
|
||||
#define ECPRI_CC_ETH_100G_FH2_MACSEC_CLK_SRC 35
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_0_CLK 36
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_0_DIV_CLK_SRC 37
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_1_CLK 38
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_1_DIV_CLK_SRC 39
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_2_CLK 40
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_2_DIV_CLK_SRC 41
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_3_CLK 42
|
||||
#define ECPRI_CC_ETH_100G_FH_0_HM_FF_3_DIV_CLK_SRC 43
|
||||
#define ECPRI_CC_ETH_100G_FH_0_UDP_FIFO_CLK 44
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_0_CLK 45
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_0_DIV_CLK_SRC 46
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_1_CLK 47
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_1_DIV_CLK_SRC 48
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_2_CLK 49
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_2_DIV_CLK_SRC 50
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_3_CLK 51
|
||||
#define ECPRI_CC_ETH_100G_FH_1_HM_FF_3_DIV_CLK_SRC 52
|
||||
#define ECPRI_CC_ETH_100G_FH_1_UDP_FIFO_CLK 53
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_0_CLK 54
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_0_DIV_CLK_SRC 55
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_1_CLK 56
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_1_DIV_CLK_SRC 57
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_2_CLK 58
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_2_DIV_CLK_SRC 59
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_3_CLK 60
|
||||
#define ECPRI_CC_ETH_100G_FH_2_HM_FF_3_DIV_CLK_SRC 61
|
||||
#define ECPRI_CC_ETH_100G_FH_2_UDP_FIFO_CLK 62
|
||||
#define ECPRI_CC_ETH_100G_FH_MACSEC_0_CLK 63
|
||||
#define ECPRI_CC_ETH_100G_FH_MACSEC_1_CLK 64
|
||||
#define ECPRI_CC_ETH_100G_FH_MACSEC_2_CLK 65
|
||||
#define ECPRI_CC_ETH_100G_MAC_C2C_HM_REF_CLK 66
|
||||
#define ECPRI_CC_ETH_100G_MAC_C2C_HM_REF_CLK_SRC 67
|
||||
#define ECPRI_CC_ETH_100G_MAC_DBG_C2C_HM_REF_CLK 68
|
||||
#define ECPRI_CC_ETH_100G_MAC_DBG_C2C_HM_REF_CLK_SRC 69
|
||||
#define ECPRI_CC_ETH_100G_MAC_FH0_HM_REF_CLK 70
|
||||
#define ECPRI_CC_ETH_100G_MAC_FH0_HM_REF_CLK_SRC 71
|
||||
#define ECPRI_CC_ETH_100G_MAC_FH1_HM_REF_CLK 72
|
||||
#define ECPRI_CC_ETH_100G_MAC_FH1_HM_REF_CLK_SRC 73
|
||||
#define ECPRI_CC_ETH_100G_MAC_FH2_HM_REF_CLK 74
|
||||
#define ECPRI_CC_ETH_100G_MAC_FH2_HM_REF_CLK_SRC 75
|
||||
#define ECPRI_CC_ETH_DBG_NFAPI_AXI_CLK 76
|
||||
#define ECPRI_CC_ETH_DBG_NOC_AXI_CLK 77
|
||||
#define ECPRI_CC_ETH_PHY_0_OCK_SRAM_CLK 78
|
||||
#define ECPRI_CC_ETH_PHY_1_OCK_SRAM_CLK 79
|
||||
#define ECPRI_CC_ETH_PHY_2_OCK_SRAM_CLK 80
|
||||
#define ECPRI_CC_ETH_PHY_3_OCK_SRAM_CLK 81
|
||||
#define ECPRI_CC_ETH_PHY_4_OCK_SRAM_CLK 82
|
||||
#define ECPRI_CC_MSS_EMAC_CLK 83
|
||||
#define ECPRI_CC_MSS_EMAC_CLK_SRC 84
|
||||
#define ECPRI_CC_MSS_ORAN_CLK 85
|
||||
#define ECPRI_CC_PHY0_LANE0_RX_CLK 86
|
||||
#define ECPRI_CC_PHY0_LANE0_TX_CLK 87
|
||||
#define ECPRI_CC_PHY0_LANE1_RX_CLK 88
|
||||
#define ECPRI_CC_PHY0_LANE1_TX_CLK 89
|
||||
#define ECPRI_CC_PHY0_LANE2_RX_CLK 90
|
||||
#define ECPRI_CC_PHY0_LANE2_TX_CLK 91
|
||||
#define ECPRI_CC_PHY0_LANE3_RX_CLK 92
|
||||
#define ECPRI_CC_PHY0_LANE3_TX_CLK 93
|
||||
#define ECPRI_CC_PHY1_LANE0_RX_CLK 94
|
||||
#define ECPRI_CC_PHY1_LANE0_TX_CLK 95
|
||||
#define ECPRI_CC_PHY1_LANE1_RX_CLK 96
|
||||
#define ECPRI_CC_PHY1_LANE1_TX_CLK 97
|
||||
#define ECPRI_CC_PHY1_LANE2_RX_CLK 98
|
||||
#define ECPRI_CC_PHY1_LANE2_TX_CLK 99
|
||||
#define ECPRI_CC_PHY1_LANE3_RX_CLK 100
|
||||
#define ECPRI_CC_PHY1_LANE3_TX_CLK 101
|
||||
#define ECPRI_CC_PHY2_LANE0_RX_CLK 102
|
||||
#define ECPRI_CC_PHY2_LANE0_TX_CLK 103
|
||||
#define ECPRI_CC_PHY2_LANE1_RX_CLK 104
|
||||
#define ECPRI_CC_PHY2_LANE1_TX_CLK 105
|
||||
#define ECPRI_CC_PHY2_LANE2_RX_CLK 106
|
||||
#define ECPRI_CC_PHY2_LANE2_TX_CLK 107
|
||||
#define ECPRI_CC_PHY2_LANE3_RX_CLK 108
|
||||
#define ECPRI_CC_PHY2_LANE3_TX_CLK 109
|
||||
#define ECPRI_CC_PHY3_LANE0_RX_CLK 110
|
||||
#define ECPRI_CC_PHY3_LANE0_TX_CLK 111
|
||||
#define ECPRI_CC_PHY3_LANE1_RX_CLK 112
|
||||
#define ECPRI_CC_PHY3_LANE1_TX_CLK 113
|
||||
#define ECPRI_CC_PHY3_LANE2_RX_CLK 114
|
||||
#define ECPRI_CC_PHY3_LANE2_TX_CLK 115
|
||||
#define ECPRI_CC_PHY3_LANE3_RX_CLK 116
|
||||
#define ECPRI_CC_PHY3_LANE3_TX_CLK 117
|
||||
#define ECPRI_CC_PHY4_LANE0_RX_CLK 118
|
||||
#define ECPRI_CC_PHY4_LANE0_TX_CLK 119
|
||||
#define ECPRI_CC_PHY4_LANE1_RX_CLK 120
|
||||
#define ECPRI_CC_PHY4_LANE1_TX_CLK 121
|
||||
#define ECPRI_CC_PHY4_LANE2_RX_CLK 122
|
||||
#define ECPRI_CC_PHY4_LANE2_TX_CLK 123
|
||||
#define ECPRI_CC_PHY4_LANE3_RX_CLK 124
|
||||
#define ECPRI_CC_PHY4_LANE3_TX_CLK 125
|
||||
|
||||
/* ECPRI_CC resets */
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_ECPRI_SS_BCR 0
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_ETH_C2C_BCR 1
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_ETH_FH0_BCR 2
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_ETH_FH1_BCR 3
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_ETH_FH2_BCR 4
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_ETH_WRAPPER_TOP_BCR 5
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_MODEM_BCR 6
|
||||
#define ECPRI_CC_CLK_CTL_TOP_ECPRI_CC_NOC_BCR 7
|
||||
|
||||
#endif
|
@ -16,6 +16,10 @@
|
||||
|
||||
/* VIDEO_CC Resets */
|
||||
#define VIDEO_CC_MVSC_CORE_CLK_BCR 0
|
||||
#define VIDEO_CC_INTERFACE_BCR 1
|
||||
#define VIDEO_CC_MVS0_BCR 2
|
||||
#define VIDEO_CC_MVS1_BCR 3
|
||||
#define VIDEO_CC_MVSC_BCR 4
|
||||
|
||||
/* VIDEO_CC GDSCRs */
|
||||
#define VENUS_GDSC 0
|
||||
|
176
include/dt-bindings/clock/sophgo,cv1800.h
Normal file
176
include/dt-bindings/clock/sophgo,cv1800.h
Normal file
@ -0,0 +1,176 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */
|
||||
/*
|
||||
* Copyright (C) 2023 Sophgo Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __DT_BINDINGS_SOPHGO_CV1800_CLK_H__
|
||||
#define __DT_BINDINGS_SOPHGO_CV1800_CLK_H__
|
||||
|
||||
#define CLK_MPLL 0
|
||||
#define CLK_TPLL 1
|
||||
#define CLK_FPLL 2
|
||||
#define CLK_MIPIMPLL 3
|
||||
#define CLK_A0PLL 4
|
||||
#define CLK_DISPPLL 5
|
||||
#define CLK_CAM0PLL 6
|
||||
#define CLK_CAM1PLL 7
|
||||
|
||||
#define CLK_MIPIMPLL_D3 8
|
||||
#define CLK_CAM0PLL_D2 9
|
||||
#define CLK_CAM0PLL_D3 10
|
||||
|
||||
#define CLK_TPU 11
|
||||
#define CLK_TPU_FAB 12
|
||||
#define CLK_AHB_ROM 13
|
||||
#define CLK_DDR_AXI_REG 14
|
||||
#define CLK_RTC_25M 15
|
||||
#define CLK_SRC_RTC_SYS_0 16
|
||||
#define CLK_TEMPSEN 17
|
||||
#define CLK_SARADC 18
|
||||
#define CLK_EFUSE 19
|
||||
#define CLK_APB_EFUSE 20
|
||||
#define CLK_DEBUG 21
|
||||
#define CLK_AP_DEBUG 22
|
||||
#define CLK_XTAL_MISC 23
|
||||
#define CLK_AXI4_EMMC 24
|
||||
#define CLK_EMMC 25
|
||||
#define CLK_EMMC_100K 26
|
||||
#define CLK_AXI4_SD0 27
|
||||
#define CLK_SD0 28
|
||||
#define CLK_SD0_100K 29
|
||||
#define CLK_AXI4_SD1 30
|
||||
#define CLK_SD1 31
|
||||
#define CLK_SD1_100K 32
|
||||
#define CLK_SPI_NAND 33
|
||||
#define CLK_ETH0_500M 34
|
||||
#define CLK_AXI4_ETH0 35
|
||||
#define CLK_ETH1_500M 36
|
||||
#define CLK_AXI4_ETH1 37
|
||||
#define CLK_APB_GPIO 38
|
||||
#define CLK_APB_GPIO_INTR 39
|
||||
#define CLK_GPIO_DB 40
|
||||
#define CLK_AHB_SF 41
|
||||
#define CLK_AHB_SF1 42
|
||||
#define CLK_A24M 43
|
||||
#define CLK_AUDSRC 44
|
||||
#define CLK_APB_AUDSRC 45
|
||||
#define CLK_SDMA_AXI 46
|
||||
#define CLK_SDMA_AUD0 47
|
||||
#define CLK_SDMA_AUD1 48
|
||||
#define CLK_SDMA_AUD2 49
|
||||
#define CLK_SDMA_AUD3 50
|
||||
#define CLK_I2C 51
|
||||
#define CLK_APB_I2C 52
|
||||
#define CLK_APB_I2C0 53
|
||||
#define CLK_APB_I2C1 54
|
||||
#define CLK_APB_I2C2 55
|
||||
#define CLK_APB_I2C3 56
|
||||
#define CLK_APB_I2C4 57
|
||||
#define CLK_APB_WDT 58
|
||||
#define CLK_PWM_SRC 59
|
||||
#define CLK_PWM 60
|
||||
#define CLK_SPI 61
|
||||
#define CLK_APB_SPI0 62
|
||||
#define CLK_APB_SPI1 63
|
||||
#define CLK_APB_SPI2 64
|
||||
#define CLK_APB_SPI3 65
|
||||
#define CLK_1M 66
|
||||
#define CLK_CAM0_200 67
|
||||
#define CLK_PM 68
|
||||
#define CLK_TIMER0 69
|
||||
#define CLK_TIMER1 70
|
||||
#define CLK_TIMER2 71
|
||||
#define CLK_TIMER3 72
|
||||
#define CLK_TIMER4 73
|
||||
#define CLK_TIMER5 74
|
||||
#define CLK_TIMER6 75
|
||||
#define CLK_TIMER7 76
|
||||
#define CLK_UART0 77
|
||||
#define CLK_APB_UART0 78
|
||||
#define CLK_UART1 79
|
||||
#define CLK_APB_UART1 80
|
||||
#define CLK_UART2 81
|
||||
#define CLK_APB_UART2 82
|
||||
#define CLK_UART3 83
|
||||
#define CLK_APB_UART3 84
|
||||
#define CLK_UART4 85
|
||||
#define CLK_APB_UART4 86
|
||||
#define CLK_APB_I2S0 87
|
||||
#define CLK_APB_I2S1 88
|
||||
#define CLK_APB_I2S2 89
|
||||
#define CLK_APB_I2S3 90
|
||||
#define CLK_AXI4_USB 91
|
||||
#define CLK_APB_USB 92
|
||||
#define CLK_USB_125M 93
|
||||
#define CLK_USB_33K 94
|
||||
#define CLK_USB_12M 95
|
||||
#define CLK_AXI4 96
|
||||
#define CLK_AXI6 97
|
||||
#define CLK_DSI_ESC 98
|
||||
#define CLK_AXI_VIP 99
|
||||
#define CLK_SRC_VIP_SYS_0 100
|
||||
#define CLK_SRC_VIP_SYS_1 101
|
||||
#define CLK_SRC_VIP_SYS_2 102
|
||||
#define CLK_SRC_VIP_SYS_3 103
|
||||
#define CLK_SRC_VIP_SYS_4 104
|
||||
#define CLK_CSI_BE_VIP 105
|
||||
#define CLK_CSI_MAC0_VIP 106
|
||||
#define CLK_CSI_MAC1_VIP 107
|
||||
#define CLK_CSI_MAC2_VIP 108
|
||||
#define CLK_CSI0_RX_VIP 109
|
||||
#define CLK_CSI1_RX_VIP 110
|
||||
#define CLK_ISP_TOP_VIP 111
|
||||
#define CLK_IMG_D_VIP 112
|
||||
#define CLK_IMG_V_VIP 113
|
||||
#define CLK_SC_TOP_VIP 114
|
||||
#define CLK_SC_D_VIP 115
|
||||
#define CLK_SC_V1_VIP 116
|
||||
#define CLK_SC_V2_VIP 117
|
||||
#define CLK_SC_V3_VIP 118
|
||||
#define CLK_DWA_VIP 119
|
||||
#define CLK_BT_VIP 120
|
||||
#define CLK_DISP_VIP 121
|
||||
#define CLK_DSI_MAC_VIP 122
|
||||
#define CLK_LVDS0_VIP 123
|
||||
#define CLK_LVDS1_VIP 124
|
||||
#define CLK_PAD_VI_VIP 125
|
||||
#define CLK_PAD_VI1_VIP 126
|
||||
#define CLK_PAD_VI2_VIP 127
|
||||
#define CLK_CFG_REG_VIP 128
|
||||
#define CLK_VIP_IP0 129
|
||||
#define CLK_VIP_IP1 130
|
||||
#define CLK_VIP_IP2 131
|
||||
#define CLK_VIP_IP3 132
|
||||
#define CLK_IVE_VIP 133
|
||||
#define CLK_RAW_VIP 134
|
||||
#define CLK_OSDC_VIP 135
|
||||
#define CLK_CAM0_VIP 136
|
||||
#define CLK_AXI_VIDEO_CODEC 137
|
||||
#define CLK_VC_SRC0 138
|
||||
#define CLK_VC_SRC1 139
|
||||
#define CLK_VC_SRC2 140
|
||||
#define CLK_H264C 141
|
||||
#define CLK_APB_H264C 142
|
||||
#define CLK_H265C 143
|
||||
#define CLK_APB_H265C 144
|
||||
#define CLK_JPEG 145
|
||||
#define CLK_APB_JPEG 146
|
||||
#define CLK_CAM0 147
|
||||
#define CLK_CAM1 148
|
||||
#define CLK_WGN 149
|
||||
#define CLK_WGN0 150
|
||||
#define CLK_WGN1 151
|
||||
#define CLK_WGN2 152
|
||||
#define CLK_KEYSCAN 153
|
||||
#define CLK_CFG_REG_VC 154
|
||||
#define CLK_C906_0 155
|
||||
#define CLK_C906_1 156
|
||||
#define CLK_A53 157
|
||||
#define CLK_CPU_AXI0 158
|
||||
#define CLK_CPU_GIC 159
|
||||
#define CLK_XTAL_AP 160
|
||||
|
||||
// Only for CV181x
|
||||
#define CLK_DISP_SRC_VIP 161
|
||||
|
||||
#endif /* __DT_BINDINGS_SOPHGO_CV1800_CLK_H__ */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user