Merge branches 'clk-rockchip', 'clk-ingenic', 'clk-bindings', 'clk-samsung' and ...
authorStephen Boyd <sboyd@kernel.org>
Wed, 25 May 2022 07:27:09 +0000 (00:27 -0700)
committerStephen Boyd <sboyd@kernel.org>
Wed, 25 May 2022 07:27:09 +0000 (00:27 -0700)
 - Mark some clks critical on Ingenic X1000
 - Add STM32MP13 RCC driver (Reset Clock Controller)

* clk-rockchip:
  dt-bindings: clock: convert rockchip,rk3368-cru.txt to YAML
  dt-bindings: clock: convert rockchip,rk3228-cru.txt to YAML
  dt-bindings: clock: convert rockchip,rk3036-cru.txt to YAML
  dt-bindings: clock: convert rockchip,rk3308-cru.txt to YAML
  dt-bindings: clock: convert rockchip,px30-cru.txt to YAML
  dt-bindings: clock: convert rockchip,rk3188-cru.txt to YAML
  dt-bindings: clock: convert rockchip,rk3288-cru.txt to YAML
  dt-bindings: clock: convert rockchip,rv1108-cru.txt to YAML
  dt-binding: clock: Add missing rk3568 cru bindings
  clk: rockchip: Mark hclk_vo as critical on rk3568
  dt-bindings: clock: fix rk3399 cru clock issues
  dt-bindings: clock: use generic node name for pmucru example in rockchip,rk3399-cru.yaml
  dt-bindings: clock: replace a maintainer for rockchip,rk3399-cru.yaml
  dt-bindings: clock: fix some conversion style issues for rockchip,rk3399-cru.yaml

* clk-ingenic:
  clk: ingenic-tcu: Fix missing TCU clock for X1000 SoCs
  mips: ingenic: Do not manually reference the CPU clock
  clk: ingenic: Mark critical clocks in Ingenic SoCs
  clk: ingenic: Allow specifying common clock flags

* clk-bindings:
  dt-bindings: clock: Replace common binding with link to schema

* clk-samsung:
  dt-bindings: clock: exynosautov9: correct count of NR_CLK
  clk: samsung: exynosautov9: add cmu_peric1 clock support
  clk: samsung: exynosautov9: add cmu_peric0 clock support
  clk: samsung: exynosautov9: add cmu_fsys2 clock support
  clk: samsung: exynosautov9: add cmu_busmc clock support
  clk: samsung: exynosautov9: add cmu_peris clock support
  clk: samsung: exynosautov9: add cmu_core clock support
  clk: samsung: add top clock support for Exynos Auto v9 SoC
  dt-bindings: clock: add Exynos Auto v9 SoC CMU bindings
  dt-bindings: clock: add clock binding definitions for Exynos Auto v9

* clk-stm:
  clk: stm32mp13: add safe mux management
  clk: stm32mp13: add multi mux function
  clk: stm32mp13: add all STM32MP13 kernel clocks
  clk: stm32mp13: add all STM32MP13 peripheral clocks
  clk: stm32mp13: manage secured clocks
  clk: stm32mp13: add composite clock
  clk: stm32mp13: add stm32 divider clock
  clk: stm32mp13: add stm32_gate management
  clk: stm32mp13: add stm32_mux clock management
  clk: stm32: Introduce STM32MP13 RCC drivers (Reset Clock Controller)
  dt-bindings: rcc: stm32: add new compatible for STM32MP13 SoC

225 files changed:
Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-sys-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/airoha,en7523-scu.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/clock-bindings.txt
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.yaml
Documentation/devicetree/bindings/clock/renesas,rzg2l-cpg.yaml
Documentation/devicetree/bindings/clock/rockchip,px30-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,px30-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.yaml
Documentation/devicetree/bindings/clock/rockchip,rk3568-cru.yaml
Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynosautov9-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/st,stm32mp1-rcc.yaml
Documentation/devicetree/bindings/clock/stericsson,u8500-clks.yaml
Documentation/devicetree/bindings/clock/ti,am654-ehrpwm-tbclk.yaml
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/actions/owl-pll.c
drivers/clk/bcm/clk-raspberrypi.c
drivers/clk/clk-cdce706.c
drivers/clk/clk-cdce925.c
drivers/clk/clk-cs2000-cp.c
drivers/clk/clk-en7523.c [new file with mode: 0644]
drivers/clk/clk-fixed-rate.c
drivers/clk/clk-max9485.c
drivers/clk/clk-mux.c
drivers/clk/clk-renesas-pcie.c
drivers/clk/clk-si514.c
drivers/clk/clk-si5341.c
drivers/clk/clk-si5351.c
drivers/clk/clk-si544.c
drivers/clk/clk-si570.c
drivers/clk/clk.c
drivers/clk/imx/clk-composite-8m.c
drivers/clk/imx/clk-imx7d.c
drivers/clk/imx/clk-imx8mm.c
drivers/clk/imx/clk-imx8mn.c
drivers/clk/imx/clk-imx8mp.c
drivers/clk/imx/clk-imx8mq.c
drivers/clk/imx/clk-scu.c
drivers/clk/imx/clk.c
drivers/clk/imx/clk.h
drivers/clk/keystone/syscon-clk.c
drivers/clk/mediatek/Kconfig
drivers/clk/mediatek/Makefile
drivers/clk/mediatek/clk-apmixed.c
drivers/clk/mediatek/clk-cpumux.c
drivers/clk/mediatek/clk-cpumux.h
drivers/clk/mediatek/clk-gate.c
drivers/clk/mediatek/clk-gate.h
drivers/clk/mediatek/clk-mt2701-aud.c
drivers/clk/mediatek/clk-mt2701-bdp.c
drivers/clk/mediatek/clk-mt2701-eth.c
drivers/clk/mediatek/clk-mt2701-g3d.c
drivers/clk/mediatek/clk-mt2701-hif.c
drivers/clk/mediatek/clk-mt2701-img.c
drivers/clk/mediatek/clk-mt2701-mm.c
drivers/clk/mediatek/clk-mt2701-vdec.c
drivers/clk/mediatek/clk-mt2701.c
drivers/clk/mediatek/clk-mt2712-bdp.c
drivers/clk/mediatek/clk-mt2712-img.c
drivers/clk/mediatek/clk-mt2712-jpgdec.c
drivers/clk/mediatek/clk-mt2712-mfg.c
drivers/clk/mediatek/clk-mt2712-mm.c
drivers/clk/mediatek/clk-mt2712-vdec.c
drivers/clk/mediatek/clk-mt2712-venc.c
drivers/clk/mediatek/clk-mt2712.c
drivers/clk/mediatek/clk-mt6765-audio.c
drivers/clk/mediatek/clk-mt6765-cam.c
drivers/clk/mediatek/clk-mt6765-img.c
drivers/clk/mediatek/clk-mt6765-mipi0a.c
drivers/clk/mediatek/clk-mt6765-mm.c
drivers/clk/mediatek/clk-mt6765-vcodec.c
drivers/clk/mediatek/clk-mt6765.c
drivers/clk/mediatek/clk-mt6779-aud.c
drivers/clk/mediatek/clk-mt6779-cam.c
drivers/clk/mediatek/clk-mt6779-img.c
drivers/clk/mediatek/clk-mt6779-ipe.c
drivers/clk/mediatek/clk-mt6779-mfg.c
drivers/clk/mediatek/clk-mt6779-mm.c
drivers/clk/mediatek/clk-mt6779-vdec.c
drivers/clk/mediatek/clk-mt6779-venc.c
drivers/clk/mediatek/clk-mt6779.c
drivers/clk/mediatek/clk-mt6797-img.c
drivers/clk/mediatek/clk-mt6797-mm.c
drivers/clk/mediatek/clk-mt6797-vdec.c
drivers/clk/mediatek/clk-mt6797-venc.c
drivers/clk/mediatek/clk-mt6797.c
drivers/clk/mediatek/clk-mt7622-aud.c
drivers/clk/mediatek/clk-mt7622-eth.c
drivers/clk/mediatek/clk-mt7622-hif.c
drivers/clk/mediatek/clk-mt7622.c
drivers/clk/mediatek/clk-mt7629-eth.c
drivers/clk/mediatek/clk-mt7629-hif.c
drivers/clk/mediatek/clk-mt7629.c
drivers/clk/mediatek/clk-mt7986-apmixed.c
drivers/clk/mediatek/clk-mt7986-eth.c
drivers/clk/mediatek/clk-mt7986-infracfg.c
drivers/clk/mediatek/clk-mt7986-topckgen.c
drivers/clk/mediatek/clk-mt8135.c
drivers/clk/mediatek/clk-mt8167-aud.c
drivers/clk/mediatek/clk-mt8167-img.c
drivers/clk/mediatek/clk-mt8167-mfgcfg.c
drivers/clk/mediatek/clk-mt8167-mm.c
drivers/clk/mediatek/clk-mt8167-vdec.c
drivers/clk/mediatek/clk-mt8167.c
drivers/clk/mediatek/clk-mt8173-mm.c
drivers/clk/mediatek/clk-mt8173.c
drivers/clk/mediatek/clk-mt8183-audio.c
drivers/clk/mediatek/clk-mt8183-cam.c
drivers/clk/mediatek/clk-mt8183-img.c
drivers/clk/mediatek/clk-mt8183-ipu0.c
drivers/clk/mediatek/clk-mt8183-ipu1.c
drivers/clk/mediatek/clk-mt8183-ipu_adl.c
drivers/clk/mediatek/clk-mt8183-ipu_conn.c
drivers/clk/mediatek/clk-mt8183-mfgcfg.c
drivers/clk/mediatek/clk-mt8183-mm.c
drivers/clk/mediatek/clk-mt8183-vdec.c
drivers/clk/mediatek/clk-mt8183-venc.c
drivers/clk/mediatek/clk-mt8183.c
drivers/clk/mediatek/clk-mt8186-apmixedsys.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-cam.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-img.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-infra_ao.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-ipe.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-mcu.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-mdp.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-mfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-mm.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-topckgen.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-vdec.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-venc.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8186-wpe.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-aud.c
drivers/clk/mediatek/clk-mt8192-mm.c
drivers/clk/mediatek/clk-mt8192.c
drivers/clk/mediatek/clk-mt8195-apmixedsys.c
drivers/clk/mediatek/clk-mt8195-apusys_pll.c
drivers/clk/mediatek/clk-mt8195-topckgen.c
drivers/clk/mediatek/clk-mt8195-vdo0.c
drivers/clk/mediatek/clk-mt8195-vdo1.c
drivers/clk/mediatek/clk-mt8516-aud.c
drivers/clk/mediatek/clk-mt8516.c
drivers/clk/mediatek/clk-mtk.c
drivers/clk/mediatek/clk-mtk.h
drivers/clk/mediatek/clk-mux.c
drivers/clk/mediatek/clk-mux.h
drivers/clk/mediatek/clk-pll.c
drivers/clk/mediatek/clk-pll.h
drivers/clk/renesas/Kconfig
drivers/clk/renesas/Makefile
drivers/clk/renesas/r8a774a1-cpg-mssr.c
drivers/clk/renesas/r8a774b1-cpg-mssr.c
drivers/clk/renesas/r8a774c0-cpg-mssr.c
drivers/clk/renesas/r8a774e1-cpg-mssr.c
drivers/clk/renesas/r8a7795-cpg-mssr.c
drivers/clk/renesas/r8a7796-cpg-mssr.c
drivers/clk/renesas/r8a77965-cpg-mssr.c
drivers/clk/renesas/r8a77980-cpg-mssr.c
drivers/clk/renesas/r8a77990-cpg-mssr.c
drivers/clk/renesas/r8a77995-cpg-mssr.c
drivers/clk/renesas/r8a779a0-cpg-mssr.c
drivers/clk/renesas/r8a779f0-cpg-mssr.c
drivers/clk/renesas/r8a779g0-cpg-mssr.c [new file with mode: 0644]
drivers/clk/renesas/r9a06g032-clocks.c
drivers/clk/renesas/r9a07g043-cpg.c [new file with mode: 0644]
drivers/clk/renesas/r9a07g044-cpg.c
drivers/clk/renesas/r9a09g011-cpg.c [new file with mode: 0644]
drivers/clk/renesas/rcar-gen3-cpg.h
drivers/clk/renesas/rcar-gen4-cpg.c
drivers/clk/renesas/rcar-gen4-cpg.h
drivers/clk/renesas/renesas-cpg-mssr.c
drivers/clk/renesas/renesas-cpg-mssr.h
drivers/clk/renesas/rzg2l-cpg.c
drivers/clk/renesas/rzg2l-cpg.h
drivers/clk/rockchip/clk-rk3568.c
drivers/clk/samsung/Makefile
drivers/clk/samsung/clk-exynosautov9.c [new file with mode: 0644]
drivers/clk/stm32/Makefile [new file with mode: 0644]
drivers/clk/stm32/clk-stm32-core.c [new file with mode: 0644]
drivers/clk/stm32/clk-stm32-core.h [new file with mode: 0644]
drivers/clk/stm32/clk-stm32mp13.c [new file with mode: 0644]
drivers/clk/stm32/reset-stm32.c [new file with mode: 0644]
drivers/clk/stm32/reset-stm32.h [new file with mode: 0644]
drivers/clk/stm32/stm32mp13_rcc.h [new file with mode: 0644]
drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
drivers/clk/sunxi-ng/ccu-sun50i-h6-r.h
drivers/clk/sunxi-ng/ccu-sun50i-h616.c
drivers/clk/sunxi-ng/ccu-sun50i-h616.h
drivers/clk/tegra/clk-bpmp.c
drivers/clk/tegra/clk-dfll.c
drivers/clk/ti/clkctrl.c
drivers/clk/ti/composite.c
drivers/clk/ux500/clk-prcmu.c
drivers/clk/ux500/clk.h
drivers/clk/ux500/reset-prcc.c
drivers/clk/ux500/u8500_of_clk.c
include/dt-bindings/clock/en7523-clk.h [new file with mode: 0644]
include/dt-bindings/clock/imx8mn-clock.h
include/dt-bindings/clock/imx8mp-clock.h
include/dt-bindings/clock/mt8186-clk.h [new file with mode: 0644]
include/dt-bindings/clock/r8a779g0-cpg-mssr.h [new file with mode: 0644]
include/dt-bindings/clock/r9a07g043-cpg.h [new file with mode: 0644]
include/dt-bindings/clock/r9a09g011-cpg.h [new file with mode: 0644]
include/dt-bindings/clock/samsung,exynosautov9.h [new file with mode: 0644]
include/dt-bindings/clock/ste-db8500-clkout.h [new file with mode: 0644]
include/dt-bindings/clock/stm32mp13-clks.h [new file with mode: 0644]
include/dt-bindings/clock/sun50i-h6-r-ccu.h
include/dt-bindings/clock/sun50i-h616-ccu.h
include/dt-bindings/power/r8a779g0-sysc.h [new file with mode: 0644]
include/dt-bindings/reset/stm32mp13-resets.h [new file with mode: 0644]

diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-clock.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-clock.yaml
new file mode 100644 (file)
index 0000000..cf1002c
--- /dev/null
@@ -0,0 +1,56 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8186-clock.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: MediaTek Functional Clock Controller for MT8186
+
+maintainers:
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description: |
+  The clock architecture in MediaTek like below
+  PLLs -->
+          dividers -->
+                      muxes
+                           -->
+                              clock gate
+
+  The devices provide clock gate control in different IP blocks.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8186-imp_iic_wrap
+          - mediatek,mt8186-mfgsys
+          - mediatek,mt8186-wpesys
+          - mediatek,mt8186-imgsys1
+          - mediatek,mt8186-imgsys2
+          - mediatek,mt8186-vdecsys
+          - mediatek,mt8186-vencsys
+          - mediatek,mt8186-camsys
+          - mediatek,mt8186-camsys_rawa
+          - mediatek,mt8186-camsys_rawb
+          - mediatek,mt8186-mdpsys
+          - mediatek,mt8186-ipesys
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    imp_iic_wrap: clock-controller@11017000 {
+        compatible = "mediatek,mt8186-imp_iic_wrap";
+        reg = <0x11017000 0x1000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-sys-clock.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-sys-clock.yaml
new file mode 100644 (file)
index 0000000..0886e2e
--- /dev/null
@@ -0,0 +1,54 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8186-sys-clock.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: MediaTek System Clock Controller for MT8186
+
+maintainers:
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description: |
+  The clock architecture in MediaTek like below
+  PLLs -->
+          dividers -->
+                      muxes
+                           -->
+                              clock gate
+
+  The apmixedsys provides most of PLLs which generated from SoC 26m.
+  The topckgen provides dividers and muxes which provide the clock source to other IP blocks.
+  The infracfg_ao provides clock gate in peripheral and infrastructure IP blocks.
+  The mcusys provides mux control to select the clock source in AP MCU.
+  The device nodes also provide the system control capacity for configuration.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8186-mcusys
+          - mediatek,mt8186-topckgen
+          - mediatek,mt8186-infracfg_ao
+          - mediatek,mt8186-apmixedsys
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    topckgen: syscon@10000000 {
+        compatible = "mediatek,mt8186-topckgen", "syscon";
+        reg = <0x10000000 0x1000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/airoha,en7523-scu.yaml b/Documentation/devicetree/bindings/clock/airoha,en7523-scu.yaml
new file mode 100644 (file)
index 0000000..d60e746
--- /dev/null
@@ -0,0 +1,58 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/airoha,en7523-scu.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: EN7523 Clock Device Tree Bindings
+
+maintainers:
+  - Felix Fietkau <nbd@nbd.name>
+  - John Crispin <nbd@nbd.name>
+
+description: |
+  This node defines the System Control Unit of the EN7523 SoC,
+  a collection of registers configuring many different aspects of the SoC.
+
+  The clock driver uses it to read and configure settings of the
+  PLL controller, which provides clocks for the CPU, the bus and
+  other SoC internal peripherals.
+
+  Each clock is assigned an identifier and client nodes use this identifier
+  to specify which clock they consume.
+
+  All these identifiers can be found in:
+  [1]: <include/dt-bindings/clock/en7523-clk.h>.
+
+  The clocks are provided inside a system controller node.
+
+properties:
+  compatible:
+    items:
+      - const: airoha,en7523-scu
+
+  reg:
+    maxItems: 2
+
+  "#clock-cells":
+    description:
+      The first cell indicates the clock number, see [1] for available
+      clocks.
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/en7523-clk.h>
+    scu: system-controller@1fa20000 {
+      compatible = "airoha,en7523-scu";
+      reg = <0x1fa20000 0x400>,
+            <0x1fb00000 0x1000>;
+      #clock-cells = <1>;
+    };
index f2ea538..6fe5413 100644 (file)
@@ -1,186 +1,2 @@
-This binding is a work-in-progress, and are based on some experimental
-work by benh[1].
-
-Sources of clock signal can be represented by any node in the device
-tree.  Those nodes are designated as clock providers.  Clock consumer
-nodes use a phandle and clock specifier pair to connect clock provider
-outputs to clock inputs.  Similar to the gpio specifiers, a clock
-specifier is an array of zero, one or more cells identifying the clock
-output on a device.  The length of a clock specifier is defined by the
-value of a #clock-cells property in the clock provider node.
-
-[1] https://patchwork.ozlabs.org/patch/31551/
-
-==Clock providers==
-
-Required properties:
-#clock-cells:     Number of cells in a clock specifier; Typically 0 for nodes
-                  with a single clock output and 1 for nodes with multiple
-                  clock outputs.
-
-Optional properties:
-clock-output-names: Recommended to be a list of strings of clock output signal
-                   names indexed by the first cell in the clock specifier.
-                   However, the meaning of clock-output-names is domain
-                   specific to the clock provider, and is only provided to
-                   encourage using the same meaning for the majority of clock
-                   providers.  This format may not work for clock providers
-                   using a complex clock specifier format.  In those cases it
-                   is recommended to omit this property and create a binding
-                   specific names property.
-
-                   Clock consumer nodes must never directly reference
-                   the provider's clock-output-names property.
-
-For example:
-
-    oscillator {
-        #clock-cells = <1>;
-        clock-output-names = "ckil", "ckih";
-    };
-
-- this node defines a device with two clock outputs, the first named
-  "ckil" and the second named "ckih".  Consumer nodes always reference
-  clocks by index. The names should reflect the clock output signal
-  names for the device.
-
-clock-indices:    If the identifying number for the clocks in the node
-                  is not linear from zero, then this allows the mapping of
-                  identifiers into the clock-output-names array.
-
-For example, if we have two clocks <&oscillator 1> and <&oscillator 3>:
-
-       oscillator {
-               compatible = "myclocktype";
-               #clock-cells = <1>;
-               clock-indices = <1>, <3>;
-               clock-output-names = "clka", "clkb";
-       }
-
-       This ensures we do not have any empty strings in clock-output-names
-
-
-==Clock consumers==
-
-Required properties:
-clocks:                List of phandle and clock specifier pairs, one pair
-               for each clock input to the device.  Note: if the
-               clock provider specifies '0' for #clock-cells, then
-               only the phandle portion of the pair will appear.
-
-Optional properties:
-clock-names:   List of clock input name strings sorted in the same
-               order as the clocks property.  Consumers drivers
-               will use clock-names to match clock input names
-               with clocks specifiers.
-clock-ranges:  Empty property indicating that child nodes can inherit named
-               clocks from this node. Useful for bus nodes to provide a
-               clock to their children.
-
-For example:
-
-    device {
-        clocks = <&osc 1>, <&ref 0>;
-        clock-names = "baud", "register";
-    };
-
-
-This represents a device with two clock inputs, named "baud" and "register".
-The baud clock is connected to output 1 of the &osc device, and the register
-clock is connected to output 0 of the &ref.
-
-==Example==
-
-    /* external oscillator */
-    osc: oscillator {
-        compatible = "fixed-clock";
-        #clock-cells = <0>;
-        clock-frequency  = <32678>;
-        clock-output-names = "osc";
-    };
-
-    /* phase-locked-loop device, generates a higher frequency clock
-     * from the external oscillator reference */
-    pll: pll@4c000 {
-        compatible = "vendor,some-pll-interface"
-        #clock-cells = <1>;
-        clocks = <&osc 0>;
-        clock-names = "ref";
-        reg = <0x4c000 0x1000>;
-        clock-output-names = "pll", "pll-switched";
-    };
-
-    /* UART, using the low frequency oscillator for the baud clock,
-     * and the high frequency switched PLL output for register
-     * clocking */
-    uart@a000 {
-        compatible = "fsl,imx-uart";
-        reg = <0xa000 0x1000>;
-        interrupts = <33>;
-        clocks = <&osc 0>, <&pll 1>;
-        clock-names = "baud", "register";
-    };
-
-This DT fragment defines three devices: an external oscillator to provide a
-low-frequency reference clock, a PLL device to generate a higher frequency
-clock signal, and a UART.
-
-* The oscillator is fixed-frequency, and provides one clock output, named "osc".
-* The PLL is both a clock provider and a clock consumer. It uses the clock
-  signal generated by the external oscillator, and provides two output signals
-  ("pll" and "pll-switched").
-* The UART has its baud clock connected the external oscillator and its
-  register clock connected to the PLL clock (the "pll-switched" signal)
-
-==Assigned clock parents and rates==
-
-Some platforms may require initial configuration of default parent clocks
-and clock frequencies. Such a configuration can be specified in a device tree
-node through assigned-clocks, assigned-clock-parents and assigned-clock-rates
-properties. The assigned-clock-parents property should contain a list of parent
-clocks in the form of a phandle and clock specifier pair and the
-assigned-clock-rates property should contain a list of frequencies in Hz. Both
-these properties should correspond to the clocks listed in the assigned-clocks
-property.
-
-To skip setting parent or rate of a clock its corresponding entry should be
-set to 0, or can be omitted if it is not followed by any non-zero entry.
-
-    uart@a000 {
-        compatible = "fsl,imx-uart";
-        reg = <0xa000 0x1000>;
-        ...
-        clocks = <&osc 0>, <&pll 1>;
-        clock-names = "baud", "register";
-
-        assigned-clocks = <&clkcon 0>, <&pll 2>;
-        assigned-clock-parents = <&pll 2>;
-        assigned-clock-rates = <0>, <460800>;
-    };
-
-In this example the <&pll 2> clock is set as parent of clock <&clkcon 0> and
-the <&pll 2> clock is assigned a frequency value of 460800 Hz.
-
-Configuring a clock's parent and rate through the device node that consumes
-the clock can be done only for clocks that have a single user. Specifying
-conflicting parent or rate configuration in multiple consumer nodes for
-a shared clock is forbidden.
-
-Configuration of common clocks, which affect multiple consumer devices can
-be similarly specified in the clock provider node.
-
-==Protected clocks==
-
-Some platforms or firmwares may not fully expose all the clocks to the OS, such
-as in situations where those clks are used by drivers running in ARM secure
-execution levels. Such a configuration can be specified in device tree with the
-protected-clocks property in the form of a clock specifier list. This property should
-only be specified in the node that is providing the clocks being protected:
-
-   clock-controller@a000f000 {
-        compatible = "vendor,clk95;
-        reg = <0xa000f000 0x1000>
-        #clocks-cells = <1>;
-        ...
-        protected-clocks = <UART3_CLK>, <SPI5_CLK>;
-   };
+This file has moved to the clock binding schema:
+https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/clock/clock.yaml
index e0b8621..e57bc40 100644 (file)
@@ -49,6 +49,7 @@ properties:
       - renesas,r8a77995-cpg-mssr # R-Car D3
       - renesas,r8a779a0-cpg-mssr # R-Car V3U
       - renesas,r8a779f0-cpg-mssr # R-Car S4-8
+      - renesas,r8a779g0-cpg-mssr # R-Car V4H
 
   reg:
     maxItems: 1
index bd3af8f..8880b83 100644 (file)
@@ -4,14 +4,15 @@
 $id: "http://devicetree.org/schemas/clock/renesas,rzg2l-cpg.yaml#"
 $schema: "http://devicetree.org/meta-schemas/core.yaml#"
 
-title: Renesas RZ/{G2L,V2L} Clock Pulse Generator / Module Standby Mode
+title: Renesas RZ/{G2L,V2L,V2M} Clock Pulse Generator / Module Standby Mode
 
 maintainers:
   - Geert Uytterhoeven <geert+renesas@glider.be>
 
 description: |
-  On Renesas RZ/{G2L,V2L} SoC, the CPG (Clock Pulse Generator) and Module
-  Standby Mode share the same register block.
+  On Renesas RZ/{G2L,V2L}-alike SoC's, the CPG (Clock Pulse Generator) and Module
+  Standby Mode share the same register block. On RZ/V2M, the functionality is
+  similar, but does not have Clock Monitor Registers.
 
   They provide the following functionalities:
     - The CPG block generates various core clocks,
@@ -23,8 +24,10 @@ description: |
 properties:
   compatible:
     enum:
-      - renesas,r9a07g044-cpg  # RZ/G2{L,LC}
-      - renesas,r9a07g054-cpg  # RZ/V2L
+      - renesas,r9a07g043-cpg # RZ/G2UL{Type-1,Type-2}
+      - renesas,r9a07g044-cpg # RZ/G2{L,LC}
+      - renesas,r9a07g054-cpg # RZ/V2L
+      - renesas,r9a09g011-cpg # RZ/V2M
 
   reg:
     maxItems: 1
@@ -42,9 +45,10 @@ properties:
     description: |
       - For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
         and a core clock reference, as defined in
-        <dt-bindings/clock/r9a07g*-cpg.h>
+        <dt-bindings/clock/r9a0*-cpg.h>
       - For module clocks, the two clock specifier cells must be "CPG_MOD" and
-        a module number, as defined in the <dt-bindings/clock/r9a07g0*-cpg.h>.
+        a module number, as defined in the <dt-bindings/clock/r9a07g0*-cpg.h> or
+        <dt-bindings/clock/r9a09g011-cpg.h>.
     const: 2
 
   '#power-domain-cells':
@@ -58,7 +62,7 @@ properties:
   '#reset-cells':
     description:
       The single reset specifier cell must be the module number, as defined in
-      the <dt-bindings/clock/r9a07g0*-cpg.h>.
+      the <dt-bindings/clock/r9a07g0*-cpg.h> or <dt-bindings/clock/r9a09g011-cpg.h>.
     const: 1
 
 required:
diff --git a/Documentation/devicetree/bindings/clock/rockchip,px30-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,px30-cru.txt
deleted file mode 100644 (file)
index 55e78cd..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-* Rockchip PX30 Clock and Reset Unit
-
-The PX30 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: PMU for CRU should be "rockchip,px30-pmu-cru"
-- compatible: CRU should be "rockchip,px30-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- clocks: A list of phandle + clock-specifier pairs for the clocks listed
-          in clock-names
-- clock-names: Should contain the following:
-  - "xin24m" for both PMUCRU and CRU
-  - "gpll" for CRU (sourced from PMUCRU)
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing, pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/px30-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "xin32k" - rtc clock - optional,
- - "i2sx_clkin" - external I2S clock - optional,
- - "gmac_clkin" - external GMAC clock - optional
-
-Example: Clock controller node:
-
-       pmucru: clock-controller@ff2bc000 {
-               compatible = "rockchip,px30-pmucru";
-               reg = <0x0 0xff2bc000 0x0 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-       cru: clock-controller@ff2b0000 {
-               compatible = "rockchip,px30-cru";
-               reg = <0x0 0xff2b0000 0x0 0x1000>;
-               rockchip,grf = <&grf>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@ff030000 {
-               compatible = "rockchip,px30-uart", "snps,dw-apb-uart";
-               reg = <0x0 0xff030000 0x0 0x100>;
-               interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
-               clocks = <&pmucru SCLK_UART0_PMU>, <&pmucru PCLK_UART0_PMU>;
-               clock-names = "baudclk", "apb_pclk";
-               reg-shift = <2>;
-               reg-io-width = <4>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,px30-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,px30-cru.yaml
new file mode 100644 (file)
index 0000000..3eec381
--- /dev/null
@@ -0,0 +1,119 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,px30-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip PX30 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The PX30 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/px30-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"     - crystal input       - required
+    - "xin32k"     - rtc clock           - optional
+    - "i2sx_clkin" - external I2S clock  - optional
+    - "gmac_clkin" - external GMAC clock - optional
+
+properties:
+  compatible:
+    enum:
+      - rockchip,px30-cru
+      - rockchip,px30-pmucru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    minItems: 1
+    items:
+      - description: Clock for both PMUCRU and CRU
+      - description: Clock for CRU (sourced from PMUCRU)
+
+  clock-names:
+    minItems: 1
+    items:
+      - const: xin24m
+      - const: gpll
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - clock-names
+  - "#clock-cells"
+  - "#reset-cells"
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: rockchip,px30-cru
+
+    then:
+      properties:
+        clocks:
+          minItems: 2
+
+        clock-names:
+          minItems: 2
+
+    else:
+      properties:
+        clocks:
+          maxItems: 1
+
+        clock-names:
+          maxItems: 1
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/px30-cru.h>
+
+    pmucru: clock-controller@ff2bc000 {
+      compatible = "rockchip,px30-pmucru";
+      reg = <0xff2bc000 0x1000>;
+      clocks = <&xin24m>;
+      clock-names = "xin24m";
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
+
+    cru: clock-controller@ff2b0000 {
+      compatible = "rockchip,px30-cru";
+      reg = <0xff2b0000 0x1000>;
+      clocks = <&xin24m>, <&pmucru PLL_GPLL>;
+      clock-names = "xin24m", "gpll";
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.txt
deleted file mode 100644 (file)
index 20df350..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-* Rockchip RK3036 Clock and Reset Unit
-
-The RK3036 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: should be "rockchip,rk3036-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3036-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "ext_i2s" - external I2S clock - optional,
- - "rmii_clkin" - external EMAC clock - optional
-
-Example: Clock controller node:
-
-       cru: cru@20000000 {
-               compatible = "rockchip,rk3036-cru";
-               reg = <0x20000000 0x1000>;
-               rockchip,grf = <&grf>;
-
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@20060000 {
-               compatible = "snps,dw-apb-uart";
-               reg = <0x20060000 0x100>;
-               interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
-               clocks = <&cru SCLK_UART0>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.yaml
new file mode 100644 (file)
index 0000000..1376230
--- /dev/null
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3036-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3036 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3036 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3036-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"     - crystal input       - required
+    - "ext_i2s"    - external I2S clock  - optional
+    - "rmii_clkin" - external EMAC clock - optional
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3036-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@20000000 {
+      compatible = "rockchip,rk3036-cru";
+      reg = <0x20000000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.txt
deleted file mode 100644 (file)
index 7f36853..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-* Rockchip RK3188/RK3066 Clock and Reset Unit
-
-The RK3188/RK3066 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: should be "rockchip,rk3188-cru", "rockchip,rk3188a-cru" or
-                       "rockchip,rk3066a-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3188-cru.h and
-dt-bindings/clock/rk3066-cru.h headers and can be used in device tree sources.
-Similar macros exist for the reset sources in these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "xin32k" - rtc clock - optional,
- - "xin27m" - 27mhz crystal input on rk3066 - optional,
- - "ext_hsadc" - external HSADC clock - optional,
- - "ext_cif0" - external camera clock - optional,
- - "ext_rmii" - external RMII clock - optional,
- - "ext_jtag" - externalJTAG clock - optional
-
-Example: Clock controller node:
-
-       cru: cru@20000000 {
-               compatible = "rockchip,rk3188-cru";
-               reg = <0x20000000 0x1000>;
-               rockchip,grf = <&grf>;
-
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@10124000 {
-               compatible = "snps,dw-apb-uart";
-               reg = <0x10124000 0x400>;
-               interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <1>;
-               clocks = <&cru SCLK_UART0>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.yaml
new file mode 100644 (file)
index 0000000..ddd7e46
--- /dev/null
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3188-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3188/RK3066 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3188/RK3066 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3188-cru.h and
+  dt-bindings/clock/rk3066-cru.h headers and can be used in device tree sources.
+  Similar macros exist for the reset sources in these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"    - crystal input                 - required
+    - "xin32k"    - RTC clock                     - optional
+    - "xin27m"    - 27mhz crystal input on RK3066 - optional
+    - "ext_hsadc" - external HSADC clock          - optional
+    - "ext_cif0"  - external camera clock         - optional
+    - "ext_rmii"  - external RMII clock           - optional
+    - "ext_jtag"  - external JTAG clock           - optional
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3066a-cru
+      - rockchip,rk3188-cru
+      - rockchip,rk3188a-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@20000000 {
+      compatible = "rockchip,rk3188-cru";
+      reg = <0x20000000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.txt
deleted file mode 100644 (file)
index f323048..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-* Rockchip RK3228 Clock and Reset Unit
-
-The RK3228 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: should be "rockchip,rk3228-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3228-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "ext_i2s" - external I2S clock - optional,
- - "ext_gmac" - external GMAC clock - optional
- - "ext_hsadc" - external HSADC clock - optional
- - "phy_50m_out" - output clock of the pll in the mac phy
-
-Example: Clock controller node:
-
-       cru: cru@20000000 {
-               compatible = "rockchip,rk3228-cru";
-               reg = <0x20000000 0x1000>;
-               rockchip,grf = <&grf>;
-
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@10110000 {
-               compatible = "snps,dw-apb-uart";
-               reg = <0x10110000 0x100>;
-               interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
-               clocks = <&cru SCLK_UART0>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.yaml
new file mode 100644 (file)
index 0000000..cf7dc01
--- /dev/null
@@ -0,0 +1,74 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3228-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3228 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3228 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3228-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"      - crystal input                          - required
+    - "ext_i2s"     - external I2S clock                     - optional
+    - "ext_gmac"    - external GMAC clock                    - optional
+    - "ext_hsadc"   - external HSADC clock                   - optional
+    - "phy_50m_out" - output clock of the pll in the mac phy
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3228-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@20000000 {
+      compatible = "rockchip,rk3228-cru";
+      reg = <0x20000000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.txt
deleted file mode 100644 (file)
index bf3a9ec..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-* Rockchip RK3288 Clock and Reset Unit
-
-The RK3288 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-A revision of this SoC is available: rk3288w. The clock tree is a bit
-different so another dt-compatible is available. Noticed that it is only
-setting the difference but there is no automatic revision detection. This
-should be performed by bootloaders.
-
-Required Properties:
-
-- compatible: should be "rockchip,rk3288-cru" or "rockchip,rk3288w-cru" in
-  case of this revision of Rockchip rk3288.
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3288-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "xin32k" - rtc clock - optional,
- - "ext_i2s" - external I2S clock - optional,
- - "ext_hsadc" - external HSADC clock - optional,
- - "ext_edp_24m" - external display port clock - optional,
- - "ext_vip" - external VIP clock - optional,
- - "ext_isp" - external ISP clock - optional,
- - "ext_jtag" - external JTAG clock - optional
-
-Example: Clock controller node:
-
-       cru: cru@20000000 {
-               compatible = "rockchip,rk3188-cru";
-               reg = <0x20000000 0x1000>;
-               rockchip,grf = <&grf>;
-
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@10124000 {
-               compatible = "snps,dw-apb-uart";
-               reg = <0x10124000 0x400>;
-               interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <1>;
-               clocks = <&cru SCLK_UART0>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.yaml
new file mode 100644 (file)
index 0000000..96bc057
--- /dev/null
@@ -0,0 +1,85 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3288-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3288 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3288 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+
+  A revision of this SoC is available: rk3288w. The clock tree is a bit
+  different so another dt-compatible is available. Noticed that it is only
+  setting the difference but there is no automatic revision detection. This
+  should be performed by boot loaders.
+
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3288-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"      - crystal input               - required,
+    - "xin32k"      - rtc clock                   - optional,
+    - "ext_i2s"     - external I2S clock          - optional,
+    - "ext_hsadc"   - external HSADC clock        - optional,
+    - "ext_edp_24m" - external display port clock - optional,
+    - "ext_vip"     - external VIP clock          - optional,
+    - "ext_isp"     - external ISP clock          - optional,
+    - "ext_jtag"    - external JTAG clock         - optional
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3288-cru
+      - rockchip,rk3288w-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@ff760000 {
+      compatible = "rockchip,rk3288-cru";
+      reg = <0xff760000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.txt
deleted file mode 100644 (file)
index 9b151c5..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-* Rockchip RK3308 Clock and Reset Unit
-
-The RK3308 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: CRU should be "rockchip,rk3308-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing, pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3308-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "xin32k" - rtc clock - optional,
- - "mclk_i2s0_8ch_in", "mclk_i2s1_8ch_in", "mclk_i2s2_8ch_in",
-   "mclk_i2s3_8ch_in", "mclk_i2s0_2ch_in",
-   "mclk_i2s1_2ch_in" - external I2S or SPDIF clock - optional,
- - "mac_clkin" - external MAC clock - optional
-
-Example: Clock controller node:
-
-       cru: clock-controller@ff500000 {
-               compatible = "rockchip,rk3308-cru";
-               reg = <0x0 0xff500000 0x0 0x1000>;
-               rockchip,grf = <&grf>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@ff0a0000 {
-               compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
-               reg = <0x0 0xff0a0000 0x0 0x100>;
-               interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
-               clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
-               clock-names = "baudclk", "apb_pclk";
-               reg-shift = <2>;
-               reg-io-width = <4>;
-               status = "disabled";
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.yaml
new file mode 100644 (file)
index 0000000..523ee57
--- /dev/null
@@ -0,0 +1,76 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3308-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3308 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3308 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3308-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"                               - crystal input      - required
+    - "xin32k"                               - rtc clock          - optional
+    - "mclk_i2s0_8ch_in", "mclk_i2s1_8ch_in",
+      "mclk_i2s2_8ch_in", "mclk_i2s3_8ch_in",
+      "mclk_i2s0_2ch_in", "mclk_i2s1_2ch_in" - external I2S or
+                                               SPDIF clock        - optional
+    - "mac_clkin"                            - external MAC clock - optional
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3308-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@ff500000 {
+      compatible = "rockchip,rk3308-cru";
+      reg = <0xff500000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.txt
deleted file mode 100644 (file)
index 7c8bbcf..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-* Rockchip RK3368 Clock and Reset Unit
-
-The RK3368 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: should be "rockchip,rk3368-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing, pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3368-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "xin32k" - rtc clock - optional,
- - "ext_i2s" - external I2S clock - optional,
- - "ext_gmac" - external GMAC clock - optional
- - "ext_hsadc" - external HSADC clock - optional,
- - "ext_isp" - external ISP clock - optional,
- - "ext_jtag" - external JTAG clock - optional
- - "ext_vip" - external VIP clock - optional,
- - "usbotg_out" - output clock of the pll in the otg phy
-
-Example: Clock controller node:
-
-       cru: clock-controller@ff760000 {
-               compatible = "rockchip,rk3368-cru";
-               reg = <0x0 0xff760000 0x0 0x1000>;
-               rockchip,grf = <&grf>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@10124000 {
-               compatible = "snps,dw-apb-uart";
-               reg = <0x10124000 0x400>;
-               interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <1>;
-               clocks = <&cru SCLK_UART0>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.yaml
new file mode 100644 (file)
index 0000000..adb6787
--- /dev/null
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3368-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3368 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3368 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3368-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"     - crystal input                          - required
+    - "xin32k"     - rtc clock                              - optional
+    - "ext_i2s"    - external I2S clock                     - optional
+    - "ext_gmac"   - external GMAC clock                    - optional
+    - "ext_hsadc"  - external HSADC clock                   - optional
+    - "ext_isp"    - external ISP clock                     - optional
+    - "ext_jtag"   - external JTAG clock                    - optional
+    - "ext_vip"    - external VIP clock                     - optional
+    - "usbotg_out" - output clock of the pll in the otg phy
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3368-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@ff760000 {
+      compatible = "rockchip,rk3368-cru";
+      reg = <0xff760000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
index 72b286a..54da1e3 100644 (file)
@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
 title: Rockchip RK3399 Clock and Reset Unit
 
 maintainers:
-  - Xing Zheng <zhengxing@rock-chips.com>
+  - Elaine Zhang <zhangqing@rock-chips.com>
   - Heiko Stuebner <heiko@sntech.de>
 
 description: |
@@ -22,11 +22,11 @@ description: |
   There are several clocks that are generated outside the SoC. It is expected
   that they are defined using standard clock bindings with following
   clock-output-names:
-    - "xin24m" - crystal input - required,
-    - "xin32k" - rtc clock - optional,
-    - "clkin_gmac" - external GMAC clock - optional,
-    - "clkin_i2s" - external I2S clock - optional,
-    - "pclkin_cif" - external ISP clock - optional,
+    - "xin24m"           - crystal input                          - required,
+    - "xin32k"           - rtc clock                              - optional,
+    - "clkin_gmac"       - external GMAC clock                    - optional,
+    - "clkin_i2s"        - external I2S clock                     - optional,
+    - "pclkin_cif"       - external ISP clock                     - optional,
     - "clk_usbphy0_480m" - output clock of the pll in the usbphy0
     - "clk_usbphy1_480m" - output clock of the pll in the usbphy1
 
@@ -46,24 +46,15 @@ properties:
     const: 1
 
   clocks:
-    minItems: 1
-
-  assigned-clocks:
-    minItems: 1
-    maxItems: 64
-
-  assigned-clock-parents:
-    minItems: 1
-    maxItems: 64
+    maxItems: 1
 
-  assigned-clock-rates:
-    minItems: 1
-    maxItems: 64
+  clock-names:
+    const: xin24m
 
   rockchip,grf:
     $ref: /schemas/types.yaml#/definitions/phandle
-    description: >
-      phandle to the syscon managing the "general register files". It is used
+    description:
+      Phandle to the syscon managing the "general register files". It is used
       for GRF muxes, if missing any muxes present in the GRF will not be
       available.
 
@@ -77,7 +68,7 @@ additionalProperties: false
 
 examples:
   - |
-    pmucru: pmu-clock-controller@ff750000 {
+    pmucru: clock-controller@ff750000 {
       compatible = "rockchip,rk3399-pmucru";
       reg = <0xff750000 0x1000>;
       #clock-cells = <1>;
index b2c2609..fc7546f 100644 (file)
@@ -34,6 +34,19 @@ properties:
   "#reset-cells":
     const: 1
 
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.txt
deleted file mode 100644 (file)
index 161326a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-* Rockchip RV1108 Clock and Reset Unit
-
-The RV1108 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: should be "rockchip,rv1108-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files"
-  If missing pll rates are not changeable, due to the missing pll lock status.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rv1108-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "ext_vip" - external VIP clock - optional
- - "ext_i2s" - external I2S clock - optional
- - "ext_gmac" - external GMAC clock - optional
- - "hdmiphy" - external clock input derived from HDMI PHY - optional
- - "usbphy" - external clock input derived from USB PHY - optional
-
-Example: Clock controller node:
-
-       cru: cru@20200000 {
-               compatible = "rockchip,rv1108-cru";
-               reg = <0x20200000 0x1000>;
-               rockchip,grf = <&grf>;
-
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@10230000 {
-               compatible = "rockchip,rv1108-uart", "snps,dw-apb-uart";
-               reg = <0x10230000 0x100>;
-               interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
-               clocks = <&cru SCLK_UART0>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.yaml
new file mode 100644 (file)
index 0000000..20421c2
--- /dev/null
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rv1108-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RV1108 Clock and Reset Unit (CRU)
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RV1108 clock controller generates and supplies clocks to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rv1108-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m"   - crystal input                              - required
+    - "ext_vip"  - external VIP clock                         - optional
+    - "ext_i2s"  - external I2S clock                         - optional
+    - "ext_gmac" - external GMAC clock                        - optional
+    - "hdmiphy"  - external clock input derived from HDMI PHY - optional
+    - "usbphy"   - external clock input derived from USB PHY  - optional
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rv1108-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    const: xin24m
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      Phandle to the syscon managing the "general register files" (GRF),
+      if missing pll rates are not changeable, due to the missing pll
+      lock status.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    cru: clock-controller@20200000 {
+      compatible = "rockchip,rv1108-cru";
+      reg = <0x20200000 0x1000>;
+      rockchip,grf = <&grf>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/samsung,exynosautov9-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,exynosautov9-clock.yaml
new file mode 100644 (file)
index 0000000..eafc715
--- /dev/null
@@ -0,0 +1,219 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,exynosautov9-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung Exynos Auto v9 SoC clock controller
+
+maintainers:
+  - Chanho Park <chanho61.park@samsung.com>
+  - Chanwoo Choi <cw00.choi@samsung.com>
+  - Krzysztof Kozlowski <krzk@kernel.org>
+  - Sylwester Nawrocki <s.nawrocki@samsung.com>
+  - Tomasz Figa <tomasz.figa@gmail.com>
+
+description: |
+  Exynos Auto v9 clock controller is comprised of several CMU units, generating
+  clocks for different domains. Those CMU units are modeled as separate device
+  tree nodes, and might depend on each other. Root clocks in that clock tree are
+  two external clocks:: OSCCLK/XTCXO (26 MHz) and RTCCLK/XrtcXTI (32768 Hz).
+  The external OSCCLK must be defined as fixed-rate clock in dts.
+
+  CMU_TOP is a top-level CMU, where all base clocks are prepared using PLLs and
+  dividers; all other clocks of function blocks (other CMUs) are usually
+  derived from CMU_TOP.
+
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All clocks available for usage
+  in clock consumer nodes are defined as preprocessor macros in
+  'include/dt-bindings/clock/samsung,exynosautov9.h' header.
+
+properties:
+  compatible:
+    enum:
+      - samsung,exynosautov9-cmu-top
+      - samsung,exynosautov9-cmu-busmc
+      - samsung,exynosautov9-cmu-core
+      - samsung,exynosautov9-cmu-fsys2
+      - samsung,exynosautov9-cmu-peric0
+      - samsung,exynosautov9-cmu-peric1
+      - samsung,exynosautov9-cmu-peris
+
+  clocks:
+    minItems: 1
+    maxItems: 5
+
+  clock-names:
+    minItems: 1
+    maxItems: 5
+
+  "#clock-cells":
+    const: 1
+
+  reg:
+    maxItems: 1
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-top
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+
+        clock-names:
+          items:
+            - const: oscclk
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-busmc
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_BUSMC bus clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_busmc_bus
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-core
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_CORE bus clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_core_bus
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-fsys2
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_FSYS2 bus clock (from CMU_TOP)
+            - description: UFS clock (from CMU_TOP)
+            - description: Ethernet clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_fsys2_bus
+            - const: dout_fsys2_clkcmu_ufs_embd
+            - const: dout_fsys2_clkcmu_ethernet
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-peric0
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_PERIC0 bus clock (from CMU_TOP)
+            - description: PERIC0 IP clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_peric0_bus
+            - const: dout_clkcmu_peric0_ip
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-peric1
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_PERIC1 bus clock (from CMU_TOP)
+            - description: PERIC1 IP clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_peric1_bus
+            - const: dout_clkcmu_peric1_ip
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-peris
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_PERIS bus clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_peris_bus
+
+required:
+  - compatible
+  - "#clock-cells"
+  - clocks
+  - clock-names
+  - reg
+
+additionalProperties: false
+
+examples:
+  # Clock controller node for CMU_FSYS2
+  - |
+    #include <dt-bindings/clock/samsung,exynosautov9.h>
+
+    cmu_fsys2: clock-controller@17c00000 {
+        compatible = "samsung,exynosautov9-cmu-fsys2";
+        reg = <0x17c00000 0x8000>;
+        #clock-cells = <1>;
+
+        clocks = <&xtcxo>,
+                 <&cmu_top DOUT_CLKCMU_FSYS2_BUS>,
+                 <&cmu_top DOUT_CLKCMU_FSYS2_UFS_EMBD>,
+                 <&cmu_top DOUT_CLKCMU_FSYS2_ETHERNET>;
+        clock-names = "oscclk",
+                      "dout_clkcmu_fsys2_bus",
+                      "dout_fsys2_clkcmu_ufs_embd",
+                      "dout_fsys2_clkcmu_ethernet";
+    };
+
+...
index a0ae486..b758d6b 100644 (file)
@@ -41,6 +41,7 @@ description: |
 
   The list of valid indices for STM32MP1 is available in:
   include/dt-bindings/reset-controller/stm32mp1-resets.h
+  include/dt-bindings/reset-controller/stm32mp13-resets.h
 
   This file implements defines like:
   #define LTDC_R       3072
@@ -57,6 +58,7 @@ properties:
       - enum:
           - st,stm32mp1-rcc-secure
           - st,stm32mp1-rcc
+          - st,stm32mp13-rcc
       - const: syscon
 
   reg:
index 9bc95a3..2150307 100644 (file)
@@ -109,6 +109,25 @@ properties:
 
     additionalProperties: false
 
+  clkout-clock:
+    description: A subnode with three clock cells for externally routed clocks,
+      output clocks. These are two PRCMU-internal clocks that can be divided and
+      muxed out on the pads of the DB8500 SoC.
+    type: object
+
+    properties:
+      '#clock-cells':
+        description:
+          The first cell indicates which output clock we are using,
+          possible values are 0 (CLKOUT1) and 1 (CLKOUT2).
+          The second cell indicates which clock we want to use as source,
+          possible values are 0 thru 7, see the defines for the different
+          source clocks.
+          The third cell is a divider, legal values are 1 thru 63.
+        const: 3
+
+    additionalProperties: false
+
 required:
   - compatible
   - reg
@@ -119,3 +138,41 @@ required:
   - smp-twd-clock
 
 additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/ste-db8500-clkout.h>
+    clocks@8012 {
+      compatible = "stericsson,u8500-clks";
+      reg = <0x8012f000 0x1000>, <0x8011f000 0x1000>,
+            <0x8000f000 0x1000>, <0xa03ff000 0x1000>,
+            <0xa03cf000 0x1000>;
+
+      prcmu_clk: prcmu-clock {
+        #clock-cells = <1>;
+      };
+
+      prcc_pclk: prcc-periph-clock {
+        #clock-cells = <2>;
+      };
+
+      prcc_kclk: prcc-kernel-clock {
+        #clock-cells = <2>;
+      };
+
+      prcc_reset: prcc-reset-controller {
+        #reset-cells = <2>;
+      };
+
+      rtc_clk: rtc32k-clock {
+        #clock-cells = <0>;
+      };
+
+      smp_twd_clk: smp-twd-clock {
+        #clock-cells = <0>;
+      };
+
+      clkout_clk: clkout-clock {
+        #clock-cells = <3>;
+      };
+    };
index 9b537bc..6676511 100644 (file)
@@ -15,6 +15,7 @@ properties:
       - enum:
           - ti,am654-ehrpwm-tbclk
           - ti,am64-epwm-tbclk
+          - ti,am62-epwm-tbclk
       - const: syscon
 
   "#clock-cells":
index 5d596e7..48f8f42 100644 (file)
@@ -210,6 +210,15 @@ config COMMON_CLK_CS2000_CP
        help
          If you say yes here you get support for the CS2000 clock multiplier.
 
+config COMMON_CLK_EN7523
+       bool "Clock driver for Airoha EN7523 SoC system clocks"
+       depends on OF
+       depends on ARCH_AIROHA || COMPILE_TEST
+       default ARCH_AIROHA
+       help
+         This driver provides the fixed clocks and gates present on Airoha
+         ARM silicon.
+
 config COMMON_CLK_FSL_FLEXSPI
        tristate "Clock driver for FlexSPI on Layerscape SoCs"
        depends on ARCH_LAYERSCAPE || COMPILE_TEST
@@ -368,6 +377,11 @@ config COMMON_CLK_VC5
          This driver supports the IDT VersaClock 5 and VersaClock 6
          programmable clock generators.
 
+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
index 2bd5ffd..a6c2a7b 100644 (file)
@@ -30,6 +30,7 @@ obj-$(CONFIG_COMMON_CLK_CDCE925)      += clk-cdce925.o
 obj-$(CONFIG_ARCH_CLPS711X)            += clk-clps711x.o
 obj-$(CONFIG_COMMON_CLK_CS2000_CP)     += clk-cs2000-cp.o
 obj-$(CONFIG_ARCH_SPARX5)              += clk-sparx5.o
+obj-$(CONFIG_COMMON_CLK_EN7523)                += clk-en7523.o
 obj-$(CONFIG_COMMON_CLK_FIXED_MMIO)    += clk-fixed-mmio.o
 obj-$(CONFIG_COMMON_CLK_FSL_FLEXSPI)   += clk-fsl-flexspi.o
 obj-$(CONFIG_COMMON_CLK_FSL_SAI)       += clk-fsl-sai.o
@@ -115,6 +116,7 @@ obj-y                                       += socfpga/
 obj-$(CONFIG_PLAT_SPEAR)               += spear/
 obj-y                                  += sprd/
 obj-$(CONFIG_ARCH_STI)                 += st/
+obj-$(CONFIG_ARCH_STM32)               += stm32/
 obj-$(CONFIG_SOC_STARFIVE)             += starfive/
 obj-$(CONFIG_ARCH_SUNXI)               += sunxi/
 obj-y                                  += sunxi-ng/
index 02437bd..155f313 100644 (file)
@@ -25,7 +25,7 @@ static u32 owl_pll_calculate_mul(struct owl_pll_hw *pll_hw, unsigned long rate)
        else if (mul > pll_hw->max_mul)
                mul = pll_hw->max_mul;
 
-       return mul &= mul_mask(pll_hw);
+       return mul & mul_mask(pll_hw);
 }
 
 static unsigned long _get_table_rate(const struct clk_pll_table *table,
index 9d09621..7351800 100644 (file)
@@ -345,7 +345,7 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
        int ret;
 
        clks = devm_kcalloc(rpi->dev,
-                           sizeof(*clks), RPI_FIRMWARE_NUM_CLK_ID,
+                           RPI_FIRMWARE_NUM_CLK_ID, sizeof(*clks),
                            GFP_KERNEL);
        if (!clks)
                return -ENOMEM;
index c91e909..5467d94 100644 (file)
@@ -627,8 +627,7 @@ of_clk_cdce_get(struct of_phandle_args *clkspec, void *data)
        return &cdce->clkout[idx].hw;
 }
 
-static int cdce706_probe(struct i2c_client *client,
-                        const struct i2c_device_id *id)
+static int cdce706_probe(struct i2c_client *client)
 {
        struct i2c_adapter *adapter = client->adapter;
        struct cdce706_dev_data *cdce;
@@ -692,7 +691,7 @@ static struct i2c_driver cdce706_i2c_driver = {
                .name   = "cdce706",
                .of_match_table = of_match_ptr(cdce706_dt_match),
        },
-       .probe          = cdce706_probe,
+       .probe_new      = cdce706_probe,
        .remove         = cdce706_remove,
        .id_table       = cdce706_id,
 };
index 308b353..ef9a2d4 100644 (file)
@@ -634,11 +634,20 @@ static struct regmap_bus regmap_cdce925_bus = {
        .read = cdce925_regmap_i2c_read,
 };
 
-static int cdce925_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static const struct i2c_device_id cdce925_id[] = {
+       { "cdce913", CDCE913 },
+       { "cdce925", CDCE925 },
+       { "cdce937", CDCE937 },
+       { "cdce949", CDCE949 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, cdce925_id);
+
+static int cdce925_probe(struct i2c_client *client)
 {
        struct clk_cdce925_chip *data;
        struct device_node *node = client->dev.of_node;
+       const struct i2c_device_id *id = i2c_match_id(cdce925_id, client);
        const char *parent_name;
        const char *pll_clk_name[MAX_NUMBER_OF_PLLS] = {NULL,};
        struct clk_init_data init;
@@ -814,15 +823,6 @@ error:
        return err;
 }
 
-static const struct i2c_device_id cdce925_id[] = {
-       { "cdce913", CDCE913 },
-       { "cdce925", CDCE925 },
-       { "cdce937", CDCE937 },
-       { "cdce949", CDCE949 },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, cdce925_id);
-
 static const struct of_device_id clk_cdce925_of_match[] = {
        { .compatible = "ti,cdce913" },
        { .compatible = "ti,cdce925" },
@@ -837,7 +837,7 @@ static struct i2c_driver cdce925_driver = {
                .name = "cdce925",
                .of_match_table = of_match_ptr(clk_cdce925_of_match),
        },
-       .probe          = cdce925_probe,
+       .probe_new      = cdce925_probe,
        .id_table       = cdce925_id,
 };
 module_i2c_driver(cdce925_driver);
index dc5040a..aa5c72b 100644 (file)
@@ -570,8 +570,7 @@ static int cs2000_remove(struct i2c_client *client)
        return 0;
 }
 
-static int cs2000_probe(struct i2c_client *client,
-                       const struct i2c_device_id *id)
+static int cs2000_probe(struct i2c_client *client)
 {
        struct cs2000_priv *priv;
        struct device *dev = &client->dev;
@@ -625,7 +624,7 @@ static struct i2c_driver cs2000_driver = {
                .pm     = &cs2000_pm_ops,
                .of_match_table = cs2000_of_match,
        },
-       .probe          = cs2000_probe,
+       .probe_new      = cs2000_probe,
        .remove         = cs2000_remove,
        .id_table       = cs2000_id,
 };
diff --git a/drivers/clk/clk-en7523.c b/drivers/clk/clk-en7523.c
new file mode 100644 (file)
index 0000000..29f0126
--- /dev/null
@@ -0,0 +1,351 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/delay.h>
+#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 <dt-bindings/clock/en7523-clk.h>
+
+#define REG_PCI_CONTROL                        0x88
+#define   REG_PCI_CONTROL_PERSTOUT     BIT(29)
+#define   REG_PCI_CONTROL_PERSTOUT1    BIT(26)
+#define   REG_PCI_CONTROL_REFCLK_EN1   BIT(22)
+#define REG_GSW_CLK_DIV_SEL            0x1b4
+#define REG_EMI_CLK_DIV_SEL            0x1b8
+#define REG_BUS_CLK_DIV_SEL            0x1bc
+#define REG_SPI_CLK_DIV_SEL            0x1c4
+#define REG_SPI_CLK_FREQ_SEL           0x1c8
+#define REG_NPU_CLK_DIV_SEL            0x1fc
+#define REG_CRYPTO_CLKSRC              0x200
+#define REG_RESET_CONTROL              0x834
+#define   REG_RESET_CONTROL_PCIEHB     BIT(29)
+#define   REG_RESET_CONTROL_PCIE1      BIT(27)
+#define   REG_RESET_CONTROL_PCIE2      BIT(26)
+
+struct en_clk_desc {
+       int id;
+       const char *name;
+       u32 base_reg;
+       u8 base_bits;
+       u8 base_shift;
+       union {
+               const unsigned int *base_values;
+               unsigned int base_value;
+       };
+       size_t n_base_values;
+
+       u16 div_reg;
+       u8 div_bits;
+       u8 div_shift;
+       u16 div_val0;
+       u8 div_step;
+};
+
+struct en_clk_gate {
+       void __iomem *base;
+       struct clk_hw hw;
+};
+
+static const u32 gsw_base[] = { 400000000, 500000000 };
+static const u32 emi_base[] = { 333000000, 400000000 };
+static const u32 bus_base[] = { 500000000, 540000000 };
+static const u32 slic_base[] = { 100000000, 3125000 };
+static const u32 npu_base[] = { 333000000, 400000000, 500000000 };
+
+static const struct en_clk_desc en7523_base_clks[] = {
+       {
+               .id = EN7523_CLK_GSW,
+               .name = "gsw",
+
+               .base_reg = REG_GSW_CLK_DIV_SEL,
+               .base_bits = 1,
+               .base_shift = 8,
+               .base_values = gsw_base,
+               .n_base_values = ARRAY_SIZE(gsw_base),
+
+               .div_bits = 3,
+               .div_shift = 0,
+               .div_step = 1,
+       }, {
+               .id = EN7523_CLK_EMI,
+               .name = "emi",
+
+               .base_reg = REG_EMI_CLK_DIV_SEL,
+               .base_bits = 1,
+               .base_shift = 8,
+               .base_values = emi_base,
+               .n_base_values = ARRAY_SIZE(emi_base),
+
+               .div_bits = 3,
+               .div_shift = 0,
+               .div_step = 1,
+       }, {
+               .id = EN7523_CLK_BUS,
+               .name = "bus",
+
+               .base_reg = REG_BUS_CLK_DIV_SEL,
+               .base_bits = 1,
+               .base_shift = 8,
+               .base_values = bus_base,
+               .n_base_values = ARRAY_SIZE(bus_base),
+
+               .div_bits = 3,
+               .div_shift = 0,
+               .div_step = 1,
+       }, {
+               .id = EN7523_CLK_SLIC,
+               .name = "slic",
+
+               .base_reg = REG_SPI_CLK_FREQ_SEL,
+               .base_bits = 1,
+               .base_shift = 0,
+               .base_values = slic_base,
+               .n_base_values = ARRAY_SIZE(slic_base),
+
+               .div_reg = REG_SPI_CLK_DIV_SEL,
+               .div_bits = 5,
+               .div_shift = 24,
+               .div_val0 = 20,
+               .div_step = 2,
+       }, {
+               .id = EN7523_CLK_SPI,
+               .name = "spi",
+
+               .base_reg = REG_SPI_CLK_DIV_SEL,
+
+               .base_value = 400000000,
+
+               .div_bits = 5,
+               .div_shift = 8,
+               .div_val0 = 40,
+               .div_step = 2,
+       }, {
+               .id = EN7523_CLK_NPU,
+               .name = "npu",
+
+               .base_reg = REG_NPU_CLK_DIV_SEL,
+               .base_bits = 2,
+               .base_shift = 8,
+               .base_values = npu_base,
+               .n_base_values = ARRAY_SIZE(npu_base),
+
+               .div_bits = 3,
+               .div_shift = 0,
+               .div_step = 1,
+       }, {
+               .id = EN7523_CLK_CRYPTO,
+               .name = "crypto",
+
+               .base_reg = REG_CRYPTO_CLKSRC,
+               .base_bits = 1,
+               .base_shift = 8,
+               .base_values = emi_base,
+               .n_base_values = ARRAY_SIZE(emi_base),
+       }
+};
+
+static const struct of_device_id of_match_clk_en7523[] = {
+       { .compatible = "airoha,en7523-scu", },
+       { /* sentinel */ }
+};
+
+static unsigned int en7523_get_base_rate(void __iomem *base, unsigned int i)
+{
+       const struct en_clk_desc *desc = &en7523_base_clks[i];
+       u32 val;
+
+       if (!desc->base_bits)
+               return desc->base_value;
+
+       val = readl(base + desc->base_reg);
+       val >>= desc->base_shift;
+       val &= (1 << desc->base_bits) - 1;
+
+       if (val >= desc->n_base_values)
+               return 0;
+
+       return desc->base_values[val];
+}
+
+static u32 en7523_get_div(void __iomem *base, int i)
+{
+       const struct en_clk_desc *desc = &en7523_base_clks[i];
+       u32 reg, val;
+
+       if (!desc->div_bits)
+               return 1;
+
+       reg = desc->div_reg ? desc->div_reg : desc->base_reg;
+       val = readl(base + reg);
+       val >>= desc->div_shift;
+       val &= (1 << desc->div_bits) - 1;
+
+       if (!val && desc->div_val0)
+               return desc->div_val0;
+
+       return (val + 1) * desc->div_step;
+}
+
+static int en7523_pci_is_enabled(struct clk_hw *hw)
+{
+       struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
+
+       return !!(readl(cg->base + REG_PCI_CONTROL) & REG_PCI_CONTROL_REFCLK_EN1);
+}
+
+static int en7523_pci_prepare(struct clk_hw *hw)
+{
+       struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
+       void __iomem *np_base = cg->base;
+       u32 val, mask;
+
+       /* Need to pull device low before reset */
+       val = readl(np_base + REG_PCI_CONTROL);
+       val &= ~(REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT);
+       writel(val, np_base + REG_PCI_CONTROL);
+       usleep_range(1000, 2000);
+
+       /* Enable PCIe port 1 */
+       val |= REG_PCI_CONTROL_REFCLK_EN1;
+       writel(val, np_base + REG_PCI_CONTROL);
+       usleep_range(1000, 2000);
+
+       /* Reset to default */
+       val = readl(np_base + REG_RESET_CONTROL);
+       mask = REG_RESET_CONTROL_PCIE1 | REG_RESET_CONTROL_PCIE2 |
+              REG_RESET_CONTROL_PCIEHB;
+       writel(val & ~mask, np_base + REG_RESET_CONTROL);
+       usleep_range(1000, 2000);
+       writel(val | mask, np_base + REG_RESET_CONTROL);
+       msleep(100);
+       writel(val & ~mask, np_base + REG_RESET_CONTROL);
+       usleep_range(5000, 10000);
+
+       /* Release device */
+       mask = REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT;
+       val = readl(np_base + REG_PCI_CONTROL);
+       writel(val & ~mask, np_base + REG_PCI_CONTROL);
+       usleep_range(1000, 2000);
+       writel(val | mask, np_base + REG_PCI_CONTROL);
+       msleep(250);
+
+       return 0;
+}
+
+static void en7523_pci_unprepare(struct clk_hw *hw)
+{
+       struct en_clk_gate *cg = container_of(hw, struct en_clk_gate, hw);
+       void __iomem *np_base = cg->base;
+       u32 val;
+
+       val = readl(np_base + REG_PCI_CONTROL);
+       val &= ~REG_PCI_CONTROL_REFCLK_EN1;
+       writel(val, np_base + REG_PCI_CONTROL);
+}
+
+static struct clk_hw *en7523_register_pcie_clk(struct device *dev,
+                                              void __iomem *np_base)
+{
+       static const struct clk_ops pcie_gate_ops = {
+               .is_enabled = en7523_pci_is_enabled,
+               .prepare = en7523_pci_prepare,
+               .unprepare = en7523_pci_unprepare,
+       };
+       struct clk_init_data init = {
+               .name = "pcie",
+               .ops = &pcie_gate_ops,
+       };
+       struct en_clk_gate *cg;
+
+       cg = devm_kzalloc(dev, sizeof(*cg), GFP_KERNEL);
+       if (!cg)
+               return NULL;
+
+       cg->base = np_base;
+       cg->hw.init = &init;
+       en7523_pci_unprepare(&cg->hw);
+
+       if (clk_hw_register(dev, &cg->hw))
+               return NULL;
+
+       return &cg->hw;
+}
+
+static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_data *clk_data,
+                                  void __iomem *base, void __iomem *np_base)
+{
+       struct clk_hw *hw;
+       u32 rate;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(en7523_base_clks); i++) {
+               const struct en_clk_desc *desc = &en7523_base_clks[i];
+
+               rate = en7523_get_base_rate(base, i);
+               rate /= en7523_get_div(base, i);
+
+               hw = clk_hw_register_fixed_rate(dev, desc->name, NULL, 0, rate);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %ld\n",
+                              desc->name, PTR_ERR(hw));
+                       continue;
+               }
+
+               clk_data->hws[desc->id] = hw;
+       }
+
+       hw = en7523_register_pcie_clk(dev, np_base);
+       clk_data->hws[EN7523_CLK_PCIE] = hw;
+
+       clk_data->num = EN7523_NUM_CLOCKS;
+}
+
+static int en7523_clk_probe(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct clk_hw_onecell_data *clk_data;
+       void __iomem *base, *np_base;
+       int r;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       np_base = devm_platform_ioremap_resource(pdev, 1);
+       if (IS_ERR(np_base))
+               return PTR_ERR(np_base);
+
+       clk_data = devm_kzalloc(&pdev->dev,
+                               struct_size(clk_data, hws, EN7523_NUM_CLOCKS),
+                               GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       en7523_register_clocks(&pdev->dev, clk_data, base, np_base);
+
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+               dev_err(&pdev->dev,
+                       "could not register clock provider: %s: %d\n",
+                       pdev->name, r);
+
+       return r;
+}
+
+static struct platform_driver clk_en7523_drv = {
+       .probe = en7523_clk_probe,
+       .driver = {
+               .name = "clk-en7523",
+               .of_match_table = of_match_clk_en7523,
+               .suppress_bind_attrs = true,
+       },
+};
+
+static int __init clk_en7523_init(void)
+{
+       return platform_driver_register(&clk_en7523_drv);
+}
+
+arch_initcall(clk_en7523_init);
index 4550163..ac68a6b 100644 (file)
@@ -87,7 +87,7 @@ struct clk_hw *__clk_hw_register_fixed_rate(struct device *dev,
        hw = &fixed->hw;
        if (dev || !np)
                ret = clk_hw_register(dev, hw);
-       else if (np)
+       else
                ret = of_clk_hw_register(np, hw);
        if (ret) {
                kfree(fixed);
index 5e80f3d..5f85b0a 100644 (file)
@@ -254,8 +254,7 @@ max9485_of_clk_get(struct of_phandle_args *clkspec, void *data)
        return &drvdata->hw[idx].hw;
 }
 
-static int max9485_i2c_probe(struct i2c_client *client,
-                            const struct i2c_device_id *id)
+static int max9485_i2c_probe(struct i2c_client *client)
 {
        struct max9485_driver_data *drvdata;
        struct device *dev = &client->dev;
@@ -377,7 +376,7 @@ static struct i2c_driver max9485_driver = {
                .pm             = &max9485_pm_ops,
                .of_match_table = max9485_dt_ids,
        },
-       .probe = max9485_i2c_probe,
+       .probe_new = max9485_i2c_probe,
        .id_table = max9485_i2c_ids,
 };
 module_i2c_driver(max9485_driver);
index 214045f..fa817c3 100644 (file)
@@ -157,11 +157,11 @@ struct clk_hw *__clk_hw_register_mux(struct device *dev, struct device_node *np,
        struct clk_mux *mux;
        struct clk_hw *hw;
        struct clk_init_data init = {};
-       u8 width = 0;
        int ret = -EINVAL;
 
        if (clk_mux_flags & CLK_MUX_HIWORD_MASK) {
-               width = fls(mask) - ffs(mask) + 1;
+               u8 width = fls(mask) - ffs(mask) + 1;
+
                if (width + shift > 16) {
                        pr_err("mux value exceeds LOWORD field\n");
                        return ERR_PTR(-EINVAL);
index 59d9cf0..4f5df1f 100644 (file)
@@ -213,7 +213,7 @@ rs9_of_clk_get(struct of_phandle_args *clkspec, void *data)
        return rs9->clk_dif[idx];
 }
 
-static int rs9_probe(struct i2c_client *client, const struct i2c_device_id *id)
+static int rs9_probe(struct i2c_client *client)
 {
        unsigned char name[5] = "DIF0";
        struct rs9_driver_data *rs9;
@@ -312,7 +312,7 @@ static struct i2c_driver rs9_driver = {
                .pm     = &rs9_pm_ops,
                .of_match_table = clk_rs9_of_match,
        },
-       .probe          = rs9_probe,
+       .probe_new      = rs9_probe,
        .id_table       = rs9_id,
 };
 module_i2c_driver(rs9_driver);
index 364b62b..4481c43 100644 (file)
@@ -327,8 +327,7 @@ static const struct regmap_config si514_regmap_config = {
        .volatile_reg = si514_regmap_is_volatile,
 };
 
-static int si514_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static int si514_probe(struct i2c_client *client)
 {
        struct clk_si514 *data;
        struct clk_init_data init;
@@ -394,7 +393,7 @@ static struct i2c_driver si514_driver = {
                .name = "si514",
                .of_match_table = clk_si514_of_match,
        },
-       .probe          = si514_probe,
+       .probe_new      = si514_probe,
        .remove         = si514_remove,
        .id_table       = si514_id,
 };
index 41851f4..4bca732 100644 (file)
@@ -1547,8 +1547,7 @@ static const struct attribute *si5341_attributes[] = {
        NULL
 };
 
-static int si5341_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static int si5341_probe(struct i2c_client *client)
 {
        struct clk_si5341 *data;
        struct clk_init_data init;
@@ -1837,7 +1836,7 @@ static struct i2c_driver si5341_driver = {
                .name = "si5341",
                .of_match_table = clk_si5341_of_match,
        },
-       .probe          = si5341_probe,
+       .probe_new      = si5341_probe,
        .remove         = si5341_remove,
        .id_table       = si5341_id,
 };
index 93fa8c9..b9f088c 100644 (file)
@@ -1367,9 +1367,18 @@ si53351_of_clk_get(struct of_phandle_args *clkspec, void *data)
 }
 #endif /* CONFIG_OF */
 
-static int si5351_i2c_probe(struct i2c_client *client,
-                           const struct i2c_device_id *id)
+static const struct i2c_device_id si5351_i2c_ids[] = {
+       { "si5351a", SI5351_VARIANT_A },
+       { "si5351a-msop", SI5351_VARIANT_A3 },
+       { "si5351b", SI5351_VARIANT_B },
+       { "si5351c", SI5351_VARIANT_C },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, si5351_i2c_ids);
+
+static int si5351_i2c_probe(struct i2c_client *client)
 {
+       const struct i2c_device_id *id = i2c_match_id(si5351_i2c_ids, client);
        enum si5351_variant variant = (enum si5351_variant)id->driver_data;
        struct si5351_platform_data *pdata;
        struct si5351_driver_data *drvdata;
@@ -1649,21 +1658,12 @@ static int si5351_i2c_remove(struct i2c_client *client)
        return 0;
 }
 
-static const struct i2c_device_id si5351_i2c_ids[] = {
-       { "si5351a", SI5351_VARIANT_A },
-       { "si5351a-msop", SI5351_VARIANT_A3 },
-       { "si5351b", SI5351_VARIANT_B },
-       { "si5351c", SI5351_VARIANT_C },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, si5351_i2c_ids);
-
 static struct i2c_driver si5351_driver = {
        .driver = {
                .name = "si5351",
                .of_match_table = of_match_ptr(si5351_dt_ids),
        },
-       .probe = si5351_i2c_probe,
+       .probe_new = si5351_i2c_probe,
        .remove = si5351_i2c_remove,
        .id_table = si5351_i2c_ids,
 };
index d9ec908..0897869 100644 (file)
@@ -451,11 +451,19 @@ static const struct regmap_config si544_regmap_config = {
        .volatile_reg = si544_regmap_is_volatile,
 };
 
-static int si544_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static const struct i2c_device_id si544_id[] = {
+       { "si544a", si544a },
+       { "si544b", si544b },
+       { "si544c", si544c },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, si544_id);
+
+static int si544_probe(struct i2c_client *client)
 {
        struct clk_si544 *data;
        struct clk_init_data init;
+       const struct i2c_device_id *id = i2c_match_id(si544_id, client);
        int err;
 
        data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
@@ -499,14 +507,6 @@ static int si544_probe(struct i2c_client *client,
        return 0;
 }
 
-static const struct i2c_device_id si544_id[] = {
-       { "si544a", si544a },
-       { "si544b", si544b },
-       { "si544c", si544c },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, si544_id);
-
 static const struct of_device_id clk_si544_of_match[] = {
        { .compatible = "silabs,si544a" },
        { .compatible = "silabs,si544b" },
@@ -520,7 +520,7 @@ static struct i2c_driver si544_driver = {
                .name = "si544",
                .of_match_table = clk_si544_of_match,
        },
-       .probe          = si544_probe,
+       .probe_new      = si544_probe,
        .id_table       = si544_id,
 };
 module_i2c_driver(si544_driver);
index eea5012..1ff8f32 100644 (file)
@@ -398,11 +398,20 @@ static const struct regmap_config si570_regmap_config = {
        .volatile_reg = si570_regmap_is_volatile,
 };
 
-static int si570_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static const struct i2c_device_id si570_id[] = {
+       { "si570", si57x },
+       { "si571", si57x },
+       { "si598", si59x },
+       { "si599", si59x },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, si570_id);
+
+static int si570_probe(struct i2c_client *client)
 {
        struct clk_si570 *data;
        struct clk_init_data init;
+       const struct i2c_device_id *id = i2c_match_id(si570_id, client);
        u32 initial_fout, factory_fout, stability;
        bool skip_recall;
        int err;
@@ -495,15 +504,6 @@ static int si570_remove(struct i2c_client *client)
        return 0;
 }
 
-static const struct i2c_device_id si570_id[] = {
-       { "si570", si57x },
-       { "si571", si57x },
-       { "si598", si59x },
-       { "si599", si59x },
-       { }
-};
-MODULE_DEVICE_TABLE(i2c, si570_id);
-
 static const struct of_device_id clk_si570_of_match[] = {
        { .compatible = "silabs,si570" },
        { .compatible = "silabs,si571" },
@@ -518,7 +518,7 @@ static struct i2c_driver si570_driver = {
                .name = "si570",
                .of_match_table = clk_si570_of_match,
        },
-       .probe          = si570_probe,
+       .probe_new      = si570_probe,
        .remove         = si570_remove,
        .id_table       = si570_id,
 };
index ed11918..f00d4c1 100644 (file)
@@ -108,17 +108,10 @@ struct clk {
 /***           runtime pm          ***/
 static int clk_pm_runtime_get(struct clk_core *core)
 {
-       int ret;
-
        if (!core->rpm_enabled)
                return 0;
 
-       ret = pm_runtime_get_sync(core->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(core->dev);
-               return ret;
-       }
-       return 0;
+       return pm_runtime_resume_and_get(core->dev);
 }
 
 static void clk_pm_runtime_put(struct clk_core *core)
index 2dfd614..cbf0d79 100644 (file)
@@ -178,7 +178,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
                                        unsigned long flags)
 {
        struct clk_hw *hw = ERR_PTR(-ENOMEM), *mux_hw;
-       struct clk_hw *div_hw, *gate_hw;
+       struct clk_hw *div_hw, *gate_hw = NULL;
        struct clk_divider *div = NULL;
        struct clk_gate *gate = NULL;
        struct clk_mux *mux = NULL;
@@ -223,14 +223,17 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
        div->lock = &imx_ccm_lock;
        div->flags = CLK_DIVIDER_ROUND_CLOSEST;
 
-       gate = kzalloc(sizeof(*gate), GFP_KERNEL);
-       if (!gate)
-               goto fail;
+       /* skip registering the gate ops if M4 is enabled */
+       if (!mcore_booted) {
+               gate = kzalloc(sizeof(*gate), GFP_KERNEL);
+               if (!gate)
+                       goto fail;
 
-       gate_hw = &gate->hw;
-       gate->reg = reg;
-       gate->bit_idx = PCG_CGC_SHIFT;
-       gate->lock = &imx_ccm_lock;
+               gate_hw = &gate->hw;
+               gate->reg = reg;
+               gate->bit_idx = PCG_CGC_SHIFT;
+               gate->lock = &imx_ccm_lock;
+       }
 
        hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
                        mux_hw, mux_ops, div_hw,
index 3f6fd7e..cbf8131 100644 (file)
@@ -782,7 +782,6 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
        hws[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] = imx_clk_hw_gate2_flags("dram_phym_alt_root_clk", "dram_phym_alt_post_div", base + 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
        hws[IMX7D_DRAM_ALT_ROOT_CLK] = imx_clk_hw_gate2_flags("dram_alt_root_clk", "dram_alt_post_div", base + 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
        hws[IMX7D_OCOTP_CLK] = imx_clk_hw_gate4("ocotp_clk", "ipg_root_clk", base + 0x4230, 0);
-       hws[IMX7D_SNVS_CLK] = imx_clk_hw_gate4("snvs_clk", "ipg_root_clk", base + 0x4250, 0);
        hws[IMX7D_MU_ROOT_CLK] = imx_clk_hw_gate4("mu_root_clk", "ipg_root_clk", base + 0x4270, 0);
        hws[IMX7D_CAAM_CLK] = imx_clk_hw_gate4("caam_clk", "ipg_root_clk", base + 0x4240, 0);
        hws[IMX7D_USB_HSIC_ROOT_CLK] = imx_clk_hw_gate4("usb_hsic_root_clk", "usb_hsic_post_div", base + 0x4690, 0);
index e8cbe18..b6d2758 100644 (file)
@@ -560,7 +560,6 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
        hws[IMX8MM_CLK_SAI5_IPG] = imx_clk_hw_gate2_shared2("sai5_ipg_clk", "ipg_audio_root", base + 0x4370, 0, &share_count_sai5);
        hws[IMX8MM_CLK_SAI6_ROOT] = imx_clk_hw_gate2_shared2("sai6_root_clk", "sai6", base + 0x4380, 0, &share_count_sai6);
        hws[IMX8MM_CLK_SAI6_IPG] = imx_clk_hw_gate2_shared2("sai6_ipg_clk", "ipg_audio_root", base + 0x4380, 0, &share_count_sai6);
-       hws[IMX8MM_CLK_SNVS_ROOT] = imx_clk_hw_gate4("snvs_root_clk", "ipg_root", base + 0x4470, 0);
        hws[IMX8MM_CLK_UART1_ROOT] = imx_clk_hw_gate4("uart1_root_clk", "uart1", base + 0x4490, 0);
        hws[IMX8MM_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", base + 0x44a0, 0);
        hws[IMX8MM_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", base + 0x44b0, 0);
@@ -639,6 +638,8 @@ static struct platform_driver imx8mm_clk_driver = {
        },
 };
 module_platform_driver(imx8mm_clk_driver);
+module_param(mcore_booted, bool, S_IRUGO);
+MODULE_PARM_DESC(mcore_booted, "See Cortex-M core is booted or not");
 
 MODULE_AUTHOR("Bai Ping <ping.bai@nxp.com>");
 MODULE_DESCRIPTION("NXP i.MX8MM clock driver");
index 92fcbab..d37c45b 100644 (file)
@@ -227,6 +227,30 @@ static const char * const imx8mn_pwm4_sels[] = {"osc_24m", "sys_pll2_100m", "sys
                                                "sys_pll1_40m", "sys_pll3_out", "clk_ext2",
                                                "sys_pll1_80m", "video_pll1_out", };
 
+static const char * const imx8mn_gpt1_sels[] = {"osc_24m", "sys_pll2_100m", "sys_pll1_400m",
+                                               "sys_pll1_40m", "video_pll1_out", "sys_pll1_80m",
+                                               "audio_pll1_out", "clk_ext1", };
+
+static const char * const imx8mn_gpt2_sels[] = {"osc_24m", "sys_pll2_100m", "sys_pll1_400m",
+                                               "sys_pll1_40m", "video_pll1_out", "sys_pll1_80m",
+                                               "audio_pll1_out", "clk_ext1", };
+
+static const char * const imx8mn_gpt3_sels[] = {"osc_24m", "sys_pll2_100m", "sys_pll1_400m",
+                                               "sys_pll1_40m", "video_pll1_out", "sys_pll1_80m",
+                                               "audio_pll1_out", "clk_ext1", };
+
+static const char * const imx8mn_gpt4_sels[] = {"osc_24m", "sys_pll2_100m", "sys_pll1_400m",
+                                               "sys_pll1_40m", "video_pll1_out", "sys_pll1_80m",
+                                               "audio_pll1_out", "clk_ext1", };
+
+static const char * const imx8mn_gpt5_sels[] = {"osc_24m", "sys_pll2_100m", "sys_pll1_400m",
+                                               "sys_pll1_40m", "video_pll1_out", "sys_pll1_80m",
+                                               "audio_pll1_out", "clk_ext1", };
+
+static const char * const imx8mn_gpt6_sels[] = {"osc_24m", "sys_pll2_100m", "sys_pll1_400m",
+                                               "sys_pll1_40m", "video_pll1_out", "sys_pll1_80m",
+                                               "audio_pll1_out", "clk_ext1", };
+
 static const char * const imx8mn_wdog_sels[] = {"osc_24m", "sys_pll1_133m", "sys_pll1_160m",
                                                "vpu_pll_out", "sys_pll2_125m", "sys_pll3_out",
                                                "sys_pll1_80m", "sys_pll2_166m", };
@@ -476,6 +500,12 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
        hws[IMX8MN_CLK_PWM2] = imx8m_clk_hw_composite("pwm2", imx8mn_pwm2_sels, base + 0xb400);
        hws[IMX8MN_CLK_PWM3] = imx8m_clk_hw_composite("pwm3", imx8mn_pwm3_sels, base + 0xb480);
        hws[IMX8MN_CLK_PWM4] = imx8m_clk_hw_composite("pwm4", imx8mn_pwm4_sels, base + 0xb500);
+       hws[IMX8MN_CLK_GPT1] = imx8m_clk_hw_composite("gpt1", imx8mn_gpt1_sels, base + 0xb580);
+       hws[IMX8MN_CLK_GPT2] = imx8m_clk_hw_composite("gpt2", imx8mn_gpt2_sels, base + 0xb600);
+       hws[IMX8MN_CLK_GPT3] = imx8m_clk_hw_composite("gpt3", imx8mn_gpt3_sels, base + 0xb680);
+       hws[IMX8MN_CLK_GPT4] = imx8m_clk_hw_composite("gpt4", imx8mn_gpt4_sels, base + 0xb700);
+       hws[IMX8MN_CLK_GPT5] = imx8m_clk_hw_composite("gpt5", imx8mn_gpt5_sels, base + 0xb780);
+       hws[IMX8MN_CLK_GPT6] = imx8m_clk_hw_composite("gpt6", imx8mn_gpt6_sels, base + 0xb800);
        hws[IMX8MN_CLK_WDOG] = imx8m_clk_hw_composite("wdog", imx8mn_wdog_sels, base + 0xb900);
        hws[IMX8MN_CLK_WRCLK] = imx8m_clk_hw_composite("wrclk", imx8mn_wrclk_sels, base + 0xb980);
        hws[IMX8MN_CLK_CLKO1] = imx8m_clk_hw_composite("clko1", imx8mn_clko1_sels, base + 0xba00);
@@ -501,6 +531,12 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
        hws[IMX8MN_CLK_GPIO3_ROOT] = imx_clk_hw_gate4("gpio3_root_clk", "ipg_root", base + 0x40d0, 0);
        hws[IMX8MN_CLK_GPIO4_ROOT] = imx_clk_hw_gate4("gpio4_root_clk", "ipg_root", base + 0x40e0, 0);
        hws[IMX8MN_CLK_GPIO5_ROOT] = imx_clk_hw_gate4("gpio5_root_clk", "ipg_root", base + 0x40f0, 0);
+       hws[IMX8MN_CLK_GPT1_ROOT] = imx_clk_hw_gate4("gpt1_root_clk", "gpt1", base + 0x4100, 0);
+       hws[IMX8MN_CLK_GPT2_ROOT] = imx_clk_hw_gate4("gpt2_root_clk", "gpt2", base + 0x4110, 0);
+       hws[IMX8MN_CLK_GPT3_ROOT] = imx_clk_hw_gate4("gpt3_root_clk", "gpt3", base + 0x4120, 0);
+       hws[IMX8MN_CLK_GPT4_ROOT] = imx_clk_hw_gate4("gpt4_root_clk", "gpt4", base + 0x4130, 0);
+       hws[IMX8MN_CLK_GPT5_ROOT] = imx_clk_hw_gate4("gpt5_root_clk", "gpt5", base + 0x4140, 0);
+       hws[IMX8MN_CLK_GPT6_ROOT] = imx_clk_hw_gate4("gpt6_root_clk", "gpt6", base + 0x4150, 0);
        hws[IMX8MN_CLK_I2C1_ROOT] = imx_clk_hw_gate4("i2c1_root_clk", "i2c1", base + 0x4170, 0);
        hws[IMX8MN_CLK_I2C2_ROOT] = imx_clk_hw_gate4("i2c2_root_clk", "i2c2", base + 0x4180, 0);
        hws[IMX8MN_CLK_I2C3_ROOT] = imx_clk_hw_gate4("i2c3_root_clk", "i2c3", base + 0x4190, 0);
@@ -522,7 +558,6 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
        hws[IMX8MN_CLK_SAI5_IPG] = imx_clk_hw_gate2_shared2("sai5_ipg_clk", "ipg_audio_root", base + 0x4370, 0, &share_count_sai5);
        hws[IMX8MN_CLK_SAI6_ROOT] = imx_clk_hw_gate2_shared2("sai6_root_clk", "sai6", base + 0x4380, 0, &share_count_sai6);
        hws[IMX8MN_CLK_SAI6_IPG] = imx_clk_hw_gate2_shared2("sai6_ipg_clk", "ipg_audio_root", base + 0x4380, 0, &share_count_sai6);
-       hws[IMX8MN_CLK_SNVS_ROOT] = imx_clk_hw_gate4("snvs_root_clk", "ipg_root", base + 0x4470, 0);
        hws[IMX8MN_CLK_UART1_ROOT] = imx_clk_hw_gate4("uart1_root_clk", "uart1", base + 0x4490, 0);
        hws[IMX8MN_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", base + 0x44a0, 0);
        hws[IMX8MN_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", base + 0x44b0, 0);
@@ -549,6 +584,8 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
        hws[IMX8MN_CLK_SDMA3_ROOT] = imx_clk_hw_gate4("sdma3_clk", "ipg_audio_root", base + 0x45f0, 0);
        hws[IMX8MN_CLK_SAI7_ROOT] = imx_clk_hw_gate2_shared2("sai7_root_clk", "sai7", base + 0x4650, 0, &share_count_sai7);
 
+       hws[IMX8MN_CLK_GPT_3M] = imx_clk_hw_fixed_factor("gpt_3m", "osc_24m", 1, 8);
+
        hws[IMX8MN_CLK_DRAM_ALT_ROOT] = imx_clk_hw_fixed_factor("dram_alt_root", "dram_alt", 1, 4);
 
        hws[IMX8MN_CLK_ARM] = imx_clk_hw_cpu("arm", "arm_a53_core",
@@ -594,6 +631,8 @@ static struct platform_driver imx8mn_clk_driver = {
        },
 };
 module_platform_driver(imx8mn_clk_driver);
+module_param(mcore_booted, bool, S_IRUGO);
+MODULE_PARM_DESC(mcore_booted, "See Cortex-M core is booted or not");
 
 MODULE_AUTHOR("Anson Huang <Anson.Huang@nxp.com>");
 MODULE_DESCRIPTION("NXP i.MX8MN clock driver");
index 18f5b7c..e89db56 100644 (file)
@@ -358,7 +358,7 @@ static const char * const imx8mp_media_mipi_phy1_ref_sels[] = {"osc_24m", "sys_p
                                                               "clk_ext2", "audio_pll2_out",
                                                               "video_pll1_out", };
 
-static const char * const imx8mp_media_disp1_pix_sels[] = {"osc_24m", "video_pll1_out", "audio_pll2_out",
+static const char * const imx8mp_media_disp_pix_sels[] = {"osc_24m", "video_pll1_out", "audio_pll2_out",
                                                           "audio_pll1_out", "sys_pll1_800m",
                                                           "sys_pll2_1000m", "sys_pll3_out", "clk_ext4", };
 
@@ -399,6 +399,11 @@ static const char * const imx8mp_sai7_sels[] = {"osc_24m", "audio_pll1_out", "au
 
 static const char * const imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", };
 
+static const char * const imx8mp_clkout_sels[] = {"audio_pll1_out", "audio_pll2_out", "video_pll1_out",
+                                                 "dummy", "dummy", "gpu_pll_out", "vpu_pll_out",
+                                                 "arm_pll_out", "sys_pll1", "sys_pll2", "sys_pll3",
+                                                 "dummy", "dummy", "osc_24m", "dummy", "osc_32k"};
+
 static struct clk_hw **hws;
 static struct clk_hw_onecell_data *clk_hw_data;
 
@@ -504,6 +509,15 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
        hws[IMX8MP_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_out", 1, 2);
        hws[IMX8MP_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
 
+       hws[IMX8MP_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", anatop_base + 0x128, 4, 4,
+                                                     imx8mp_clkout_sels, ARRAY_SIZE(imx8mp_clkout_sels));
+       hws[IMX8MP_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", anatop_base + 0x128, 0, 4);
+       hws[IMX8MP_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", anatop_base + 0x128, 8);
+       hws[IMX8MP_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", anatop_base + 0x128, 20, 4,
+                                                     imx8mp_clkout_sels, ARRAY_SIZE(imx8mp_clkout_sels));
+       hws[IMX8MP_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", anatop_base + 0x128, 16, 4);
+       hws[IMX8MP_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", anatop_base + 0x128, 24);
+
        hws[IMX8MP_CLK_A53_DIV] = imx8m_clk_hw_composite_core("arm_a53_div", imx8mp_a53_sels, ccm_base + 0x8000);
        hws[IMX8MP_CLK_A53_SRC] = hws[IMX8MP_CLK_A53_DIV];
        hws[IMX8MP_CLK_A53_CG] = hws[IMX8MP_CLK_A53_DIV];
@@ -538,6 +552,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
        hws[IMX8MP_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb_root", imx8mp_ahb_sels, ccm_base + 0x9000);
        hws[IMX8MP_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mp_audio_ahb_sels, ccm_base + 0x9100);
        hws[IMX8MP_CLK_MIPI_DSI_ESC_RX] = imx8m_clk_hw_composite_bus("mipi_dsi_esc_rx", imx8mp_mipi_dsi_esc_rx_sels, ccm_base + 0x9200);
+       hws[IMX8MP_CLK_MEDIA_DISP2_PIX] = imx8m_clk_hw_composite("media_disp2_pix", imx8mp_media_disp_pix_sels, ccm_base + 0x9300);
 
        hws[IMX8MP_CLK_IPG_ROOT] = imx_clk_hw_divider2("ipg_root", "ahb_root", ccm_base + 0x9080, 0, 1);
 
@@ -600,7 +615,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
        hws[IMX8MP_CLK_USDHC3] = imx8m_clk_hw_composite("usdhc3", imx8mp_usdhc3_sels, ccm_base + 0xbc80);
        hws[IMX8MP_CLK_MEDIA_CAM1_PIX] = imx8m_clk_hw_composite("media_cam1_pix", imx8mp_media_cam1_pix_sels, ccm_base + 0xbd00);
        hws[IMX8MP_CLK_MEDIA_MIPI_PHY1_REF] = imx8m_clk_hw_composite("media_mipi_phy1_ref", imx8mp_media_mipi_phy1_ref_sels, ccm_base + 0xbd80);
-       hws[IMX8MP_CLK_MEDIA_DISP1_PIX] = imx8m_clk_hw_composite("media_disp1_pix", imx8mp_media_disp1_pix_sels, ccm_base + 0xbe00);
+       hws[IMX8MP_CLK_MEDIA_DISP1_PIX] = imx8m_clk_hw_composite("media_disp1_pix", imx8mp_media_disp_pix_sels, ccm_base + 0xbe00);
        hws[IMX8MP_CLK_MEDIA_CAM2_PIX] = imx8m_clk_hw_composite("media_cam2_pix", imx8mp_media_cam2_pix_sels, ccm_base + 0xbe80);
        hws[IMX8MP_CLK_MEDIA_LDB] = imx8m_clk_hw_composite("media_ldb", imx8mp_media_ldb_sels, ccm_base + 0xbf00);
        hws[IMX8MP_CLK_MEMREPAIR] = imx8m_clk_hw_composite_critical("mem_repair", imx8mp_memrepair_sels, ccm_base + 0xbf80);
@@ -654,12 +669,11 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
        hws[IMX8MP_CLK_SIM_ENET_ROOT] = imx_clk_hw_gate4("sim_enet_root_clk", "enet_axi", ccm_base + 0x4400, 0);
        hws[IMX8MP_CLK_GPU2D_ROOT] = imx_clk_hw_gate4("gpu2d_root_clk", "gpu2d_core", ccm_base + 0x4450, 0);
        hws[IMX8MP_CLK_GPU3D_ROOT] = imx_clk_hw_gate4("gpu3d_root_clk", "gpu3d_core", ccm_base + 0x4460, 0);
-       hws[IMX8MP_CLK_SNVS_ROOT] = imx_clk_hw_gate4("snvs_root_clk", "ipg_root", ccm_base + 0x4470, 0);
        hws[IMX8MP_CLK_UART1_ROOT] = imx_clk_hw_gate4("uart1_root_clk", "uart1", ccm_base + 0x4490, 0);
        hws[IMX8MP_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", ccm_base + 0x44a0, 0);
        hws[IMX8MP_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", ccm_base + 0x44b0, 0);
        hws[IMX8MP_CLK_UART4_ROOT] = imx_clk_hw_gate4("uart4_root_clk", "uart4", ccm_base + 0x44c0, 0);
-       hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate4("usb_root_clk", "osc_32k", ccm_base + 0x44d0, 0);
+       hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate4("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0);
        hws[IMX8MP_CLK_USB_PHY_ROOT] = imx_clk_hw_gate4("usb_phy_root_clk", "usb_phy_ref", ccm_base + 0x44f0, 0);
        hws[IMX8MP_CLK_USDHC1_ROOT] = imx_clk_hw_gate4("usdhc1_root_clk", "usdhc1", ccm_base + 0x4510, 0);
        hws[IMX8MP_CLK_USDHC2_ROOT] = imx_clk_hw_gate4("usdhc2_root_clk", "usdhc2", ccm_base + 0x4520, 0);
@@ -721,6 +735,8 @@ static struct platform_driver imx8mp_clk_driver = {
        },
 };
 module_platform_driver(imx8mp_clk_driver);
+module_param(mcore_booted, bool, S_IRUGO);
+MODULE_PARM_DESC(mcore_booted, "See Cortex-M core is booted or not");
 
 MODULE_AUTHOR("Anson Huang <Anson.Huang@nxp.com>");
 MODULE_DESCRIPTION("NXP i.MX8MP clock driver");
index 83cc2b1..882dcad 100644 (file)
@@ -25,7 +25,7 @@ static u32 share_count_sai6;
 static u32 share_count_dcss;
 static u32 share_count_nand;
 
-static const char * const pll_ref_sels[] = { "osc_25m", "osc_27m", "dummy", "dummy", };
+static const char * const pll_ref_sels[] = { "osc_25m", "osc_27m", "hdmi_phy_27m", "dummy", };
 static const char * const arm_pll_bypass_sels[] = {"arm_pll", "arm_pll_ref_sel", };
 static const char * const gpu_pll_bypass_sels[] = {"gpu_pll", "gpu_pll_ref_sel", };
 static const char * const vpu_pll_bypass_sels[] = {"vpu_pll", "vpu_pll_ref_sel", };
@@ -557,7 +557,6 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
        hws[IMX8MQ_CLK_SAI5_IPG] = imx_clk_hw_gate2_shared2("sai5_ipg_clk", "ipg_audio_root", base + 0x4370, 0, &share_count_sai5);
        hws[IMX8MQ_CLK_SAI6_ROOT] = imx_clk_hw_gate2_shared2("sai6_root_clk", "sai6", base + 0x4380, 0, &share_count_sai6);
        hws[IMX8MQ_CLK_SAI6_IPG] = imx_clk_hw_gate2_shared2("sai6_ipg_clk", "ipg_audio_root", base + 0x4380, 0, &share_count_sai6);
-       hws[IMX8MQ_CLK_SNVS_ROOT] = imx_clk_hw_gate4("snvs_root_clk", "ipg_root", base + 0x4470, 0);
        hws[IMX8MQ_CLK_UART1_ROOT] = imx_clk_hw_gate4("uart1_root_clk", "uart1", base + 0x4490, 0);
        hws[IMX8MQ_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", base + 0x44a0, 0);
        hws[IMX8MQ_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", base + 0x44b0, 0);
@@ -632,6 +631,8 @@ static struct platform_driver imx8mq_clk_driver = {
        },
 };
 module_platform_driver(imx8mq_clk_driver);
+module_param(mcore_booted, bool, S_IRUGO);
+MODULE_PARM_DESC(mcore_booted, "See Cortex-M core is booted or not");
 
 MODULE_AUTHOR("Abel Vesa <abel.vesa@nxp.com>");
 MODULE_DESCRIPTION("NXP i.MX8MQ clock driver");
index 083da31..5b022ee 100644 (file)
@@ -528,7 +528,7 @@ static int imx_clk_scu_probe(struct platform_device *pdev)
                pm_runtime_use_autosuspend(&pdev->dev);
                pm_runtime_enable(dev);
 
-               ret = pm_runtime_get_sync(dev);
+               ret = pm_runtime_resume_and_get(dev);
                if (ret) {
                        pm_genpd_remove_device(dev);
                        pm_runtime_disable(dev);
@@ -837,8 +837,10 @@ struct clk_hw *__imx_clk_gpr_scu(const char *name, const char * const *parent_na
        if (!clk_node)
                return ERR_PTR(-ENOMEM);
 
-       if (!imx_scu_clk_is_valid(rsrc_id))
+       if (!imx_scu_clk_is_valid(rsrc_id)) {
+               kfree(clk_node);
                return ERR_PTR(-EINVAL);
+       }
 
        clk = kzalloc(sizeof(*clk), GFP_KERNEL);
        if (!clk) {
index 7cc6699..5582f18 100644 (file)
@@ -17,6 +17,9 @@
 DEFINE_SPINLOCK(imx_ccm_lock);
 EXPORT_SYMBOL_GPL(imx_ccm_lock);
 
+bool mcore_booted;
+EXPORT_SYMBOL_GPL(mcore_booted);
+
 void imx_unregister_clocks(struct clk *clks[], unsigned int count)
 {
        unsigned int i;
@@ -173,6 +176,8 @@ void imx_register_uart_clocks(unsigned int clk_count)
                int i;
 
                imx_uart_clocks = kcalloc(clk_count, sizeof(struct clk *), GFP_KERNEL);
+               if (!imx_uart_clocks)
+                       return;
 
                if (!of_stdout)
                        return;
index a7cbbcd..5061a06 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/clk-provider.h>
 
 extern spinlock_t imx_ccm_lock;
+extern bool mcore_booted;
 
 void imx_check_clocks(struct clk *clks[], unsigned int count);
 void imx_check_clk_hws(struct clk_hw *clks[], unsigned int count);
index aae1a40..1919832 100644 (file)
@@ -162,6 +162,13 @@ static const struct ti_syscon_gate_clk_data am64_clk_data[] = {
        { /* Sentinel */ },
 };
 
+static const struct ti_syscon_gate_clk_data am62_clk_data[] = {
+       TI_SYSCON_CLK_GATE("epwm_tbclk0", 0x0, 0),
+       TI_SYSCON_CLK_GATE("epwm_tbclk1", 0x0, 1),
+       TI_SYSCON_CLK_GATE("epwm_tbclk2", 0x0, 2),
+       { /* Sentinel */ },
+};
+
 static const struct of_device_id ti_syscon_gate_clk_ids[] = {
        {
                .compatible = "ti,am654-ehrpwm-tbclk",
@@ -171,6 +178,10 @@ static const struct of_device_id ti_syscon_gate_clk_ids[] = {
                .compatible = "ti,am64-epwm-tbclk",
                .data = &am64_clk_data,
        },
+       {
+               .compatible = "ti,am62-epwm-tbclk",
+               .data = &am62_clk_data,
+       },
        { }
 };
 MODULE_DEVICE_TABLE(of, ti_syscon_gate_clk_ids);
index 01ef02c..d5936cf 100644 (file)
@@ -512,6 +512,14 @@ config COMMON_CLK_MT8183_VENCSYS
        help
          This driver supports MediaTek MT8183 vencsys clocks.
 
+config COMMON_CLK_MT8186
+       bool "Clock driver for MediaTek MT8186"
+       depends on ARM64 || COMPILE_TEST
+       select COMMON_CLK_MEDIATEK
+       default ARCH_MEDIATEK
+       help
+         This driver supports MediaTek MT8186 clocks.
+
 config COMMON_CLK_MT8192
        bool "Clock driver for MediaTek MT8192"
        depends on ARM64 || COMPILE_TEST
index 7b0c264..caf2ce9 100644 (file)
@@ -71,6 +71,11 @@ obj-$(CONFIG_COMMON_CLK_MT8183_MFGCFG) += clk-mt8183-mfgcfg.o
 obj-$(CONFIG_COMMON_CLK_MT8183_MMSYS) += clk-mt8183-mm.o
 obj-$(CONFIG_COMMON_CLK_MT8183_VDECSYS) += clk-mt8183-vdec.o
 obj-$(CONFIG_COMMON_CLK_MT8183_VENCSYS) += clk-mt8183-venc.o
+obj-$(CONFIG_COMMON_CLK_MT8186) += clk-mt8186-mcu.o clk-mt8186-topckgen.o clk-mt8186-infra_ao.o \
+                                  clk-mt8186-apmixedsys.o clk-mt8186-imp_iic_wrap.o \
+                                  clk-mt8186-mfg.o clk-mt8186-mm.o clk-mt8186-wpe.o \
+                                  clk-mt8186-img.o clk-mt8186-vdec.o clk-mt8186-venc.o \
+                                  clk-mt8186-cam.o clk-mt8186-mdp.o clk-mt8186-ipe.o
 obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192.o
 obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o
 obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o
index a29339c..fc3d414 100644 (file)
@@ -70,12 +70,12 @@ static const struct clk_ops mtk_ref2usb_tx_ops = {
        .unprepare      = mtk_ref2usb_tx_unprepare,
 };
 
-struct clk * __init mtk_clk_register_ref2usb_tx(const char *name,
+struct clk_hw * __init mtk_clk_register_ref2usb_tx(const char *name,
                        const char *parent_name, void __iomem *reg)
 {
        struct mtk_ref2usb_tx *tx;
        struct clk_init_data init = {};
-       struct clk *clk;
+       int ret;
 
        tx = kzalloc(sizeof(*tx), GFP_KERNEL);
        if (!tx)
@@ -89,14 +89,14 @@ struct clk * __init mtk_clk_register_ref2usb_tx(const char *name,
        init.parent_names = &parent_name;
        init.num_parents = 1;
 
-       clk = clk_register(NULL, &tx->hw);
+       ret = clk_hw_register(NULL, &tx->hw);
 
-       if (IS_ERR(clk)) {
-               pr_err("Failed to register clk %s: %pe\n", name, clk);
+       if (ret) {
                kfree(tx);
+               return ERR_PTR(ret);
        }
 
-       return clk;
+       return &tx->hw;
 }
 
 MODULE_LICENSE("GPL");
index c11b3fa..2b5d485 100644 (file)
@@ -57,12 +57,12 @@ static const struct clk_ops clk_cpumux_ops = {
        .set_parent = clk_cpumux_set_parent,
 };
 
-static struct clk *
+static struct clk_hw *
 mtk_clk_register_cpumux(const struct mtk_composite *mux,
                        struct regmap *regmap)
 {
        struct mtk_clk_cpumux *cpumux;
-       struct clk *clk;
+       int ret;
        struct clk_init_data init;
 
        cpumux = kzalloc(sizeof(*cpumux), GFP_KERNEL);
@@ -81,34 +81,33 @@ mtk_clk_register_cpumux(const struct mtk_composite *mux,
        cpumux->regmap = regmap;
        cpumux->hw.init = &init;
 
-       clk = clk_register(NULL, &cpumux->hw);
-       if (IS_ERR(clk))
+       ret = clk_hw_register(NULL, &cpumux->hw);
+       if (ret) {
                kfree(cpumux);
+               return ERR_PTR(ret);
+       }
 
-       return clk;
+       return &cpumux->hw;
 }
 
-static void mtk_clk_unregister_cpumux(struct clk *clk)
+static void mtk_clk_unregister_cpumux(struct clk_hw *hw)
 {
        struct mtk_clk_cpumux *cpumux;
-       struct clk_hw *hw;
-
-       hw = __clk_get_hw(clk);
        if (!hw)
                return;
 
        cpumux = to_mtk_clk_cpumux(hw);
 
-       clk_unregister(clk);
+       clk_hw_unregister(hw);
        kfree(cpumux);
 }
 
 int mtk_clk_register_cpumuxes(struct device_node *node,
                              const struct mtk_composite *clks, int num,
-                             struct clk_onecell_data *clk_data)
+                             struct clk_hw_onecell_data *clk_data)
 {
        int i;
-       struct clk *clk;
+       struct clk_hw *hw;
        struct regmap *regmap;
 
        regmap = device_node_to_regmap(node);
@@ -120,19 +119,20 @@ int mtk_clk_register_cpumuxes(struct device_node *node,
        for (i = 0; i < num; i++) {
                const struct mtk_composite *mux = &clks[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[mux->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[mux->id])) {
                        pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
                                node, mux->id);
                        continue;
                }
 
-               clk = mtk_clk_register_cpumux(mux, regmap);
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", mux->name, clk);
+               hw = mtk_clk_register_cpumux(mux, regmap);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", mux->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[mux->id] = clk;
+               clk_data->hws[mux->id] = hw;
        }
 
        return 0;
@@ -141,29 +141,29 @@ err:
        while (--i >= 0) {
                const struct mtk_composite *mux = &clks[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mux->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mux->id]))
                        continue;
 
-               mtk_clk_unregister_cpumux(clk_data->clks[mux->id]);
-               clk_data->clks[mux->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_cpumux(clk_data->hws[mux->id]);
+               clk_data->hws[mux->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 
 void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, int num,
-                                struct clk_onecell_data *clk_data)
+                                struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
        for (i = num; i > 0; i--) {
                const struct mtk_composite *mux = &clks[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mux->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mux->id]))
                        continue;
 
-               mtk_clk_unregister_cpumux(clk_data->clks[mux->id]);
-               clk_data->clks[mux->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_cpumux(clk_data->hws[mux->id]);
+               clk_data->hws[mux->id] = ERR_PTR(-ENOENT);
        }
 }
 
index b07e89f..325adbe 100644 (file)
@@ -7,15 +7,15 @@
 #ifndef __DRV_CLK_CPUMUX_H
 #define __DRV_CLK_CPUMUX_H
 
-struct clk_onecell_data;
+struct clk_hw_onecell_data;
 struct device_node;
 struct mtk_composite;
 
 int mtk_clk_register_cpumuxes(struct device_node *node,
                              const struct mtk_composite *clks, int num,
-                             struct clk_onecell_data *clk_data);
+                             struct clk_hw_onecell_data *clk_data);
 
 void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, int num,
-                                struct clk_onecell_data *clk_data);
+                                struct clk_hw_onecell_data *clk_data);
 
 #endif /* __DRV_CLK_CPUMUX_H */
index da52023..4218062 100644 (file)
@@ -152,7 +152,7 @@ const struct clk_ops mtk_clk_gate_ops_no_setclr_inv = {
 };
 EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_no_setclr_inv);
 
-static struct clk *mtk_clk_register_gate(const char *name,
+static struct clk_hw *mtk_clk_register_gate(const char *name,
                                         const char *parent_name,
                                         struct regmap *regmap, int set_ofs,
                                         int clr_ofs, int sta_ofs, u8 bit,
@@ -160,7 +160,7 @@ static struct clk *mtk_clk_register_gate(const char *name,
                                         unsigned long flags, struct device *dev)
 {
        struct mtk_clk_gate *cg;
-       struct clk *clk;
+       int ret;
        struct clk_init_data init = {};
 
        cg = kzalloc(sizeof(*cg), GFP_KERNEL);
@@ -181,35 +181,34 @@ static struct clk *mtk_clk_register_gate(const char *name,
 
        cg->hw.init = &init;
 
-       clk = clk_register(dev, &cg->hw);
-       if (IS_ERR(clk))
+       ret = clk_hw_register(dev, &cg->hw);
+       if (ret) {
                kfree(cg);
+               return ERR_PTR(ret);
+       }
 
-       return clk;
+       return &cg->hw;
 }
 
-static void mtk_clk_unregister_gate(struct clk *clk)
+static void mtk_clk_unregister_gate(struct clk_hw *hw)
 {
        struct mtk_clk_gate *cg;
-       struct clk_hw *hw;
-
-       hw = __clk_get_hw(clk);
        if (!hw)
                return;
 
        cg = to_mtk_clk_gate(hw);
 
-       clk_unregister(clk);
+       clk_hw_unregister(hw);
        kfree(cg);
 }
 
 int mtk_clk_register_gates_with_dev(struct device_node *node,
                                    const struct mtk_gate *clks, int num,
-                                   struct clk_onecell_data *clk_data,
+                                   struct clk_hw_onecell_data *clk_data,
                                    struct device *dev)
 {
        int i;
-       struct clk *clk;
+       struct clk_hw *hw;
        struct regmap *regmap;
 
        if (!clk_data)
@@ -224,13 +223,13 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
        for (i = 0; i < num; i++) {
                const struct mtk_gate *gate = &clks[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[gate->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[gate->id])) {
                        pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
                                node, gate->id);
                        continue;
                }
 
-               clk = mtk_clk_register_gate(gate->name, gate->parent_name,
+               hw = mtk_clk_register_gate(gate->name, gate->parent_name,
                                            regmap,
                                            gate->regs->set_ofs,
                                            gate->regs->clr_ofs,
@@ -238,12 +237,13 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
                                            gate->shift, gate->ops,
                                            gate->flags, dev);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", gate->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", gate->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[gate->id] = clk;
+               clk_data->hws[gate->id] = hw;
        }
 
        return 0;
@@ -252,26 +252,26 @@ err:
        while (--i >= 0) {
                const struct mtk_gate *gate = &clks[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[gate->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[gate->id]))
                        continue;
 
-               mtk_clk_unregister_gate(clk_data->clks[gate->id]);
-               clk_data->clks[gate->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_gate(clk_data->hws[gate->id]);
+               clk_data->hws[gate->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 
 int mtk_clk_register_gates(struct device_node *node,
                           const struct mtk_gate *clks, int num,
-                          struct clk_onecell_data *clk_data)
+                          struct clk_hw_onecell_data *clk_data)
 {
        return mtk_clk_register_gates_with_dev(node, clks, num, clk_data, NULL);
 }
 EXPORT_SYMBOL_GPL(mtk_clk_register_gates);
 
 void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
-                             struct clk_onecell_data *clk_data)
+                             struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
@@ -281,11 +281,11 @@ void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
        for (i = num; i > 0; i--) {
                const struct mtk_gate *gate = &clks[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[gate->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[gate->id]))
                        continue;
 
-               mtk_clk_unregister_gate(clk_data->clks[gate->id]);
-               clk_data->clks[gate->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_gate(clk_data->hws[gate->id]);
+               clk_data->hws[gate->id] = ERR_PTR(-ENOENT);
        }
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_gates);
index 6b57388..d9897ef 100644 (file)
@@ -10,7 +10,7 @@
 #include <linux/types.h>
 
 struct clk;
-struct clk_onecell_data;
+struct clk_hw_onecell_data;
 struct clk_ops;
 struct device;
 struct device_node;
@@ -52,14 +52,14 @@ struct mtk_gate {
 
 int mtk_clk_register_gates(struct device_node *node,
                           const struct mtk_gate *clks, int num,
-                          struct clk_onecell_data *clk_data);
+                          struct clk_hw_onecell_data *clk_data);
 
 int mtk_clk_register_gates_with_dev(struct device_node *node,
                                    const struct mtk_gate *clks, int num,
-                                   struct clk_onecell_data *clk_data,
+                                   struct clk_hw_onecell_data *clk_data,
                                    struct device *dev);
 
 void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
-                             struct clk_onecell_data *clk_data);
+                             struct clk_hw_onecell_data *clk_data);
 
 #endif /* __DRV_CLK_GATE_H */
index e66896a..6ba398e 100644 (file)
@@ -145,7 +145,7 @@ static const struct of_device_id of_match_clk_mt2701_aud[] = {
 
 static int clk_mt2701_aud_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -154,7 +154,7 @@ static int clk_mt2701_aud_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r) {
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index ffa09cf..662a8ab 100644 (file)
@@ -101,7 +101,7 @@ static const struct of_device_id of_match_clk_mt2701_bdp[] = {
 
 static int clk_mt2701_bdp_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -110,7 +110,7 @@ static int clk_mt2701_bdp_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, bdp_clks, ARRAY_SIZE(bdp_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 100ff6c..47c2289 100644 (file)
@@ -43,7 +43,7 @@ static const struct of_device_id of_match_clk_mt2701_eth[] = {
 
 static int clk_mt2701_eth_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -52,7 +52,7 @@ static int clk_mt2701_eth_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 1328c11..79929ed 100644 (file)
@@ -37,7 +37,7 @@ static const struct mtk_gate g3d_clks[] = {
 
 static int clk_mt2701_g3dsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -46,7 +46,7 @@ static int clk_mt2701_g3dsys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, g3d_clks, ARRAY_SIZE(g3d_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 6144488..1aa36cb 100644 (file)
@@ -40,7 +40,7 @@ static const struct of_device_id of_match_clk_mt2701_hif[] = {
 
 static int clk_mt2701_hif_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -49,7 +49,7 @@ static int clk_mt2701_hif_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, hif_clks, ARRAY_SIZE(hif_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r) {
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 631e80f..c4f3cd2 100644 (file)
@@ -43,7 +43,7 @@ static const struct of_device_id of_match_clk_mt2701_img[] = {
 
 static int clk_mt2701_img_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -52,7 +52,7 @@ static int clk_mt2701_img_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index cb18e18..9ea7aba 100644 (file)
@@ -83,7 +83,7 @@ static int clk_mt2701_mm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR);
@@ -91,7 +91,7 @@ static int clk_mt2701_mm_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index c9def72..a2f1811 100644 (file)
@@ -54,7 +54,7 @@ static const struct of_device_id of_match_clk_mt2701_vdec[] = {
 
 static int clk_mt2701_vdec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -63,7 +63,7 @@ static int clk_mt2701_vdec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 1eb3e45..04ba356 100644 (file)
@@ -666,7 +666,7 @@ static const struct mtk_gate top_clks[] = {
 
 static int mtk_topckgen_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        struct device_node *node = pdev->dev.of_node;
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -692,7 +692,7 @@ static int mtk_topckgen_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
                                                clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct mtk_gate_regs infra_cg_regs = {
@@ -735,7 +735,7 @@ static const struct mtk_fixed_factor infra_fixed_divs[] = {
        FACTOR(CLK_INFRA_CLK_13M, "clk13m", "clk26m", 1, 2),
 };
 
-static struct clk_onecell_data *infra_clk_data;
+static struct clk_hw_onecell_data *infra_clk_data;
 
 static void __init mtk_infrasys_init_early(struct device_node *node)
 {
@@ -745,7 +745,7 @@ static void __init mtk_infrasys_init_early(struct device_node *node)
                infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
 
                for (i = 0; i < CLK_INFRA_NR; i++)
-                       infra_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
+                       infra_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
        }
 
        mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
@@ -754,7 +754,8 @@ static void __init mtk_infrasys_init_early(struct device_node *node)
        mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
                                  infra_clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, infra_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                  infra_clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -771,8 +772,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
                infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
        } else {
                for (i = 0; i < CLK_INFRA_NR; i++) {
-                       if (infra_clk_data->clks[i] == ERR_PTR(-EPROBE_DEFER))
-                               infra_clk_data->clks[i] = ERR_PTR(-ENOENT);
+                       if (infra_clk_data->hws[i] == ERR_PTR(-EPROBE_DEFER))
+                               infra_clk_data->hws[i] = ERR_PTR(-ENOENT);
                }
        }
 
@@ -781,7 +782,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
        mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
                                                infra_clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, infra_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                  infra_clk_data);
        if (r)
                return r;
 
@@ -886,7 +888,7 @@ static const struct mtk_composite peri_muxs[] = {
 
 static int mtk_pericfg_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
        struct device_node *node = pdev->dev.of_node;
@@ -904,7 +906,7 @@ static int mtk_pericfg_init(struct platform_device *pdev)
        mtk_clk_register_composites(peri_muxs, ARRAY_SIZE(peri_muxs), base,
                        &mt2701_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                return r;
 
@@ -935,13 +937,13 @@ static int mtk_pericfg_init(struct platform_device *pdev)
        }
 
 static const struct mtk_pll_data apmixed_plls[] = {
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x200, 0x20c, 0x80000001,
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x200, 0x20c, 0x80000000,
                        PLL_AO, 21, 0x204, 24, 0x0, 0x204, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x210, 0x21c, 0xf0000001,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x210, 0x21c, 0xf0000000,
                  HAVE_RST_BAR, 21, 0x210, 4, 0x0, 0x214, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x220, 0x22c, 0xf3000001,
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x220, 0x22c, 0xf3000000,
                  HAVE_RST_BAR, 7, 0x220, 4, 0x0, 0x224, 14),
-       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x230, 0x23c, 0x00000001, 0,
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x230, 0x23c, 0, 0,
                                21, 0x230, 4, 0x0, 0x234, 0),
        PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x240, 0x24c, 0x00000001, 0,
                                21, 0x240, 4, 0x0, 0x244, 0),
@@ -969,7 +971,7 @@ static const struct mtk_fixed_factor apmixed_fixed_divs[] = {
 
 static int mtk_apmixedsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR);
@@ -981,7 +983,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
        mtk_clk_register_factors(apmixed_fixed_divs, ARRAY_SIZE(apmixed_fixed_divs),
                                                                clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt2701[] = {
index a200714..9acab43 100644 (file)
@@ -60,7 +60,7 @@ static const struct mtk_gate bdp_clks[] = {
 
 static int clk_mt2712_bdp_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -69,7 +69,7 @@ static int clk_mt2712_bdp_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, bdp_clks, ARRAY_SIZE(bdp_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index 89b2a71..5cc143e 100644 (file)
@@ -38,7 +38,7 @@ static const struct mtk_gate img_clks[] = {
 
 static int clk_mt2712_img_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -47,7 +47,7 @@ static int clk_mt2712_img_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index 58813c3..31fc303 100644 (file)
@@ -34,7 +34,7 @@ static const struct mtk_gate jpgdec_clks[] = {
 
 static int clk_mt2712_jpgdec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -43,7 +43,7 @@ static int clk_mt2712_jpgdec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, jpgdec_clks, ARRAY_SIZE(jpgdec_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index a6b827d..a4d0967 100644 (file)
@@ -33,7 +33,7 @@ static const struct mtk_gate mfg_clks[] = {
 
 static int clk_mt2712_mfg_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -42,7 +42,7 @@ static int clk_mt2712_mfg_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index 5519c3d..7d44b09 100644 (file)
@@ -130,7 +130,7 @@ static int clk_mt2712_mm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
@@ -138,7 +138,7 @@ static int clk_mt2712_mm_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index 4987ad9..af13f43 100644 (file)
@@ -52,7 +52,7 @@ static const struct mtk_gate vdec_clks[] = {
 
 static int clk_mt2712_vdec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -61,7 +61,7 @@ static int clk_mt2712_vdec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index 07c29da..abc08a0 100644 (file)
@@ -35,7 +35,7 @@ static const struct mtk_gate venc_clks[] = {
 
 static int clk_mt2712_venc_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -44,7 +44,7 @@ static int clk_mt2712_venc_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index ff72b9a..410b059 100644 (file)
@@ -1223,44 +1223,44 @@ static const struct mtk_pll_div_table mmpll_div_table[] = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0230, 0x023C, 0xf0000101,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0230, 0x023C, 0xf0000100,
                HAVE_RST_BAR, 31, 0x0230, 4, 0, 0, 0, 0x0234, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0240, 0x024C, 0xfe000101,
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0240, 0x024C, 0xfe000100,
                HAVE_RST_BAR, 31, 0x0240, 4, 0, 0, 0, 0x0244, 0),
-       PLL(CLK_APMIXED_VCODECPLL, "vcodecpll", 0x0320, 0x032C, 0xc0000101,
+       PLL(CLK_APMIXED_VCODECPLL, "vcodecpll", 0x0320, 0x032C, 0xc0000100,
                0, 31, 0x0320, 4, 0, 0, 0, 0x0324, 0),
-       PLL(CLK_APMIXED_VENCPLL, "vencpll", 0x0280, 0x028C, 0x00000101,
+       PLL(CLK_APMIXED_VENCPLL, "vencpll", 0x0280, 0x028C, 0x00000100,
                0, 31, 0x0280, 4, 0, 0, 0, 0x0284, 0),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x0330, 0x0340, 0x00000101,
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x0330, 0x0340, 0x00000100,
                0, 31, 0x0330, 4, 0x0338, 0x0014, 0, 0x0334, 0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x0350, 0x0360, 0x00000101,
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x0350, 0x0360, 0x00000100,
                0, 31, 0x0350, 4, 0x0358, 0x0014, 1, 0x0354, 0),
-       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x0370, 0x037c, 0x00000101,
+       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x0370, 0x037c, 0x00000100,
                0, 31, 0x0370, 4, 0, 0, 0, 0x0374, 0),
-       PLL(CLK_APMIXED_LVDSPLL2, "lvdspll2", 0x0390, 0x039C, 0x00000101,
+       PLL(CLK_APMIXED_LVDSPLL2, "lvdspll2", 0x0390, 0x039C, 0x00000100,
                0, 31, 0x0390, 4, 0, 0, 0, 0x0394, 0),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0270, 0x027C, 0x00000101,
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0270, 0x027C, 0x00000100,
                0, 31, 0x0270, 4, 0, 0, 0, 0x0274, 0),
-       PLL(CLK_APMIXED_MSDCPLL2, "msdcpll2", 0x0410, 0x041C, 0x00000101,
+       PLL(CLK_APMIXED_MSDCPLL2, "msdcpll2", 0x0410, 0x041C, 0x00000100,
                0, 31, 0x0410, 4, 0, 0, 0, 0x0414, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0290, 0x029C, 0xc0000101,
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0290, 0x029C, 0xc0000100,
                0, 31, 0x0290, 4, 0, 0, 0, 0x0294, 0),
-       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0250, 0x0260, 0x00000101,
+       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0250, 0x0260, 0x00000100,
                0, 31, 0x0250, 4, 0, 0, 0, 0x0254, 0,
                mmpll_div_table),
-       PLL_B(CLK_APMIXED_ARMCA35PLL, "armca35pll", 0x0100, 0x0110, 0xf0000101,
+       PLL_B(CLK_APMIXED_ARMCA35PLL, "armca35pll", 0x0100, 0x0110, 0xf0000100,
                HAVE_RST_BAR, 31, 0x0100, 4, 0, 0, 0, 0x0104, 0,
                armca35pll_div_table),
-       PLL_B(CLK_APMIXED_ARMCA72PLL, "armca72pll", 0x0210, 0x0220, 0x00000101,
+       PLL_B(CLK_APMIXED_ARMCA72PLL, "armca72pll", 0x0210, 0x0220, 0x00000100,
                0, 31, 0x0210, 4, 0, 0, 0, 0x0214, 0,
                armca72pll_div_table),
-       PLL(CLK_APMIXED_ETHERPLL, "etherpll", 0x0300, 0x030C, 0xc0000101,
+       PLL(CLK_APMIXED_ETHERPLL, "etherpll", 0x0300, 0x030C, 0xc0000100,
                0, 31, 0x0300, 4, 0, 0, 0, 0x0304, 0),
 };
 
 static int clk_mt2712_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -1268,7 +1268,7 @@ static int clk_mt2712_apmixed_probe(struct platform_device *pdev)
 
        mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -1277,7 +1277,7 @@ static int clk_mt2712_apmixed_probe(struct platform_device *pdev)
        return r;
 }
 
-static struct clk_onecell_data *top_clk_data;
+static struct clk_hw_onecell_data *top_clk_data;
 
 static void clk_mt2712_top_init_early(struct device_node *node)
 {
@@ -1287,13 +1287,13 @@ static void clk_mt2712_top_init_early(struct device_node *node)
                top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
 
                for (i = 0; i < CLK_TOP_NR_CLK; i++)
-                       top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
+                       top_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
        }
 
        mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs),
                        top_clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -1318,8 +1318,8 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
                top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
        } else {
                for (i = 0; i < CLK_TOP_NR_CLK; i++) {
-                       if (top_clk_data->clks[i] == ERR_PTR(-EPROBE_DEFER))
-                               top_clk_data->clks[i] = ERR_PTR(-ENOENT);
+                       if (top_clk_data->hws[i] == ERR_PTR(-EPROBE_DEFER))
+                               top_clk_data->hws[i] = ERR_PTR(-ENOENT);
                }
        }
 
@@ -1335,7 +1335,7 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
                        top_clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -1346,7 +1346,7 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
 
 static int clk_mt2712_infra_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -1355,7 +1355,7 @@ static int clk_mt2712_infra_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -1368,7 +1368,7 @@ static int clk_mt2712_infra_probe(struct platform_device *pdev)
 
 static int clk_mt2712_peri_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -1377,7 +1377,7 @@ static int clk_mt2712_peri_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -1390,7 +1390,7 @@ static int clk_mt2712_peri_probe(struct platform_device *pdev)
 
 static int clk_mt2712_mcu_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
        void __iomem *base;
@@ -1406,7 +1406,7 @@ static int clk_mt2712_mcu_probe(struct platform_device *pdev)
        mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
                        &mt2712_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r != 0)
                pr_err("%s(): could not register clock provider: %d\n",
index 4c98916..9c6e9ca 100644 (file)
@@ -66,7 +66,7 @@ static const struct mtk_gate audio_clks[] = {
 
 static int clk_mt6765_audio_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -75,7 +75,7 @@ static int clk_mt6765_audio_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, audio_clks,
                               ARRAY_SIZE(audio_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index c963948..2586d3a 100644 (file)
@@ -41,7 +41,7 @@ static const struct mtk_gate cam_clks[] = {
 
 static int clk_mt6765_cam_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -49,7 +49,7 @@ static int clk_mt6765_cam_probe(struct platform_device *pdev)
 
        mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 6fd8bf8..8cc95b9 100644 (file)
@@ -37,7 +37,7 @@ static const struct mtk_gate img_clks[] = {
 
 static int clk_mt6765_img_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -45,7 +45,7 @@ static int clk_mt6765_img_probe(struct platform_device *pdev)
 
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 81744d0..c816e26 100644 (file)
@@ -34,7 +34,7 @@ static const struct mtk_gate mipi0a_clks[] = {
 
 static int clk_mt6765_mipi0a_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -43,7 +43,7 @@ static int clk_mt6765_mipi0a_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, mipi0a_clks,
                               ARRAY_SIZE(mipi0a_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 6d8214c..ee6d3b8 100644 (file)
@@ -63,7 +63,7 @@ static const struct mtk_gate mm_clks[] = {
 
 static int clk_mt6765_mm_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -71,7 +71,7 @@ static int clk_mt6765_mm_probe(struct platform_device *pdev)
 
        mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index baae665..d804597 100644 (file)
@@ -36,7 +36,7 @@ static const struct mtk_gate venc_clks[] = {
 
 static int clk_mt6765_vcodec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -45,7 +45,7 @@ static int clk_mt6765_vcodec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, venc_clks,
                               ARRAY_SIZE(venc_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 24829ca..e9b9e67 100644 (file)
@@ -748,32 +748,32 @@ static const struct mtk_gate apmixed_clks[] = {
                        _pcw_reg, _pcw_shift, NULL)     \
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL_L, "armpll_l", 0x021C, 0x0228, BIT(0),
+       PLL(CLK_APMIXED_ARMPLL_L, "armpll_l", 0x021C, 0x0228, 0,
            PLL_AO, 22, 8, 0x0220, 24, 0, 0, 0, 0x0220, 0),
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x020C, 0x0218, BIT(0),
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x020C, 0x0218, 0,
            PLL_AO, 22, 8, 0x0210, 24, 0, 0, 0, 0x0210, 0),
-       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x022C, 0x0238, BIT(0),
+       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x022C, 0x0238, 0,
            PLL_AO, 22, 8, 0x0230, 24, 0, 0, 0, 0x0230, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x023C, 0x0248, BIT(0),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x023C, 0x0248, 0,
            (HAVE_RST_BAR | PLL_AO), 22, 8, 0x0240, 24, 0, 0, 0, 0x0240,
            0),
-       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x024C, 0x0258, BIT(0),
+       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x024C, 0x0258, 0,
            0, 22, 8, 0x0250, 24, 0, 0, 0, 0x0250, 0),
-       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x025C, 0x0268, BIT(0),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x025C, 0x0268, 0,
            0, 22, 8, 0x0260, 24, 0, 0, 0, 0x0260, 0),
-       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x026C, 0x0278, BIT(0),
+       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x026C, 0x0278, 0,
            HAVE_RST_BAR, 22, 8, 0x0270, 24, 0, 0, 0, 0x0270, 0),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x027C, 0x0288, BIT(0),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x027C, 0x0288, 0,
            0, 22, 8, 0x0280, 24, 0, 0, 0, 0x0280, 0),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x028C, 0x029C, BIT(0),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x028C, 0x029C, 0,
            0, 32, 8, 0x0290, 24, 0x0040, 0x000C, 0, 0x0294, 0),
-       PLL(CLK_APMIXED_MPLL, "mpll", 0x02A0, 0x02AC, BIT(0),
+       PLL(CLK_APMIXED_MPLL, "mpll", 0x02A0, 0x02AC, 0,
            PLL_AO, 22, 8, 0x02A4, 24, 0, 0, 0, 0x02A4, 0),
 };
 
 static int clk_mt6765_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
        void __iomem *base;
@@ -791,7 +791,7 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev)
 
        mtk_clk_register_gates(node, apmixed_clks,
                               ARRAY_SIZE(apmixed_clks), clk_data);
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -811,7 +811,7 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
        int r;
        struct device_node *node = pdev->dev.of_node;
        void __iomem *base;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        base = devm_ioremap_resource(&pdev->dev, res);
@@ -831,7 +831,7 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -848,7 +848,7 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
 
 static int clk_mt6765_ifr_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
        void __iomem *base;
@@ -864,7 +864,7 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev)
 
        mtk_clk_register_gates(node, ifr_clks, ARRAY_SIZE(ifr_clks),
                               clk_data);
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 9e889e4..97e44ab 100644 (file)
@@ -96,7 +96,7 @@ static const struct of_device_id of_match_clk_mt6779_aud[] = {
 
 static int clk_mt6779_aud_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
@@ -104,7 +104,7 @@ static int clk_mt6779_aud_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_aud_drv = {
index 7f07a2a..9c5117a 100644 (file)
@@ -45,7 +45,7 @@ static const struct of_device_id of_match_clk_mt6779_cam[] = {
 
 static int clk_mt6779_cam_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK);
@@ -53,7 +53,7 @@ static int clk_mt6779_cam_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_cam_drv = {
index f0961fa..8012714 100644 (file)
@@ -37,7 +37,7 @@ static const struct of_device_id of_match_clk_mt6779_img[] = {
 
 static int clk_mt6779_img_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
@@ -45,7 +45,7 @@ static int clk_mt6779_img_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_img_drv = {
index 8c6f3e1..f67814c 100644 (file)
@@ -39,7 +39,7 @@ static const struct of_device_id of_match_clk_mt6779_ipe[] = {
 
 static int clk_mt6779_ipe_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IPE_NR_CLK);
@@ -47,7 +47,7 @@ static int clk_mt6779_ipe_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, ipe_clks, ARRAY_SIZE(ipe_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_ipe_drv = {
index 9f33728..fc7387b 100644 (file)
@@ -29,7 +29,7 @@ static const struct mtk_gate mfg_clks[] = {
 
 static int clk_mt6779_mfg_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_MFGCFG_NR_CLK);
@@ -37,7 +37,7 @@ static int clk_mt6779_mfg_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt6779_mfg[] = {
index 33946e6..eda8cbe 100644 (file)
@@ -89,14 +89,14 @@ static int clk_mt6779_mm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
 
        mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_mm_drv = {
index f435884..7e195b0 100644 (file)
@@ -46,7 +46,7 @@ static const struct of_device_id of_match_clk_mt6779_vdec[] = {
 
 static int clk_mt6779_vdec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_VDEC_GCON_NR_CLK);
@@ -54,7 +54,7 @@ static int clk_mt6779_vdec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_vdec_drv = {
index ff67084..573efa8 100644 (file)
@@ -37,7 +37,7 @@ static const struct of_device_id of_match_clk_mt6779_venc[] = {
 
 static int clk_mt6779_venc_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_VENC_GCON_NR_CLK);
@@ -45,7 +45,7 @@ static int clk_mt6779_venc_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt6779_venc_drv = {
index 7b61664..0d0a90e 100644 (file)
@@ -1182,39 +1182,39 @@ static const struct mtk_gate apmixed_clks[] = {
                        _pcw_chg_reg, NULL)
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL_LL, "armpll_ll", 0x0200, 0x020C, BIT(0),
+       PLL(CLK_APMIXED_ARMPLL_LL, "armpll_ll", 0x0200, 0x020C, 0,
            PLL_AO, 0, 22, 8, 0x0204, 24, 0, 0, 0, 0x0204, 0, 0),
-       PLL(CLK_APMIXED_ARMPLL_BL, "armpll_bl", 0x0210, 0x021C, BIT(0),
+       PLL(CLK_APMIXED_ARMPLL_BL, "armpll_bl", 0x0210, 0x021C, 0,
            PLL_AO, 0, 22, 8, 0x0214, 24, 0, 0, 0, 0x0214, 0, 0),
-       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x02A0, 0x02AC, BIT(0),
+       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x02A0, 0x02AC, 0,
            PLL_AO, 0, 22, 8, 0x02A4, 24, 0, 0, 0, 0x02A4, 0, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0230, 0x023C, BIT(0),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0230, 0x023C, 0,
            (HAVE_RST_BAR), BIT(24), 22, 8, 0x0234, 24, 0, 0, 0,
            0x0234, 0, 0),
-       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0240, 0x024C, BIT(0),
+       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0240, 0x024C, 0,
            (HAVE_RST_BAR), BIT(24), 22, 8, 0x0244, 24,
            0, 0, 0, 0x0244, 0, 0),
-       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x0250, 0x025C, BIT(0),
+       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x0250, 0x025C, 0,
            0, 0, 22, 8, 0x0254, 24, 0, 0, 0, 0x0254, 0, 0),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0260, 0x026C, BIT(0),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0260, 0x026C, 0,
            0, 0, 22, 8, 0x0264, 24, 0, 0, 0, 0x0264, 0, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0270, 0x027C, BIT(0),
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0270, 0x027C, 0,
            0, 0, 22, 8, 0x0274, 24, 0, 0, 0, 0x0274, 0, 0),
-       PLL(CLK_APMIXED_ADSPPLL, "adsppll", 0x02b0, 0x02bC, BIT(0),
+       PLL(CLK_APMIXED_ADSPPLL, "adsppll", 0x02b0, 0x02bC, 0,
            (HAVE_RST_BAR), BIT(23), 22, 8, 0x02b4, 24,
            0, 0, 0, 0x02b4, 0, 0),
-       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0280, 0x028C, BIT(0),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0280, 0x028C, 0,
            (HAVE_RST_BAR), BIT(23), 22, 8, 0x0284, 24,
            0, 0, 0, 0x0284, 0, 0),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x02C0, 0x02D0, BIT(0),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x02C0, 0x02D0, 0,
            0, 0, 32, 8, 0x02C0, 1, 0, 0x14, 0, 0x02C4, 0, 0x2C0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x02D4, 0x02E4, BIT(0),
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x02D4, 0x02E4, 0,
            0, 0, 32, 8, 0x02D4, 1, 0, 0x14, 1, 0x02D8, 0, 0x02D4),
 };
 
 static int clk_mt6779_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
@@ -1224,13 +1224,13 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, apmixed_clks,
                               ARRAY_SIZE(apmixed_clks), clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static int clk_mt6779_top_probe(struct platform_device *pdev)
 {
        void __iomem *base;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        base = devm_platform_ioremap_resource(pdev, 0);
@@ -1253,12 +1253,12 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)
        mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
                                    base, &mt6779_clk_lock, clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static int clk_mt6779_infra_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
@@ -1266,7 +1266,7 @@ static int clk_mt6779_infra_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt6779[] = {
index 908bf97..25d17db 100644 (file)
@@ -39,7 +39,7 @@ static const struct of_device_id of_match_clk_mt6797_img[] = {
 
 static int clk_mt6797_img_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -48,7 +48,7 @@ static int clk_mt6797_img_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 01fdce2..0846011 100644 (file)
@@ -96,7 +96,7 @@ static int clk_mt6797_mm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR);
@@ -104,7 +104,7 @@ static int clk_mt6797_mm_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index bbbc811..de85789 100644 (file)
@@ -56,7 +56,7 @@ static const struct of_device_id of_match_clk_mt6797_vdec[] = {
 
 static int clk_mt6797_vdec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -65,7 +65,7 @@ static int clk_mt6797_vdec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 2c75f0c..78b7ed5 100644 (file)
@@ -41,7 +41,7 @@ static const struct of_device_id of_match_clk_mt6797_venc[] = {
 
 static int clk_mt6797_venc_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -50,7 +50,7 @@ static int clk_mt6797_venc_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 02259e8..b89f325 100644 (file)
@@ -383,7 +383,7 @@ static const struct mtk_composite top_muxes[] = {
 
 static int mtk_topckgen_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        struct device_node *node = pdev->dev.of_node;
 
@@ -399,7 +399,7 @@ static int mtk_topckgen_init(struct platform_device *pdev)
        mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
                                    &mt6797_clk_lock, clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct mtk_gate_regs infra0_cg_regs = {
@@ -556,7 +556,7 @@ static const struct mtk_fixed_factor infra_fixed_divs[] = {
        FACTOR(CLK_INFRA_13M, "clk13m", "clk26m", 1, 2),
 };
 
-static struct clk_onecell_data *infra_clk_data;
+static struct clk_hw_onecell_data *infra_clk_data;
 
 static void mtk_infrasys_init_early(struct device_node *node)
 {
@@ -566,13 +566,14 @@ static void mtk_infrasys_init_early(struct device_node *node)
                infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
 
                for (i = 0; i < CLK_INFRA_NR; i++)
-                       infra_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
+                       infra_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
        }
 
        mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
                                 infra_clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, infra_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                  infra_clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                       __func__, r);
@@ -590,8 +591,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
                infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
        } else {
                for (i = 0; i < CLK_INFRA_NR; i++) {
-                       if (infra_clk_data->clks[i] == ERR_PTR(-EPROBE_DEFER))
-                               infra_clk_data->clks[i] = ERR_PTR(-ENOENT);
+                       if (infra_clk_data->hws[i] == ERR_PTR(-EPROBE_DEFER))
+                               infra_clk_data->hws[i] = ERR_PTR(-ENOENT);
                }
        }
 
@@ -600,7 +601,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
        mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
                                 infra_clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, infra_clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                     infra_clk_data);
 }
 
 #define MT6797_PLL_FMAX                (3000UL * MHZ)
@@ -635,31 +637,31 @@ static int mtk_infrasys_init(struct platform_device *pdev)
                        NULL)
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0220, 0x022C, 0xF0000101, PLL_AO,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0220, 0x022C, 0xF0000100, PLL_AO,
            21, 0x220, 4, 0x0, 0x224, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0230, 0x023C, 0xFE000011, 0, 7,
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0230, 0x023C, 0xFE000010, 0, 7,
            0x230, 4, 0x0, 0x234, 14),
-       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x0240, 0x024C, 0x00000101, 0, 21,
+       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x0240, 0x024C, 0x00000100, 0, 21,
            0x244, 24, 0x0, 0x244, 0),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0250, 0x025C, 0x00000121, 0, 21,
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0250, 0x025C, 0x00000120, 0, 21,
            0x250, 4, 0x0, 0x254, 0),
-       PLL(CLK_APMIXED_IMGPLL, "imgpll", 0x0260, 0x026C, 0x00000121, 0, 21,
+       PLL(CLK_APMIXED_IMGPLL, "imgpll", 0x0260, 0x026C, 0x00000120, 0, 21,
            0x260, 4, 0x0, 0x264, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0270, 0x027C, 0xC0000121, 0, 21,
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0270, 0x027C, 0xC0000120, 0, 21,
            0x270, 4, 0x0, 0x274, 0),
-       PLL(CLK_APMIXED_CODECPLL, "codecpll", 0x0290, 0x029C, 0x00000121, 0, 21,
+       PLL(CLK_APMIXED_CODECPLL, "codecpll", 0x0290, 0x029C, 0x00000120, 0, 21,
            0x290, 4, 0x0, 0x294, 0),
-       PLL(CLK_APMIXED_VDECPLL, "vdecpll", 0x02E4, 0x02F0, 0x00000121, 0, 21,
+       PLL(CLK_APMIXED_VDECPLL, "vdecpll", 0x02E4, 0x02F0, 0x00000120, 0, 21,
            0x2E4, 4, 0x0, 0x2E8, 0),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x02A0, 0x02B0, 0x00000131, 0, 31,
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x02A0, 0x02B0, 0x00000130, 0, 31,
            0x2A0, 4, 0x2A8, 0x2A4, 0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x02B4, 0x02C4, 0x00000131, 0, 31,
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x02B4, 0x02C4, 0x00000130, 0, 31,
            0x2B4, 4, 0x2BC, 0x2B8, 0),
 };
 
 static int mtk_apmixedsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR);
@@ -668,7 +670,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
 
        mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt6797[] = {
index 2bd4295..9f2e5aa 100644 (file)
@@ -132,7 +132,7 @@ static const struct mtk_gate audio_clks[] = {
 
 static int clk_mt7622_audiosys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -141,7 +141,7 @@ static int clk_mt7622_audiosys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r) {
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index c9947dc..b12d487 100644 (file)
@@ -67,7 +67,7 @@ static const struct mtk_gate sgmii_clks[] = {
 
 static int clk_mt7622_ethsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -76,7 +76,7 @@ static int clk_mt7622_ethsys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
@@ -89,7 +89,7 @@ static int clk_mt7622_ethsys_init(struct platform_device *pdev)
 
 static int clk_mt7622_sgmiisys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -98,7 +98,7 @@ static int clk_mt7622_sgmiisys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, sgmii_clks, ARRAY_SIZE(sgmii_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 628be0c..58728e3 100644 (file)
@@ -78,7 +78,7 @@ static const struct mtk_gate pcie_clks[] = {
 
 static int clk_mt7622_ssusbsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -87,7 +87,7 @@ static int clk_mt7622_ssusbsys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, ssusb_clks, ARRAY_SIZE(ssusb_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
@@ -100,7 +100,7 @@ static int clk_mt7622_ssusbsys_init(struct platform_device *pdev)
 
 static int clk_mt7622_pciesys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -109,7 +109,7 @@ static int clk_mt7622_pciesys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, pcie_clks, ARRAY_SIZE(pcie_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 0e1fb30..e4a5e52 100644 (file)
@@ -329,23 +329,23 @@ static const struct mtk_gate_regs peri1_cg_regs = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001,
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0,
            PLL_AO, 21, 0x0204, 24, 0, 0x0204, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0210, 0x021C, 0x00000001,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0210, 0x021C, 0,
            HAVE_RST_BAR, 21, 0x0214, 24, 0, 0x0214, 0),
-       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0220, 0x022C, 0x00000001,
+       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0220, 0x022C, 0,
            HAVE_RST_BAR, 7, 0x0224, 24, 0, 0x0224, 14),
-       PLL(CLK_APMIXED_ETH1PLL, "eth1pll", 0x0300, 0x0310, 0x00000001,
+       PLL(CLK_APMIXED_ETH1PLL, "eth1pll", 0x0300, 0x0310, 0,
            0, 21, 0x0300, 1, 0, 0x0304, 0),
-       PLL(CLK_APMIXED_ETH2PLL, "eth2pll", 0x0314, 0x0320, 0x00000001,
+       PLL(CLK_APMIXED_ETH2PLL, "eth2pll", 0x0314, 0x0320, 0,
            0, 21, 0x0314, 1, 0, 0x0318, 0),
-       PLL(CLK_APMIXED_AUD1PLL, "aud1pll", 0x0324, 0x0330, 0x00000001,
+       PLL(CLK_APMIXED_AUD1PLL, "aud1pll", 0x0324, 0x0330, 0,
            0, 31, 0x0324, 1, 0, 0x0328, 0),
-       PLL(CLK_APMIXED_AUD2PLL, "aud2pll", 0x0334, 0x0340, 0x00000001,
+       PLL(CLK_APMIXED_AUD2PLL, "aud2pll", 0x0334, 0x0340, 0,
            0, 31, 0x0334, 1, 0, 0x0338, 0),
-       PLL(CLK_APMIXED_TRGPLL, "trgpll", 0x0344, 0x0354, 0x00000001,
+       PLL(CLK_APMIXED_TRGPLL, "trgpll", 0x0344, 0x0354, 0,
            0, 21, 0x0344, 1, 0, 0x0348, 0),
-       PLL(CLK_APMIXED_SGMIPLL, "sgmipll", 0x0358, 0x0368, 0x00000001,
+       PLL(CLK_APMIXED_SGMIPLL, "sgmipll", 0x0358, 0x0368, 0,
            0, 21, 0x0358, 1, 0, 0x035C, 0),
 };
 
@@ -612,7 +612,7 @@ static struct mtk_composite peri_muxes[] = {
 
 static int mtk_topckgen_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        struct device_node *node = pdev->dev.of_node;
 
@@ -637,17 +637,17 @@ static int mtk_topckgen_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
                               clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_TOP_AXI_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_MEM_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_DDRPHYCFG_SEL]);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_AXI_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_MEM_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_DDRPHYCFG_SEL]->clk);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static int mtk_infrasys_init(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
@@ -658,8 +658,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
        mtk_clk_register_cpumuxes(node, infra_muxes, ARRAY_SIZE(infra_muxes),
                                  clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get,
-                               clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                  clk_data);
        if (r)
                return r;
 
@@ -670,7 +670,7 @@ static int mtk_infrasys_init(struct platform_device *pdev)
 
 static int mtk_apmixedsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
@@ -683,15 +683,15 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, apmixed_clks,
                               ARRAY_SIZE(apmixed_clks), clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_APMIXED_ARMPLL]);
-       clk_prepare_enable(clk_data->clks[CLK_APMIXED_MAIN_CORE_EN]);
+       clk_prepare_enable(clk_data->hws[CLK_APMIXED_ARMPLL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_APMIXED_MAIN_CORE_EN]->clk);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static int mtk_pericfg_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
        struct device_node *node = pdev->dev.of_node;
@@ -708,11 +708,11 @@ static int mtk_pericfg_init(struct platform_device *pdev)
        mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
                                    &mt7622_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                return r;
 
-       clk_prepare_enable(clk_data->clks[CLK_PERI_UART0_PD]);
+       clk_prepare_enable(clk_data->hws[CLK_PERI_UART0_PD]->clk);
 
        mtk_register_reset_controller(node, 2, 0x0);
 
index 88279d0..c49fd73 100644 (file)
@@ -78,7 +78,7 @@ static const struct mtk_gate sgmii_clks[2][4] = {
 
 static int clk_mt7629_ethsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -86,7 +86,7 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)
 
        mtk_clk_register_gates(node, eth_clks, CLK_ETH_NR_CLK, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
@@ -99,7 +99,7 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)
 
 static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        static int id;
        int r;
@@ -109,7 +109,7 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, sgmii_clks[id++], CLK_SGMII_NR_CLK,
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index 5c5b372..acaa97f 100644 (file)
@@ -73,7 +73,7 @@ static const struct mtk_gate pcie_clks[] = {
 
 static int clk_mt7629_ssusbsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -82,7 +82,7 @@ static int clk_mt7629_ssusbsys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, ssusb_clks, ARRAY_SIZE(ssusb_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
@@ -95,7 +95,7 @@ static int clk_mt7629_ssusbsys_init(struct platform_device *pdev)
 
 static int clk_mt7629_pciesys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -104,7 +104,7 @@ static int clk_mt7629_pciesys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, pcie_clks, ARRAY_SIZE(pcie_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                dev_err(&pdev->dev,
                        "could not register clock provider: %s: %d\n",
index c0e023b..e4a08c8 100644 (file)
@@ -336,17 +336,17 @@ static const struct mtk_gate_regs peri1_cg_regs = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001,
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0,
            0, 21, 0x0204, 24, 0, 0x0204, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0210, 0x021C, 0x00000001,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0210, 0x021C, 0,
            HAVE_RST_BAR, 21, 0x0214, 24, 0, 0x0214, 0),
-       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0220, 0x022C, 0x00000001,
+       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0220, 0x022C, 0,
            HAVE_RST_BAR, 7, 0x0224, 24, 0, 0x0224, 14),
-       PLL(CLK_APMIXED_ETH1PLL, "eth1pll", 0x0300, 0x0310, 0x00000001,
+       PLL(CLK_APMIXED_ETH1PLL, "eth1pll", 0x0300, 0x0310, 0,
            0, 21, 0x0300, 1, 0, 0x0304, 0),
-       PLL(CLK_APMIXED_ETH2PLL, "eth2pll", 0x0314, 0x0320, 0x00000001,
+       PLL(CLK_APMIXED_ETH2PLL, "eth2pll", 0x0314, 0x0320, 0,
            0, 21, 0x0314, 1, 0, 0x0318, 0),
-       PLL(CLK_APMIXED_SGMIPLL, "sgmipll", 0x0358, 0x0368, 0x00000001,
+       PLL(CLK_APMIXED_SGMIPLL, "sgmipll", 0x0358, 0x0368, 0,
            0, 21, 0x0358, 1, 0, 0x035C, 0),
 };
 
@@ -572,7 +572,7 @@ static struct mtk_composite peri_muxes[] = {
 
 static int mtk_topckgen_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        struct device_node *node = pdev->dev.of_node;
 
@@ -591,17 +591,17 @@ static int mtk_topckgen_init(struct platform_device *pdev)
        mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
                                    base, &mt7629_clk_lock, clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_TOP_AXI_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_MEM_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_DDRPHYCFG_SEL]);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_AXI_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_MEM_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_DDRPHYCFG_SEL]->clk);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static int mtk_infrasys_init(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
 
        clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
 
@@ -611,13 +611,13 @@ static int mtk_infrasys_init(struct platform_device *pdev)
        mtk_clk_register_cpumuxes(node, infra_muxes, ARRAY_SIZE(infra_muxes),
                                  clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get,
-                                  clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                     clk_data);
 }
 
 static int mtk_pericfg_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
        struct device_node *node = pdev->dev.of_node;
@@ -634,18 +634,18 @@ static int mtk_pericfg_init(struct platform_device *pdev)
        mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
                                    &mt7629_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                return r;
 
-       clk_prepare_enable(clk_data->clks[CLK_PERI_UART0_PD]);
+       clk_prepare_enable(clk_data->hws[CLK_PERI_UART0_PD]->clk);
 
        return 0;
 }
 
 static int mtk_apmixedsys_init(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
@@ -658,10 +658,10 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
        mtk_clk_register_gates(node, apmixed_clks,
                               ARRAY_SIZE(apmixed_clks), clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_APMIXED_ARMPLL]);
-       clk_prepare_enable(clk_data->clks[CLK_APMIXED_MAIN_CORE_EN]);
+       clk_prepare_enable(clk_data->hws[CLK_APMIXED_ARMPLL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_APMIXED_MAIN_CORE_EN]->clk);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 
index 21d4c82..62080ee 100644 (file)
                 "clkxtal")
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001, 0, 32,
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x0, 0, 32,
            0x0200, 4, 0, 0x0204, 0),
-       PLL(CLK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001, 0, 32,
+       PLL(CLK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x0, 0, 32,
            0x0210, 4, 0, 0x0214, 0),
-       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001, 0, 32,
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x0, 0, 32,
            0x0220, 4, 0, 0x0224, 0),
-       PLL(CLK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023c, 0x00000001, 0, 32,
+       PLL(CLK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023c, 0x0, 0, 32,
            0x0230, 4, 0, 0x0234, 0),
-       PLL(CLK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024c, 0x00000001, 0,
+       PLL(CLK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024c, 0x0, 0,
            32, 0x0240, 4, 0, 0x0244, 0),
-       PLL(CLK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025c, 0x00000001, 0, 32,
+       PLL(CLK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025c, 0x0, 0, 32,
            0x0250, 4, 0, 0x0254, 0),
-       PLL(CLK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001, 0, 32, 0x0260,
+       PLL(CLK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x0, 0, 32, 0x0260,
            4, 0, 0x0264, 0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001, 0, 32,
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x0, 0, 32,
            0x0278, 4, 0, 0x027c, 0),
 };
 
@@ -67,7 +67,7 @@ static const struct of_device_id of_match_clk_mt7986_apmixed[] = {
 
 static int clk_mt7986_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -77,9 +77,9 @@ static int clk_mt7986_apmixed_probe(struct platform_device *pdev)
 
        mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_APMIXED_ARMPLL]);
+       clk_prepare_enable(clk_data->hws[CLK_APMIXED_ARMPLL]->clk);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r) {
                pr_err("%s(): could not register clock provider: %d\n",
                       __func__, r);
index 495d023..7868c07 100644 (file)
@@ -79,7 +79,7 @@ static const struct mtk_gate eth_clks[] __initconst = {
 
 static void __init mtk_sgmiisys_0_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii0_clks));
@@ -87,7 +87,7 @@ static void __init mtk_sgmiisys_0_init(struct device_node *node)
        mtk_clk_register_gates(node, sgmii0_clks, ARRAY_SIZE(sgmii0_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                       __func__, r);
@@ -97,7 +97,7 @@ CLK_OF_DECLARE(mtk_sgmiisys_0, "mediatek,mt7986-sgmiisys_0",
 
 static void __init mtk_sgmiisys_1_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii1_clks));
@@ -105,7 +105,7 @@ static void __init mtk_sgmiisys_1_init(struct device_node *node)
        mtk_clk_register_gates(node, sgmii1_clks, ARRAY_SIZE(sgmii1_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -116,17 +116,17 @@ CLK_OF_DECLARE(mtk_sgmiisys_1, "mediatek,mt7986-sgmiisys_1",
 
 static void __init mtk_ethsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(ARRAY_SIZE(eth_clks));
 
        mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                       __func__, r);
 }
-CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt7986-ethsys_ck", mtk_ethsys_init);
+CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt7986-ethsys", mtk_ethsys_init);
index f209c55..d90727a 100644 (file)
@@ -171,7 +171,7 @@ static const struct mtk_gate infra_clks[] = {
 
 static int clk_mt7986_infracfg_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
        void __iomem *base;
@@ -195,7 +195,7 @@ static int clk_mt7986_infracfg_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
                               clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r) {
                pr_err("%s(): could not register clock provider: %d\n",
                       __func__, r);
index 8f6f79b..de5121c 100644 (file)
@@ -283,7 +283,7 @@ static const struct mtk_mux top_muxes[] = {
 
 static int clk_mt7986_topckgen_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
        void __iomem *base;
@@ -306,14 +306,14 @@ static int clk_mt7986_topckgen_probe(struct platform_device *pdev)
        mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
                               &mt7986_clk_lock, clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_TOP_SYSAXI_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_SYSAPB_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_DRAMC_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_DRAMC_MD32_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_F26M_SEL]);
-       clk_prepare_enable(clk_data->clks[CLK_TOP_SGM_REG_SEL]);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_SYSAXI_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_SYSAPB_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_DRAMC_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_DRAMC_MD32_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_F26M_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_SGM_REG_SEL]->clk);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r) {
                pr_err("%s(): could not register clock provider: %d\n",
index 09ad272..9ef524b 100644 (file)
@@ -516,7 +516,7 @@ static const struct mtk_composite peri_clks[] __initconst = {
 
 static void __init mtk_topckgen_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
 
@@ -533,9 +533,9 @@ static void __init mtk_topckgen_init(struct device_node *node)
        mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
                        &mt8135_clk_lock, clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_TOP_CCI_SEL]);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_CCI_SEL]->clk);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -544,7 +544,7 @@ CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt8135-topckgen", mtk_topckgen_init);
 
 static void __init mtk_infrasys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
@@ -552,9 +552,9 @@ static void __init mtk_infrasys_init(struct device_node *node)
        mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
                                                clk_data);
 
-       clk_prepare_enable(clk_data->clks[CLK_INFRA_M4U]);
+       clk_prepare_enable(clk_data->hws[CLK_INFRA_M4U]->clk);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -565,7 +565,7 @@ CLK_OF_DECLARE(mtk_infrasys, "mediatek,mt8135-infracfg", mtk_infrasys_init);
 
 static void __init mtk_pericfg_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        void __iomem *base;
 
@@ -582,7 +582,7 @@ static void __init mtk_pericfg_init(struct device_node *node)
        mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
                        &mt8135_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -612,21 +612,21 @@ CLK_OF_DECLARE(mtk_pericfg, "mediatek,mt8135-pericfg", mtk_pericfg_init);
        }
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL1, "armpll1", 0x200, 0x218, 0x80000001, 0, 21, 0x204, 24, 0x0, 0x204, 0),
-       PLL(CLK_APMIXED_ARMPLL2, "armpll2", 0x2cc, 0x2e4, 0x80000001, 0, 21, 0x2d0, 24, 0x0, 0x2d0, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x21c, 0x234, 0xf0000001, HAVE_RST_BAR, 21, 0x21c, 6, 0x0, 0x220, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x238, 0x250, 0xf3000001, HAVE_RST_BAR, 7, 0x238, 6, 0x0, 0x238, 9),
-       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x254, 0x26c, 0xf0000001, HAVE_RST_BAR, 21, 0x254, 6, 0x0, 0x258, 0),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x278, 0x290, 0x80000001, 0, 21, 0x278, 6, 0x0, 0x27c, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x294, 0x2ac, 0x80000001, 0, 31, 0x294, 6, 0x0, 0x298, 0),
-       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x2b0, 0x2c8,       0x80000001, 0, 21, 0x2b0, 6, 0x0, 0x2b4, 0),
-       PLL(CLK_APMIXED_AUDPLL, "audpll", 0x2e8, 0x300, 0x80000001, 0, 31, 0x2e8, 6, 0x2f8, 0x2ec, 0),
-       PLL(CLK_APMIXED_VDECPLL, "vdecpll", 0x304, 0x31c,       0x80000001, 0, 21, 0x2b0, 6, 0x0, 0x308, 0),
+       PLL(CLK_APMIXED_ARMPLL1, "armpll1", 0x200, 0x218, 0x80000000, 0, 21, 0x204, 24, 0x0, 0x204, 0),
+       PLL(CLK_APMIXED_ARMPLL2, "armpll2", 0x2cc, 0x2e4, 0x80000000, 0, 21, 0x2d0, 24, 0x0, 0x2d0, 0),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x21c, 0x234, 0xf0000000, HAVE_RST_BAR, 21, 0x21c, 6, 0x0, 0x220, 0),
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x238, 0x250, 0xf3000000, HAVE_RST_BAR, 7, 0x238, 6, 0x0, 0x238, 9),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x254, 0x26c, 0xf0000000, HAVE_RST_BAR, 21, 0x254, 6, 0x0, 0x258, 0),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x278, 0x290, 0x80000000, 0, 21, 0x278, 6, 0x0, 0x27c, 0),
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x294, 0x2ac, 0x80000000, 0, 31, 0x294, 6, 0x0, 0x298, 0),
+       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x2b0, 0x2c8, 0x80000000, 0, 21, 0x2b0, 6, 0x0, 0x2b4, 0),
+       PLL(CLK_APMIXED_AUDPLL, "audpll", 0x2e8, 0x300, 0x80000000, 0, 31, 0x2e8, 6, 0x2f8, 0x2ec, 0),
+       PLL(CLK_APMIXED_VDECPLL, "vdecpll", 0x304, 0x31c, 0x80000000, 0, 21, 0x2b0, 6, 0x0, 0x308, 0),
 };
 
 static void __init mtk_apmixedsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
        if (!clk_data)
index 3f7bf64..ce1ae8d 100644 (file)
@@ -50,14 +50,14 @@ static const struct mtk_gate aud_clks[] __initconst = {
 
 static void __init mtk_audsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
 
        mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
index 3b4ec9e..e359e56 100644 (file)
@@ -43,14 +43,14 @@ static const struct mtk_gate img_clks[] __initconst = {
 
 static void __init mtk_imgsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
 
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 90b8717..4fd82fe 100644 (file)
@@ -41,14 +41,14 @@ static const struct mtk_gate mfg_clks[] __initconst = {
 
 static void __init mtk_mfgcfg_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK);
 
        mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 963b129..7391006 100644 (file)
@@ -101,7 +101,7 @@ static int clk_mt8167_mm_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
        const struct clk_mt8167_mm_driver_data *data;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int ret;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
@@ -115,7 +115,7 @@ static int clk_mt8167_mm_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (ret)
                return ret;
 
index 910b283..ee4fffb 100644 (file)
@@ -56,14 +56,14 @@ static const struct mtk_gate vdec_clks[] __initconst = {
 
 static void __init mtk_vdecsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
 
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 812b33a..f900ac4 100644 (file)
@@ -923,7 +923,7 @@ static const struct mtk_gate top_clks[] __initconst = {
 
 static void __init mtk_topckgen_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        void __iomem *base;
 
@@ -945,7 +945,7 @@ static void __init mtk_topckgen_init(struct device_node *node)
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
                                base, &mt8167_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -954,7 +954,7 @@ CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt8167-topckgen", mtk_topckgen_init);
 
 static void __init mtk_infracfg_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        void __iomem *base;
 
@@ -969,7 +969,7 @@ static void __init mtk_infracfg_init(struct device_node *node)
        mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
                &mt8167_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -1017,27 +1017,27 @@ static const struct mtk_pll_div_table mmpll_div_table[] = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0100, 0x0110, 0x00000001, 0,
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0100, 0x0110, 0, 0,
                21, 0x0104, 24, 0, 0x0104, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0120, 0x0130, 0x00000001,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0120, 0x0130, 0,
                HAVE_RST_BAR, 21, 0x0124, 24, 0, 0x0124, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0140, 0x0150, 0x30000001,
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0140, 0x0150, 0x30000000,
                HAVE_RST_BAR, 7, 0x0144, 24, 0, 0x0144, 0),
-       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0160, 0x0170, 0x00000001, 0,
+       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0160, 0x0170, 0, 0,
                21, 0x0164, 24, 0, 0x0164, 0, mmpll_div_table),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x0180, 0x0190, 0x00000001, 0,
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x0180, 0x0190, 0, 0,
                31, 0x0180, 1, 0x0194, 0x0184, 0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x01A0, 0x01B0, 0x00000001, 0,
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x01A0, 0x01B0, 0, 0,
                31, 0x01A0, 1, 0x01B4, 0x01A4, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x01C0, 0x01D0, 0x00000001, 0,
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x01C0, 0x01D0, 0, 0,
                21, 0x01C4, 24, 0, 0x01C4, 0),
-       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x01E0, 0x01F0, 0x00000001, 0,
+       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x01E0, 0x01F0, 0, 0,
                21, 0x01E4, 24, 0, 0x01E4, 0),
 };
 
 static void __init mtk_apmixedsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
 
@@ -1053,7 +1053,7 @@ static void __init mtk_apmixedsys_init(struct device_node *node)
        mtk_clk_register_dividers(apmixed_adj_divs, ARRAY_SIZE(apmixed_adj_divs),
                base, &mt8167_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
index 36fa20b..8abf42c 100644 (file)
@@ -115,7 +115,7 @@ static int clk_mt8173_mm_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
        const struct clk_mt8173_mm_driver_data *data;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int ret;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
@@ -129,7 +129,7 @@ static int clk_mt8173_mm_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (ret)
                return ret;
 
index 46b7655..0929db3 100644 (file)
@@ -819,25 +819,25 @@ static const struct mtk_gate venclt_clks[] __initconst = {
        GATE_VENCLT(CLK_VENCLT_CKE1, "venclt_cke1", "venclt_sel", 4),
 };
 
-static struct clk_onecell_data *mt8173_top_clk_data __initdata;
-static struct clk_onecell_data *mt8173_pll_clk_data __initdata;
+static struct clk_hw_onecell_data *mt8173_top_clk_data __initdata;
+static struct clk_hw_onecell_data *mt8173_pll_clk_data __initdata;
 
 static void __init mtk_clk_enable_critical(void)
 {
        if (!mt8173_top_clk_data || !mt8173_pll_clk_data)
                return;
 
-       clk_prepare_enable(mt8173_pll_clk_data->clks[CLK_APMIXED_ARMCA15PLL]);
-       clk_prepare_enable(mt8173_pll_clk_data->clks[CLK_APMIXED_ARMCA7PLL]);
-       clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_MEM_SEL]);
-       clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_DDRPHYCFG_SEL]);
-       clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_CCI400_SEL]);
-       clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_RTC_SEL]);
+       clk_prepare_enable(mt8173_pll_clk_data->hws[CLK_APMIXED_ARMCA15PLL]->clk);
+       clk_prepare_enable(mt8173_pll_clk_data->hws[CLK_APMIXED_ARMCA7PLL]->clk);
+       clk_prepare_enable(mt8173_top_clk_data->hws[CLK_TOP_MEM_SEL]->clk);
+       clk_prepare_enable(mt8173_top_clk_data->hws[CLK_TOP_DDRPHYCFG_SEL]->clk);
+       clk_prepare_enable(mt8173_top_clk_data->hws[CLK_TOP_CCI400_SEL]->clk);
+       clk_prepare_enable(mt8173_top_clk_data->hws[CLK_TOP_RTC_SEL]->clk);
 }
 
 static void __init mtk_topckgen_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
 
@@ -854,7 +854,7 @@ static void __init mtk_topckgen_init(struct device_node *node)
        mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
                        &mt8173_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -865,7 +865,7 @@ CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt8173-topckgen", mtk_topckgen_init);
 
 static void __init mtk_infrasys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
@@ -877,7 +877,7 @@ static void __init mtk_infrasys_init(struct device_node *node)
        mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
                                  clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -888,7 +888,7 @@ CLK_OF_DECLARE(mtk_infrasys, "mediatek,mt8173-infracfg", mtk_infrasys_init);
 
 static void __init mtk_pericfg_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        void __iomem *base;
 
@@ -905,7 +905,7 @@ static void __init mtk_pericfg_init(struct device_node *node)
        mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
                        &mt8173_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -973,27 +973,27 @@ static const struct mtk_pll_div_table mmpll_div_table[] = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMCA15PLL, "armca15pll", 0x200, 0x20c, 0x00000001, 0, 21, 0x204, 24, 0x0, 0x204, 0),
-       PLL(CLK_APMIXED_ARMCA7PLL, "armca7pll", 0x210, 0x21c, 0x00000001, 0, 21, 0x214, 24, 0x0, 0x214, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x220, 0x22c, 0xf0000101, HAVE_RST_BAR, 21, 0x220, 4, 0x0, 0x224, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x230, 0x23c, 0xfe000001, HAVE_RST_BAR, 7, 0x230, 4, 0x0, 0x234, 14),
-       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x240, 0x24c, 0x00000001, 0, 21, 0x244, 24, 0x0, 0x244, 0, mmpll_div_table),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x250, 0x25c, 0x00000001, 0, 21, 0x250, 4, 0x0, 0x254, 0),
-       PLL(CLK_APMIXED_VENCPLL, "vencpll", 0x260, 0x26c, 0x00000001, 0, 21, 0x260, 4, 0x0, 0x264, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x270, 0x27c, 0x00000001, 0, 21, 0x270, 4, 0x0, 0x274, 0),
-       PLL(CLK_APMIXED_MPLL, "mpll", 0x280, 0x28c, 0x00000001, 0, 21, 0x280, 4, 0x0, 0x284, 0),
-       PLL(CLK_APMIXED_VCODECPLL, "vcodecpll", 0x290, 0x29c, 0x00000001, 0, 21, 0x290, 4, 0x0, 0x294, 0),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x2a0, 0x2b0, 0x00000001, 0, 31, 0x2a0, 4, 0x2a4, 0x2a4, 0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x2b4, 0x2c4, 0x00000001, 0, 31, 0x2b4, 4, 0x2b8, 0x2b8, 0),
-       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x2d0, 0x2dc, 0x00000001, 0, 21, 0x2d0, 4, 0x0, 0x2d4, 0),
-       PLL(CLK_APMIXED_MSDCPLL2, "msdcpll2", 0x2f0, 0x2fc, 0x00000001, 0, 21, 0x2f0, 4, 0x0, 0x2f4, 0),
+       PLL(CLK_APMIXED_ARMCA15PLL, "armca15pll", 0x200, 0x20c, 0, 0, 21, 0x204, 24, 0x0, 0x204, 0),
+       PLL(CLK_APMIXED_ARMCA7PLL, "armca7pll", 0x210, 0x21c, 0, 0, 21, 0x214, 24, 0x0, 0x214, 0),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x220, 0x22c, 0xf0000100, HAVE_RST_BAR, 21, 0x220, 4, 0x0, 0x224, 0),
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x230, 0x23c, 0xfe000000, HAVE_RST_BAR, 7, 0x230, 4, 0x0, 0x234, 14),
+       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x240, 0x24c, 0, 0, 21, 0x244, 24, 0x0, 0x244, 0, mmpll_div_table),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x250, 0x25c, 0, 0, 21, 0x250, 4, 0x0, 0x254, 0),
+       PLL(CLK_APMIXED_VENCPLL, "vencpll", 0x260, 0x26c, 0, 0, 21, 0x260, 4, 0x0, 0x264, 0),
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x270, 0x27c, 0, 0, 21, 0x270, 4, 0x0, 0x274, 0),
+       PLL(CLK_APMIXED_MPLL, "mpll", 0x280, 0x28c, 0, 0, 21, 0x280, 4, 0x0, 0x284, 0),
+       PLL(CLK_APMIXED_VCODECPLL, "vcodecpll", 0x290, 0x29c, 0, 0, 21, 0x290, 4, 0x0, 0x294, 0),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x2a0, 0x2b0, 0, 0, 31, 0x2a0, 4, 0x2a4, 0x2a4, 0),
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x2b4, 0x2c4, 0, 0, 31, 0x2b4, 4, 0x2b8, 0x2b8, 0),
+       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x2d0, 0x2dc, 0, 0, 21, 0x2d0, 4, 0x0, 0x2d4, 0),
+       PLL(CLK_APMIXED_MSDCPLL2, "msdcpll2", 0x2f0, 0x2fc, 0, 0, 21, 0x2f0, 4, 0x0, 0x2f4, 0),
 };
 
 static void __init mtk_apmixedsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
-       struct clk *clk;
+       struct clk_hw *hw;
        int r, i;
 
        base = of_iomap(node, 0);
@@ -1013,24 +1013,21 @@ static void __init mtk_apmixedsys_init(struct device_node *node)
        for (i = 0; i < ARRAY_SIZE(apmixed_usb); i++) {
                const struct mtk_clk_usb *cku = &apmixed_usb[i];
 
-               clk = mtk_clk_register_ref2usb_tx(cku->name, cku->parent,
-                                       base + cku->reg_ofs);
-
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %ld\n", cku->name,
-                                       PTR_ERR(clk));
+               hw = mtk_clk_register_ref2usb_tx(cku->name, cku->parent, base + cku->reg_ofs);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %ld\n", cku->name, PTR_ERR(hw));
                        continue;
                }
 
-               clk_data->clks[cku->id] = clk;
+               clk_data->hws[cku->id] = hw;
        }
 
-       clk = clk_register_divider(NULL, "hdmi_ref", "tvdpll_594m", 0,
-                                  base + 0x40, 16, 3, CLK_DIVIDER_POWER_OF_TWO,
-                                  NULL);
-       clk_data->clks[CLK_APMIXED_HDMI_REF] = clk;
+       hw = clk_hw_register_divider(NULL, "hdmi_ref", "tvdpll_594m", 0,
+                                    base + 0x40, 16, 3, CLK_DIVIDER_POWER_OF_TWO,
+                                    NULL);
+       clk_data->hws[CLK_APMIXED_HDMI_REF] = hw;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -1042,7 +1039,7 @@ CLK_OF_DECLARE(mtk_apmixedsys, "mediatek,mt8173-apmixedsys",
 
 static void __init mtk_imgsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
@@ -1050,7 +1047,7 @@ static void __init mtk_imgsys_init(struct device_node *node)
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
@@ -1060,7 +1057,7 @@ CLK_OF_DECLARE(mtk_imgsys, "mediatek,mt8173-imgsys", mtk_imgsys_init);
 
 static void __init mtk_vdecsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
@@ -1068,7 +1065,7 @@ static void __init mtk_vdecsys_init(struct device_node *node)
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -1077,7 +1074,7 @@ CLK_OF_DECLARE(mtk_vdecsys, "mediatek,mt8173-vdecsys", mtk_vdecsys_init);
 
 static void __init mtk_vencsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK);
@@ -1085,7 +1082,7 @@ static void __init mtk_vencsys_init(struct device_node *node)
        mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -1094,7 +1091,7 @@ CLK_OF_DECLARE(mtk_vencsys, "mediatek,mt8173-vencsys", mtk_vencsys_init);
 
 static void __init mtk_vencltsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_VENCLT_NR_CLK);
@@ -1102,7 +1099,7 @@ static void __init mtk_vencltsys_init(struct device_node *node)
        mtk_clk_register_gates(node, venclt_clks, ARRAY_SIZE(venclt_clks),
                                                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
index c874501..b2d7746 100644 (file)
@@ -69,7 +69,7 @@ static const struct mtk_gate audio_clks[] = {
 
 static int clk_mt8183_audio_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        struct device_node *node = pdev->dev.of_node;
 
@@ -78,7 +78,7 @@ static int clk_mt8183_audio_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
                        clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                return r;
 
index 8643802..fcc598a 100644 (file)
@@ -36,7 +36,7 @@ static const struct mtk_gate cam_clks[] = {
 
 static int clk_mt8183_cam_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK);
@@ -44,7 +44,7 @@ static int clk_mt8183_cam_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_cam[] = {
index 470d676..eb2def2 100644 (file)
@@ -36,7 +36,7 @@ static const struct mtk_gate img_clks[] = {
 
 static int clk_mt8183_img_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
@@ -44,7 +44,7 @@ static int clk_mt8183_img_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_img[] = {
index c5cb76f..b30fc9f 100644 (file)
@@ -29,7 +29,7 @@ static const struct mtk_gate ipu_core0_clks[] = {
 
 static int clk_mt8183_ipu_core0_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IPU_CORE0_NR_CLK);
@@ -37,7 +37,7 @@ static int clk_mt8183_ipu_core0_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, ipu_core0_clks, ARRAY_SIZE(ipu_core0_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_ipu_core0[] = {
index 8fd5fe0..b378957 100644 (file)
@@ -29,7 +29,7 @@ static const struct mtk_gate ipu_core1_clks[] = {
 
 static int clk_mt8183_ipu_core1_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IPU_CORE1_NR_CLK);
@@ -37,7 +37,7 @@ static int clk_mt8183_ipu_core1_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, ipu_core1_clks, ARRAY_SIZE(ipu_core1_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_ipu_core1[] = {
index 3f37d0e..941b43a 100644 (file)
@@ -27,7 +27,7 @@ static const struct mtk_gate ipu_adl_clks[] = {
 
 static int clk_mt8183_ipu_adl_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IPU_ADL_NR_CLK);
@@ -35,7 +35,7 @@ static int clk_mt8183_ipu_adl_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, ipu_adl_clks, ARRAY_SIZE(ipu_adl_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_ipu_adl[] = {
index 7e0eef7..ae82c2e 100644 (file)
@@ -96,7 +96,7 @@ static const struct mtk_gate ipu_conn_clks[] = {
 
 static int clk_mt8183_ipu_conn_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_IPU_CONN_NR_CLK);
@@ -104,7 +104,7 @@ static int clk_mt8183_ipu_conn_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, ipu_conn_clks, ARRAY_SIZE(ipu_conn_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_ipu_conn[] = {
index 37b4162..d774eda 100644 (file)
@@ -28,7 +28,7 @@ static const struct mtk_gate mfg_clks[] = {
 
 static int clk_mt8183_mfg_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        pm_runtime_enable(&pdev->dev);
@@ -38,7 +38,7 @@ static int clk_mt8183_mfg_probe(struct platform_device *pdev)
        mtk_clk_register_gates_with_dev(node, mfg_clks, ARRAY_SIZE(mfg_clks),
                        clk_data, &pdev->dev);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_mfg[] = {
index 9d60e09..11ecc6f 100644 (file)
@@ -86,14 +86,14 @@ static int clk_mt8183_mm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
 
        mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt8183_mm_drv = {
index 6250fd1..0548cde 100644 (file)
@@ -40,7 +40,7 @@ static const struct mtk_gate vdec_clks[] = {
 
 static int clk_mt8183_vdec_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
@@ -48,7 +48,7 @@ static int clk_mt8183_vdec_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_vdec[] = {
index 6678ef0..f86ec60 100644 (file)
@@ -32,7 +32,7 @@ static const struct mtk_gate venc_clks[] = {
 
 static int clk_mt8183_venc_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK);
@@ -40,7 +40,7 @@ static int clk_mt8183_venc_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
                        clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183_venc[] = {
index 6849655..b5c1798 100644 (file)
@@ -1122,40 +1122,40 @@ static const struct mtk_pll_div_table mfgpll_div_table[] = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL_B(CLK_APMIXED_ARMPLL_LL, "armpll_ll", 0x0200, 0x020C, 0x00000001,
+       PLL_B(CLK_APMIXED_ARMPLL_LL, "armpll_ll", 0x0200, 0x020C, 0,
                HAVE_RST_BAR | PLL_AO, BIT(24), 22, 8, 0x0204, 24, 0x0, 0x0, 0,
                0x0204, 0, 0, armpll_div_table),
-       PLL_B(CLK_APMIXED_ARMPLL_L, "armpll_l", 0x0210, 0x021C, 0x00000001,
+       PLL_B(CLK_APMIXED_ARMPLL_L, "armpll_l", 0x0210, 0x021C, 0,
                HAVE_RST_BAR | PLL_AO, BIT(24), 22, 8, 0x0214, 24, 0x0, 0x0, 0,
                0x0214, 0, 0, armpll_div_table),
-       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x0290, 0x029C, 0x00000001,
+       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x0290, 0x029C, 0,
                HAVE_RST_BAR | PLL_AO, BIT(24), 22, 8, 0x0294, 24, 0x0, 0x0, 0,
                0x0294, 0, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0220, 0x022C, 0x00000001,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0220, 0x022C, 0,
                HAVE_RST_BAR, BIT(24), 22, 8, 0x0224, 24, 0x0, 0x0, 0,
                0x0224, 0, 0),
-       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0230, 0x023C, 0x00000001,
+       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0230, 0x023C, 0,
                HAVE_RST_BAR, BIT(24), 22, 8, 0x0234, 24, 0x0, 0x0, 0,
                0x0234, 0, 0),
-       PLL_B(CLK_APMIXED_MFGPLL, "mfgpll", 0x0240, 0x024C, 0x00000001,
+       PLL_B(CLK_APMIXED_MFGPLL, "mfgpll", 0x0240, 0x024C, 0,
                0, 0, 22, 8, 0x0244, 24, 0x0, 0x0, 0, 0x0244, 0, 0,
                mfgpll_div_table),
-       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0250, 0x025C, 0x00000001,
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0250, 0x025C, 0,
                0, 0, 22, 8, 0x0254, 24, 0x0, 0x0, 0, 0x0254, 0, 0),
-       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0260, 0x026C, 0x00000001,
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0260, 0x026C, 0,
                0, 0, 22, 8, 0x0264, 24, 0x0, 0x0, 0, 0x0264, 0, 0),
-       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0270, 0x027C, 0x00000001,
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0270, 0x027C, 0,
                HAVE_RST_BAR, BIT(23), 22, 8, 0x0274, 24, 0x0, 0x0, 0,
                0x0274, 0, 0),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x02A0, 0x02B0, 0x00000001,
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x02A0, 0x02B0, 0,
                0, 0, 32, 8, 0x02A0, 1, 0x02A8, 0x0014, 0, 0x02A4, 0, 0x02A0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x02b4, 0x02c4, 0x00000001,
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x02b4, 0x02c4, 0,
                0, 0, 32, 8, 0x02B4, 1, 0x02BC, 0x0014, 1, 0x02B8, 0, 0x02B4),
 };
 
 static int clk_mt8183_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
@@ -1165,10 +1165,10 @@ static int clk_mt8183_apmixed_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks),
                clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
-static struct clk_onecell_data *top_clk_data;
+static struct clk_hw_onecell_data *top_clk_data;
 
 static void clk_mt8183_top_init_early(struct device_node *node)
 {
@@ -1177,12 +1177,12 @@ static void clk_mt8183_top_init_early(struct device_node *node)
        top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
 
        for (i = 0; i < CLK_TOP_NR_CLK; i++)
-               top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
+               top_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
 
        mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs),
                        top_clk_data);
 
-       of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
 }
 
 CLK_OF_DECLARE_DRIVER(mt8183_topckgen, "mediatek,mt8183-topckgen",
@@ -1217,12 +1217,13 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
                top_clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                     top_clk_data);
 }
 
 static int clk_mt8183_infra_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -1231,7 +1232,7 @@ static int clk_mt8183_infra_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
                clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r) {
                dev_err(&pdev->dev,
                        "%s(): could not register clock provider: %d\n",
@@ -1246,7 +1247,7 @@ static int clk_mt8183_infra_probe(struct platform_device *pdev)
 
 static int clk_mt8183_peri_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
 
        clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
@@ -1254,12 +1255,12 @@ static int clk_mt8183_peri_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
                               clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static int clk_mt8183_mcu_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        void __iomem *base;
 
@@ -1272,7 +1273,7 @@ static int clk_mt8183_mcu_probe(struct platform_device *pdev)
        mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
                        &mt8183_clk_lock, clk_data);
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static const struct of_device_id of_match_clk_mt8183[] = {
diff --git a/drivers/clk/mediatek/clk-mt8186-apmixedsys.c b/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
new file mode 100644 (file)
index 0000000..e692a2a
--- /dev/null
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-mtk.h"
+#include "clk-pll.h"
+
+#define MT8186_PLL_FMAX                (3800UL * MHZ)
+#define MT8186_PLL_FMIN                (1500UL * MHZ)
+#define MT8186_INTEGER_BITS    (8)
+
+#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) {                                                 \
+               .id = _id,                                              \
+               .name = _name,                                          \
+               .reg = _reg,                                            \
+               .pwr_reg = _pwr_reg,                                    \
+               .en_mask = _en_mask,                                    \
+               .flags = _flags,                                        \
+               .rst_bar_mask = _rst_bar_mask,                          \
+               .fmax = MT8186_PLL_FMAX,                                \
+               .fmin = MT8186_PLL_FMIN,                                \
+               .pcwbits = _pcwbits,                                    \
+               .pcwibits = MT8186_INTEGER_BITS,                        \
+               .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 = 0,                                         \
+               .pcw_chg_reg = 0,                                       \
+               .en_reg = 0,                                            \
+               .pll_en_bit = 0,                                        \
+       }
+
+static const struct mtk_pll_data plls[] = {
+       /*
+        * armpll_ll/armpll_bl/ccipll are main clock source of AP MCU,
+        * should not be closed in Linux world.
+        */
+       PLL(CLK_APMIXED_ARMPLL_LL, "armpll_ll", 0x0204, 0x0210, 0,
+           PLL_AO, 0, 22, 0x0208, 24, 0, 0, 0, 0x0208),
+       PLL(CLK_APMIXED_ARMPLL_BL, "armpll_bl", 0x0214, 0x0220, 0,
+           PLL_AO, 0, 22, 0x0218, 24, 0, 0, 0, 0x0218),
+       PLL(CLK_APMIXED_CCIPLL, "ccipll", 0x0224, 0x0230, 0,
+           PLL_AO, 0, 22, 0x0228, 24, 0, 0, 0, 0x0228),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0244, 0x0250, 0xff000000,
+           HAVE_RST_BAR, BIT(23), 22, 0x0248, 24, 0, 0, 0, 0x0248),
+       PLL(CLK_APMIXED_UNIV2PLL, "univ2pll", 0x0324, 0x0330, 0xff000000,
+           HAVE_RST_BAR, BIT(23), 22, 0x0328, 24, 0, 0, 0, 0x0328),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x038C, 0x0398, 0,
+           0, 0, 22, 0x0390, 24, 0, 0, 0, 0x0390),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0254, 0x0260, 0,
+           0, 0, 22, 0x0258, 24, 0, 0, 0, 0x0258),
+       PLL(CLK_APMIXED_NNAPLL, "nnapll", 0x035C, 0x0368, 0,
+           0, 0, 22, 0x0360, 24, 0, 0, 0, 0x0360),
+       PLL(CLK_APMIXED_NNA2PLL, "nna2pll", 0x036C, 0x0378, 0,
+           0, 0, 22, 0x0370, 24, 0, 0, 0, 0x0370),
+       PLL(CLK_APMIXED_ADSPPLL, "adsppll", 0x0304, 0x0310, 0,
+           0, 0, 22, 0x0308, 24, 0, 0, 0, 0x0308),
+       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x0314, 0x0320, 0,
+           0, 0, 22, 0x0318, 24, 0, 0, 0, 0x0318),
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x0264, 0x0270, 0,
+           0, 0, 22, 0x0268, 24, 0, 0, 0, 0x0268),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x0334, 0x0344, 0,
+           0, 0, 32, 0x0338, 24, 0x0040, 0x000C, 0, 0x033C),
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x0348, 0x0358, 0,
+           0, 0, 32, 0x034C, 24, 0x0044, 0x000C, 5, 0x0350),
+};
+
+static const struct of_device_id of_match_clk_mt8186_apmixed[] = {
+       { .compatible = "mediatek,mt8186-apmixedsys", },
+       {}
+};
+
+static int clk_mt8186_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(CLK_APMIXED_NR_CLK);
+       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;
+
+       platform_set_drvdata(pdev, clk_data);
+
+       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 int clk_mt8186_apmixed_remove(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt8186_apmixed_drv = {
+       .probe = clk_mt8186_apmixed_probe,
+       .remove = clk_mt8186_apmixed_remove,
+       .driver = {
+               .name = "clk-mt8186-apmixed",
+               .of_match_table = of_match_clk_mt8186_apmixed,
+       },
+};
+builtin_platform_driver(clk_mt8186_apmixed_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-cam.c b/drivers/clk/mediatek/clk-mt8186-cam.c
new file mode 100644 (file)
index 0000000..9ec345a
--- /dev/null
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs cam_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_CAM(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &cam_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate cam_clks[] = {
+       GATE_CAM(CLK_CAM_LARB13, "cam_larb13", "top_cam", 0),
+       GATE_CAM(CLK_CAM_DFP_VAD, "cam_dfp_vad", "top_cam", 1),
+       GATE_CAM(CLK_CAM_LARB14, "cam_larb14", "top_cam", 2),
+       GATE_CAM(CLK_CAM, "cam", "top_cam", 6),
+       GATE_CAM(CLK_CAMTG, "camtg", "top_cam", 7),
+       GATE_CAM(CLK_CAM_SENINF, "cam_seninf", "top_cam", 8),
+       GATE_CAM(CLK_CAMSV1, "camsv1", "top_cam", 10),
+       GATE_CAM(CLK_CAMSV2, "camsv2", "top_cam", 11),
+       GATE_CAM(CLK_CAMSV3, "camsv3", "top_cam", 12),
+       GATE_CAM(CLK_CAM_CCU0, "cam_ccu0", "top_cam", 13),
+       GATE_CAM(CLK_CAM_CCU1, "cam_ccu1", "top_cam", 14),
+       GATE_CAM(CLK_CAM_MRAW0, "cam_mraw0", "top_cam", 15),
+       GATE_CAM(CLK_CAM_FAKE_ENG, "cam_fake_eng", "top_cam", 17),
+       GATE_CAM(CLK_CAM_CCU_GALS, "cam_ccu_gals", "top_cam", 18),
+       GATE_CAM(CLK_CAM2MM_GALS, "cam2mm_gals", "top_cam", 19),
+};
+
+static const struct mtk_gate cam_rawa_clks[] = {
+       GATE_CAM(CLK_CAM_RAWA_LARBX_RAWA, "cam_rawa_larbx_rawa", "top_cam", 0),
+       GATE_CAM(CLK_CAM_RAWA, "cam_rawa", "top_cam", 1),
+       GATE_CAM(CLK_CAM_RAWA_CAMTG_RAWA, "cam_rawa_camtg_rawa", "top_cam", 2),
+};
+
+static const struct mtk_gate cam_rawb_clks[] = {
+       GATE_CAM(CLK_CAM_RAWB_LARBX_RAWB, "cam_rawb_larbx_rawb", "top_cam", 0),
+       GATE_CAM(CLK_CAM_RAWB, "cam_rawb", "top_cam", 1),
+       GATE_CAM(CLK_CAM_RAWB_CAMTG_RAWB, "cam_rawb_camtg_rawb", "top_cam", 2),
+};
+
+static const struct mtk_clk_desc cam_desc = {
+       .clks = cam_clks,
+       .num_clks = ARRAY_SIZE(cam_clks),
+};
+
+static const struct mtk_clk_desc cam_rawa_desc = {
+       .clks = cam_rawa_clks,
+       .num_clks = ARRAY_SIZE(cam_rawa_clks),
+};
+
+static const struct mtk_clk_desc cam_rawb_desc = {
+       .clks = cam_rawb_clks,
+       .num_clks = ARRAY_SIZE(cam_rawb_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_cam[] = {
+       {
+               .compatible = "mediatek,mt8186-camsys",
+               .data = &cam_desc,
+       }, {
+               .compatible = "mediatek,mt8186-camsys_rawa",
+               .data = &cam_rawa_desc,
+       }, {
+               .compatible = "mediatek,mt8186-camsys_rawb",
+               .data = &cam_rawb_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_cam_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-cam",
+               .of_match_table = of_match_clk_mt8186_cam,
+       },
+};
+builtin_platform_driver(clk_mt8186_cam_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-img.c b/drivers/clk/mediatek/clk-mt8186-img.c
new file mode 100644 (file)
index 0000000..08a6254
--- /dev/null
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs img_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_IMG(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate img1_clks[] = {
+       GATE_IMG(CLK_IMG1_LARB9_IMG1, "img1_larb9_img1", "top_img1", 0),
+       GATE_IMG(CLK_IMG1_LARB10_IMG1, "img1_larb10_img1", "top_img1", 1),
+       GATE_IMG(CLK_IMG1_DIP, "img1_dip", "top_img1", 2),
+       GATE_IMG(CLK_IMG1_GALS_IMG1, "img1_gals_img1", "top_img1", 12),
+};
+
+static const struct mtk_gate img2_clks[] = {
+       GATE_IMG(CLK_IMG2_LARB9_IMG2, "img2_larb9_img2", "top_img1", 0),
+       GATE_IMG(CLK_IMG2_LARB10_IMG2, "img2_larb10_img2", "top_img1", 1),
+       GATE_IMG(CLK_IMG2_MFB, "img2_mfb", "top_img1", 6),
+       GATE_IMG(CLK_IMG2_WPE, "img2_wpe", "top_img1", 7),
+       GATE_IMG(CLK_IMG2_MSS, "img2_mss", "top_img1", 8),
+       GATE_IMG(CLK_IMG2_GALS_IMG2, "img2_gals_img2", "top_img1", 12),
+};
+
+static const struct mtk_clk_desc img1_desc = {
+       .clks = img1_clks,
+       .num_clks = ARRAY_SIZE(img1_clks),
+};
+
+static const struct mtk_clk_desc img2_desc = {
+       .clks = img2_clks,
+       .num_clks = ARRAY_SIZE(img2_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_img[] = {
+       {
+               .compatible = "mediatek,mt8186-imgsys1",
+               .data = &img1_desc,
+       }, {
+               .compatible = "mediatek,mt8186-imgsys2",
+               .data = &img2_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_img_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-img",
+               .of_match_table = of_match_clk_mt8186_img,
+       },
+};
+builtin_platform_driver(clk_mt8186_img_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c
new file mode 100644 (file)
index 0000000..47f2e48
--- /dev/null
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs imp_iic_wrap_cg_regs = {
+       .set_ofs = 0xe08,
+       .clr_ofs = 0xe04,
+       .sta_ofs = 0xe00,
+};
+
+#define GATE_IMP_IIC_WRAP(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &imp_iic_wrap_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate imp_iic_wrap_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C0,
+               "imp_iic_wrap_ap_clock_i2c0", "infra_ao_i2c_ap", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C1,
+               "imp_iic_wrap_ap_clock_i2c1", "infra_ao_i2c_ap", 1),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C2,
+               "imp_iic_wrap_ap_clock_i2c2", "infra_ao_i2c_ap", 2),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C3,
+               "imp_iic_wrap_ap_clock_i2c3", "infra_ao_i2c_ap", 3),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C4,
+               "imp_iic_wrap_ap_clock_i2c4", "infra_ao_i2c_ap", 4),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C5,
+               "imp_iic_wrap_ap_clock_i2c5", "infra_ao_i2c_ap", 5),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C6,
+               "imp_iic_wrap_ap_clock_i2c6", "infra_ao_i2c_ap", 6),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C7,
+               "imp_iic_wrap_ap_clock_i2c7", "infra_ao_i2c_ap", 7),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C8,
+               "imp_iic_wrap_ap_clock_i2c8", "infra_ao_i2c_ap", 8),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_AP_CLOCK_I2C9,
+               "imp_iic_wrap_ap_clock_i2c9", "infra_ao_i2c_ap", 9),
+};
+
+static const struct mtk_clk_desc imp_iic_wrap_desc = {
+       .clks = imp_iic_wrap_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_imp_iic_wrap[] = {
+       {
+               .compatible = "mediatek,mt8186-imp_iic_wrap",
+               .data = &imp_iic_wrap_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_imp_iic_wrap_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-imp_iic_wrap",
+               .of_match_table = of_match_clk_mt8186_imp_iic_wrap,
+       },
+};
+builtin_platform_driver(clk_mt8186_imp_iic_wrap_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-infra_ao.c b/drivers/clk/mediatek/clk-mt8186-infra_ao.c
new file mode 100644 (file)
index 0000000..2a7adc2
--- /dev/null
@@ -0,0 +1,216 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs infra_ao0_cg_regs = {
+       .set_ofs = 0x80,
+       .clr_ofs = 0x84,
+       .sta_ofs = 0x90,
+};
+
+static const struct mtk_gate_regs infra_ao1_cg_regs = {
+       .set_ofs = 0x88,
+       .clr_ofs = 0x8c,
+       .sta_ofs = 0x94,
+};
+
+static const struct mtk_gate_regs infra_ao2_cg_regs = {
+       .set_ofs = 0xa4,
+       .clr_ofs = 0xa8,
+       .sta_ofs = 0xac,
+};
+
+static const struct mtk_gate_regs infra_ao3_cg_regs = {
+       .set_ofs = 0xc0,
+       .clr_ofs = 0xc4,
+       .sta_ofs = 0xc8,
+};
+
+#define GATE_INFRA_AO0_FLAGS(_id, _name, _parent, _shift, _flag)       \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao0_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO0(_id, _name, _parent, _shift)                    \
+       GATE_INFRA_AO0_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA_AO1_FLAGS(_id, _name, _parent, _shift, _flag)       \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao1_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO1(_id, _name, _parent, _shift)                    \
+       GATE_INFRA_AO1_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA_AO2_FLAGS(_id, _name, _parent, _shift, _flag)       \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao2_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO2(_id, _name, _parent, _shift)                    \
+       GATE_INFRA_AO2_FLAGS(_id, _name, _parent, _shift, 0)
+
+ #define GATE_INFRA_AO3_FLAGS(_id, _name, _parent, _shift, _flag)        \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao3_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO3(_id, _name, _parent, _shift)                    \
+       GATE_INFRA_AO3_FLAGS(_id, _name, _parent, _shift, 0)
+
+static const struct mtk_gate infra_ao_clks[] = {
+       /* INFRA_AO0 */
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_TMR, "infra_ao_pmic_tmr", "top_pwrap_ulposc", 0),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_AP, "infra_ao_pmic_ap", "top_pwrap_ulposc", 1),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_MD, "infra_ao_pmic_md", "top_pwrap_ulposc", 2),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_CONN, "infra_ao_pmic_conn", "top_pwrap_ulposc", 3),
+       /* infra_ao_scp_core are main clock in always-on co-processor. */
+       GATE_INFRA_AO0_FLAGS(CLK_INFRA_AO_SCP_CORE,
+                            "infra_ao_scp_core", "top_scp", 4, CLK_IS_CRITICAL),
+       /* infra_ao_sej is main clock for secure engine with JTAG support */
+       GATE_INFRA_AO0_FLAGS(CLK_INFRA_AO_SEJ,
+                            "infra_ao_sej", "top_axi", 5, CLK_IS_CRITICAL),
+       GATE_INFRA_AO0(CLK_INFRA_AO_APXGPT, "infra_ao_apxgpt", "top_axi", 6),
+       GATE_INFRA_AO0(CLK_INFRA_AO_ICUSB, "infra_ao_icusb", "top_axi", 8),
+       GATE_INFRA_AO0(CLK_INFRA_AO_GCE, "infra_ao_gce", "top_axi", 9),
+       GATE_INFRA_AO0(CLK_INFRA_AO_THERM, "infra_ao_therm", "top_axi", 10),
+       GATE_INFRA_AO0(CLK_INFRA_AO_I2C_AP, "infra_ao_i2c_ap", "top_i2c", 11),
+       GATE_INFRA_AO0(CLK_INFRA_AO_I2C_CCU, "infra_ao_i2c_ccu", "top_i2c", 12),
+       GATE_INFRA_AO0(CLK_INFRA_AO_I2C_SSPM, "infra_ao_i2c_sspm", "top_i2c", 13),
+       GATE_INFRA_AO0(CLK_INFRA_AO_I2C_RSV, "infra_ao_i2c_rsv", "top_i2c", 14),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM_HCLK, "infra_ao_pwm_hclk", "top_axi", 15),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM1, "infra_ao_pwm1", "top_pwm", 16),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM2, "infra_ao_pwm2", "top_pwm", 17),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM3, "infra_ao_pwm3", "top_pwm", 18),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM4, "infra_ao_pwm4", "top_pwm", 19),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM5, "infra_ao_pwm5", "top_pwm", 20),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM, "infra_ao_pwm", "top_pwm", 21),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART0, "infra_ao_uart0", "top_uart", 22),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART1, "infra_ao_uart1", "top_uart", 23),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART2, "infra_ao_uart2", "top_uart", 24),
+       GATE_INFRA_AO0(CLK_INFRA_AO_GCE_26M, "infra_ao_gce_26m", "clk26m", 27),
+       GATE_INFRA_AO0(CLK_INFRA_AO_CQ_DMA_FPC, "infra_ao_dma", "top_axi", 28),
+       GATE_INFRA_AO0(CLK_INFRA_AO_BTIF, "infra_ao_btif", "top_axi", 31),
+       /* INFRA_AO1 */
+       GATE_INFRA_AO1(CLK_INFRA_AO_SPI0, "infra_ao_spi0", "top_spi", 1),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDC0, "infra_ao_msdc0", "top_msdc5hclk", 2),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDCFDE, "infra_ao_msdcfde", "top_aes_msdcfde", 3),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDC1, "infra_ao_msdc1", "top_axi", 4),
+       /* infra_ao_dvfsrc is for internal DVFS usage, should not be handled by Linux */
+       GATE_INFRA_AO1_FLAGS(CLK_INFRA_AO_DVFSRC,
+                            "infra_ao_dvfsrc", "top_dvfsrc", 7, CLK_IS_CRITICAL),
+       GATE_INFRA_AO1(CLK_INFRA_AO_GCPU, "infra_ao_gcpu", "top_axi", 8),
+       GATE_INFRA_AO1(CLK_INFRA_AO_TRNG, "infra_ao_trng", "top_axi", 9),
+       GATE_INFRA_AO1(CLK_INFRA_AO_AUXADC, "infra_ao_auxadc", "clk26m", 10),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CPUM, "infra_ao_cpum", "top_axi", 11),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CCIF1_AP, "infra_ao_ccif1_ap", "top_axi", 12),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CCIF1_MD, "infra_ao_ccif1_md", "top_axi", 13),
+       GATE_INFRA_AO1(CLK_INFRA_AO_AUXADC_MD, "infra_ao_auxadc_md", "clk26m", 14),
+       GATE_INFRA_AO1(CLK_INFRA_AO_AP_DMA, "infra_ao_ap_dma", "top_axi", 18),
+       GATE_INFRA_AO1(CLK_INFRA_AO_XIU, "infra_ao_xiu", "top_axi", 19),
+       /* infra_ao_device_apc is for device access permission control module */
+       GATE_INFRA_AO1_FLAGS(CLK_INFRA_AO_DEVICE_APC,
+                            "infra_ao_dapc", "top_axi", 20, CLK_IS_CRITICAL),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CCIF_AP, "infra_ao_ccif_ap", "top_axi", 23),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DEBUGTOP, "infra_ao_debugtop", "top_axi", 24),
+       GATE_INFRA_AO1(CLK_INFRA_AO_AUDIO, "infra_ao_audio", "top_axi", 25),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CCIF_MD, "infra_ao_ccif_md", "top_axi", 26),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DXCC_SEC_CORE, "infra_ao_secore", "top_dxcc", 27),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DXCC_AO, "infra_ao_dxcc_ao", "top_dxcc", 28),
+       GATE_INFRA_AO1(CLK_INFRA_AO_IMP_IIC, "infra_ao_imp_iic", "top_axi", 29),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DRAMC_F26M, "infra_ao_dramc26", "clk26m", 31),
+       /* INFRA_AO2 */
+       GATE_INFRA_AO2(CLK_INFRA_AO_RG_PWM_FBCLK6, "infra_ao_pwm_fbclk6", "clk26m", 0),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_HCLK, "infra_ao_ssusb_hclk", "top_axi", 1),
+       GATE_INFRA_AO2(CLK_INFRA_AO_DISP_PWM, "infra_ao_disp_pwm", "top_disp_pwm", 2),
+       GATE_INFRA_AO2(CLK_INFRA_AO_CLDMA_BCLK, "infra_ao_cldmabclk", "top_axi", 3),
+       GATE_INFRA_AO2(CLK_INFRA_AO_AUDIO_26M_BCLK, "infra_ao_audio26m", "clk26m", 4),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_P1_HCLK, "infra_ao_ssusb_p1_hclk", "top_axi", 5),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI1, "infra_ao_spi1", "top_spi", 6),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C4, "infra_ao_i2c4", "top_i2c", 7),
+       GATE_INFRA_AO2(CLK_INFRA_AO_MODEM_TEMP_SHARE, "infra_ao_mdtemp", "clk26m", 8),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI2, "infra_ao_spi2", "top_spi", 9),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI3, "infra_ao_spi3", "top_spi", 10),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_REF, "infra_ao_ssusb_ref", "clk26m", 11),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_XHCI, "infra_ao_ssusb_xhci", "top_ssusb_xhci", 12),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_P1_REF, "infra_ao_ssusb_p1_ref", "clk26m", 13),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_P1_XHCI,
+                      "infra_ao_ssusb_p1_xhci", "top_ssusb_xhci_1p", 14),
+       /* infra_ao_sspm is main clock in co-processor, should not be closed in Linux. */
+       GATE_INFRA_AO2_FLAGS(CLK_INFRA_AO_SSPM, "infra_ao_sspm", "top_sspm", 15, CLK_IS_CRITICAL),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_TOP_P1_SYS,
+                      "infra_ao_ssusb_p1_sys", "top_ssusb_1p", 16),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C5, "infra_ao_i2c5", "top_i2c", 18),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C5_ARBITER, "infra_ao_i2c5a", "top_i2c", 19),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C5_IMM, "infra_ao_i2c5_imm", "top_i2c", 20),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C1_ARBITER, "infra_ao_i2c1a", "top_i2c", 21),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C1_IMM, "infra_ao_i2c1_imm", "top_i2c", 22),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C2_ARBITER, "infra_ao_i2c2a", "top_i2c", 23),
+       GATE_INFRA_AO2(CLK_INFRA_AO_I2C2_IMM, "infra_ao_i2c2_imm", "top_i2c", 24),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI4, "infra_ao_spi4", "top_spi", 25),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI5, "infra_ao_spi5", "top_spi", 26),
+       GATE_INFRA_AO2(CLK_INFRA_AO_CQ_DMA, "infra_ao_cq_dma", "top_axi", 27),
+       GATE_INFRA_AO2(CLK_INFRA_AO_BIST2FPC, "infra_ao_bist2fpc", "f_bist2fpc_ck", 28),
+       /* INFRA_AO3 */
+       GATE_INFRA_AO3(CLK_INFRA_AO_MSDC0_SELF, "infra_ao_msdc0sf", "top_msdc50_0", 0),
+       GATE_INFRA_AO3(CLK_INFRA_AO_SPINOR, "infra_ao_spinor", "top_spinor", 1),
+       /*
+        * infra_ao_sspm_26m/infra_ao_sspm_32k are main clocks in co-processor,
+        * should not be closed in Linux.
+        */
+       GATE_INFRA_AO3_FLAGS(CLK_INFRA_AO_SSPM_26M_SELF, "infra_ao_sspm_26m", "clk26m", 3,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO3_FLAGS(CLK_INFRA_AO_SSPM_32K_SELF, "infra_ao_sspm_32k", "clk32k", 4,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO3(CLK_INFRA_AO_I2C6, "infra_ao_i2c6", "top_i2c", 6),
+       GATE_INFRA_AO3(CLK_INFRA_AO_AP_MSDC0, "infra_ao_ap_msdc0", "top_axi", 7),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MD_MSDC0, "infra_ao_md_msdc0", "top_axi", 8),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MSDC0_SRC, "infra_ao_msdc0_clk", "top_msdc50_0", 9),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MSDC1_SRC, "infra_ao_msdc1_clk", "top_msdc30_1", 10),
+       /* infra_ao_sej_f13m is main clock for secure engine with JTAG support */
+       GATE_INFRA_AO3_FLAGS(CLK_INFRA_AO_SEJ_F13M,
+                            "infra_ao_sej_f13m", "clk26m", 15, CLK_IS_CRITICAL),
+       /* infra_ao_aes_top0_bclk is for secure encryption */
+       GATE_INFRA_AO3_FLAGS(CLK_INFRA_AO_AES_TOP0_BCLK,
+                            "infra_ao_aes_top0_bclk", "top_axi", 16, CLK_IS_CRITICAL),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MCU_PM_BCLK, "infra_ao_mcu_pm_bclk", "top_axi", 17),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CCIF2_AP, "infra_ao_ccif2_ap", "top_axi", 18),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CCIF2_MD, "infra_ao_ccif2_md", "top_axi", 19),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CCIF3_AP, "infra_ao_ccif3_ap", "top_axi", 20),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CCIF3_MD, "infra_ao_ccif3_md", "top_axi", 21),
+       GATE_INFRA_AO3(CLK_INFRA_AO_FADSP_26M, "infra_ao_fadsp_26m", "clk26m", 22),
+       GATE_INFRA_AO3(CLK_INFRA_AO_FADSP_32K, "infra_ao_fadsp_32k", "clk32k", 23),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CCIF4_AP, "infra_ao_ccif4_ap", "top_axi", 24),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CCIF4_MD, "infra_ao_ccif4_md", "top_axi", 25),
+       GATE_INFRA_AO3(CLK_INFRA_AO_FADSP, "infra_ao_fadsp", "top_audiodsp", 27),
+       GATE_INFRA_AO3(CLK_INFRA_AO_FLASHIF_133M, "infra_ao_flashif_133m", "top_axi", 28),
+       GATE_INFRA_AO3(CLK_INFRA_AO_FLASHIF_66M, "infra_ao_flashif_66m", "top_axi", 29),
+};
+
+static const struct mtk_clk_desc infra_ao_desc = {
+       .clks = infra_ao_clks,
+       .num_clks = ARRAY_SIZE(infra_ao_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_infra_ao[] = {
+       {
+               .compatible = "mediatek,mt8186-infracfg_ao",
+               .data = &infra_ao_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_infra_ao_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-infra-ao",
+               .of_match_table = of_match_clk_mt8186_infra_ao,
+       },
+};
+builtin_platform_driver(clk_mt8186_infra_ao_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-ipe.c b/drivers/clk/mediatek/clk-mt8186-ipe.c
new file mode 100644 (file)
index 0000000..8fca148
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs ipe_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_IPE(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &ipe_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate ipe_clks[] = {
+       GATE_IPE(CLK_IPE_LARB19, "ipe_larb19", "top_ipe", 0),
+       GATE_IPE(CLK_IPE_LARB20, "ipe_larb20", "top_ipe", 1),
+       GATE_IPE(CLK_IPE_SMI_SUBCOM, "ipe_smi_subcom", "top_ipe", 2),
+       GATE_IPE(CLK_IPE_FD, "ipe_fd", "top_ipe", 3),
+       GATE_IPE(CLK_IPE_FE, "ipe_fe", "top_ipe", 4),
+       GATE_IPE(CLK_IPE_RSC, "ipe_rsc", "top_ipe", 5),
+       GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "top_ipe", 6),
+       GATE_IPE(CLK_IPE_GALS_IPE, "ipe_gals_ipe", "top_img1", 8),
+};
+
+static const struct mtk_clk_desc ipe_desc = {
+       .clks = ipe_clks,
+       .num_clks = ARRAY_SIZE(ipe_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_ipe[] = {
+       {
+               .compatible = "mediatek,mt8186-ipesys",
+               .data = &ipe_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_ipe_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-ipe",
+               .of_match_table = of_match_clk_mt8186_ipe,
+       },
+};
+builtin_platform_driver(clk_mt8186_ipe_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-mcu.c b/drivers/clk/mediatek/clk-mt8186-mcu.c
new file mode 100644 (file)
index 0000000..dfc305c
--- /dev/null
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-mtk.h"
+
+static const char * const mcu_armpll_ll_parents[] = {
+       "clk26m",
+       "armpll_ll",
+       "mainpll",
+       "univpll_d2"
+};
+
+static const char * const mcu_armpll_bl_parents[] = {
+       "clk26m",
+       "armpll_bl",
+       "mainpll",
+       "univpll_d2"
+};
+
+static const char * const mcu_armpll_bus_parents[] = {
+       "clk26m",
+       "ccipll",
+       "mainpll",
+       "univpll_d2"
+};
+
+/*
+ * We only configure the CPU muxes when adjust CPU frequency in MediaTek CPUFreq Driver.
+ * Other fields like divider always keep the same value. (set once in bootloader)
+ */
+static struct mtk_composite mcu_muxes[] = {
+       /* CPU_PLLDIV_CFG0 */
+       MUX(CLK_MCU_ARMPLL_LL_SEL, "mcu_armpll_ll_sel", mcu_armpll_ll_parents, 0x2A0, 9, 2),
+       /* CPU_PLLDIV_CFG1 */
+       MUX(CLK_MCU_ARMPLL_BL_SEL, "mcu_armpll_bl_sel", mcu_armpll_bl_parents, 0x2A4, 9, 2),
+       /* BUS_PLLDIV_CFG */
+       MUX(CLK_MCU_ARMPLL_BUS_SEL, "mcu_armpll_bus_sel", mcu_armpll_bus_parents, 0x2E0, 9, 2),
+};
+
+static const struct of_device_id of_match_clk_mt8186_mcu[] = {
+       { .compatible = "mediatek,mt8186-mcusys", },
+       {}
+};
+
+static int clk_mt8186_mcu_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+       void __iomem *base;
+
+       clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base)) {
+               r = PTR_ERR(base);
+               goto free_mcu_data;
+       }
+
+       r = mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
+                                       NULL, clk_data);
+       if (r)
+               goto free_mcu_data;
+
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+               goto unregister_composite_muxes;
+
+       platform_set_drvdata(pdev, clk_data);
+
+       return r;
+
+unregister_composite_muxes:
+       mtk_clk_unregister_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), clk_data);
+free_mcu_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static int clk_mt8186_mcu_remove(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct device_node *node = pdev->dev.of_node;
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt8186_mcu_drv = {
+       .probe = clk_mt8186_mcu_probe,
+       .remove = clk_mt8186_mcu_remove,
+       .driver = {
+               .name = "clk-mt8186-mcu",
+               .of_match_table = of_match_clk_mt8186_mcu,
+       },
+};
+builtin_platform_driver(clk_mt8186_mcu_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-mdp.c b/drivers/clk/mediatek/clk-mt8186-mdp.c
new file mode 100644 (file)
index 0000000..0517408
--- /dev/null
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs mdp0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs mdp2_cg_regs = {
+       .set_ofs = 0x124,
+       .clr_ofs = 0x128,
+       .sta_ofs = 0x120,
+};
+
+#define GATE_MDP0(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &mdp0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_MDP2(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &mdp2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate mdp_clks[] = {
+       /* MDP0 */
+       GATE_MDP0(CLK_MDP_RDMA0, "mdp_rdma0", "top_mdp", 0),
+       GATE_MDP0(CLK_MDP_TDSHP0, "mdp_tdshp0", "top_mdp", 1),
+       GATE_MDP0(CLK_MDP_IMG_DL_ASYNC0, "mdp_img_dl_async0", "top_mdp", 2),
+       GATE_MDP0(CLK_MDP_IMG_DL_ASYNC1, "mdp_img_dl_async1", "top_mdp", 3),
+       GATE_MDP0(CLK_MDP_DISP_RDMA, "mdp_disp_rdma", "top_mdp", 4),
+       GATE_MDP0(CLK_MDP_HMS, "mdp_hms", "top_mdp", 5),
+       GATE_MDP0(CLK_MDP_SMI0, "mdp_smi0", "top_mdp", 6),
+       GATE_MDP0(CLK_MDP_APB_BUS, "mdp_apb_bus", "top_mdp", 7),
+       GATE_MDP0(CLK_MDP_WROT0, "mdp_wrot0", "top_mdp", 8),
+       GATE_MDP0(CLK_MDP_RSZ0, "mdp_rsz0", "top_mdp", 9),
+       GATE_MDP0(CLK_MDP_HDR0, "mdp_hdr0", "top_mdp", 10),
+       GATE_MDP0(CLK_MDP_MUTEX0, "mdp_mutex0", "top_mdp", 11),
+       GATE_MDP0(CLK_MDP_WROT1, "mdp_wrot1", "top_mdp", 12),
+       GATE_MDP0(CLK_MDP_RSZ1, "mdp_rsz1", "top_mdp", 13),
+       GATE_MDP0(CLK_MDP_FAKE_ENG0, "mdp_fake_eng0", "top_mdp", 14),
+       GATE_MDP0(CLK_MDP_AAL0, "mdp_aal0", "top_mdp", 15),
+       GATE_MDP0(CLK_MDP_DISP_WDMA, "mdp_disp_wdma", "top_mdp", 16),
+       GATE_MDP0(CLK_MDP_COLOR, "mdp_color", "top_mdp", 17),
+       GATE_MDP0(CLK_MDP_IMG_DL_ASYNC2, "mdp_img_dl_async2", "top_mdp", 18),
+       /* MDP2 */
+       GATE_MDP2(CLK_MDP_IMG_DL_RELAY0_ASYNC0, "mdp_img_dl_rel0_as0", "top_mdp", 0),
+       GATE_MDP2(CLK_MDP_IMG_DL_RELAY1_ASYNC1, "mdp_img_dl_rel1_as1", "top_mdp", 8),
+       GATE_MDP2(CLK_MDP_IMG_DL_RELAY2_ASYNC2, "mdp_img_dl_rel2_as2", "top_mdp", 24),
+};
+
+static const struct mtk_clk_desc mdp_desc = {
+       .clks = mdp_clks,
+       .num_clks = ARRAY_SIZE(mdp_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_mdp[] = {
+       {
+               .compatible = "mediatek,mt8186-mdpsys",
+               .data = &mdp_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_mdp_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-mdp",
+               .of_match_table = of_match_clk_mt8186_mdp,
+       },
+};
+builtin_platform_driver(clk_mt8186_mdp_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-mfg.c b/drivers/clk/mediatek/clk-mt8186-mfg.c
new file mode 100644 (file)
index 0000000..f1f9221
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs mfg_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_MFG(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate mfg_clks[] = {
+       GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "top_mfg", 0),
+};
+
+static const struct mtk_clk_desc mfg_desc = {
+       .clks = mfg_clks,
+       .num_clks = ARRAY_SIZE(mfg_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_mfg[] = {
+       {
+               .compatible = "mediatek,mt8186-mfgsys",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_mfg_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-mfg",
+               .of_match_table = of_match_clk_mt8186_mfg,
+       },
+};
+builtin_platform_driver(clk_mt8186_mfg_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-mm.c b/drivers/clk/mediatek/clk-mt8186-mm.c
new file mode 100644 (file)
index 0000000..1d33be4
--- /dev/null
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs mm0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs mm1_cg_regs = {
+       .set_ofs = 0x1a4,
+       .clr_ofs = 0x1a8,
+       .sta_ofs = 0x1a0,
+};
+
+#define GATE_MM0(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &mm0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_MM1(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &mm1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate mm_clks[] = {
+       /* MM0 */
+       GATE_MM0(CLK_MM_DISP_MUTEX0, "mm_disp_mutex0", "top_disp", 0),
+       GATE_MM0(CLK_MM_APB_MM_BUS, "mm_apb_mm_bus", "top_disp", 1),
+       GATE_MM0(CLK_MM_DISP_OVL0, "mm_disp_ovl0", "top_disp", 2),
+       GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "top_disp", 3),
+       GATE_MM0(CLK_MM_DISP_OVL0_2L, "mm_disp_ovl0_2l", "top_disp", 4),
+       GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "top_disp", 5),
+       GATE_MM0(CLK_MM_DISP_RSZ0, "mm_disp_rsz0", "top_disp", 7),
+       GATE_MM0(CLK_MM_DISP_AAL0, "mm_disp_aal0", "top_disp", 8),
+       GATE_MM0(CLK_MM_DISP_CCORR0, "mm_disp_ccorr0", "top_disp", 9),
+       GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "top_disp", 10),
+       GATE_MM0(CLK_MM_SMI_INFRA, "mm_smi_infra", "top_disp", 11),
+       GATE_MM0(CLK_MM_DISP_DSC_WRAP0, "mm_disp_dsc_wrap0", "top_disp", 12),
+       GATE_MM0(CLK_MM_DISP_GAMMA0, "mm_disp_gamma0", "top_disp", 13),
+       GATE_MM0(CLK_MM_DISP_POSTMASK0, "mm_disp_postmask0", "top_disp", 14),
+       GATE_MM0(CLK_MM_DISP_DITHER0, "mm_disp_dither0", "top_disp", 16),
+       GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "top_disp", 17),
+       GATE_MM0(CLK_MM_DSI0, "mm_dsi0", "top_disp", 19),
+       GATE_MM0(CLK_MM_DISP_FAKE_ENG0, "mm_disp_fake_eng0", "top_disp", 20),
+       GATE_MM0(CLK_MM_DISP_FAKE_ENG1, "mm_disp_fake_eng1", "top_disp", 21),
+       GATE_MM0(CLK_MM_SMI_GALS, "mm_smi_gals", "top_disp", 22),
+       GATE_MM0(CLK_MM_SMI_IOMMU, "mm_smi_iommu", "top_disp", 24),
+       GATE_MM0(CLK_MM_DISP_RDMA1, "mm_disp_rdma1", "top_disp", 25),
+       GATE_MM0(CLK_MM_DISP_DPI, "mm_disp_dpi", "top_disp", 26),
+       /* MM1 */
+       GATE_MM1(CLK_MM_DSI0_DSI_CK_DOMAIN, "mm_dsi0_dsi_domain", "top_disp", 0),
+       GATE_MM1(CLK_MM_DISP_26M, "mm_disp_26m_ck", "top_disp", 10),
+};
+
+static int clk_mt8186_mm_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_hw_onecell_data *clk_data;
+       int r;
+
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
+       if (r)
+               goto free_mm_data;
+
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+               goto unregister_gates;
+
+       platform_set_drvdata(pdev, clk_data);
+
+       return r;
+
+unregister_gates:
+       mtk_clk_unregister_gates(mm_clks, ARRAY_SIZE(mm_clks), clk_data);
+free_mm_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static int clk_mt8186_mm_remove(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_gates(mm_clks, ARRAY_SIZE(mm_clks), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt8186_mm_drv = {
+       .probe = clk_mt8186_mm_probe,
+       .remove = clk_mt8186_mm_remove,
+       .driver = {
+               .name = "clk-mt8186-mm",
+       },
+};
+builtin_platform_driver(clk_mt8186_mm_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-topckgen.c b/drivers/clk/mediatek/clk-mt8186-topckgen.c
new file mode 100644 (file)
index 0000000..d7f2c46
--- /dev/null
@@ -0,0 +1,780 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-mtk.h"
+#include "clk-mux.h"
+
+static DEFINE_SPINLOCK(mt8186_clk_lock);
+
+static const struct mtk_fixed_clk top_fixed_clks[] = {
+       FIXED_CLK(CLK_TOP_ULPOSC1, "ulposc1", NULL, 250000000),
+       FIXED_CLK(CLK_TOP_466M_FMEM, "hd_466m_fmem_ck", NULL, 466000000),
+       FIXED_CLK(CLK_TOP_MPLL, "mpll", NULL, 208000000),
+};
+
+static const struct mtk_fixed_factor top_divs[] = {
+       FACTOR(CLK_TOP_MAINPLL_D2, "mainpll_d2", "mainpll", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D2_D2, "mainpll_d2_d2", "mainpll_d2", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D2_D4, "mainpll_d2_d4", "mainpll_d2", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D2_D16, "mainpll_d2_d16", "mainpll_d2", 1, 16),
+       FACTOR(CLK_TOP_MAINPLL_D3, "mainpll_d3", "mainpll", 1, 3),
+       FACTOR(CLK_TOP_MAINPLL_D3_D2, "mainpll_d3_d2", "mainpll_d3", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D3_D4, "mainpll_d3_d4", "mainpll_d3", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D5, "mainpll_d5", "mainpll", 1, 5),
+       FACTOR(CLK_TOP_MAINPLL_D5_D2, "mainpll_d5_d2", "mainpll_d5", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D5_D4, "mainpll_d5_d4", "mainpll_d5", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D7, "mainpll_d7", "mainpll", 1, 7),
+       FACTOR(CLK_TOP_MAINPLL_D7_D2, "mainpll_d7_d2", "mainpll_d7", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D7_D4, "mainpll_d7_d4", "mainpll_d7", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL, "univpll", "univ2pll", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univpll", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D2_D2, "univpll_d2_d2", "univpll_d2", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D2_D4, "univpll_d2_d4", "univpll_d2", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univpll", 1, 3),
+       FACTOR(CLK_TOP_UNIVPLL_D3_D2, "univpll_d3_d2", "univpll_d3", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D3_D4, "univpll_d3_d4", "univpll_d3", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D3_D8, "univpll_d3_d8", "univpll_d3", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D3_D32, "univpll_d3_d32", "univpll_d3", 1, 32),
+       FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, 5),
+       FACTOR(CLK_TOP_UNIVPLL_D5_D2, "univpll_d5_d2", "univpll_d5", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D5_D4, "univpll_d5_d4", "univpll_d5", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univpll", 1, 7),
+       FACTOR(CLK_TOP_UNIVPLL_192M, "univpll_192m", "univ2pll", 1, 13),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D4, "univpll_192m_d4", "univpll_192m", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D8, "univpll_192m_d8", "univpll_192m", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D16, "univpll_192m_d16", "univpll_192m", 1, 16),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D32, "univpll_192m_d32", "univpll_192m", 1, 32),
+       FACTOR(CLK_TOP_APLL1_D2, "apll1_d2", "apll1", 1, 2),
+       FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1", 1, 4),
+       FACTOR(CLK_TOP_APLL1_D8, "apll1_d8", "apll1", 1, 8),
+       FACTOR(CLK_TOP_APLL2_D2, "apll2_d2", "apll2", 1, 2),
+       FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
+       FACTOR(CLK_TOP_APLL2_D8, "apll2_d8", "apll2", 1, 8),
+       FACTOR(CLK_TOP_MMPLL_D2, "mmpll_d2", "mmpll", 1, 2),
+       FACTOR(CLK_TOP_TVDPLL_D2, "tvdpll_d2", "tvdpll", 1, 2),
+       FACTOR(CLK_TOP_TVDPLL_D4, "tvdpll_d4", "tvdpll", 1, 4),
+       FACTOR(CLK_TOP_TVDPLL_D8, "tvdpll_d8", "tvdpll", 1, 8),
+       FACTOR(CLK_TOP_TVDPLL_D16, "tvdpll_d16", "tvdpll", 1, 16),
+       FACTOR(CLK_TOP_TVDPLL_D32, "tvdpll_d32", "tvdpll", 1, 32),
+       FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2),
+       FACTOR(CLK_TOP_ULPOSC1_D2, "ulposc1_d2", "ulposc1", 1, 2),
+       FACTOR(CLK_TOP_ULPOSC1_D4, "ulposc1_d4", "ulposc1", 1, 4),
+       FACTOR(CLK_TOP_ULPOSC1_D8, "ulposc1_d8", "ulposc1", 1, 8),
+       FACTOR(CLK_TOP_ULPOSC1_D10, "ulposc1_d10", "ulposc1", 1, 10),
+       FACTOR(CLK_TOP_ULPOSC1_D16, "ulposc1_d16", "ulposc1", 1, 16),
+       FACTOR(CLK_TOP_ULPOSC1_D32, "ulposc1_d32", "ulposc1", 1, 32),
+       FACTOR(CLK_TOP_ADSPPLL_D2, "adsppll_d2", "adsppll", 1, 2),
+       FACTOR(CLK_TOP_ADSPPLL_D4, "adsppll_d4", "adsppll", 1, 4),
+       FACTOR(CLK_TOP_ADSPPLL_D8, "adsppll_d8", "adsppll", 1, 8),
+       FACTOR(CLK_TOP_NNAPLL_D2, "nnapll_d2", "nnapll", 1, 2),
+       FACTOR(CLK_TOP_NNAPLL_D4, "nnapll_d4", "nnapll", 1, 4),
+       FACTOR(CLK_TOP_NNAPLL_D8, "nnapll_d8", "nnapll", 1, 8),
+       FACTOR(CLK_TOP_NNA2PLL_D2, "nna2pll_d2", "nna2pll", 1, 2),
+       FACTOR(CLK_TOP_NNA2PLL_D4, "nna2pll_d4", "nna2pll", 1, 4),
+       FACTOR(CLK_TOP_NNA2PLL_D8, "nna2pll_d8", "nna2pll", 1, 8),
+       FACTOR(CLK_TOP_F_BIST2FPC, "f_bist2fpc_ck", "univpll_d3_d2", 1, 1),
+};
+
+static const char * const axi_parents[] = {
+       "clk26m",
+       "mainpll_d7",
+       "mainpll_d2_d4",
+       "univpll_d7"
+};
+
+static const char * const scp_parents[] = {
+       "clk26m",
+       "mainpll_d2_d4",
+       "mainpll_d5",
+       "mainpll_d2_d2",
+       "mainpll_d3",
+       "univpll_d3"
+};
+
+static const char * const mfg_parents[] = {
+       "clk26m",
+       "mfgpll",
+       "mainpll_d3",
+       "mainpll_d5"
+};
+
+static const char * const camtg_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d3_d8",
+       "univpll_192m_d4",
+       "univpll_d3_d32",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const uart_parents[] = {
+       "clk26m",
+       "univpll_d3_d8"
+};
+
+static const char * const spi_parents[] = {
+       "clk26m",
+       "mainpll_d5_d4",
+       "mainpll_d3_d4",
+       "mainpll_d5_d2",
+       "mainpll_d2_d4",
+       "mainpll_d7",
+       "mainpll_d3_d2",
+       "mainpll_d5"
+};
+
+static const char * const msdc5hclk_parents[] = {
+       "clk26m",
+       "mainpll_d2_d2",
+       "mainpll_d7",
+       "mainpll_d3_d2"
+};
+
+static const char * const msdc50_0_parents[] = {
+       "clk26m",
+       "msdcpll",
+       "univpll_d3",
+       "msdcpll_d2",
+       "mainpll_d7",
+       "mainpll_d3_d2",
+       "univpll_d2_d2"
+};
+
+static const char * const msdc30_1_parents[] = {
+       "clk26m",
+       "msdcpll_d2",
+       "univpll_d3_d2",
+       "mainpll_d3_d2",
+       "mainpll_d7"
+};
+
+static const char * const audio_parents[] = {
+       "clk26m",
+       "mainpll_d5_d4",
+       "mainpll_d7_d4",
+       "mainpll_d2_d16"
+};
+
+static const char * const aud_intbus_parents[] = {
+       "clk26m",
+       "mainpll_d2_d4",
+       "mainpll_d7_d2"
+};
+
+static const char * const aud_1_parents[] = {
+       "clk26m",
+       "apll1"
+};
+
+static const char * const aud_2_parents[] = {
+       "clk26m",
+       "apll2"
+};
+
+static const char * const aud_engen1_parents[] = {
+       "clk26m",
+       "apll1_d2",
+       "apll1_d4",
+       "apll1_d8"
+};
+
+static const char * const aud_engen2_parents[] = {
+       "clk26m",
+       "apll2_d2",
+       "apll2_d4",
+       "apll2_d8"
+};
+
+static const char * const disp_pwm_parents[] = {
+       "clk26m",
+       "univpll_d5_d2",
+       "univpll_d3_d4",
+       "ulposc1_d2",
+       "ulposc1_d8"
+};
+
+static const char * const sspm_parents[] = {
+       "clk26m",
+       "mainpll_d2_d2",
+       "mainpll_d3_d2",
+       "mainpll_d5",
+       "mainpll_d3"
+};
+
+static const char * const dxcc_parents[] = {
+       "clk26m",
+       "mainpll_d2_d2",
+       "mainpll_d2_d4"
+};
+
+static const char * const usb_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "univpll_d5_d2"
+};
+
+static const char * const srck_parents[] = {
+       "clk32k",
+       "clk26m",
+       "ulposc1_d10"
+};
+
+static const char * const spm_parents[] = {
+       "clk32k",
+       "ulposc1_d10",
+       "clk26m",
+       "mainpll_d7_d2"
+};
+
+static const char * const i2c_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "univpll_d3_d4",
+       "univpll_d5_d2"
+};
+
+static const char * const pwm_parents[] = {
+       "clk26m",
+       "univpll_d3_d8",
+       "univpll_d3_d4",
+       "univpll_d2_d4"
+};
+
+static const char * const seninf_parents[] = {
+       "clk26m",
+       "univpll_d2_d4",
+       "univpll_d2_d2",
+       "univpll_d3_d2"
+};
+
+static const char * const aes_msdcfde_parents[] = {
+       "clk26m",
+       "univpll_d3",
+       "mainpll_d3",
+       "univpll_d2_d2",
+       "mainpll_d2_d2",
+       "mainpll_d2_d4"
+};
+
+static const char * const pwrap_ulposc_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "ulposc1_d4",
+       "ulposc1_d8",
+       "ulposc1_d10",
+       "ulposc1_d16",
+       "ulposc1_d32"
+};
+
+static const char * const camtm_parents[] = {
+       "clk26m",
+       "univpll_d2_d4",
+       "univpll_d3_d2"
+};
+
+static const char * const venc_parents[] = {
+       "clk26m",
+       "mmpll",
+       "mainpll_d2_d2",
+       "mainpll_d2",
+       "univpll_d3",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "mmpll"
+};
+
+static const char * const isp_parents[] = {
+       "clk26m",
+       "mainpll_d2",
+       "mainpll_d2_d2",
+       "univpll_d3",
+       "mainpll_d3",
+       "mmpll",
+       "univpll_d5",
+       "univpll_d2_d2",
+       "mmpll_d2"
+};
+
+static const char * const dpmaif_parents[] = {
+       "clk26m",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "mainpll_d2_d2",
+       "univpll_d3_d2"
+};
+
+static const char * const vdec_parents[] = {
+       "clk26m",
+       "mainpll_d3",
+       "mainpll_d2_d2",
+       "univpll_d5",
+       "mainpll_d2",
+       "univpll_d3",
+       "univpll_d2_d2"
+};
+
+static const char * const disp_parents[] = {
+       "clk26m",
+       "univpll_d3_d2",
+       "mainpll_d5",
+       "univpll_d5",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "univpll_d3",
+       "mainpll_d2",
+       "mmpll"
+};
+
+static const char * const mdp_parents[] = {
+       "clk26m",
+       "mainpll_d5",
+       "univpll_d5",
+       "mainpll_d2_d2",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "univpll_d3",
+       "mainpll_d2",
+       "mmpll"
+};
+
+static const char * const audio_h_parents[] = {
+       "clk26m",
+       "univpll_d7",
+       "apll1",
+       "apll2"
+};
+
+static const char * const ufs_parents[] = {
+       "clk26m",
+       "mainpll_d7",
+       "univpll_d2_d4",
+       "mainpll_d2_d4"
+};
+
+static const char * const aes_fde_parents[] = {
+       "clk26m",
+       "univpll_d3",
+       "mainpll_d2_d2",
+       "univpll_d5"
+};
+
+static const char * const audiodsp_parents[] = {
+       "clk26m",
+       "ulposc1_d10",
+       "adsppll",
+       "adsppll_d2",
+       "adsppll_d4",
+       "adsppll_d8"
+};
+
+static const char * const dvfsrc_parents[] = {
+       "clk26m",
+       "ulposc1_d10",
+};
+
+static const char * const dsi_occ_parents[] = {
+       "clk26m",
+       "univpll_d3_d2",
+       "mpll",
+       "mainpll_d5"
+};
+
+static const char * const spmi_mst_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "ulposc1_d4",
+       "ulposc1_d8",
+       "ulposc1_d10",
+       "ulposc1_d16",
+       "ulposc1_d32"
+};
+
+static const char * const spinor_parents[] = {
+       "clk26m",
+       "clk13m",
+       "mainpll_d7_d4",
+       "univpll_d3_d8",
+       "univpll_d5_d4",
+       "mainpll_d7_d2"
+};
+
+static const char * const nna_parents[] = {
+       "clk26m",
+       "univpll_d3_d8",
+       "mainpll_d2_d4",
+       "univpll_d3_d2",
+       "mainpll_d2_d2",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "univpll_d3",
+       "mmpll",
+       "mainpll_d2",
+       "univpll_d2",
+       "nnapll_d2",
+       "nnapll_d4",
+       "nnapll_d8",
+       "nnapll",
+       "nna2pll"
+};
+
+static const char * const nna2_parents[] = {
+       "clk26m",
+       "univpll_d3_d8",
+       "mainpll_d2_d4",
+       "univpll_d3_d2",
+       "mainpll_d2_d2",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "univpll_d3",
+       "mmpll",
+       "mainpll_d2",
+       "univpll_d2",
+       "nna2pll_d2",
+       "nna2pll_d4",
+       "nna2pll_d8",
+       "nnapll",
+       "nna2pll"
+};
+
+static const char * const ssusb_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "univpll_d5_d2"
+};
+
+static const char * const wpe_parents[] = {
+       "clk26m",
+       "univpll_d3_d2",
+       "mainpll_d5",
+       "univpll_d5",
+       "univpll_d2_d2",
+       "mainpll_d3",
+       "univpll_d3",
+       "mainpll_d2",
+       "mmpll"
+};
+
+static const char * const dpi_parents[] = {
+       "clk26m",
+       "tvdpll",
+       "tvdpll_d2",
+       "tvdpll_d4",
+       "tvdpll_d8",
+       "tvdpll_d16",
+       "tvdpll_d32"
+};
+
+static const char * const u3_occ_250m_parents[] = {
+       "clk26m",
+       "univpll_d5"
+};
+
+static const char * const u3_occ_500m_parents[] = {
+       "clk26m",
+       "nna2pll_d2"
+};
+
+static const char * const adsp_bus_parents[] = {
+       "clk26m",
+       "ulposc1_d2",
+       "mainpll_d5",
+       "mainpll_d2_d2",
+       "mainpll_d3",
+       "mainpll_d2",
+       "univpll_d3"
+};
+
+static const char * const apll_mck_parents[] = {
+       "top_aud_1",
+       "top_aud_2"
+};
+
+static const struct mtk_mux top_mtk_muxes[] = {
+       /*
+        * CLK_CFG_0
+        * top_axi is bus clock, should not be closed by Linux.
+        * top_scp is main clock in always-on co-processor.
+        */
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI, "top_axi", axi_parents,
+                                  0x0040, 0x0044, 0x0048, 0, 2, 7, 0x0004, 0,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SCP, "top_scp", scp_parents,
+                                  0x0040, 0x0044, 0x0048, 8, 3, 15, 0x0004, 1,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG, "top_mfg",
+               mfg_parents, 0x0040, 0x0044, 0x0048, 16, 2, 23, 0x0004, 2),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG, "top_camtg",
+               camtg_parents, 0x0040, 0x0044, 0x0048, 24, 3, 31, 0x0004, 3),
+       /* CLK_CFG_1 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG1, "top_camtg1",
+               camtg_parents, 0x0050, 0x0054, 0x0058, 0, 3, 7, 0x0004, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG2, "top_camtg2",
+               camtg_parents, 0x0050, 0x0054, 0x0058, 8, 3, 15, 0x0004, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG3, "top_camtg3",
+               camtg_parents, 0x0050, 0x0054, 0x0058, 16, 3, 23, 0x0004, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG4, "top_camtg4",
+               camtg_parents, 0x0050, 0x0054, 0x0058, 24, 3, 31, 0x0004, 7),
+       /* CLK_CFG_2 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG5, "top_camtg5",
+               camtg_parents, 0x0060, 0x0064, 0x0068, 0, 3, 7, 0x0004, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG6, "top_camtg6",
+               camtg_parents, 0x0060, 0x0064, 0x0068, 8, 3, 15, 0x0004, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UART, "top_uart",
+               uart_parents, 0x0060, 0x0064, 0x0068, 16, 1, 23, 0x0004, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI, "top_spi",
+               spi_parents, 0x0060, 0x0064, 0x0068, 24, 3, 31, 0x0004, 11),
+       /* CLK_CFG_3 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_HCLK, "top_msdc5hclk",
+               msdc5hclk_parents, 0x0070, 0x0074, 0x0078, 0, 2, 7, 0x0004, 12),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0, "top_msdc50_0",
+               msdc50_0_parents, 0x0070, 0x0074, 0x0078, 8, 3, 15, 0x0004, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1, "top_msdc30_1",
+               msdc30_1_parents, 0x0070, 0x0074, 0x0078, 16, 3, 23, 0x0004, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO, "top_audio",
+               audio_parents, 0x0070, 0x0074, 0x0078, 24, 2, 31, 0x0004, 15),
+       /* CLK_CFG_4 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS, "top_aud_intbus",
+               aud_intbus_parents, 0x0080, 0x0084, 0x0088, 0, 2, 7, 0x0004, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_1, "top_aud_1",
+               aud_1_parents, 0x0080, 0x0084, 0x0088, 8, 1, 15, 0x0004, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_2, "top_aud_2",
+               aud_2_parents, 0x0080, 0x0084, 0x0088, 16, 1, 23, 0x0004, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN1, "top_aud_engen1",
+               aud_engen1_parents, 0x0080, 0x0084, 0x0088, 24, 2, 31, 0x0004, 19),
+       /*
+        * CLK_CFG_5
+        * top_sspm is main clock in always-on co-processor, should not be closed
+        * in Linux.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN2, "top_aud_engen2",
+               aud_engen2_parents, 0x0090, 0x0094, 0x0098, 0, 2, 7, 0x0004, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM, "top_disp_pwm",
+               disp_pwm_parents, 0x0090, 0x0094, 0x0098, 8, 3, 15, 0x0004, 21),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SSPM, "top_sspm", sspm_parents,
+                                  0x0090, 0x0094, 0x0098, 16, 3, 23, 0x0004, 22,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DXCC, "top_dxcc",
+               dxcc_parents, 0x0090, 0x0094, 0x0098, 24, 2, 31, 0x0004, 23),
+       /*
+        * CLK_CFG_6
+        * top_spm and top_srck are main clocks in always-on co-processor.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP, "top_usb",
+               usb_parents, 0x00a0, 0x00a4, 0x00a8, 0, 2, 7, 0x0004, 24),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SRCK, "top_srck", srck_parents,
+                                  0x00a0, 0x00a4, 0x00a8, 8, 2, 15, 0x0004, 25,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SPM, "top_spm", spm_parents,
+                                  0x00a0, 0x00a4, 0x00a8, 16, 2, 23, 0x0004, 26,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C, "top_i2c",
+               i2c_parents, 0x00a0, 0x00a4, 0x00a8, 24, 2, 31, 0x0004, 27),
+       /* CLK_CFG_7 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM, "top_pwm",
+               pwm_parents, 0x00b0, 0x00b4, 0x00b8, 0, 2, 7, 0x0004, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF, "top_seninf",
+               seninf_parents, 0x00b0, 0x00b4, 0x00b8, 8, 2, 15, 0x0004, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF1, "top_seninf1",
+               seninf_parents, 0x00b0, 0x00b4, 0x00b8, 16, 2, 23, 0x0004, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF2, "top_seninf2",
+               seninf_parents, 0x00b0, 0x00b4, 0x00b8, 24, 2, 31, 0x0008, 0),
+       /* CLK_CFG_8 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF3, "top_seninf3",
+               seninf_parents, 0x00c0, 0x00c4, 0x00c8, 0, 2, 7, 0x0008, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_MSDCFDE, "top_aes_msdcfde",
+               aes_msdcfde_parents, 0x00c0, 0x00c4, 0x00c8, 8, 3, 15, 0x0008, 2),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWRAP_ULPOSC, "top_pwrap_ulposc",
+               pwrap_ulposc_parents, 0x00c0, 0x00c4, 0x00c8, 16, 3, 23, 0x0008, 3),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM, "top_camtm",
+               camtm_parents, 0x00c0, 0x00c4, 0x00c8, 24, 2, 31, 0x0008, 4),
+       /* CLK_CFG_9 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VENC, "top_venc",
+               venc_parents, 0x00d0, 0x00d4, 0x00d8, 0, 3, 7, 0x0008, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAM, "top_cam",
+               isp_parents, 0x00d0, 0x00d4, 0x00d8, 8, 4, 15, 0x0008, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG1, "top_img1",
+               isp_parents, 0x00d0, 0x00d4, 0x00d8, 16, 4, 23, 0x0008, 7),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IPE, "top_ipe",
+               isp_parents, 0x00d0, 0x00d4, 0x00d8, 24, 4, 31, 0x0008, 8),
+       /* CLK_CFG_10 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPMAIF, "top_dpmaif",
+               dpmaif_parents, 0x00e0, 0x00e4, 0x00e8, 0, 3, 7, 0x0008, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VDEC, "top_vdec",
+               vdec_parents, 0x00e0, 0x00e4, 0x00e8, 8, 3, 15, 0x0008, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP, "top_disp",
+               disp_parents, 0x00e0, 0x00e4, 0x00e8, 16, 4, 23, 0x0008, 11),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MDP, "top_mdp",
+               mdp_parents, 0x00e0, 0x00e4, 0x00e8, 24, 4, 31, 0x0008, 12),
+       /* CLK_CFG_11 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_H, "top_audio_h",
+               audio_h_parents, 0x00ec, 0x00f0, 0x00f4, 0, 2, 7, 0x0008, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS, "top_ufs",
+               ufs_parents, 0x00ec, 0x00f0, 0x00f4, 8, 2, 15, 0x0008, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_FDE, "top_aes_fde",
+               aes_fde_parents, 0x00ec, 0x00f0, 0x00f4, 16, 2, 23, 0x0008, 15),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIODSP, "top_audiodsp",
+               audiodsp_parents, 0x00ec, 0x00f0, 0x00f4, 24, 3, 31, 0x0008, 16),
+       /*
+        * CLK_CFG_12
+        * dvfsrc is for internal DVFS usage, should not be closed in Linux.
+        */
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DVFSRC, "top_dvfsrc", dvfsrc_parents,
+                                  0x0100, 0x0104, 0x0108, 0, 1, 7, 0x0008, 17,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSI_OCC, "top_dsi_occ",
+               dsi_occ_parents, 0x0100, 0x0104, 0x0108, 8, 2, 15, 0x0008, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_MST, "top_spmi_mst",
+               spmi_mst_parents, 0x0100, 0x0104, 0x0108, 16, 3, 23, 0x0008, 19),
+       /* CLK_CFG_13 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINOR, "top_spinor",
+               spinor_parents, 0x0110, 0x0114, 0x0118, 0, 3, 6, 0x0008, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA, "top_nna",
+               nna_parents, 0x0110, 0x0114, 0x0118, 7, 4, 14, 0x0008, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA1, "top_nna1",
+               nna_parents, 0x0110, 0x0114, 0x0118, 15, 4, 22, 0x0008, 22),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA2, "top_nna2",
+               nna2_parents, 0x0110, 0x0114, 0x0118, 23, 4, 30, 0x0008, 23),
+       /* CLK_CFG_14 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI, "top_ssusb_xhci",
+               ssusb_parents, 0x0120, 0x0124, 0x0128, 0, 2, 5, 0x0008, 24),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_TOP_1P, "top_ssusb_1p",
+               ssusb_parents, 0x0120, 0x0124, 0x0128, 6, 2, 11, 0x0008, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_1P, "top_ssusb_xhci_1p",
+               ssusb_parents, 0x0120, 0x0124, 0x0128, 12, 2, 17, 0x0008, 26),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_WPE, "top_wpe",
+               wpe_parents, 0x0120, 0x0124, 0x0128, 18, 4, 25, 0x0008, 27),
+       /* CLK_CFG_15 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI, "top_dpi",
+               dpi_parents, 0x0180, 0x0184, 0x0188, 0, 3, 6, 0x0008, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_U3_OCC_250M, "top_u3_occ_250m",
+               u3_occ_250m_parents, 0x0180, 0x0184, 0x0188, 7, 1, 11, 0x0008, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_U3_OCC_500M, "top_u3_occ_500m",
+               u3_occ_500m_parents, 0x0180, 0x0184, 0x0188, 12, 1, 16, 0x0008, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ADSP_BUS, "top_adsp_bus",
+               adsp_bus_parents, 0x0180, 0x0184, 0x0188, 17, 3, 23, 0x0008, 31),
+};
+
+static struct mtk_composite top_muxes[] = {
+       /* CLK_AUDDIV_0 */
+       MUX(CLK_TOP_APLL_I2S0_MCK_SEL, "apll_i2s0_mck_sel", apll_mck_parents, 0x0320, 16, 1),
+       MUX(CLK_TOP_APLL_I2S1_MCK_SEL, "apll_i2s1_mck_sel", apll_mck_parents, 0x0320, 17, 1),
+       MUX(CLK_TOP_APLL_I2S2_MCK_SEL, "apll_i2s2_mck_sel", apll_mck_parents, 0x0320, 18, 1),
+       MUX(CLK_TOP_APLL_I2S4_MCK_SEL, "apll_i2s4_mck_sel", apll_mck_parents, 0x0320, 19, 1),
+       MUX(CLK_TOP_APLL_TDMOUT_MCK_SEL, "apll_tdmout_mck_sel", apll_mck_parents,
+               0x0320, 20, 1),
+};
+
+static const struct mtk_composite top_adj_divs[] = {
+       DIV_GATE(CLK_TOP_APLL12_CK_DIV0, "apll12_div0", "apll_i2s0_mck_sel",
+                       0x0320, 0, 0x0328, 8, 0),
+       DIV_GATE(CLK_TOP_APLL12_CK_DIV1, "apll12_div1", "apll_i2s1_mck_sel",
+                       0x0320, 1, 0x0328, 8, 8),
+       DIV_GATE(CLK_TOP_APLL12_CK_DIV2, "apll12_div2", "apll_i2s2_mck_sel",
+                       0x0320, 2, 0x0328, 8, 16),
+       DIV_GATE(CLK_TOP_APLL12_CK_DIV4, "apll12_div4", "apll_i2s4_mck_sel",
+                       0x0320, 3, 0x0328, 8, 24),
+       DIV_GATE(CLK_TOP_APLL12_CK_DIV_TDMOUT_M, "apll12_div_tdmout_m", "apll_tdmout_mck_sel",
+                       0x0320, 4, 0x0334, 8, 0),
+};
+
+static const struct of_device_id of_match_clk_mt8186_topck[] = {
+       { .compatible = "mediatek,mt8186-topckgen", },
+       {}
+};
+
+static int clk_mt8186_topck_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+       void __iomem *base;
+
+       clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base)) {
+               r = PTR_ERR(base);
+               goto free_top_data;
+       }
+
+       r = mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
+                                       clk_data);
+       if (r)
+               goto free_top_data;
+
+       r = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+       if (r)
+               goto unregister_fixed_clks;
+
+       r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
+                                  &mt8186_clk_lock, clk_data);
+       if (r)
+               goto unregister_factors;
+
+       r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+                                       &mt8186_clk_lock, clk_data);
+       if (r)
+               goto unregister_muxes;
+
+       r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+                                       &mt8186_clk_lock, clk_data);
+       if (r)
+               goto unregister_composite_muxes;
+
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+               goto unregister_composite_divs;
+
+       platform_set_drvdata(pdev, clk_data);
+
+       return r;
+
+unregister_composite_divs:
+       mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), clk_data);
+unregister_composite_muxes:
+       mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
+unregister_muxes:
+       mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), clk_data);
+unregister_factors:
+       mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+unregister_fixed_clks:
+       mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), clk_data);
+free_top_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static int clk_mt8186_topck_remove(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct device_node *node = pdev->dev.of_node;
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), clk_data);
+       mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
+       mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), clk_data);
+       mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+       mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt8186_topck_drv = {
+       .probe = clk_mt8186_topck_probe,
+       .remove = clk_mt8186_topck_remove,
+       .driver = {
+               .name = "clk-mt8186-topck",
+               .of_match_table = of_match_clk_mt8186_topck,
+       },
+};
+builtin_platform_driver(clk_mt8186_topck_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-vdec.c b/drivers/clk/mediatek/clk-mt8186-vdec.c
new file mode 100644 (file)
index 0000000..5ad7e1a
--- /dev/null
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8186-clk.h>
+
+static const struct mtk_gate_regs vdec0_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x4,
+       .sta_ofs = 0x0,
+};
+
+static const struct mtk_gate_regs vdec1_cg_regs = {
+       .set_ofs = 0x190,
+       .clr_ofs = 0x190,
+       .sta_ofs = 0x190,
+};
+
+static const struct mtk_gate_regs vdec2_cg_regs = {
+       .set_ofs = 0x200,
+       .clr_ofs = 0x204,
+       .sta_ofs = 0x200,
+};
+
+static const struct mtk_gate_regs vdec3_cg_regs = {
+       .set_ofs = 0x8,
+       .clr_ofs = 0xc,
+       .sta_ofs = 0x8,
+};
+
+#define GATE_VDEC0(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec0_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+#define GATE_VDEC1(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+#define GATE_VDEC2(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec2_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+#define GATE_VDEC3(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec3_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+static const struct mtk_gate vdec_clks[] = {
+       /* VDEC0 */
+       GATE_VDEC0(CLK_VDEC_CKEN, "vdec_cken", "top_vdec", 0),
+       GATE_VDEC0(CLK_VDEC_ACTIVE, "vdec_active", "top_vdec", 4),
+       GATE_VDEC0(CLK_VDEC_CKEN_ENG, "vdec_cken_eng", "top_vdec", 8),
+       /* VDEC1 */
+       GATE_VDEC1(CLK_VDEC_MINI_MDP_CKEN_CFG_RG, "vdec_mini_mdp_cken_cfg_rg", "top_vdec", 0),
+       /* VDEC2 */
+       GATE_VDEC2(CLK_VDEC_LAT_CKEN, "vdec_lat_cken", "top_vdec", 0),
+       GATE_VDEC2(CLK_VDEC_LAT_ACTIVE, "vdec_lat_active", "top_vdec", 4),
+       GATE_VDEC2(CLK_VDEC_LAT_CKEN_ENG, "vdec_lat_cken_eng", "top_vdec", 8),
+       /* VDEC3 */
+       GATE_VDEC3(CLK_VDEC_LARB1_CKEN, "vdec_larb1_cken", "top_vdec", 0),
+};
+
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_vdec[] = {
+       {
+               .compatible = "mediatek,mt8186-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_vdec_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-vdec",
+               .of_match_table = of_match_clk_mt8186_vdec,
+       },
+};
+builtin_platform_driver(clk_mt8186_vdec_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-venc.c b/drivers/clk/mediatek/clk-mt8186-venc.c
new file mode 100644 (file)
index 0000000..f5519f7
--- /dev/null
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs venc_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_VENC(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &venc_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+static const struct mtk_gate venc_clks[] = {
+       GATE_VENC(CLK_VENC_CKE0_LARB, "venc_cke0_larb", "top_venc", 0),
+       GATE_VENC(CLK_VENC_CKE1_VENC, "venc_cke1_venc", "top_venc", 4),
+       GATE_VENC(CLK_VENC_CKE2_JPGENC, "venc_cke2_jpgenc", "top_venc", 8),
+       GATE_VENC(CLK_VENC_CKE5_GALS, "venc_cke5_gals", "top_venc", 28),
+};
+
+static const struct mtk_clk_desc venc_desc = {
+       .clks = venc_clks,
+       .num_clks = ARRAY_SIZE(venc_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_venc[] = {
+       {
+               .compatible = "mediatek,mt8186-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_venc_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-venc",
+               .of_match_table = of_match_clk_mt8186_venc,
+       },
+};
+builtin_platform_driver(clk_mt8186_venc_drv);
diff --git a/drivers/clk/mediatek/clk-mt8186-wpe.c b/drivers/clk/mediatek/clk-mt8186-wpe.c
new file mode 100644 (file)
index 0000000..8db3e91
--- /dev/null
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2022 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/mt8186-clk.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs wpe_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x0,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_WPE(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &wpe_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate wpe_clks[] = {
+       GATE_WPE(CLK_WPE_CK_EN, "wpe", "top_wpe", 17),
+       GATE_WPE(CLK_WPE_SMI_LARB8_CK_EN, "wpe_smi_larb8", "top_wpe", 19),
+       GATE_WPE(CLK_WPE_SYS_EVENT_TX_CK_EN, "wpe_sys_event_tx", "top_wpe", 20),
+       GATE_WPE(CLK_WPE_SMI_LARB8_PCLK_EN, "wpe_smi_larb8_p_en", "top_wpe", 25),
+};
+
+static const struct mtk_clk_desc wpe_desc = {
+       .clks = wpe_clks,
+       .num_clks = ARRAY_SIZE(wpe_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8186_wpe[] = {
+       {
+               .compatible = "mediatek,mt8186-wpesys",
+               .data = &wpe_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8186_wpe_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8186-wpe",
+               .of_match_table = of_match_clk_mt8186_wpe,
+       },
+};
+builtin_platform_driver(clk_mt8186_wpe_drv);
index f28d566..8c989bf 100644 (file)
@@ -79,7 +79,7 @@ static const struct mtk_gate aud_clks[] = {
 
 static int clk_mt8192_aud_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -91,7 +91,7 @@ static int clk_mt8192_aud_probe(struct platform_device *pdev)
        if (r)
                return r;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                return r;
 
index 4a0b4c4..1be3ff4 100644 (file)
@@ -84,7 +84,7 @@ static int clk_mt8192_mm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
@@ -95,7 +95,7 @@ static int clk_mt8192_mm_probe(struct platform_device *pdev)
        if (r)
                return r;
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
 static struct platform_driver clk_mt8192_mm_drv = {
index ab27cd6..dda211b 100644 (file)
@@ -1178,7 +1178,7 @@ static const struct mtk_pll_data plls[] = {
              0, 0, 32, 0x0330, 24, 0, 0, 0, 0x0334, 0),
 };
 
-static struct clk_onecell_data *top_clk_data;
+static struct clk_hw_onecell_data *top_clk_data;
 
 static void clk_mt8192_top_init_early(struct device_node *node)
 {
@@ -1189,11 +1189,11 @@ static void clk_mt8192_top_init_early(struct device_node *node)
                return;
 
        for (i = 0; i < CLK_TOP_NR_CLK; i++)
-               top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
+               top_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
 
        mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), top_clk_data);
 
-       of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
 }
 
 CLK_OF_DECLARE_DRIVER(mt8192_topckgen, "mediatek,mt8192-topckgen",
@@ -1222,12 +1222,13 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
        if (r)
                return r;
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
+                                     top_clk_data);
 }
 
 static int clk_mt8192_infra_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -1239,7 +1240,7 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev)
        if (r)
                goto free_clk_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto free_clk_data;
 
@@ -1252,7 +1253,7 @@ free_clk_data:
 
 static int clk_mt8192_peri_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -1264,7 +1265,7 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev)
        if (r)
                goto free_clk_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto free_clk_data;
 
@@ -1277,7 +1278,7 @@ free_clk_data:
 
 static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -1290,7 +1291,7 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
        if (r)
                goto free_clk_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto free_clk_data;
 
index eecc703..0dfed6e 100644 (file)
@@ -112,7 +112,7 @@ static const struct of_device_id of_match_clk_mt8195_apmixed[] = {
 
 static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -128,7 +128,7 @@ static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
        if (r)
                goto unregister_plls;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto unregister_gates;
 
@@ -148,7 +148,7 @@ free_apmixed_data:
 static int clk_mt8195_apmixed_remove(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
-       struct clk_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
 
        of_clk_del_provider(node);
        mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
index 8cd88df..0b52f6a 100644 (file)
@@ -58,7 +58,7 @@ static const struct mtk_pll_data apusys_plls[] = {
 
 static int clk_mt8195_apusys_pll_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -70,7 +70,7 @@ static int clk_mt8195_apusys_pll_probe(struct platform_device *pdev)
        if (r)
                goto free_apusys_pll_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto unregister_plls;
 
@@ -87,7 +87,7 @@ free_apusys_pll_data:
 
 static int clk_mt8195_apusys_pll_remove(struct platform_device *pdev)
 {
-       struct clk_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
        struct device_node *node = pdev->dev.of_node;
 
        of_clk_del_provider(node);
index b602fcd..ec70e1f 100644 (file)
@@ -1224,7 +1224,7 @@ static const struct of_device_id of_match_clk_mt8195_topck[] = {
 
 static int clk_mt8195_topck_probe(struct platform_device *pdev)
 {
-       struct clk_onecell_data *top_clk_data;
+       struct clk_hw_onecell_data *top_clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
        void __iomem *base;
@@ -1267,7 +1267,7 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
        if (r)
                goto unregister_composite_divs;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
        if (r)
                goto unregister_gates;
 
@@ -1294,7 +1294,7 @@ free_top_data:
 
 static int clk_mt8195_topck_remove(struct platform_device *pdev)
 {
-       struct clk_onecell_data *top_clk_data = platform_get_drvdata(pdev);
+       struct clk_hw_onecell_data *top_clk_data = platform_get_drvdata(pdev);
        struct device_node *node = pdev->dev.of_node;
 
        of_clk_del_provider(node);
index 3bc7ed1..261a7f7 100644 (file)
@@ -92,7 +92,7 @@ static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_VDO0_NR_CLK);
@@ -103,7 +103,7 @@ static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
        if (r)
                goto free_vdo0_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto unregister_gates;
 
@@ -122,7 +122,7 @@ static int clk_mt8195_vdo0_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
 
        of_clk_del_provider(node);
        mtk_clk_unregister_gates(vdo0_clks, ARRAY_SIZE(vdo0_clks), clk_data);
index 90c738a..3378487 100644 (file)
@@ -109,7 +109,7 @@ static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_VDO1_NR_CLK);
@@ -120,7 +120,7 @@ static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
        if (r)
                goto free_vdo1_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto unregister_gates;
 
@@ -139,7 +139,7 @@ static int clk_mt8195_vdo1_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->parent->of_node;
-       struct clk_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
 
        of_clk_del_provider(node);
        mtk_clk_unregister_gates(vdo1_clks, ARRAY_SIZE(vdo1_clks), clk_data);
index 6ab3a06..90f4806 100644 (file)
@@ -49,14 +49,14 @@ static const struct mtk_gate aud_clks[] __initconst = {
 
 static void __init mtk_audsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
 
        clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
 
        mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
index a37143f..b96db88 100644 (file)
@@ -677,7 +677,7 @@ static const struct mtk_gate top_clks[] __initconst = {
 
 static void __init mtk_topckgen_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        void __iomem *base;
 
@@ -699,7 +699,7 @@ static void __init mtk_topckgen_init(struct device_node *node)
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
                                base, &mt8516_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -708,7 +708,7 @@ CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt8516-topckgen", mtk_topckgen_init);
 
 static void __init mtk_infracfg_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        int r;
        void __iomem *base;
 
@@ -723,7 +723,7 @@ static void __init mtk_infracfg_init(struct device_node *node)
        mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
                &mt8516_clk_lock, clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
@@ -771,23 +771,23 @@ static const struct mtk_pll_div_table mmpll_div_table[] = {
 };
 
 static const struct mtk_pll_data plls[] = {
-       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0100, 0x0110, 0x00000001, 0,
+       PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0100, 0x0110, 0, 0,
                21, 0x0104, 24, 0, 0x0104, 0),
-       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0120, 0x0130, 0x00000001,
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0120, 0x0130, 0,
                HAVE_RST_BAR, 21, 0x0124, 24, 0, 0x0124, 0),
-       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0140, 0x0150, 0x30000001,
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x0140, 0x0150, 0x30000000,
                HAVE_RST_BAR, 7, 0x0144, 24, 0, 0x0144, 0),
-       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0160, 0x0170, 0x00000001, 0,
+       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0160, 0x0170, 0, 0,
                21, 0x0164, 24, 0, 0x0164, 0, mmpll_div_table),
-       PLL(CLK_APMIXED_APLL1, "apll1", 0x0180, 0x0190, 0x00000001, 0,
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x0180, 0x0190, 0, 0,
                31, 0x0180, 1, 0x0194, 0x0184, 0),
-       PLL(CLK_APMIXED_APLL2, "apll2", 0x01A0, 0x01B0, 0x00000001, 0,
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x01A0, 0x01B0, 0, 0,
                31, 0x01A0, 1, 0x01B4, 0x01A4, 0),
 };
 
 static void __init mtk_apmixedsys_init(struct device_node *node)
 {
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        void __iomem *base;
        int r;
 
@@ -801,7 +801,7 @@ static void __init mtk_apmixedsys_init(struct device_node *node)
 
        mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
index b406326..b918800 100644 (file)
 #include "clk-mtk.h"
 #include "clk-gate.h"
 
-struct clk_onecell_data *mtk_alloc_clk_data(unsigned int clk_num)
+struct clk_hw_onecell_data *mtk_alloc_clk_data(unsigned int clk_num)
 {
        int i;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
 
-       clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
+       clk_data = kzalloc(struct_size(clk_data, hws, clk_num), GFP_KERNEL);
        if (!clk_data)
                return NULL;
 
-       clk_data->clks = kcalloc(clk_num, sizeof(*clk_data->clks), GFP_KERNEL);
-       if (!clk_data->clks)
-               goto err_out;
-
-       clk_data->clk_num = clk_num;
+       clk_data->num = clk_num;
 
        for (i = 0; i < clk_num; i++)
-               clk_data->clks[i] = ERR_PTR(-ENOENT);
+               clk_data->hws[i] = ERR_PTR(-ENOENT);
 
        return clk_data;
-err_out:
-       kfree(clk_data);
-
-       return NULL;
 }
 EXPORT_SYMBOL_GPL(mtk_alloc_clk_data);
 
-void mtk_free_clk_data(struct clk_onecell_data *clk_data)
+void mtk_free_clk_data(struct clk_hw_onecell_data *clk_data)
 {
-       if (!clk_data)
-               return;
-
-       kfree(clk_data->clks);
        kfree(clk_data);
 }
+EXPORT_SYMBOL_GPL(mtk_free_clk_data);
 
 int mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks, int num,
-                               struct clk_onecell_data *clk_data)
+                               struct clk_hw_onecell_data *clk_data)
 {
        int i;
-       struct clk *clk;
+       struct clk_hw *hw;
 
        if (!clk_data)
                return -ENOMEM;
@@ -65,20 +54,21 @@ int mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks, int num,
        for (i = 0; i < num; i++) {
                const struct mtk_fixed_clk *rc = &clks[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[rc->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[rc->id])) {
                        pr_warn("Trying to register duplicate clock ID: %d\n", rc->id);
                        continue;
                }
 
-               clk = clk_register_fixed_rate(NULL, rc->name, rc->parent, 0,
+               hw = clk_hw_register_fixed_rate(NULL, rc->name, rc->parent, 0,
                                              rc->rate);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", rc->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", rc->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[rc->id] = clk;
+               clk_data->hws[rc->id] = hw;
        }
 
        return 0;
@@ -87,19 +77,19 @@ err:
        while (--i >= 0) {
                const struct mtk_fixed_clk *rc = &clks[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[rc->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[rc->id]))
                        continue;
 
-               clk_unregister_fixed_rate(clk_data->clks[rc->id]);
-               clk_data->clks[rc->id] = ERR_PTR(-ENOENT);
+               clk_unregister_fixed_rate(clk_data->hws[rc->id]->clk);
+               clk_data->hws[rc->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 EXPORT_SYMBOL_GPL(mtk_clk_register_fixed_clks);
 
 void mtk_clk_unregister_fixed_clks(const struct mtk_fixed_clk *clks, int num,
-                                  struct clk_onecell_data *clk_data)
+                                  struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
@@ -109,20 +99,20 @@ void mtk_clk_unregister_fixed_clks(const struct mtk_fixed_clk *clks, int num,
        for (i = num; i > 0; i--) {
                const struct mtk_fixed_clk *rc = &clks[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[rc->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[rc->id]))
                        continue;
 
-               clk_unregister_fixed_rate(clk_data->clks[rc->id]);
-               clk_data->clks[rc->id] = ERR_PTR(-ENOENT);
+               clk_unregister_fixed_rate(clk_data->hws[rc->id]->clk);
+               clk_data->hws[rc->id] = ERR_PTR(-ENOENT);
        }
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_fixed_clks);
 
 int mtk_clk_register_factors(const struct mtk_fixed_factor *clks, int num,
-                            struct clk_onecell_data *clk_data)
+                            struct clk_hw_onecell_data *clk_data)
 {
        int i;
-       struct clk *clk;
+       struct clk_hw *hw;
 
        if (!clk_data)
                return -ENOMEM;
@@ -130,20 +120,21 @@ int mtk_clk_register_factors(const struct mtk_fixed_factor *clks, int num,
        for (i = 0; i < num; i++) {
                const struct mtk_fixed_factor *ff = &clks[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[ff->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[ff->id])) {
                        pr_warn("Trying to register duplicate clock ID: %d\n", ff->id);
                        continue;
                }
 
-               clk = clk_register_fixed_factor(NULL, ff->name, ff->parent_name,
+               hw = clk_hw_register_fixed_factor(NULL, ff->name, ff->parent_name,
                                CLK_SET_RATE_PARENT, ff->mult, ff->div);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", ff->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", ff->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[ff->id] = clk;
+               clk_data->hws[ff->id] = hw;
        }
 
        return 0;
@@ -152,19 +143,19 @@ err:
        while (--i >= 0) {
                const struct mtk_fixed_factor *ff = &clks[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[ff->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[ff->id]))
                        continue;
 
-               clk_unregister_fixed_factor(clk_data->clks[ff->id]);
-               clk_data->clks[ff->id] = ERR_PTR(-ENOENT);
+               clk_unregister_fixed_factor(clk_data->hws[ff->id]->clk);
+               clk_data->hws[ff->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 EXPORT_SYMBOL_GPL(mtk_clk_register_factors);
 
 void mtk_clk_unregister_factors(const struct mtk_fixed_factor *clks, int num,
-                               struct clk_onecell_data *clk_data)
+                               struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
@@ -174,19 +165,19 @@ void mtk_clk_unregister_factors(const struct mtk_fixed_factor *clks, int num,
        for (i = num; i > 0; i--) {
                const struct mtk_fixed_factor *ff = &clks[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[ff->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[ff->id]))
                        continue;
 
-               clk_unregister_fixed_factor(clk_data->clks[ff->id]);
-               clk_data->clks[ff->id] = ERR_PTR(-ENOENT);
+               clk_unregister_fixed_factor(clk_data->hws[ff->id]->clk);
+               clk_data->hws[ff->id] = ERR_PTR(-ENOENT);
        }
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_factors);
 
-struct clk *mtk_clk_register_composite(const struct mtk_composite *mc,
+static struct clk_hw *mtk_clk_register_composite(const struct mtk_composite *mc,
                void __iomem *base, spinlock_t *lock)
 {
-       struct clk *clk;
+       struct clk_hw *hw;
        struct clk_mux *mux = NULL;
        struct clk_gate *gate = NULL;
        struct clk_divider *div = NULL;
@@ -250,18 +241,18 @@ struct clk *mtk_clk_register_composite(const struct mtk_composite *mc,
                div_ops = &clk_divider_ops;
        }
 
-       clk = clk_register_composite(NULL, mc->name, parent_names, num_parents,
+       hw = clk_hw_register_composite(NULL, mc->name, parent_names, num_parents,
                mux_hw, mux_ops,
                div_hw, div_ops,
                gate_hw, gate_ops,
                mc->flags);
 
-       if (IS_ERR(clk)) {
-               ret = PTR_ERR(clk);
+       if (IS_ERR(hw)) {
+               ret = PTR_ERR(hw);
                goto err_out;
        }
 
-       return clk;
+       return hw;
 err_out:
        kfree(div);
        kfree(gate);
@@ -270,15 +261,13 @@ err_out:
        return ERR_PTR(ret);
 }
 
-static void mtk_clk_unregister_composite(struct clk *clk)
+static void mtk_clk_unregister_composite(struct clk_hw *hw)
 {
-       struct clk_hw *hw;
        struct clk_composite *composite;
        struct clk_mux *mux = NULL;
        struct clk_gate *gate = NULL;
        struct clk_divider *div = NULL;
 
-       hw = __clk_get_hw(clk);
        if (!hw)
                return;
 
@@ -290,7 +279,7 @@ static void mtk_clk_unregister_composite(struct clk *clk)
        if (composite->rate_hw)
                div = to_clk_divider(composite->rate_hw);
 
-       clk_unregister_composite(clk);
+       clk_hw_unregister_composite(hw);
        kfree(div);
        kfree(gate);
        kfree(mux);
@@ -298,9 +287,9 @@ static void mtk_clk_unregister_composite(struct clk *clk)
 
 int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
                                void __iomem *base, spinlock_t *lock,
-                               struct clk_onecell_data *clk_data)
+                               struct clk_hw_onecell_data *clk_data)
 {
-       struct clk *clk;
+       struct clk_hw *hw;
        int i;
 
        if (!clk_data)
@@ -309,20 +298,21 @@ int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
        for (i = 0; i < num; i++) {
                const struct mtk_composite *mc = &mcs[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[mc->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[mc->id])) {
                        pr_warn("Trying to register duplicate clock ID: %d\n",
                                mc->id);
                        continue;
                }
 
-               clk = mtk_clk_register_composite(mc, base, lock);
+               hw = mtk_clk_register_composite(mc, base, lock);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", mc->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", mc->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[mc->id] = clk;
+               clk_data->hws[mc->id] = hw;
        }
 
        return 0;
@@ -331,19 +321,19 @@ err:
        while (--i >= 0) {
                const struct mtk_composite *mc = &mcs[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mcs->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mcs->id]))
                        continue;
 
-               mtk_clk_unregister_composite(clk_data->clks[mc->id]);
-               clk_data->clks[mc->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_composite(clk_data->hws[mc->id]);
+               clk_data->hws[mc->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 EXPORT_SYMBOL_GPL(mtk_clk_register_composites);
 
 void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,
-                                  struct clk_onecell_data *clk_data)
+                                  struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
@@ -353,20 +343,20 @@ void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,
        for (i = num; i > 0; i--) {
                const struct mtk_composite *mc = &mcs[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mc->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mc->id]))
                        continue;
 
-               mtk_clk_unregister_composite(clk_data->clks[mc->id]);
-               clk_data->clks[mc->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_composite(clk_data->hws[mc->id]);
+               clk_data->hws[mc->id] = ERR_PTR(-ENOENT);
        }
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_composites);
 
 int mtk_clk_register_dividers(const struct mtk_clk_divider *mcds, int num,
                              void __iomem *base, spinlock_t *lock,
-                             struct clk_onecell_data *clk_data)
+                             struct clk_hw_onecell_data *clk_data)
 {
-       struct clk *clk;
+       struct clk_hw *hw;
        int i;
 
        if (!clk_data)
@@ -375,22 +365,23 @@ int mtk_clk_register_dividers(const struct mtk_clk_divider *mcds, int num,
        for (i = 0; i <  num; i++) {
                const struct mtk_clk_divider *mcd = &mcds[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[mcd->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[mcd->id])) {
                        pr_warn("Trying to register duplicate clock ID: %d\n",
                                mcd->id);
                        continue;
                }
 
-               clk = clk_register_divider(NULL, mcd->name, mcd->parent_name,
+               hw = clk_hw_register_divider(NULL, mcd->name, mcd->parent_name,
                        mcd->flags, base +  mcd->div_reg, mcd->div_shift,
                        mcd->div_width, mcd->clk_divider_flags, lock);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", mcd->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", mcd->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[mcd->id] = clk;
+               clk_data->hws[mcd->id] = hw;
        }
 
        return 0;
@@ -399,18 +390,18 @@ err:
        while (--i >= 0) {
                const struct mtk_clk_divider *mcd = &mcds[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mcd->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mcd->id]))
                        continue;
 
-               mtk_clk_unregister_composite(clk_data->clks[mcd->id]);
-               clk_data->clks[mcd->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_composite(clk_data->hws[mcd->id]);
+               clk_data->hws[mcd->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 
 void mtk_clk_unregister_dividers(const struct mtk_clk_divider *mcds, int num,
-                                struct clk_onecell_data *clk_data)
+                                struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
@@ -420,18 +411,18 @@ void mtk_clk_unregister_dividers(const struct mtk_clk_divider *mcds, int num,
        for (i = num; i > 0; i--) {
                const struct mtk_clk_divider *mcd = &mcds[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mcd->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mcd->id]))
                        continue;
 
-               clk_unregister_divider(clk_data->clks[mcd->id]);
-               clk_data->clks[mcd->id] = ERR_PTR(-ENOENT);
+               clk_unregister_divider(clk_data->hws[mcd->id]->clk);
+               clk_data->hws[mcd->id] = ERR_PTR(-ENOENT);
        }
 }
 
 int mtk_clk_simple_probe(struct platform_device *pdev)
 {
        const struct mtk_clk_desc *mcd;
-       struct clk_onecell_data *clk_data;
+       struct clk_hw_onecell_data *clk_data;
        struct device_node *node = pdev->dev.of_node;
        int r;
 
@@ -447,7 +438,7 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
        if (r)
                goto free_data;
 
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
                goto unregister_clks;
 
@@ -465,7 +456,7 @@ free_data:
 int mtk_clk_simple_remove(struct platform_device *pdev)
 {
        const struct mtk_clk_desc *mcd = of_device_get_match_data(&pdev->dev);
-       struct clk_onecell_data *clk_data = platform_get_drvdata(pdev);
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
        struct device_node *node = pdev->dev.of_node;
 
        of_clk_del_provider(node);
index bf6565a..adb1304 100644 (file)
@@ -35,9 +35,9 @@ struct mtk_fixed_clk {
        }
 
 int mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks, int num,
-                               struct clk_onecell_data *clk_data);
+                               struct clk_hw_onecell_data *clk_data);
 void mtk_clk_unregister_fixed_clks(const struct mtk_fixed_clk *clks, int num,
-                                  struct clk_onecell_data *clk_data);
+                                  struct clk_hw_onecell_data *clk_data);
 
 struct mtk_fixed_factor {
        int id;
@@ -56,9 +56,9 @@ struct mtk_fixed_factor {
        }
 
 int mtk_clk_register_factors(const struct mtk_fixed_factor *clks, int num,
-                            struct clk_onecell_data *clk_data);
+                            struct clk_hw_onecell_data *clk_data);
 void mtk_clk_unregister_factors(const struct mtk_fixed_factor *clks, int num,
-                               struct clk_onecell_data *clk_data);
+                               struct clk_hw_onecell_data *clk_data);
 
 struct mtk_composite {
        int id;
@@ -147,14 +147,11 @@ struct mtk_composite {
                .flags = 0,                                             \
        }
 
-struct clk *mtk_clk_register_composite(const struct mtk_composite *mc,
-               void __iomem *base, spinlock_t *lock);
-
 int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
                                void __iomem *base, spinlock_t *lock,
-                               struct clk_onecell_data *clk_data);
+                               struct clk_hw_onecell_data *clk_data);
 void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,
-                                  struct clk_onecell_data *clk_data);
+                                  struct clk_hw_onecell_data *clk_data);
 
 struct mtk_clk_divider {
        int id;
@@ -180,14 +177,14 @@ struct mtk_clk_divider {
 
 int mtk_clk_register_dividers(const struct mtk_clk_divider *mcds, int num,
                              void __iomem *base, spinlock_t *lock,
-                             struct clk_onecell_data *clk_data);
+                             struct clk_hw_onecell_data *clk_data);
 void mtk_clk_unregister_dividers(const struct mtk_clk_divider *mcds, int num,
-                                struct clk_onecell_data *clk_data);
+                                struct clk_hw_onecell_data *clk_data);
 
-struct clk_onecell_data *mtk_alloc_clk_data(unsigned int clk_num);
-void mtk_free_clk_data(struct clk_onecell_data *clk_data);
+struct clk_hw_onecell_data *mtk_alloc_clk_data(unsigned int clk_num);
+void mtk_free_clk_data(struct clk_hw_onecell_data *clk_data);
 
-struct clk *mtk_clk_register_ref2usb_tx(const char *name,
+struct clk_hw *mtk_clk_register_ref2usb_tx(const char *name,
                        const char *parent_name, void __iomem *reg);
 
 void mtk_register_reset_controller(struct device_node *np,
index 21ad5a4..cd5f9fd 100644 (file)
@@ -143,13 +143,13 @@ const struct clk_ops mtk_mux_gate_clr_set_upd_ops  = {
 };
 EXPORT_SYMBOL_GPL(mtk_mux_gate_clr_set_upd_ops);
 
-static struct clk *mtk_clk_register_mux(const struct mtk_mux *mux,
+static struct clk_hw *mtk_clk_register_mux(const struct mtk_mux *mux,
                                 struct regmap *regmap,
                                 spinlock_t *lock)
 {
        struct mtk_clk_mux *clk_mux;
        struct clk_init_data init = {};
-       struct clk *clk;
+       int ret;
 
        clk_mux = kzalloc(sizeof(*clk_mux), GFP_KERNEL);
        if (!clk_mux)
@@ -166,37 +166,34 @@ static struct clk *mtk_clk_register_mux(const struct mtk_mux *mux,
        clk_mux->lock = lock;
        clk_mux->hw.init = &init;
 
-       clk = clk_register(NULL, &clk_mux->hw);
-       if (IS_ERR(clk)) {
+       ret = clk_hw_register(NULL, &clk_mux->hw);
+       if (ret) {
                kfree(clk_mux);
-               return clk;
+               return ERR_PTR(ret);
        }
 
-       return clk;
+       return &clk_mux->hw;
 }
 
-static void mtk_clk_unregister_mux(struct clk *clk)
+static void mtk_clk_unregister_mux(struct clk_hw *hw)
 {
        struct mtk_clk_mux *mux;
-       struct clk_hw *hw;
-
-       hw = __clk_get_hw(clk);
        if (!hw)
                return;
 
        mux = to_mtk_clk_mux(hw);
 
-       clk_unregister(clk);
+       clk_hw_unregister(hw);
        kfree(mux);
 }
 
 int mtk_clk_register_muxes(const struct mtk_mux *muxes,
                           int num, struct device_node *node,
                           spinlock_t *lock,
-                          struct clk_onecell_data *clk_data)
+                          struct clk_hw_onecell_data *clk_data)
 {
        struct regmap *regmap;
-       struct clk *clk;
+       struct clk_hw *hw;
        int i;
 
        regmap = device_node_to_regmap(node);
@@ -208,20 +205,21 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
        for (i = 0; i < num; i++) {
                const struct mtk_mux *mux = &muxes[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[mux->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[mux->id])) {
                        pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
                                node, mux->id);
                        continue;
                }
 
-               clk = mtk_clk_register_mux(mux, regmap, lock);
+               hw = mtk_clk_register_mux(mux, regmap, lock);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", mux->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", mux->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[mux->id] = clk;
+               clk_data->hws[mux->id] = hw;
        }
 
        return 0;
@@ -230,19 +228,19 @@ err:
        while (--i >= 0) {
                const struct mtk_mux *mux = &muxes[i];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mux->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mux->id]))
                        continue;
 
-               mtk_clk_unregister_mux(clk_data->clks[mux->id]);
-               clk_data->clks[mux->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_mux(clk_data->hws[mux->id]);
+               clk_data->hws[mux->id] = ERR_PTR(-ENOENT);
        }
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 EXPORT_SYMBOL_GPL(mtk_clk_register_muxes);
 
 void mtk_clk_unregister_muxes(const struct mtk_mux *muxes, int num,
-                             struct clk_onecell_data *clk_data)
+                             struct clk_hw_onecell_data *clk_data)
 {
        int i;
 
@@ -252,11 +250,11 @@ void mtk_clk_unregister_muxes(const struct mtk_mux *muxes, int num,
        for (i = num; i > 0; i--) {
                const struct mtk_mux *mux = &muxes[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[mux->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[mux->id]))
                        continue;
 
-               mtk_clk_unregister_mux(clk_data->clks[mux->id]);
-               clk_data->clks[mux->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_mux(clk_data->hws[mux->id]);
+               clk_data->hws[mux->id] = ERR_PTR(-ENOENT);
        }
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_muxes);
index 903a3c9..6539c58 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/types.h>
 
 struct clk;
-struct clk_onecell_data;
+struct clk_hw_onecell_data;
 struct clk_ops;
 struct device_node;
 
@@ -84,9 +84,9 @@ extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
 int mtk_clk_register_muxes(const struct mtk_mux *muxes,
                           int num, struct device_node *node,
                           spinlock_t *lock,
-                          struct clk_onecell_data *clk_data);
+                          struct clk_hw_onecell_data *clk_data);
 
 void mtk_clk_unregister_muxes(const struct mtk_mux *muxes, int num,
-                             struct clk_onecell_data *clk_data);
+                             struct clk_hw_onecell_data *clk_data);
 
 #endif /* __DRV_CLK_MTK_MUX_H */
index ccaa208..54e6cfd 100644 (file)
@@ -243,7 +243,6 @@ static int mtk_pll_prepare(struct clk_hw *hw)
 {
        struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
        u32 r;
-       u32 div_en_mask;
 
        r = readl(pll->pwr_addr) | CON0_PWR_ON;
        writel(r, pll->pwr_addr);
@@ -256,9 +255,8 @@ static int mtk_pll_prepare(struct clk_hw *hw)
        r = readl(pll->en_addr) | BIT(pll->data->pll_en_bit);
        writel(r, pll->en_addr);
 
-       div_en_mask = pll->data->en_mask & ~CON0_BASE_EN;
-       if (div_en_mask) {
-               r = readl(pll->base_addr + REG_CON0) | div_en_mask;
+       if (pll->data->en_mask) {
+               r = readl(pll->base_addr + REG_CON0) | pll->data->en_mask;
                writel(r, pll->base_addr + REG_CON0);
        }
 
@@ -279,7 +277,6 @@ static void mtk_pll_unprepare(struct clk_hw *hw)
 {
        struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
        u32 r;
-       u32 div_en_mask;
 
        if (pll->data->flags & HAVE_RST_BAR) {
                r = readl(pll->base_addr + REG_CON0);
@@ -289,9 +286,8 @@ static void mtk_pll_unprepare(struct clk_hw *hw)
 
        __mtk_pll_tuner_disable(pll);
 
-       div_en_mask = pll->data->en_mask & ~CON0_BASE_EN;
-       if (div_en_mask) {
-               r = readl(pll->base_addr + REG_CON0) & ~div_en_mask;
+       if (pll->data->en_mask) {
+               r = readl(pll->base_addr + REG_CON0) & ~pll->data->en_mask;
                writel(r, pll->base_addr + REG_CON0);
        }
 
@@ -314,12 +310,12 @@ static const struct clk_ops mtk_pll_ops = {
        .set_rate       = mtk_pll_set_rate,
 };
 
-static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data,
+static struct clk_hw *mtk_clk_register_pll(const struct mtk_pll_data *data,
                void __iomem *base)
 {
        struct mtk_clk_pll *pll;
        struct clk_init_data init = {};
-       struct clk *clk;
+       int ret;
        const char *parent_name = "clk26m";
 
        pll = kzalloc(sizeof(*pll), GFP_KERNEL);
@@ -354,36 +350,36 @@ static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data,
                init.parent_names = &parent_name;
        init.num_parents = 1;
 
-       clk = clk_register(NULL, &pll->hw);
+       ret = clk_hw_register(NULL, &pll->hw);
 
-       if (IS_ERR(clk))
+       if (ret) {
                kfree(pll);
+               return ERR_PTR(ret);
+       }
 
-       return clk;
+       return &pll->hw;
 }
 
-static void mtk_clk_unregister_pll(struct clk *clk)
+static void mtk_clk_unregister_pll(struct clk_hw *hw)
 {
-       struct clk_hw *hw;
        struct mtk_clk_pll *pll;
 
-       hw = __clk_get_hw(clk);
        if (!hw)
                return;
 
        pll = to_mtk_clk_pll(hw);
 
-       clk_unregister(clk);
+       clk_hw_unregister(hw);
        kfree(pll);
 }
 
 int mtk_clk_register_plls(struct device_node *node,
                          const struct mtk_pll_data *plls, int num_plls,
-                         struct clk_onecell_data *clk_data)
+                         struct clk_hw_onecell_data *clk_data)
 {
        void __iomem *base;
        int i;
-       struct clk *clk;
+       struct clk_hw *hw;
 
        base = of_iomap(node, 0);
        if (!base) {
@@ -394,20 +390,21 @@ int mtk_clk_register_plls(struct device_node *node,
        for (i = 0; i < num_plls; i++) {
                const struct mtk_pll_data *pll = &plls[i];
 
-               if (!IS_ERR_OR_NULL(clk_data->clks[pll->id])) {
+               if (!IS_ERR_OR_NULL(clk_data->hws[pll->id])) {
                        pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
                                node, pll->id);
                        continue;
                }
 
-               clk = mtk_clk_register_pll(pll, base);
+               hw = mtk_clk_register_pll(pll, base);
 
-               if (IS_ERR(clk)) {
-                       pr_err("Failed to register clk %s: %pe\n", pll->name, clk);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", pll->name,
+                              hw);
                        goto err;
                }
 
-               clk_data->clks[pll->id] = clk;
+               clk_data->hws[pll->id] = hw;
        }
 
        return 0;
@@ -416,27 +413,26 @@ err:
        while (--i >= 0) {
                const struct mtk_pll_data *pll = &plls[i];
 
-               mtk_clk_unregister_pll(clk_data->clks[pll->id]);
-               clk_data->clks[pll->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_pll(clk_data->hws[pll->id]);
+               clk_data->hws[pll->id] = ERR_PTR(-ENOENT);
        }
 
        iounmap(base);
 
-       return PTR_ERR(clk);
+       return PTR_ERR(hw);
 }
 EXPORT_SYMBOL_GPL(mtk_clk_register_plls);
 
-static __iomem void *mtk_clk_pll_get_base(struct clk *clk,
+static __iomem void *mtk_clk_pll_get_base(struct clk_hw *hw,
                                          const struct mtk_pll_data *data)
 {
-       struct clk_hw *hw = __clk_get_hw(clk);
        struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
 
        return pll->base_addr - data->reg;
 }
 
 void mtk_clk_unregister_plls(const struct mtk_pll_data *plls, int num_plls,
-                            struct clk_onecell_data *clk_data)
+                            struct clk_hw_onecell_data *clk_data)
 {
        __iomem void *base = NULL;
        int i;
@@ -447,7 +443,7 @@ void mtk_clk_unregister_plls(const struct mtk_pll_data *plls, int num_plls,
        for (i = num_plls; i > 0; i--) {
                const struct mtk_pll_data *pll = &plls[i - 1];
 
-               if (IS_ERR_OR_NULL(clk_data->clks[pll->id]))
+               if (IS_ERR_OR_NULL(clk_data->hws[pll->id]))
                        continue;
 
                /*
@@ -456,10 +452,10 @@ void mtk_clk_unregister_plls(const struct mtk_pll_data *plls, int num_plls,
                 * pointer to the I/O region base address. We have to fetch
                 * it from one of the registered clks.
                 */
-               base = mtk_clk_pll_get_base(clk_data->clks[pll->id], pll);
+               base = mtk_clk_pll_get_base(clk_data->hws[pll->id], pll);
 
-               mtk_clk_unregister_pll(clk_data->clks[pll->id]);
-               clk_data->clks[pll->id] = ERR_PTR(-ENOENT);
+               mtk_clk_unregister_pll(clk_data->hws[pll->id]);
+               clk_data->hws[pll->id] = ERR_PTR(-ENOENT);
        }
 
        iounmap(base);
index bf06e44..fe31997 100644 (file)
@@ -10,7 +10,7 @@
 #include <linux/types.h>
 
 struct clk_ops;
-struct clk_onecell_data;
+struct clk_hw_onecell_data;
 struct device_node;
 
 struct mtk_pll_div_table {
@@ -50,8 +50,8 @@ struct mtk_pll_data {
 
 int mtk_clk_register_plls(struct device_node *node,
                          const struct mtk_pll_data *plls, int num_plls,
-                         struct clk_onecell_data *clk_data);
+                         struct clk_hw_onecell_data *clk_data);
 void mtk_clk_unregister_plls(const struct mtk_pll_data *plls, int num_plls,
-                            struct clk_onecell_data *clk_data);
+                            struct clk_hw_onecell_data *clk_data);
 
 #endif /* __DRV_CLK_MTK_PLL_H */
index c281f3a..cacaf9b 100644 (file)
@@ -32,9 +32,12 @@ config CLK_RENESAS
        select CLK_R8A77995 if ARCH_R8A77995
        select CLK_R8A779A0 if ARCH_R8A779A0
        select CLK_R8A779F0 if ARCH_R8A779F0
+       select CLK_R8A779G0 if ARCH_R8A779G0
        select CLK_R9A06G032 if ARCH_R9A06G032
+       select CLK_R9A07G043 if ARCH_R9A07G043
        select CLK_R9A07G044 if ARCH_R9A07G044
        select CLK_R9A07G054 if ARCH_R9A07G054
+       select CLK_R9A09G011 if ARCH_R9A09G011
        select CLK_SH73A0 if ARCH_SH73A0
 
 if CLK_RENESAS
@@ -157,9 +160,17 @@ config CLK_R8A779F0
        bool "R-Car S4-8 clock support" if COMPILE_TEST
        select CLK_RCAR_GEN4_CPG
 
+config CLK_R8A779G0
+       bool "R-Car V4H clock support" if COMPILE_TEST
+       select CLK_RCAR_GEN4_CPG
+
 config CLK_R9A06G032
        bool "RZ/N1D clock support" if COMPILE_TEST
 
+config CLK_R9A07G043
+       bool "RZ/G2UL clock support" if COMPILE_TEST
+       select CLK_RZG2L
+
 config CLK_R9A07G044
        bool "RZ/G2L clock support" if COMPILE_TEST
        select CLK_RZG2L
@@ -168,6 +179,10 @@ config CLK_R9A07G054
        bool "RZ/V2L clock support" if COMPILE_TEST
        select CLK_RZG2L
 
+config CLK_R9A09G011
+       bool "RZ/V2M clock support" if COMPILE_TEST
+       select CLK_RZG2L
+
 config CLK_SH73A0
        bool "SH-Mobile AG5 clock support" if COMPILE_TEST
        select CLK_RENESAS_CPG_MSTP
@@ -200,7 +215,7 @@ config CLK_RCAR_USB2_CLOCK_SEL
          This is a driver for R-Car USB2 clock selector
 
 config CLK_RZG2L
-       bool "Renesas RZ/{G2L,V2L} family clock support" if COMPILE_TEST
+       bool "Renesas RZ/{G2L,G2UL,V2L} family clock support" if COMPILE_TEST
        select RESET_CONTROLLER
 
 # Generic
index d5e5716..de90762 100644 (file)
@@ -29,9 +29,12 @@ obj-$(CONFIG_CLK_R8A77990)           += r8a77990-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A77995)             += r8a77995-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A779A0)             += r8a779a0-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A779F0)             += r8a779f0-cpg-mssr.o
+obj-$(CONFIG_CLK_R8A779G0)             += r8a779g0-cpg-mssr.o
 obj-$(CONFIG_CLK_R9A06G032)            += r9a06g032-clocks.o
+obj-$(CONFIG_CLK_R9A07G043)            += r9a07g043-cpg.o
 obj-$(CONFIG_CLK_R9A07G044)            += r9a07g044-cpg.o
 obj-$(CONFIG_CLK_R9A07G054)            += r9a07g044-cpg.o
+obj-$(CONFIG_CLK_R9A09G011)            += r9a09g011-cpg.o
 obj-$(CONFIG_CLK_SH73A0)               += clk-sh73a0.o
 
 # Family
index 95dd56b..ad03c09 100644 (file)
@@ -68,12 +68,8 @@ static const struct cpg_core_clk r8a774a1_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A774A1_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A774A1_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A774A1_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
        DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
 
@@ -109,6 +105,9 @@ static const struct cpg_core_clk r8a774a1_core_clks[] __initconst = {
        DEF_GEN3_SD("sd2",      R8A774A1_CLK_SD2,   R8A774A1_CLK_SD2H, 0x268),
        DEF_GEN3_SD("sd3",      R8A774A1_CLK_SD3,   R8A774A1_CLK_SD3H, 0x26c),
 
+       DEF_BASE("rpc",         R8A774A1_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A774A1_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A774A1_CLK_RPC),
+
        DEF_FIXED("cl",         R8A774A1_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cp",         R8A774A1_CLK_CP,    CLK_EXTAL,      2, 1),
        DEF_FIXED("cpex",       R8A774A1_CLK_CPEX,  CLK_EXTAL,      2, 1),
index 56061b9..ab087b0 100644 (file)
@@ -66,12 +66,8 @@ static const struct cpg_core_clk r8a774b1_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A774B1_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A774B1_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A774B1_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
        DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
 
@@ -106,6 +102,9 @@ static const struct cpg_core_clk r8a774b1_core_clks[] __initconst = {
        DEF_GEN3_SD("sd2",      R8A774B1_CLK_SD2,   R8A774B1_CLK_SD2H, 0x268),
        DEF_GEN3_SD("sd3",      R8A774B1_CLK_SD3,   R8A774B1_CLK_SD3H, 0x26c),
 
+       DEF_BASE("rpc",         R8A774B1_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A774B1_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A774B1_CLK_RPC),
+
        DEF_FIXED("cl",         R8A774B1_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cp",         R8A774B1_CLK_CP,    CLK_EXTAL,      2, 1),
        DEF_FIXED("cpex",       R8A774B1_CLK_CPEX,  CLK_EXTAL,      2, 1),
index b5eb5dc..c9c8fde 100644 (file)
@@ -77,11 +77,6 @@ static const struct cpg_core_clk r8a774c0_core_clks[] __initconst = {
 
        DEF_FIXED_RPCSRC_E3(".rpcsrc", CLK_RPCSRC, CLK_PLL0, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A774C0_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A774C0_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A774C0_CLK_RPC),
-
        DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
 
        DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
@@ -108,6 +103,9 @@ static const struct cpg_core_clk r8a774c0_core_clks[] __initconst = {
        DEF_FIXED("s3d2",      R8A774C0_CLK_S3D2,  CLK_S3,         2, 1),
        DEF_FIXED("s3d4",      R8A774C0_CLK_S3D4,  CLK_S3,         4, 1),
 
+       DEF_BASE("rpc",        R8A774C0_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",      R8A774C0_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A774C0_CLK_RPC),
+
        DEF_GEN3_SDH("sd0h",   R8A774C0_CLK_SD0H, CLK_SDSRC,         0x0074),
        DEF_GEN3_SDH("sd1h",   R8A774C0_CLK_SD1H, CLK_SDSRC,         0x0078),
        DEF_GEN3_SDH("sd3h",   R8A774C0_CLK_SD3H, CLK_SDSRC,         0x026c),
index 2950f0d..a790061 100644 (file)
@@ -68,12 +68,8 @@ static const struct cpg_core_clk r8a774e1_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A774E1_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A774E1_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A774E1_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
        DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
 
@@ -109,6 +105,9 @@ static const struct cpg_core_clk r8a774e1_core_clks[] __initconst = {
        DEF_GEN3_SD("sd2",      R8A774E1_CLK_SD2,   R8A774E1_CLK_SD2H, 0x268),
        DEF_GEN3_SD("sd3",      R8A774E1_CLK_SD3,   R8A774E1_CLK_SD3H, 0x26c),
 
+       DEF_BASE("rpc",         R8A774E1_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A774E1_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A774E1_CLK_RPC),
+
        DEF_FIXED("cl",         R8A774E1_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cr",         R8A774E1_CLK_CR,    CLK_PLL1_DIV4,  2, 1),
        DEF_FIXED("cp",         R8A774E1_CLK_CP,    CLK_EXTAL,      2, 1),
index 991a443..301475c 100644 (file)
@@ -71,12 +71,8 @@ static struct cpg_core_clk r8a7795_core_clks[] __initdata = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A7795_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A7795_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A7795_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
        DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
 
@@ -113,6 +109,9 @@ static struct cpg_core_clk r8a7795_core_clks[] __initdata = {
        DEF_GEN3_SD("sd2",      R8A7795_CLK_SD2,   R8A7795_CLK_SD2H, 0x268),
        DEF_GEN3_SD("sd3",      R8A7795_CLK_SD3,   R8A7795_CLK_SD3H, 0x26c),
 
+       DEF_BASE("rpc",         R8A7795_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A7795_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A7795_CLK_RPC),
+
        DEF_FIXED("cl",         R8A7795_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cr",         R8A7795_CLK_CR,    CLK_PLL1_DIV4,  2, 1),
        DEF_FIXED("cp",         R8A7795_CLK_CP,    CLK_EXTAL,      2, 1),
index 7950313..c496931 100644 (file)
@@ -73,12 +73,8 @@ static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A7796_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A7796_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A7796_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
        DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
 
@@ -115,6 +111,9 @@ static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {
        DEF_GEN3_SD("sd2",      R8A7796_CLK_SD2,   R8A7796_CLK_SD2H, 0x268),
        DEF_GEN3_SD("sd3",      R8A7796_CLK_SD3,   R8A7796_CLK_SD3H, 0x26c),
 
+       DEF_BASE("rpc",         R8A7796_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A7796_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A7796_CLK_RPC),
+
        DEF_FIXED("cl",         R8A7796_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cr",         R8A7796_CLK_CR,    CLK_PLL1_DIV4,  2, 1),
        DEF_FIXED("cp",         R8A7796_CLK_CP,    CLK_EXTAL,      2, 1),
index d687c29..78f6e53 100644 (file)
@@ -69,12 +69,8 @@ static const struct cpg_core_clk r8a77965_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,                 CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,                 CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,              CLK_PLL1_DIV2,  2, 1),
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
-       DEF_BASE("rpc",         R8A77965_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A77965_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A77965_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
 
        DEF_GEN3_OSC(".r",      CLK_RINT,               CLK_EXTAL,      32),
 
@@ -110,6 +106,9 @@ static const struct cpg_core_clk r8a77965_core_clks[] __initconst = {
        DEF_GEN3_SD("sd2",      R8A77965_CLK_SD2,       R8A77965_CLK_SD2H, 0x268),
        DEF_GEN3_SD("sd3",      R8A77965_CLK_SD3,       R8A77965_CLK_SD3H, 0x26c),
 
+       DEF_BASE("rpc",         R8A77965_CLK_RPC,       CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A77965_CLK_RPCD2,     CLK_TYPE_GEN3_RPCD2, R8A77965_CLK_RPC),
+
        DEF_FIXED("cl",         R8A77965_CLK_CL,        CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cr",         R8A77965_CLK_CR,        CLK_PLL1_DIV4,  2, 1),
        DEF_FIXED("cp",         R8A77965_CLK_CP,        CLK_EXTAL,      2, 1),
index f3cd64d..06f925a 100644 (file)
@@ -66,13 +66,10 @@ static const struct cpg_core_clk r8a77980_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
+
        DEF_BASE(".rpcsrc",     CLK_RPCSRC, CLK_TYPE_GEN3_RPCSRC, CLK_PLL1),
-       DEF_RATE(".oco",        CLK_OCO,           32768),
 
-       DEF_BASE("rpc",         R8A77980_CLK_RPC, CLK_TYPE_GEN3_RPC,
-                CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A77980_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2,
-                R8A77980_CLK_RPC),
+       DEF_RATE(".oco",        CLK_OCO,           32768),
 
        /* Core Clock Outputs */
        DEF_FIXED("ztr",        R8A77980_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
@@ -99,6 +96,9 @@ static const struct cpg_core_clk r8a77980_core_clks[] __initconst = {
        DEF_GEN3_SDH("sd0h",    R8A77980_CLK_SD0H,  CLK_SDSRC,         0x0074),
        DEF_GEN3_SD("sd0",      R8A77980_CLK_SD0,   R8A77980_CLK_SD0H, 0x0074),
 
+       DEF_BASE("rpc",         R8A77980_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A77980_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A77980_CLK_RPC),
+
        DEF_FIXED("cl",         R8A77980_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cp",         R8A77980_CLK_CP,    CLK_EXTAL,      2, 1),
        DEF_FIXED("cpex",       R8A77980_CLK_CPEX,  CLK_EXTAL,      2, 1),
index d34d97b..b666d09 100644 (file)
@@ -44,6 +44,7 @@ enum clk_ids {
        CLK_S2,
        CLK_S3,
        CLK_SDSRC,
+       CLK_RPCSRC,
        CLK_RINT,
        CLK_OCO,
 
@@ -74,6 +75,8 @@ static const struct cpg_core_clk r8a77990_core_clks[] __initconst = {
        DEF_FIXED(".s3",       CLK_S3,             CLK_PLL1,       6, 1),
        DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
 
+       DEF_FIXED_RPCSRC_E3(".rpcsrc", CLK_RPCSRC, CLK_PLL0, CLK_PLL1),
+
        DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
 
        DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
@@ -107,6 +110,9 @@ static const struct cpg_core_clk r8a77990_core_clks[] __initconst = {
        DEF_GEN3_SD("sd1",     R8A77990_CLK_SD1,   R8A77990_CLK_SD1H, 0x0078),
        DEF_GEN3_SD("sd3",     R8A77990_CLK_SD3,   R8A77990_CLK_SD3H, 0x026c),
 
+       DEF_BASE("rpc",        R8A77990_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",      R8A77990_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A77990_CLK_RPC),
+
        DEF_FIXED("cl",        R8A77990_CLK_CL,    CLK_PLL1,      48, 1),
        DEF_FIXED("cr",        R8A77990_CLK_CR,    CLK_PLL1D2,     2, 1),
        DEF_FIXED("cp",        R8A77990_CLK_CP,    CLK_EXTAL,      2, 1),
@@ -215,6 +221,7 @@ static const struct mssr_mod_clk r8a77990_mod_clks[] __initconst = {
        DEF_MOD("can-fd",                914,   R8A77990_CLK_S3D2),
        DEF_MOD("can-if1",               915,   R8A77990_CLK_S3D4),
        DEF_MOD("can-if0",               916,   R8A77990_CLK_S3D4),
+       DEF_MOD("rpc-if",                917,   R8A77990_CLK_RPCD2),
        DEF_MOD("i2c6",                  918,   R8A77990_CLK_S3D2),
        DEF_MOD("i2c5",                  919,   R8A77990_CLK_S3D2),
        DEF_MOD("i2c-dvfs",              926,   R8A77990_CLK_CP),
index 525eef1..24ba909 100644 (file)
@@ -42,6 +42,7 @@ enum clk_ids {
        CLK_S2,
        CLK_S3,
        CLK_SDSRC,
+       CLK_RPCSRC,
        CLK_RINT,
        CLK_OCO,
 
@@ -70,6 +71,8 @@ static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
        DEF_FIXED(".s3",       CLK_S3,             CLK_PLL1,       6, 1),
        DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
 
+       DEF_FIXED_RPCSRC_D3(".rpcsrc", CLK_RPCSRC, CLK_PLL0, CLK_PLL1),
+
        DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
 
        DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
@@ -103,8 +106,11 @@ static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
        DEF_GEN3_PE("s3d2c",   R8A77995_CLK_S3D2C, CLK_S3, 2, CLK_PE, 2),
        DEF_GEN3_PE("s3d4c",   R8A77995_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4),
 
-       DEF_GEN3_SDH("sd0h",   R8A77995_CLK_SD0H, CLK_SDSRC,         0x268),
-       DEF_GEN3_SD("sd0",     R8A77995_CLK_SD0,  R8A77995_CLK_SD0H, 0x268),
+       DEF_GEN3_SDH("sd0h",   R8A77995_CLK_SD0H,  CLK_SDSRC,         0x268),
+       DEF_GEN3_SD("sd0",     R8A77995_CLK_SD0,   R8A77995_CLK_SD0H, 0x268),
+
+       DEF_BASE("rpc",        R8A77995_CLK_RPC,   CLK_TYPE_GEN3_RPC,   CLK_RPCSRC),
+       DEF_BASE("rpcd2",      R8A77995_CLK_RPCD2, CLK_TYPE_GEN3_RPCD2, R8A77995_CLK_RPC),
 
        DEF_DIV6P1("canfd",    R8A77995_CLK_CANFD, CLK_PLL0D3,    0x244),
        DEF_DIV6P1("mso",      R8A77995_CLK_MSO,   CLK_PLL1D2,    0x014),
@@ -174,6 +180,7 @@ static const struct mssr_mod_clk r8a77995_mod_clks[] __initconst = {
        DEF_MOD("can-fd",                914,   R8A77995_CLK_S3D2),
        DEF_MOD("can-if1",               915,   R8A77995_CLK_S3D4),
        DEF_MOD("can-if0",               916,   R8A77995_CLK_S3D4),
+       DEF_MOD("rpc-if",                917,   R8A77995_CLK_RPCD2),
        DEF_MOD("i2c3",                  928,   R8A77995_CLK_S3D2),
        DEF_MOD("i2c2",                  929,   R8A77995_CLK_S3D2),
        DEF_MOD("i2c1",                  930,   R8A77995_CLK_S3D2),
index fadd8a1..d74d468 100644 (file)
@@ -85,11 +85,10 @@ static const struct cpg_core_clk r8a779a0_core_clks[] __initconst = {
        DEF_FIXED(".s1",                CLK_S1,         CLK_PLL1_DIV2,  2, 1),
        DEF_FIXED(".s3",                CLK_S3,         CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".sdsrc",             CLK_SDSRC,      CLK_PLL5_DIV4,  1, 1),
+
        DEF_RATE(".oco",                CLK_OCO,        32768),
-       DEF_BASE(".rpcsrc",      CLK_RPCSRC,       CLK_TYPE_GEN4_RPCSRC, CLK_PLL5),
-       DEF_BASE("rpc",          R8A779A0_CLK_RPC, CLK_TYPE_GEN4_RPC, CLK_RPCSRC),
-       DEF_BASE("rpcd2",        R8A779A0_CLK_RPCD2, CLK_TYPE_GEN4_RPCD2,
-                R8A779A0_CLK_RPC),
+
+       DEF_BASE(".rpcsrc",             CLK_RPCSRC,     CLK_TYPE_GEN4_RPCSRC, CLK_PLL5),
 
        /* Core Clock Outputs */
        DEF_GEN4_Z("z0",        R8A779A0_CLK_Z0,        CLK_TYPE_GEN4_Z,        CLK_PLL20,      2, 0),
@@ -120,6 +119,10 @@ static const struct cpg_core_clk r8a779a0_core_clks[] __initconst = {
        DEF_GEN4_SDH("sdh0",    R8A779A0_CLK_SD0H,      CLK_SDSRC,         0x870),
        DEF_GEN4_SD("sd0",      R8A779A0_CLK_SD0,       R8A779A0_CLK_SD0H, 0x870),
 
+       DEF_BASE("rpc",         R8A779A0_CLK_RPC, CLK_TYPE_GEN4_RPC, CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A779A0_CLK_RPCD2, CLK_TYPE_GEN4_RPCD2,
+                R8A779A0_CLK_RPC),
+
        DEF_DIV6P1("mso",       R8A779A0_CLK_MSO,       CLK_PLL5_DIV4,  0x87c),
        DEF_DIV6P1("canfd",     R8A779A0_CLK_CANFD,     CLK_PLL5_DIV4,  0x878),
        DEF_DIV6P1("csi0",      R8A779A0_CLK_CSI0,      CLK_PLL5_DIV4,  0x880),
@@ -241,7 +244,7 @@ static const unsigned int r8a779a0_crit_mod_clks[] __initconst = {
 /*
  *   MD         EXTAL          PLL1    PLL20   PLL30   PLL4    PLL5    OSC
  * 14 13 (MHz)                    21      31
- * --------------------------------------------------------
+ * ----------------------------------------------------------------
  * 0  0         16.66 x 1      x128    x216    x128    x144    x192    /16
  * 0  1         20    x 1      x106    x180    x106    x120    x160    /19
  * 1  0         Prohibited setting
@@ -250,11 +253,11 @@ static const unsigned int r8a779a0_crit_mod_clks[] __initconst = {
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 13) | \
                                         (((md) & BIT(13)) >> 13))
 static const struct rcar_gen4_cpg_pll_config cpg_pll_configs[4] = {
-       /* EXTAL div    PLL1 mult/div   PLL2 mult/div   PLL3 mult/div   PLL5 mult/div   PLL6 mult/div   OSC prediv */
-       { 1,            128,    1,      0,      0,      0,      0,      192,    1,      0,      0,      16,     },
-       { 1,            106,    1,      0,      0,      0,      0,      160,    1,      0,      0,      19,     },
-       { 0,            0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      },
-       { 2,            128,    1,      0,      0,      0,      0,      192,    1,      0,      0,      32,     },
+       /* EXTAL div    PLL1 mult/div   PLL2 mult/div   PLL3 mult/div   PLL4 mult/div   PLL5 mult/div   PLL6 mult/div   OSC prediv */
+       { 1,            128,    1,      0,      0,      0,      0,      144,    1,      192,    1,      0,      0,      16,     },
+       { 1,            106,    1,      0,      0,      0,      0,      120,    1,      160,    1,      0,      0,      19,     },
+       { 0,            0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      },
+       { 2,            128,    1,      0,      0,      0,      0,      144,    1,      192,    1,      0,      0,      32,     },
 };
 
 
index 76b4419..c17ebe6 100644 (file)
@@ -70,12 +70,11 @@ static const struct cpg_core_clk r8a779f0_core_clks[] __initconst = {
        DEF_FIXED(".pll5_div4", CLK_PLL5_DIV4,  CLK_PLL5_DIV2,  2, 1),
        DEF_FIXED(".pll6_div2", CLK_PLL6_DIV2,  CLK_PLL6,       2, 1),
        DEF_FIXED(".s0",        CLK_S0,         CLK_PLL1_DIV2,  2, 1),
+
        DEF_BASE(".sdsrc",      CLK_SDSRC,      CLK_TYPE_GEN4_SDSRC, CLK_PLL5),
        DEF_RATE(".oco",        CLK_OCO,        32768),
 
-       DEF_BASE(".rpcsrc",     CLK_RPCSRC,             CLK_TYPE_GEN4_RPCSRC, CLK_PLL5),
-       DEF_BASE(".rpc",        R8A779F0_CLK_RPC,       CLK_TYPE_GEN4_RPC, CLK_RPCSRC),
-       DEF_BASE("rpcd2",       R8A779F0_CLK_RPCD2,     CLK_TYPE_GEN4_RPCD2, R8A779F0_CLK_RPC),
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC,     CLK_TYPE_GEN4_RPCSRC, CLK_PLL5),
 
        /* Core Clock Outputs */
        DEF_FIXED("s0d2",       R8A779F0_CLK_S0D2,      CLK_S0,         2, 1),
@@ -108,6 +107,10 @@ static const struct cpg_core_clk r8a779f0_core_clks[] __initconst = {
        DEF_FIXED("cpex",       R8A779F0_CLK_CPEX,      CLK_EXTAL,      2, 1),
 
        DEF_GEN4_SD("sd0",      R8A779F0_CLK_SD0,       CLK_SDSRC,      0x870),
+
+       DEF_BASE("rpc",         R8A779F0_CLK_RPC,       CLK_TYPE_GEN4_RPC, CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A779F0_CLK_RPCD2,     CLK_TYPE_GEN4_RPCD2, R8A779F0_CLK_RPC),
+
        DEF_DIV6P1("mso",       R8A779F0_CLK_MSO,       CLK_PLL5_DIV4,  0x87c),
 
        DEF_GEN4_OSC("osc",     R8A779F0_CLK_OSC,       CLK_EXTAL,      8),
@@ -129,6 +132,7 @@ static const struct mssr_mod_clk r8a779f0_mod_clks[] __initconst = {
        DEF_MOD("sys-dmac1",    710,    R8A779F0_CLK_S0D3_PER),
        DEF_MOD("wdt",          907,    R8A779F0_CLK_R),
        DEF_MOD("pfc0",         915,    R8A779F0_CLK_CL16M),
+       DEF_MOD("ufs",          1514,   R8A779F0_CLK_S0D4_HSC),
 };
 
 static const unsigned int r8a779f0_crit_mod_clks[] __initconst = {
@@ -139,23 +143,23 @@ static const unsigned int r8a779f0_crit_mod_clks[] __initconst = {
  * CPG Clock Data
  */
 /*
- *   MD         EXTAL          PLL1    PLL2    PLL3    PLL5    PLL6    OSC
+ *   MD         EXTAL          PLL1    PLL2    PLL3    PLL4    PLL5    PLL6    OSC
  * 14 13 (MHz)
- * ----------------------------------------------------------------
- * 0  0         16    / 1      x200    x150    x200    x200    x134    /15
- * 0  1         20    / 1      x160    x120    x160    x160    x106    /19
+ * ------------------------------------------------------------------------
+ * 0  0         16    / 1      x200    x150    x200    n/a     x200    x134    /15
+ * 0  1         20    / 1      x160    x120    x160    n/a     x160    x106    /19
  * 1  0         Prohibited setting
- * 1  1         40    / 2      x160    x120    x160    x160    x106    /38
+ * 1  1         40    / 2      x160    x120    x160    n/a     x160    x106    /38
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 13) | \
                                         (((md) & BIT(13)) >> 13))
 
 static const struct rcar_gen4_cpg_pll_config cpg_pll_configs[4] = {
-       /* EXTAL div    PLL1 mult/div   PLL2 mult/div   PLL3 mult/div   PLL5 mult/div   PLL6 mult/div   OSC prediv */
-       { 1,            200,    1,      150,    1,      200,    1,      200,    1,      134,    1,      15,     },
-       { 1,            160,    1,      120,    1,      160,    1,      160,    1,      106,    1,      19,     },
-       { 0,            0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      },
-       { 2,            160,    1,      120,    1,      160,    1,      160,    1,      106,    1,      38,     },
+       /* EXTAL div    PLL1 mult/div   PLL2 mult/div   PLL3 mult/div   PLL4 mult/div   PLL5 mult/div   PLL6 mult/div   OSC prediv */
+       { 1,            200,    1,      150,    1,      200,    1,      0,      0,      200,    1,      134,    1,      15,     },
+       { 1,            160,    1,      120,    1,      160,    1,      0,      0,      160,    1,      106,    1,      19,     },
+       { 0,            0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      },
+       { 2,            160,    1,      120,    1,      160,    1,      0,      0,      160,    1,      106,    1,      38,     },
 };
 
 static int __init r8a779f0_cpg_mssr_init(struct device *dev)
diff --git a/drivers/clk/renesas/r8a779g0-cpg-mssr.c b/drivers/clk/renesas/r8a779g0-cpg-mssr.c
new file mode 100644 (file)
index 0000000..3fc4233
--- /dev/null
@@ -0,0 +1,218 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * r8a779g0 Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ *
+ * Based on r8a779f0-cpg-mssr.c
+ */
+
+#include <linux/bitfield.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/soc/renesas/rcar-rst.h>
+
+#include <dt-bindings/clock/r8a779g0-cpg-mssr.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen4-cpg.h"
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R8A779G0_CLK_R,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+       CLK_EXTALR,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_PLL1,
+       CLK_PLL2,
+       CLK_PLL3,
+       CLK_PLL4,
+       CLK_PLL5,
+       CLK_PLL6,
+       CLK_PLL1_DIV2,
+       CLK_PLL2_DIV2,
+       CLK_PLL3_DIV2,
+       CLK_PLL4_DIV2,
+       CLK_PLL5_DIV2,
+       CLK_PLL5_DIV4,
+       CLK_PLL6_DIV2,
+       CLK_S0,
+       CLK_S0_VIO,
+       CLK_S0_VC,
+       CLK_S0_HSC,
+       CLK_SV_VIP,
+       CLK_SV_IR,
+       CLK_SDSRC,
+       CLK_RPCSRC,
+       CLK_VIO,
+       CLK_VC,
+       CLK_OCO,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+static const struct cpg_core_clk r8a779g0_core_clks[] __initconst = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",      CLK_EXTAL),
+       DEF_INPUT("extalr",     CLK_EXTALR),
+
+       /* Internal Core Clocks */
+       DEF_BASE(".main", CLK_MAIN,     CLK_TYPE_GEN4_MAIN, CLK_EXTAL),
+       DEF_BASE(".pll1", CLK_PLL1,     CLK_TYPE_GEN4_PLL1, CLK_MAIN),
+       DEF_BASE(".pll2", CLK_PLL2,     CLK_TYPE_GEN4_PLL2, CLK_MAIN),
+       DEF_BASE(".pll3", CLK_PLL3,     CLK_TYPE_GEN4_PLL3, CLK_MAIN),
+       DEF_BASE(".pll4", CLK_PLL4,     CLK_TYPE_GEN4_PLL4, CLK_MAIN),
+       DEF_BASE(".pll5", CLK_PLL5,     CLK_TYPE_GEN4_PLL5, CLK_MAIN),
+       DEF_BASE(".pll6", CLK_PLL6,     CLK_TYPE_GEN4_PLL6, CLK_MAIN),
+
+       DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2,  CLK_PLL1,       2, 1),
+       DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2,  CLK_PLL2,       2, 1),
+       DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2,  CLK_PLL3,       2, 1),
+       DEF_FIXED(".pll4_div2", CLK_PLL4_DIV2,  CLK_PLL4,       2, 1),
+       DEF_FIXED(".pll5_div2", CLK_PLL5_DIV2,  CLK_PLL5,       2, 1),
+       DEF_FIXED(".pll5_div4", CLK_PLL5_DIV4,  CLK_PLL5_DIV2,  2, 1),
+       DEF_FIXED(".pll6_div2", CLK_PLL6_DIV2,  CLK_PLL6,       2, 1),
+       DEF_FIXED(".s0",        CLK_S0,         CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s0_vio",    CLK_S0_VIO,     CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s0_vc",     CLK_S0_VC,      CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s0_hsc",    CLK_S0_HSC,     CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".sv_vip",    CLK_SV_VIP,     CLK_PLL1,       5, 1),
+       DEF_FIXED(".sv_ir",     CLK_SV_IR,      CLK_PLL1,       5, 1),
+       DEF_BASE(".sdsrc",      CLK_SDSRC,      CLK_TYPE_GEN4_SDSRC, CLK_PLL5),
+       DEF_RATE(".oco",        CLK_OCO,        32768),
+
+       DEF_BASE(".rpcsrc",     CLK_RPCSRC,             CLK_TYPE_GEN4_RPCSRC, CLK_PLL5),
+       DEF_FIXED(".vio",       CLK_VIO,        CLK_PLL5_DIV2,  3, 1),
+       DEF_FIXED(".vc",        CLK_VC,         CLK_PLL5_DIV2,  3, 1),
+
+       /* Core Clock Outputs */
+       DEF_FIXED("s0d2",       R8A779G0_CLK_S0D2,      CLK_S0,         2, 1),
+       DEF_FIXED("s0d3",       R8A779G0_CLK_S0D3,      CLK_S0,         3, 1),
+       DEF_FIXED("s0d4",       R8A779G0_CLK_S0D4,      CLK_S0,         4, 1),
+       DEF_FIXED("cl16m",      R8A779G0_CLK_CL16M,     CLK_S0,         48, 1),
+       DEF_FIXED("s0d1_vio",   R8A779G0_CLK_S0D1_VIO,  CLK_S0_VIO,     1, 1),
+       DEF_FIXED("s0d2_vio",   R8A779G0_CLK_S0D2_VIO,  CLK_S0_VIO,     2, 1),
+       DEF_FIXED("s0d4_vio",   R8A779G0_CLK_S0D4_VIO,  CLK_S0_VIO,     4, 1),
+       DEF_FIXED("s0d8_vio",   R8A779G0_CLK_S0D8_VIO,  CLK_S0_VIO,     8, 1),
+       DEF_FIXED("s0d1_vc",    R8A779G0_CLK_S0D1_VC,   CLK_S0_VC,      1, 1),
+       DEF_FIXED("s0d2_vc",    R8A779G0_CLK_S0D2_VC,   CLK_S0_VC,      2, 1),
+       DEF_FIXED("s0d4_vc",    R8A779G0_CLK_S0D4_VC,   CLK_S0_VC,      4, 1),
+       DEF_FIXED("s0d2_mm",    R8A779G0_CLK_S0D2_MM,   CLK_S0,         2, 1),
+       DEF_FIXED("s0d4_mm",    R8A779G0_CLK_S0D4_MM,   CLK_S0,         4, 1),
+       DEF_FIXED("cl16m_mm",   R8A779G0_CLK_CL16M_MM,  CLK_S0,         48, 1),
+       DEF_FIXED("s0d2_u3dg",  R8A779G0_CLK_S0D2_U3DG, CLK_S0,         2, 1),
+       DEF_FIXED("s0d4_u3dg",  R8A779G0_CLK_S0D4_U3DG, CLK_S0,         4, 1),
+       DEF_FIXED("s0d2_rt",    R8A779G0_CLK_S0D2_RT,   CLK_S0,         2, 1),
+       DEF_FIXED("s0d3_rt",    R8A779G0_CLK_S0D3_RT,   CLK_S0,         3, 1),
+       DEF_FIXED("s0d4_rt",    R8A779G0_CLK_S0D4_RT,   CLK_S0,         4, 1),
+       DEF_FIXED("s0d6_rt",    R8A779G0_CLK_S0D6_RT,   CLK_S0,         6, 1),
+       DEF_FIXED("s0d24_rt",   R8A779G0_CLK_S0D24_RT,  CLK_S0,         24, 1),
+       DEF_FIXED("cl16m_rt",   R8A779G0_CLK_CL16M_RT,  CLK_S0,         48, 1),
+       DEF_FIXED("s0d2_per",   R8A779G0_CLK_S0D2_PER,  CLK_S0,         2, 1),
+       DEF_FIXED("s0d3_per",   R8A779G0_CLK_S0D3_PER,  CLK_S0,         3, 1),
+       DEF_FIXED("s0d4_per",   R8A779G0_CLK_S0D4_PER,  CLK_S0,         4, 1),
+       DEF_FIXED("s0d6_per",   R8A779G0_CLK_S0D6_PER,  CLK_S0,         6, 1),
+       DEF_FIXED("s0d12_per",  R8A779G0_CLK_S0D12_PER, CLK_S0,         12, 1),
+       DEF_FIXED("s0d24_per",  R8A779G0_CLK_S0D24_PER, CLK_S0,         24, 1),
+       DEF_FIXED("cl16m_per",  R8A779G0_CLK_CL16M_PER, CLK_S0,         48, 1),
+       DEF_FIXED("s0d1_hsc",   R8A779G0_CLK_S0D1_HSC,  CLK_S0_HSC,     1, 1),
+       DEF_FIXED("s0d2_hsc",   R8A779G0_CLK_S0D2_HSC,  CLK_S0_HSC,     2, 1),
+       DEF_FIXED("s0d4_hsc",   R8A779G0_CLK_S0D4_HSC,  CLK_S0_HSC,     4, 1),
+       DEF_FIXED("cl16m_hsc",  R8A779G0_CLK_CL16M_HSC, CLK_S0_HSC,     48, 1),
+       DEF_FIXED("s0d2_cc",    R8A779G0_CLK_S0D2_CC,   CLK_S0,         2, 1),
+       DEF_FIXED("svd1_ir",    R8A779G0_CLK_SVD1_IR,   CLK_SV_IR,      1, 1),
+       DEF_FIXED("svd2_ir",    R8A779G0_CLK_SVD2_IR,   CLK_SV_IR,      2, 1),
+       DEF_FIXED("svd1_vip",   R8A779G0_CLK_SVD1_VIP,  CLK_SV_VIP,     1, 1),
+       DEF_FIXED("svd2_vip",   R8A779G0_CLK_SVD2_VIP,  CLK_SV_VIP,     2, 1),
+       DEF_FIXED("cbfusa",     R8A779G0_CLK_CBFUSA,    CLK_EXTAL,      2, 1),
+       DEF_FIXED("cpex",       R8A779G0_CLK_CPEX,      CLK_EXTAL,      2, 1),
+       DEF_FIXED("viobus",     R8A779G0_CLK_VIOBUS,    CLK_VIO,        1, 1),
+       DEF_FIXED("viobusd2",   R8A779G0_CLK_VIOBUSD2,  CLK_VIO,        2, 1),
+       DEF_FIXED("vcbus",      R8A779G0_CLK_VCBUS,     CLK_VC,         1, 1),
+       DEF_FIXED("vcbusd2",    R8A779G0_CLK_VCBUSD2,   CLK_VC,         2, 1),
+
+       DEF_GEN4_SD("sd0",      R8A779G0_CLK_SD0,       CLK_SDSRC,      0x870),
+       DEF_DIV6P1("mso",       R8A779G0_CLK_MSO,       CLK_PLL5_DIV4,  0x87c),
+
+       DEF_BASE("rpc",         R8A779G0_CLK_RPC,       CLK_TYPE_GEN4_RPC, CLK_RPCSRC),
+       DEF_BASE("rpcd2",       R8A779G0_CLK_RPCD2,     CLK_TYPE_GEN4_RPCD2, R8A779G0_CLK_RPC),
+
+       DEF_GEN4_OSC("osc",     R8A779G0_CLK_OSC,       CLK_EXTAL,      8),
+       DEF_GEN4_MDSEL("r",     R8A779G0_CLK_R, 29, CLK_EXTALR, 1, CLK_OCO, 1),
+};
+
+static const struct mssr_mod_clk r8a779g0_mod_clks[] __initconst = {
+       DEF_MOD("hscif0",       514,    R8A779G0_CLK_S0D3_PER),
+       DEF_MOD("hscif1",       515,    R8A779G0_CLK_S0D3_PER),
+       DEF_MOD("hscif2",       516,    R8A779G0_CLK_S0D3_PER),
+       DEF_MOD("hscif3",       517,    R8A779G0_CLK_S0D3_PER),
+};
+
+/*
+ * CPG Clock Data
+ */
+/*
+ *   MD         EXTAL          PLL1    PLL2    PLL3    PLL4    PLL5    PLL6    OSC
+ * 14 13 (MHz)
+ * ------------------------------------------------------------------------
+ * 0  0         16.66 / 1      x192    x204    x192    x144    x192    x168    /15
+ * 0  1         20    / 1      x160    x170    x160    x120    x160    x140    /19
+ * 1  0         Prohibited setting
+ * 1  1         33.33 / 2      x192    x204    x192    x144    x192    x168    /38
+ */
+#define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 13) | \
+                                        (((md) & BIT(13)) >> 13))
+
+static const struct rcar_gen4_cpg_pll_config cpg_pll_configs[4] = {
+       /* EXTAL div    PLL1 mult/div   PLL2 mult/div   PLL3 mult/div   PLL4 mult/div   PLL5 mult/div   PLL6 mult/div   OSC prediv */
+       { 1,            192,    1,      204,    1,      192,    1,      144,    1,      192,    1,      168,    1,      15,     },
+       { 1,            160,    1,      170,    1,      160,    1,      120,    1,      160,    1,      140,    1,      19,     },
+       { 0,            0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      },
+       { 2,            192,    1,      204,    1,      192,    1,      144,    1,      192,    1,      168,    1,      38,     },
+};
+
+static int __init r8a779g0_cpg_mssr_init(struct device *dev)
+{
+       const struct rcar_gen4_cpg_pll_config *cpg_pll_config;
+       u32 cpg_mode;
+       int error;
+
+       error = rcar_rst_read_mode_pins(&cpg_mode);
+       if (error)
+               return error;
+
+       cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
+       if (!cpg_pll_config->extal_div) {
+               dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode);
+               return -EINVAL;
+       }
+
+       return rcar_gen4_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode);
+}
+
+const struct cpg_mssr_info r8a779g0_cpg_mssr_info __initconst = {
+       /* Core Clocks */
+       .core_clks = r8a779g0_core_clks,
+       .num_core_clks = ARRAY_SIZE(r8a779g0_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Module Clocks */
+       .mod_clks = r8a779g0_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r8a779g0_mod_clks),
+       .num_hw_mod_clks = 30 * 32,
+
+       /* Callbacks */
+       .init = r8a779g0_cpg_mssr_init,
+       .cpg_clk_register = rcar_gen4_cpg_clk_register,
+
+       .reg_layout = CLK_REG_LAYOUT_RCAR_GEN4,
+};
index c99942f..1826aa7 100644 (file)
@@ -256,7 +256,7 @@ static const struct r9a06g032_clkdesc r9a06g032_clocks[] = {
        D_MODULE(HCLK_QSPI0, "hclk_qspi0", CLK_REF_SYNC_D4, 0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x300, 0x301, 0x302),
        D_MODULE(HCLK_QSPI1, "hclk_qspi1", CLK_REF_SYNC_D4, 0x480, 0x481, 0x482, 0x483, 0x4c0, 0x4c1, 0x4c2),
        D_MODULE(HCLK_ROM, "hclk_rom", CLK_REF_SYNC_D4, 0xaa0, 0xaa1, 0xaa2, 0, 0xb80, 0, 0),
-       D_MODULE(HCLK_RTC, "hclk_rtc", CLK_REF_SYNC_D8, 0xa00, 0, 0, 0, 0, 0, 0),
+       D_MODULE(HCLK_RTC, "hclk_rtc", CLK_REF_SYNC_D8, 0xa00, 0xa03, 0, 0xa02, 0, 0, 0),
        D_MODULE(HCLK_SDIO0, "hclk_sdio0", CLK_REF_SYNC_D4, 0x60, 0x61, 0x62, 0x63, 0x80, 0x81, 0x82),
        D_MODULE(HCLK_SDIO1, "hclk_sdio1", CLK_REF_SYNC_D4, 0x640, 0x641, 0x642, 0x643, 0x660, 0x661, 0x662),
        D_MODULE(HCLK_SEMAP, "hclk_semap", CLK_REF_SYNC_D4, 0x7a3, 0x7a4, 0x7a5, 0, 0xb21, 0, 0),
diff --git a/drivers/clk/renesas/r9a07g043-cpg.c b/drivers/clk/renesas/r9a07g043-cpg.c
new file mode 100644 (file)
index 0000000..33c2bd8
--- /dev/null
@@ -0,0 +1,320 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * RZ/G2UL CPG driver
+ *
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <dt-bindings/clock/r9a07g043-cpg.h>
+
+#include "rzg2l-cpg.h"
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R9A07G043_CLK_P0_DIV2,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+
+       /* Internal Core Clocks */
+       CLK_OSC_DIV1000,
+       CLK_PLL1,
+       CLK_PLL2,
+       CLK_PLL2_DIV2,
+       CLK_PLL2_DIV2_8,
+       CLK_PLL2_DIV2_10,
+       CLK_PLL3,
+       CLK_PLL3_400,
+       CLK_PLL3_533,
+       CLK_PLL3_DIV2,
+       CLK_PLL3_DIV2_4,
+       CLK_PLL3_DIV2_4_2,
+       CLK_SEL_PLL3_3,
+       CLK_DIV_PLL3_C,
+       CLK_PLL5,
+       CLK_PLL5_500,
+       CLK_PLL5_250,
+       CLK_PLL6,
+       CLK_PLL6_250,
+       CLK_P1_DIV2,
+       CLK_PLL2_800,
+       CLK_PLL2_SDHI_533,
+       CLK_PLL2_SDHI_400,
+       CLK_PLL2_SDHI_266,
+       CLK_SD0_DIV4,
+       CLK_SD1_DIV4,
+
+       /* Module Clocks */
+       MOD_CLK_BASE,
+};
+
+/* Divider tables */
+static const struct clk_div_table dtable_1_8[] = {
+       {0, 1},
+       {1, 2},
+       {2, 4},
+       {3, 8},
+       {0, 0},
+};
+
+static const struct clk_div_table dtable_1_32[] = {
+       {0, 1},
+       {1, 2},
+       {2, 4},
+       {3, 8},
+       {4, 32},
+       {0, 0},
+};
+
+/* Mux clock tables */
+static const char * const sel_pll3_3[] = { ".pll3_533", ".pll3_400" };
+static const char * const sel_pll6_2[] = { ".pll6_250", ".pll5_250" };
+static const char * const sel_shdi[] = { ".clk_533", ".clk_400", ".clk_266" };
+
+static const struct cpg_core_clk r9a07g043_core_clks[] __initconst = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal", CLK_EXTAL),
+
+       /* Internal Core Clocks */
+       DEF_FIXED(".osc", R9A07G043_OSCCLK, CLK_EXTAL, 1, 1),
+       DEF_FIXED(".osc_div1000", CLK_OSC_DIV1000, CLK_EXTAL, 1, 1000),
+       DEF_SAMPLL(".pll1", CLK_PLL1, CLK_EXTAL, PLL146_CONF(0)),
+       DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 200, 3),
+       DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2, CLK_PLL2, 1, 2),
+       DEF_FIXED(".clk_800", CLK_PLL2_800, CLK_PLL2, 1, 2),
+       DEF_FIXED(".clk_533", CLK_PLL2_SDHI_533, CLK_PLL2, 1, 3),
+       DEF_FIXED(".clk_400", CLK_PLL2_SDHI_400, CLK_PLL2_800, 1, 2),
+       DEF_FIXED(".clk_266", CLK_PLL2_SDHI_266, CLK_PLL2_SDHI_533, 1, 2),
+       DEF_FIXED(".pll2_div2_8", CLK_PLL2_DIV2_8, CLK_PLL2_DIV2, 1, 8),
+       DEF_FIXED(".pll2_div2_10", CLK_PLL2_DIV2_10, CLK_PLL2_DIV2, 1, 10),
+       DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 200, 3),
+       DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2, CLK_PLL3, 1, 2),
+       DEF_FIXED(".pll3_div2_4", CLK_PLL3_DIV2_4, CLK_PLL3_DIV2, 1, 4),
+       DEF_FIXED(".pll3_div2_4_2", CLK_PLL3_DIV2_4_2, CLK_PLL3_DIV2_4, 1, 2),
+       DEF_FIXED(".pll3_400", CLK_PLL3_400, CLK_PLL3, 1, 4),
+       DEF_FIXED(".pll3_533", CLK_PLL3_533, CLK_PLL3, 1, 3),
+       DEF_MUX_RO(".sel_pll3_3", CLK_SEL_PLL3_3, SEL_PLL3_3, sel_pll3_3),
+       DEF_DIV("divpl3c", CLK_DIV_PLL3_C, CLK_SEL_PLL3_3, DIVPL3C, dtable_1_32),
+       DEF_FIXED(".pll5", CLK_PLL5, CLK_EXTAL, 125, 1),
+       DEF_FIXED(".pll5_500", CLK_PLL5_500, CLK_PLL5, 1, 6),
+       DEF_FIXED(".pll5_250", CLK_PLL5_250, CLK_PLL5_500, 1, 2),
+       DEF_FIXED(".pll6", CLK_PLL6, CLK_EXTAL, 125, 6),
+       DEF_FIXED(".pll6_250", CLK_PLL6_250, CLK_PLL6, 1, 2),
+
+       /* Core output clk */
+       DEF_DIV("I", R9A07G043_CLK_I, CLK_PLL1, DIVPL1A, dtable_1_8),
+       DEF_DIV("P0", R9A07G043_CLK_P0, CLK_PLL2_DIV2_8, DIVPL2A, dtable_1_32),
+       DEF_FIXED("P0_DIV2", R9A07G043_CLK_P0_DIV2, R9A07G043_CLK_P0, 1, 2),
+       DEF_FIXED("TSU", R9A07G043_CLK_TSU, CLK_PLL2_DIV2_10, 1, 1),
+       DEF_DIV("P1", R9A07G043_CLK_P1, CLK_PLL3_DIV2_4, DIVPL3B, dtable_1_32),
+       DEF_FIXED("P1_DIV2", CLK_P1_DIV2, R9A07G043_CLK_P1, 1, 2),
+       DEF_DIV("P2", R9A07G043_CLK_P2, CLK_PLL3_DIV2_4_2, DIVPL3A, dtable_1_32),
+       DEF_FIXED("M0", R9A07G043_CLK_M0, CLK_PLL3_DIV2_4, 1, 1),
+       DEF_FIXED("ZT", R9A07G043_CLK_ZT, CLK_PLL3_DIV2_4_2, 1, 1),
+       DEF_MUX("HP", R9A07G043_CLK_HP, SEL_PLL6_2, sel_pll6_2),
+       DEF_FIXED("SPI0", R9A07G043_CLK_SPI0, CLK_DIV_PLL3_C, 1, 2),
+       DEF_FIXED("SPI1", R9A07G043_CLK_SPI1, CLK_DIV_PLL3_C, 1, 4),
+       DEF_SD_MUX("SD0", R9A07G043_CLK_SD0, SEL_SDHI0, sel_shdi),
+       DEF_SD_MUX("SD1", R9A07G043_CLK_SD1, SEL_SDHI1, sel_shdi),
+       DEF_FIXED("SD0_DIV4", CLK_SD0_DIV4, R9A07G043_CLK_SD0, 1, 4),
+       DEF_FIXED("SD1_DIV4", CLK_SD1_DIV4, R9A07G043_CLK_SD1, 1, 4),
+};
+
+static struct rzg2l_mod_clk r9a07g043_mod_clks[] = {
+       DEF_MOD("gic",          R9A07G043_GIC600_GICCLK, R9A07G043_CLK_P1,
+                               0x514, 0),
+       DEF_MOD("ia55_pclk",    R9A07G043_IA55_PCLK, R9A07G043_CLK_P2,
+                               0x518, 0),
+       DEF_MOD("ia55_clk",     R9A07G043_IA55_CLK, R9A07G043_CLK_P1,
+                               0x518, 1),
+       DEF_MOD("dmac_aclk",    R9A07G043_DMAC_ACLK, R9A07G043_CLK_P1,
+                               0x52c, 0),
+       DEF_MOD("dmac_pclk",    R9A07G043_DMAC_PCLK, CLK_P1_DIV2,
+                               0x52c, 1),
+       DEF_MOD("ostm0_pclk",   R9A07G043_OSTM0_PCLK, R9A07G043_CLK_P0,
+                               0x534, 0),
+       DEF_MOD("ostm1_pclk",   R9A07G043_OSTM1_PCLK, R9A07G043_CLK_P0,
+                               0x534, 1),
+       DEF_MOD("ostm2_pclk",   R9A07G043_OSTM2_PCLK, R9A07G043_CLK_P0,
+                               0x534, 2),
+       DEF_MOD("wdt0_pclk",    R9A07G043_WDT0_PCLK, R9A07G043_CLK_P0,
+                               0x548, 0),
+       DEF_MOD("wdt0_clk",     R9A07G043_WDT0_CLK, R9A07G043_OSCCLK,
+                               0x548, 1),
+       DEF_MOD("wdt2_pclk",    R9A07G043_WDT2_PCLK, R9A07G043_CLK_P0,
+                               0x548, 4),
+       DEF_MOD("wdt2_clk",     R9A07G043_WDT2_CLK, R9A07G043_OSCCLK,
+                               0x548, 5),
+       DEF_MOD("spi_clk2",     R9A07G043_SPI_CLK2, R9A07G043_CLK_SPI1,
+                               0x550, 0),
+       DEF_MOD("spi_clk",      R9A07G043_SPI_CLK, R9A07G043_CLK_SPI0,
+                               0x550, 1),
+       DEF_MOD("sdhi0_imclk",  R9A07G043_SDHI0_IMCLK, CLK_SD0_DIV4,
+                               0x554, 0),
+       DEF_MOD("sdhi0_imclk2", R9A07G043_SDHI0_IMCLK2, CLK_SD0_DIV4,
+                               0x554, 1),
+       DEF_MOD("sdhi0_clk_hs", R9A07G043_SDHI0_CLK_HS, R9A07G043_CLK_SD0,
+                               0x554, 2),
+       DEF_MOD("sdhi0_aclk",   R9A07G043_SDHI0_ACLK, R9A07G043_CLK_P1,
+                               0x554, 3),
+       DEF_MOD("sdhi1_imclk",  R9A07G043_SDHI1_IMCLK, CLK_SD1_DIV4,
+                               0x554, 4),
+       DEF_MOD("sdhi1_imclk2", R9A07G043_SDHI1_IMCLK2, CLK_SD1_DIV4,
+                               0x554, 5),
+       DEF_MOD("sdhi1_clk_hs", R9A07G043_SDHI1_CLK_HS, R9A07G043_CLK_SD1,
+                               0x554, 6),
+       DEF_MOD("sdhi1_aclk",   R9A07G043_SDHI1_ACLK, R9A07G043_CLK_P1,
+                               0x554, 7),
+       DEF_MOD("ssi0_pclk",    R9A07G043_SSI0_PCLK2, R9A07G043_CLK_P0,
+                               0x570, 0),
+       DEF_MOD("ssi0_sfr",     R9A07G043_SSI0_PCLK_SFR, R9A07G043_CLK_P0,
+                               0x570, 1),
+       DEF_MOD("ssi1_pclk",    R9A07G043_SSI1_PCLK2, R9A07G043_CLK_P0,
+                               0x570, 2),
+       DEF_MOD("ssi1_sfr",     R9A07G043_SSI1_PCLK_SFR, R9A07G043_CLK_P0,
+                               0x570, 3),
+       DEF_MOD("ssi2_pclk",    R9A07G043_SSI2_PCLK2, R9A07G043_CLK_P0,
+                               0x570, 4),
+       DEF_MOD("ssi2_sfr",     R9A07G043_SSI2_PCLK_SFR, R9A07G043_CLK_P0,
+                               0x570, 5),
+       DEF_MOD("ssi3_pclk",    R9A07G043_SSI3_PCLK2, R9A07G043_CLK_P0,
+                               0x570, 6),
+       DEF_MOD("ssi3_sfr",     R9A07G043_SSI3_PCLK_SFR, R9A07G043_CLK_P0,
+                               0x570, 7),
+       DEF_MOD("usb0_host",    R9A07G043_USB_U2H0_HCLK, R9A07G043_CLK_P1,
+                               0x578, 0),
+       DEF_MOD("usb1_host",    R9A07G043_USB_U2H1_HCLK, R9A07G043_CLK_P1,
+                               0x578, 1),
+       DEF_MOD("usb0_func",    R9A07G043_USB_U2P_EXR_CPUCLK, R9A07G043_CLK_P1,
+                               0x578, 2),
+       DEF_MOD("usb_pclk",     R9A07G043_USB_PCLK, R9A07G043_CLK_P1,
+                               0x578, 3),
+       DEF_COUPLED("eth0_axi", R9A07G043_ETH0_CLK_AXI, R9A07G043_CLK_M0,
+                               0x57c, 0),
+       DEF_COUPLED("eth0_chi", R9A07G043_ETH0_CLK_CHI, R9A07G043_CLK_ZT,
+                               0x57c, 0),
+       DEF_COUPLED("eth1_axi", R9A07G043_ETH1_CLK_AXI, R9A07G043_CLK_M0,
+                               0x57c, 1),
+       DEF_COUPLED("eth1_chi", R9A07G043_ETH1_CLK_CHI, R9A07G043_CLK_ZT,
+                               0x57c, 1),
+       DEF_MOD("i2c0",         R9A07G043_I2C0_PCLK, R9A07G043_CLK_P0,
+                               0x580, 0),
+       DEF_MOD("i2c1",         R9A07G043_I2C1_PCLK, R9A07G043_CLK_P0,
+                               0x580, 1),
+       DEF_MOD("i2c2",         R9A07G043_I2C2_PCLK, R9A07G043_CLK_P0,
+                               0x580, 2),
+       DEF_MOD("i2c3",         R9A07G043_I2C3_PCLK, R9A07G043_CLK_P0,
+                               0x580, 3),
+       DEF_MOD("scif0",        R9A07G043_SCIF0_CLK_PCK, R9A07G043_CLK_P0,
+                               0x584, 0),
+       DEF_MOD("scif1",        R9A07G043_SCIF1_CLK_PCK, R9A07G043_CLK_P0,
+                               0x584, 1),
+       DEF_MOD("scif2",        R9A07G043_SCIF2_CLK_PCK, R9A07G043_CLK_P0,
+                               0x584, 2),
+       DEF_MOD("scif3",        R9A07G043_SCIF3_CLK_PCK, R9A07G043_CLK_P0,
+                               0x584, 3),
+       DEF_MOD("scif4",        R9A07G043_SCIF4_CLK_PCK, R9A07G043_CLK_P0,
+                               0x584, 4),
+       DEF_MOD("sci0",         R9A07G043_SCI0_CLKP, R9A07G043_CLK_P0,
+                               0x588, 0),
+       DEF_MOD("sci1",         R9A07G043_SCI1_CLKP, R9A07G043_CLK_P0,
+                               0x588, 1),
+       DEF_MOD("rspi0",        R9A07G043_RSPI0_CLKB, R9A07G043_CLK_P0,
+                               0x590, 0),
+       DEF_MOD("rspi1",        R9A07G043_RSPI1_CLKB, R9A07G043_CLK_P0,
+                               0x590, 1),
+       DEF_MOD("rspi2",        R9A07G043_RSPI2_CLKB, R9A07G043_CLK_P0,
+                               0x590, 2),
+       DEF_MOD("canfd",        R9A07G043_CANFD_PCLK, R9A07G043_CLK_P0,
+                               0x594, 0),
+       DEF_MOD("gpio",         R9A07G043_GPIO_HCLK, R9A07G043_OSCCLK,
+                               0x598, 0),
+       DEF_MOD("adc_adclk",    R9A07G043_ADC_ADCLK, R9A07G043_CLK_TSU,
+                               0x5a8, 0),
+       DEF_MOD("adc_pclk",     R9A07G043_ADC_PCLK, R9A07G043_CLK_P0,
+                               0x5a8, 1),
+       DEF_MOD("tsu_pclk",     R9A07G043_TSU_PCLK, R9A07G043_CLK_TSU,
+                               0x5ac, 0),
+};
+
+static struct rzg2l_reset r9a07g043_resets[] = {
+       DEF_RST(R9A07G043_GIC600_GICRESET_N, 0x814, 0),
+       DEF_RST(R9A07G043_GIC600_DBG_GICRESET_N, 0x814, 1),
+       DEF_RST(R9A07G043_IA55_RESETN, 0x818, 0),
+       DEF_RST(R9A07G043_DMAC_ARESETN, 0x82c, 0),
+       DEF_RST(R9A07G043_DMAC_RST_ASYNC, 0x82c, 1),
+       DEF_RST(R9A07G043_OSTM0_PRESETZ, 0x834, 0),
+       DEF_RST(R9A07G043_OSTM1_PRESETZ, 0x834, 1),
+       DEF_RST(R9A07G043_OSTM2_PRESETZ, 0x834, 2),
+       DEF_RST(R9A07G043_WDT0_PRESETN, 0x848, 0),
+       DEF_RST(R9A07G043_WDT2_PRESETN, 0x848, 2),
+       DEF_RST(R9A07G043_SPI_RST, 0x850, 0),
+       DEF_RST(R9A07G043_SDHI0_IXRST, 0x854, 0),
+       DEF_RST(R9A07G043_SDHI1_IXRST, 0x854, 1),
+       DEF_RST(R9A07G043_SSI0_RST_M2_REG, 0x870, 0),
+       DEF_RST(R9A07G043_SSI1_RST_M2_REG, 0x870, 1),
+       DEF_RST(R9A07G043_SSI2_RST_M2_REG, 0x870, 2),
+       DEF_RST(R9A07G043_SSI3_RST_M2_REG, 0x870, 3),
+       DEF_RST(R9A07G043_USB_U2H0_HRESETN, 0x878, 0),
+       DEF_RST(R9A07G043_USB_U2H1_HRESETN, 0x878, 1),
+       DEF_RST(R9A07G043_USB_U2P_EXL_SYSRST, 0x878, 2),
+       DEF_RST(R9A07G043_USB_PRESETN, 0x878, 3),
+       DEF_RST(R9A07G043_ETH0_RST_HW_N, 0x87c, 0),
+       DEF_RST(R9A07G043_ETH1_RST_HW_N, 0x87c, 1),
+       DEF_RST(R9A07G043_I2C0_MRST, 0x880, 0),
+       DEF_RST(R9A07G043_I2C1_MRST, 0x880, 1),
+       DEF_RST(R9A07G043_I2C2_MRST, 0x880, 2),
+       DEF_RST(R9A07G043_I2C3_MRST, 0x880, 3),
+       DEF_RST(R9A07G043_SCIF0_RST_SYSTEM_N, 0x884, 0),
+       DEF_RST(R9A07G043_SCIF1_RST_SYSTEM_N, 0x884, 1),
+       DEF_RST(R9A07G043_SCIF2_RST_SYSTEM_N, 0x884, 2),
+       DEF_RST(R9A07G043_SCIF3_RST_SYSTEM_N, 0x884, 3),
+       DEF_RST(R9A07G043_SCIF4_RST_SYSTEM_N, 0x884, 4),
+       DEF_RST(R9A07G043_SCI0_RST, 0x888, 0),
+       DEF_RST(R9A07G043_SCI1_RST, 0x888, 1),
+       DEF_RST(R9A07G043_RSPI0_RST, 0x890, 0),
+       DEF_RST(R9A07G043_RSPI1_RST, 0x890, 1),
+       DEF_RST(R9A07G043_RSPI2_RST, 0x890, 2),
+       DEF_RST(R9A07G043_CANFD_RSTP_N, 0x894, 0),
+       DEF_RST(R9A07G043_CANFD_RSTC_N, 0x894, 1),
+       DEF_RST(R9A07G043_GPIO_RSTN, 0x898, 0),
+       DEF_RST(R9A07G043_GPIO_PORT_RESETN, 0x898, 1),
+       DEF_RST(R9A07G043_GPIO_SPARE_RESETN, 0x898, 2),
+       DEF_RST(R9A07G043_ADC_PRESETN, 0x8a8, 0),
+       DEF_RST(R9A07G043_ADC_ADRST_N, 0x8a8, 1),
+       DEF_RST(R9A07G043_TSU_PRESETN, 0x8ac, 0),
+};
+
+static const unsigned int r9a07g043_crit_mod_clks[] __initconst = {
+       MOD_CLK_BASE + R9A07G043_GIC600_GICCLK,
+       MOD_CLK_BASE + R9A07G043_IA55_CLK,
+       MOD_CLK_BASE + R9A07G043_DMAC_ACLK,
+};
+
+const struct rzg2l_cpg_info r9a07g043_cpg_info = {
+       /* Core Clocks */
+       .core_clks = r9a07g043_core_clks,
+       .num_core_clks = ARRAY_SIZE(r9a07g043_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Critical Module Clocks */
+       .crit_mod_clks = r9a07g043_crit_mod_clks,
+       .num_crit_mod_clks = ARRAY_SIZE(r9a07g043_crit_mod_clks),
+
+       /* Module Clocks */
+       .mod_clks = r9a07g043_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r9a07g043_mod_clks),
+       .num_hw_mod_clks = R9A07G043_TSU_PCLK + 1,
+
+       /* Resets */
+       .resets = r9a07g043_resets,
+       .num_resets = R9A07G043_TSU_PRESETN + 1, /* Last reset ID + 1 */
+
+       .has_clk_mon_regs = true,
+};
index bdfabb9..b288897 100644 (file)
@@ -32,6 +32,7 @@ enum clk_ids {
        CLK_PLL3,
        CLK_PLL3_400,
        CLK_PLL3_533,
+       CLK_M2_DIV2,
        CLK_PLL3_DIV2,
        CLK_PLL3_DIV2_2,
        CLK_PLL3_DIV2_4,
@@ -40,6 +41,8 @@ enum clk_ids {
        CLK_DIV_PLL3_C,
        CLK_PLL4,
        CLK_PLL5,
+       CLK_PLL5_FOUTPOSTDIV,
+       CLK_PLL5_FOUT1PH0,
        CLK_PLL5_FOUT3,
        CLK_PLL5_250,
        CLK_PLL6,
@@ -52,6 +55,11 @@ enum clk_ids {
        CLK_SD0_DIV4,
        CLK_SD1_DIV4,
        CLK_SEL_GPU2,
+       CLK_SEL_PLL5_4,
+       CLK_DSI_DIV,
+       CLK_PLL2_533,
+       CLK_PLL2_533_DIV2,
+       CLK_DIV_DSI_LPCLK,
 
        /* Module Clocks */
        MOD_CLK_BASE,
@@ -75,14 +83,23 @@ static const struct clk_div_table dtable_1_32[] = {
        {0, 0},
 };
 
+static const struct clk_div_table dtable_16_128[] = {
+       {0, 16},
+       {1, 32},
+       {2, 64},
+       {3, 128},
+       {0, 0},
+};
+
 /* Mux clock tables */
 static const char * const sel_pll3_3[] = { ".pll3_533", ".pll3_400" };
+static const char * const sel_pll5_4[] = { ".pll5_foutpostdiv", ".pll5_fout1ph0" };
 static const char * const sel_pll6_2[] = { ".pll6_250", ".pll5_250" };
 static const char * const sel_shdi[] = { ".clk_533", ".clk_400", ".clk_266" };
 static const char * const sel_gpu2[] = { ".pll6", ".pll3_div2_2" };
 
 static const struct {
-       struct cpg_core_clk common[44];
+       struct cpg_core_clk common[56];
 #ifdef CONFIG_CLK_R9A07G054
        struct cpg_core_clk drp[0];
 #endif
@@ -96,6 +113,7 @@ static const struct {
                DEF_FIXED(".osc_div1000", CLK_OSC_DIV1000, CLK_EXTAL, 1, 1000),
                DEF_SAMPLL(".pll1", CLK_PLL1, CLK_EXTAL, PLL146_CONF(0)),
                DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 200, 3),
+               DEF_FIXED(".pll2_533", CLK_PLL2_533, CLK_PLL2, 1, 3),
                DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 200, 3),
                DEF_FIXED(".pll3_400", CLK_PLL3_400, CLK_PLL3, 1, 4),
                DEF_FIXED(".pll3_533", CLK_PLL3_533, CLK_PLL3, 1, 3),
@@ -114,46 +132,48 @@ static const struct {
                DEF_FIXED(".pll2_div2_8", CLK_PLL2_DIV2_8, CLK_PLL2_DIV2, 1, 8),
                DEF_FIXED(".pll2_div2_10", CLK_PLL2_DIV2_10, CLK_PLL2_DIV2, 1, 10),
 
+               DEF_FIXED(".pll2_533_div2", CLK_PLL2_533_DIV2, CLK_PLL2_533, 1, 2),
+
                DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2, CLK_PLL3, 1, 2),
                DEF_FIXED(".pll3_div2_2", CLK_PLL3_DIV2_2, CLK_PLL3_DIV2, 1, 2),
                DEF_FIXED(".pll3_div2_4", CLK_PLL3_DIV2_4, CLK_PLL3_DIV2, 1, 4),
                DEF_FIXED(".pll3_div2_4_2", CLK_PLL3_DIV2_4_2, CLK_PLL3_DIV2_4, 1, 2),
-               DEF_MUX(".sel_pll3_3", CLK_SEL_PLL3_3, SEL_PLL3_3,
-                       sel_pll3_3, ARRAY_SIZE(sel_pll3_3), 0, CLK_MUX_READ_ONLY),
-               DEF_DIV("divpl3c", CLK_DIV_PLL3_C, CLK_SEL_PLL3_3,
-                       DIVPL3C, dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+               DEF_MUX_RO(".sel_pll3_3", CLK_SEL_PLL3_3, SEL_PLL3_3, sel_pll3_3),
+               DEF_DIV("divpl3c", CLK_DIV_PLL3_C, CLK_SEL_PLL3_3, DIVPL3C, dtable_1_32),
 
                DEF_FIXED(".pll5_250", CLK_PLL5_250, CLK_PLL5_FOUT3, 1, 2),
                DEF_FIXED(".pll6_250", CLK_PLL6_250, CLK_PLL6, 1, 2),
-               DEF_MUX(".sel_gpu2", CLK_SEL_GPU2, SEL_GPU2,
-                       sel_gpu2, ARRAY_SIZE(sel_gpu2), 0, CLK_MUX_READ_ONLY),
+               DEF_MUX_RO(".sel_gpu2", CLK_SEL_GPU2, SEL_GPU2, sel_gpu2),
+               DEF_PLL5_FOUTPOSTDIV(".pll5_foutpostdiv", CLK_PLL5_FOUTPOSTDIV, CLK_EXTAL),
+               DEF_FIXED(".pll5_fout1ph0", CLK_PLL5_FOUT1PH0, CLK_PLL5_FOUTPOSTDIV, 1, 2),
+               DEF_PLL5_4_MUX(".sel_pll5_4", CLK_SEL_PLL5_4, SEL_PLL5_4, sel_pll5_4),
+               DEF_DIV(".div_dsi_lpclk", CLK_DIV_DSI_LPCLK, CLK_PLL2_533_DIV2,
+                       DIVDSILPCLK, dtable_16_128),
 
                /* Core output clk */
-               DEF_DIV("I", R9A07G044_CLK_I, CLK_PLL1, DIVPL1A, dtable_1_8,
-                       CLK_DIVIDER_HIWORD_MASK),
-               DEF_DIV("P0", R9A07G044_CLK_P0, CLK_PLL2_DIV2_8, DIVPL2A,
-                       dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+               DEF_DIV("I", R9A07G044_CLK_I, CLK_PLL1, DIVPL1A, dtable_1_8),
+               DEF_DIV("P0", R9A07G044_CLK_P0, CLK_PLL2_DIV2_8, DIVPL2A, dtable_1_32),
                DEF_FIXED("P0_DIV2", R9A07G044_CLK_P0_DIV2, R9A07G044_CLK_P0, 1, 2),
                DEF_FIXED("TSU", R9A07G044_CLK_TSU, CLK_PLL2_DIV2_10, 1, 1),
-               DEF_DIV("P1", R9A07G044_CLK_P1, CLK_PLL3_DIV2_4,
-                       DIVPL3B, dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+               DEF_DIV("P1", R9A07G044_CLK_P1, CLK_PLL3_DIV2_4, DIVPL3B, dtable_1_32),
                DEF_FIXED("P1_DIV2", CLK_P1_DIV2, R9A07G044_CLK_P1, 1, 2),
-               DEF_DIV("P2", R9A07G044_CLK_P2, CLK_PLL3_DIV2_4_2,
-                       DIVPL3A, dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+               DEF_DIV("P2", R9A07G044_CLK_P2, CLK_PLL3_DIV2_4_2, DIVPL3A, dtable_1_32),
                DEF_FIXED("M0", R9A07G044_CLK_M0, CLK_PLL3_DIV2_4, 1, 1),
                DEF_FIXED("ZT", R9A07G044_CLK_ZT, CLK_PLL3_DIV2_4_2, 1, 1),
-               DEF_MUX("HP", R9A07G044_CLK_HP, SEL_PLL6_2,
-                       sel_pll6_2, ARRAY_SIZE(sel_pll6_2), 0, CLK_MUX_HIWORD_MASK),
+               DEF_MUX("HP", R9A07G044_CLK_HP, SEL_PLL6_2, sel_pll6_2),
                DEF_FIXED("SPI0", R9A07G044_CLK_SPI0, CLK_DIV_PLL3_C, 1, 2),
                DEF_FIXED("SPI1", R9A07G044_CLK_SPI1, CLK_DIV_PLL3_C, 1, 4),
-               DEF_SD_MUX("SD0", R9A07G044_CLK_SD0, SEL_SDHI0,
-                          sel_shdi, ARRAY_SIZE(sel_shdi)),
-               DEF_SD_MUX("SD1", R9A07G044_CLK_SD1, SEL_SDHI1,
-                          sel_shdi, ARRAY_SIZE(sel_shdi)),
+               DEF_SD_MUX("SD0", R9A07G044_CLK_SD0, SEL_SDHI0, sel_shdi),
+               DEF_SD_MUX("SD1", R9A07G044_CLK_SD1, SEL_SDHI1, sel_shdi),
                DEF_FIXED("SD0_DIV4", CLK_SD0_DIV4, R9A07G044_CLK_SD0, 1, 4),
                DEF_FIXED("SD1_DIV4", CLK_SD1_DIV4, R9A07G044_CLK_SD1, 1, 4),
-               DEF_DIV("G", R9A07G044_CLK_G, CLK_SEL_GPU2, DIVGPU, dtable_1_8,
-                       CLK_DIVIDER_HIWORD_MASK),
+               DEF_DIV("G", R9A07G044_CLK_G, CLK_SEL_GPU2, DIVGPU, dtable_1_8),
+               DEF_FIXED("M1", R9A07G044_CLK_M1, CLK_PLL5_FOUTPOSTDIV, 1, 1),
+               DEF_FIXED("M2", R9A07G044_CLK_M2, CLK_PLL3_533, 1, 2),
+               DEF_FIXED("M2_DIV2", CLK_M2_DIV2, R9A07G044_CLK_M2, 1, 2),
+               DEF_DSI_DIV("DSI_DIV", CLK_DSI_DIV, CLK_SEL_PLL5_4, CLK_SET_RATE_PARENT),
+               DEF_FIXED("M3", R9A07G044_CLK_M3, CLK_DSI_DIV, 1, 1),
+               DEF_FIXED("M4", R9A07G044_CLK_M4, CLK_DIV_DSI_LPCLK, 1, 1),
        },
 #ifdef CONFIG_CLK_R9A07G054
        .drp = {
@@ -162,7 +182,7 @@ static const struct {
 };
 
 static const struct {
-       struct rzg2l_mod_clk common[62];
+       struct rzg2l_mod_clk common[71];
 #ifdef CONFIG_CLK_R9A07G054
        struct rzg2l_mod_clk drp[0];
 #endif
@@ -180,7 +200,7 @@ static const struct {
                                        0x52c, 1),
                DEF_MOD("ostm0_pclk",   R9A07G044_OSTM0_PCLK, R9A07G044_CLK_P0,
                                        0x534, 0),
-               DEF_MOD("ostm1_clk",    R9A07G044_OSTM1_PCLK, R9A07G044_CLK_P0,
+               DEF_MOD("ostm1_pclk",   R9A07G044_OSTM1_PCLK, R9A07G044_CLK_P0,
                                        0x534, 1),
                DEF_MOD("ostm2_pclk",   R9A07G044_OSTM2_PCLK, R9A07G044_CLK_P0,
                                        0x534, 2),
@@ -222,6 +242,24 @@ static const struct {
                                        0x558, 1),
                DEF_MOD("gpu_ace_clk",  R9A07G044_GPU_ACE_CLK, R9A07G044_CLK_P1,
                                        0x558, 2),
+               DEF_MOD("dsi_pll_clk",  R9A07G044_MIPI_DSI_PLLCLK, R9A07G044_CLK_M1,
+                                       0x568, 0),
+               DEF_MOD("dsi_sys_clk",  R9A07G044_MIPI_DSI_SYSCLK, CLK_M2_DIV2,
+                                       0x568, 1),
+               DEF_MOD("dsi_aclk",     R9A07G044_MIPI_DSI_ACLK, R9A07G044_CLK_P1,
+                                       0x568, 2),
+               DEF_MOD("dsi_pclk",     R9A07G044_MIPI_DSI_PCLK, R9A07G044_CLK_P2,
+                                       0x568, 3),
+               DEF_MOD("dsi_vclk",     R9A07G044_MIPI_DSI_VCLK, R9A07G044_CLK_M3,
+                                       0x568, 4),
+               DEF_MOD("dsi_lpclk",    R9A07G044_MIPI_DSI_LPCLK, R9A07G044_CLK_M4,
+                                       0x568, 5),
+               DEF_COUPLED("lcdc_a",   R9A07G044_LCDC_CLK_A, R9A07G044_CLK_M0,
+                                       0x56c, 0),
+               DEF_COUPLED("lcdc_p",   R9A07G044_LCDC_CLK_P, R9A07G044_CLK_ZT,
+                                       0x56c, 0),
+               DEF_MOD("lcdc_clk_d",   R9A07G044_LCDC_CLK_D, R9A07G044_CLK_M3,
+                                       0x56c, 1),
                DEF_MOD("ssi0_pclk",    R9A07G044_SSI0_PCLK2, R9A07G044_CLK_P0,
                                        0x570, 0),
                DEF_MOD("ssi0_sfr",     R9A07G044_SSI0_PCLK_SFR, R9A07G044_CLK_P0,
@@ -317,6 +355,10 @@ static struct rzg2l_reset r9a07g044_resets[] = {
        DEF_RST(R9A07G044_GPU_RESETN, 0x858, 0),
        DEF_RST(R9A07G044_GPU_AXI_RESETN, 0x858, 1),
        DEF_RST(R9A07G044_GPU_ACE_RESETN, 0x858, 2),
+       DEF_RST(R9A07G044_MIPI_DSI_CMN_RSTB, 0x868, 0),
+       DEF_RST(R9A07G044_MIPI_DSI_ARESET_N, 0x868, 1),
+       DEF_RST(R9A07G044_MIPI_DSI_PRESET_N, 0x868, 2),
+       DEF_RST(R9A07G044_LCDC_RESET_N, 0x86c, 0),
        DEF_RST(R9A07G044_SSI0_RST_M2_REG, 0x870, 0),
        DEF_RST(R9A07G044_SSI1_RST_M2_REG, 0x870, 1),
        DEF_RST(R9A07G044_SSI2_RST_M2_REG, 0x870, 2),
@@ -376,6 +418,8 @@ const struct rzg2l_cpg_info r9a07g044_cpg_info = {
        /* Resets */
        .resets = r9a07g044_resets,
        .num_resets = R9A07G044_TSU_PRESETN + 1, /* Last reset ID + 1 */
+
+       .has_clk_mon_regs = true,
 };
 
 #ifdef CONFIG_CLK_R9A07G054
@@ -398,5 +442,7 @@ const struct rzg2l_cpg_info r9a07g054_cpg_info = {
        /* Resets */
        .resets = r9a07g044_resets,
        .num_resets = R9A07G054_STPAI_ARESETN + 1, /* Last reset ID + 1 */
+
+       .has_clk_mon_regs = true,
 };
 #endif
diff --git a/drivers/clk/renesas/r9a09g011-cpg.c b/drivers/clk/renesas/r9a09g011-cpg.c
new file mode 100644 (file)
index 0000000..40693bb
--- /dev/null
@@ -0,0 +1,172 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * RZ/V2M Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ *
+ * Based on r9a07g044-cpg.c
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <dt-bindings/clock/r9a09g011-cpg.h>
+
+#include "rzg2l-cpg.h"
+
+#define RZV2M_SAMPLL4_CLK1     0x104
+#define RZV2M_SAMPLL4_CLK2     0x108
+
+#define PLL4_CONF      (RZV2M_SAMPLL4_CLK1 << 22 | RZV2M_SAMPLL4_CLK2 << 12)
+
+#define DIV_A          DDIV_PACK(0x200, 0, 3)
+#define DIV_B          DDIV_PACK(0x204, 0, 2)
+#define DIV_E          DDIV_PACK(0x204, 8, 1)
+#define DIV_W          DDIV_PACK(0x328, 0, 3)
+
+#define SEL_B          SEL_PLL_PACK(0x214, 0, 1)
+#define SEL_E          SEL_PLL_PACK(0x214, 2, 1)
+#define SEL_W0         SEL_PLL_PACK(0x32C, 0, 1)
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = 0,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_MAIN_24,
+       CLK_MAIN_2,
+       CLK_PLL1,
+       CLK_PLL2,
+       CLK_PLL2_800,
+       CLK_PLL2_400,
+       CLK_PLL2_200,
+       CLK_PLL2_100,
+       CLK_PLL4,
+       CLK_DIV_A,
+       CLK_DIV_B,
+       CLK_DIV_E,
+       CLK_DIV_W,
+       CLK_SEL_B,
+       CLK_SEL_B_D2,
+       CLK_SEL_E,
+       CLK_SEL_W0,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+/* Divider tables */
+static const struct clk_div_table dtable_diva[] = {
+       {0, 1},
+       {1, 2},
+       {2, 3},
+       {3, 4},
+       {4, 6},
+       {5, 12},
+       {6, 24},
+       {0, 0},
+};
+
+static const struct clk_div_table dtable_divb[] = {
+       {0, 1},
+       {1, 2},
+       {2, 4},
+       {3, 8},
+       {0, 0},
+};
+
+static const struct clk_div_table dtable_divw[] = {
+       {0, 6},
+       {1, 7},
+       {2, 8},
+       {3, 9},
+       {4, 10},
+       {5, 11},
+       {6, 12},
+       {0, 0},
+};
+
+/* Mux clock tables */
+static const char * const sel_b[] = { ".main", ".divb" };
+static const char * const sel_e[] = { ".main", ".dive" };
+static const char * const sel_w[] = { ".main", ".divw" };
+
+static const struct cpg_core_clk r9a09g011_core_clks[] __initconst = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",      CLK_EXTAL),
+
+       /* Internal Core Clocks */
+       DEF_FIXED(".main",      CLK_MAIN,       CLK_EXTAL,      1,      1),
+       DEF_FIXED(".main_24",   CLK_MAIN_24,    CLK_MAIN,       1,      2),
+       DEF_FIXED(".main_2",    CLK_MAIN_2,     CLK_MAIN,       1,      24),
+       DEF_FIXED(".pll1",      CLK_PLL1,       CLK_MAIN_2,     498,    1),
+       DEF_FIXED(".pll2",      CLK_PLL2,       CLK_MAIN_2,     800,    1),
+       DEF_FIXED(".pll2_800",  CLK_PLL2_800,   CLK_PLL2,       1,      2),
+       DEF_FIXED(".pll2_400",  CLK_PLL2_400,   CLK_PLL2_800,   1,      2),
+       DEF_FIXED(".pll2_200",  CLK_PLL2_200,   CLK_PLL2_800,   1,      4),
+       DEF_FIXED(".pll2_100",  CLK_PLL2_100,   CLK_PLL2_800,   1,      8),
+       DEF_SAMPLL(".pll4",     CLK_PLL4,       CLK_MAIN_2,     PLL4_CONF),
+
+       DEF_DIV_RO(".diva",     CLK_DIV_A,      CLK_PLL1,       DIV_A,  dtable_diva),
+       DEF_DIV_RO(".divb",     CLK_DIV_B,      CLK_PLL2_400,   DIV_B,  dtable_divb),
+       DEF_DIV_RO(".dive",     CLK_DIV_E,      CLK_PLL2_100,   DIV_E,  NULL),
+       DEF_DIV_RO(".divw",     CLK_DIV_W,      CLK_PLL4,       DIV_W,  dtable_divw),
+
+       DEF_MUX_RO(".selb",     CLK_SEL_B,      SEL_B,          sel_b),
+       DEF_MUX_RO(".sele",     CLK_SEL_E,      SEL_E,          sel_e),
+       DEF_MUX(".selw0",       CLK_SEL_W0,     SEL_W0,         sel_w),
+
+       DEF_FIXED(".selb_d2",   CLK_SEL_B_D2,   CLK_SEL_B,      1,      2),
+};
+
+static const struct rzg2l_mod_clk r9a09g011_mod_clks[] __initconst = {
+       DEF_MOD("gic",          R9A09G011_GIC_CLK,       CLK_SEL_B_D2, 0x400, 5),
+       DEF_COUPLED("eth_axi",  R9A09G011_ETH0_CLK_AXI,  CLK_PLL2_200, 0x40c, 8),
+       DEF_COUPLED("eth_chi",  R9A09G011_ETH0_CLK_CHI,  CLK_PLL2_100, 0x40c, 8),
+       DEF_MOD("eth_clk_gptp", R9A09G011_ETH0_GPTP_EXT, CLK_PLL2_100, 0x40c, 9),
+       DEF_MOD("syc_cnt_clk",  R9A09G011_SYC_CNT_CLK,   CLK_MAIN_24,  0x41c, 12),
+       DEF_MOD("urt_pclk",     R9A09G011_URT_PCLK,      CLK_SEL_E,    0x438, 4),
+       DEF_MOD("urt0_clk",     R9A09G011_URT0_CLK,      CLK_SEL_W0,   0x438, 5),
+       DEF_MOD("ca53",         R9A09G011_CA53_CLK,      CLK_DIV_A,    0x448, 0),
+};
+
+static const struct rzg2l_reset r9a09g011_resets[] = {
+       DEF_RST_MON(R9A09G011_ETH0_RST_HW_N,    0x608, 11, 11),
+       DEF_RST_MON(R9A09G011_SYC_RST_N,        0x610, 9,  13),
+};
+
+static const unsigned int r9a09g011_crit_mod_clks[] __initconst = {
+       MOD_CLK_BASE + R9A09G011_CA53_CLK,
+       MOD_CLK_BASE + R9A09G011_GIC_CLK,
+       MOD_CLK_BASE + R9A09G011_SYC_CNT_CLK,
+       MOD_CLK_BASE + R9A09G011_URT_PCLK,
+};
+
+const struct rzg2l_cpg_info r9a09g011_cpg_info = {
+       /* Core Clocks */
+       .core_clks = r9a09g011_core_clks,
+       .num_core_clks = ARRAY_SIZE(r9a09g011_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Critical Module Clocks */
+       .crit_mod_clks = r9a09g011_crit_mod_clks,
+       .num_crit_mod_clks = ARRAY_SIZE(r9a09g011_crit_mod_clks),
+
+       /* Module Clocks */
+       .mod_clks = r9a09g011_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r9a09g011_mod_clks),
+       .num_hw_mod_clks = R9A09G011_CA53_CLK + 1,
+
+       /* Resets */
+       .resets = r9a09g011_resets,
+       .num_resets = ARRAY_SIZE(r9a09g011_resets),
+
+       .has_clk_mon_regs = false,
+};
index 2bc0afa..9028bf4 100644 (file)
@@ -25,7 +25,7 @@ enum rcar_gen3_clk_types {
        CLK_TYPE_GEN3_OSC,      /* OSC EXTAL predivider and fixed divider */
        CLK_TYPE_GEN3_RCKSEL,   /* Select parent/divider using RCKCR.CKSEL */
        CLK_TYPE_GEN3_RPCSRC,
-       CLK_TYPE_GEN3_E3_RPCSRC,
+       CLK_TYPE_GEN3_E3_RPCSRC,/* Select parent/divider using RPCCKCR.DIV */
        CLK_TYPE_GEN3_RPC,
        CLK_TYPE_GEN3_RPCD2,
 
@@ -62,6 +62,9 @@ enum rcar_gen3_clk_types {
 #define DEF_FIXED_RPCSRC_E3(_name, _id, _parent0, _parent1)    \
        DEF_BASE(_name, _id, CLK_TYPE_GEN3_E3_RPCSRC,   \
                 (_parent0) << 16 | (_parent1), .div = 8)
+#define DEF_FIXED_RPCSRC_D3(_name, _id, _parent0, _parent1)    \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_E3_RPCSRC,   \
+                (_parent0) << 16 | (_parent1), .div = 5)
 
 struct rcar_gen3_cpg_pll_config {
        u8 extal_div;
index 54ebf4b..c7ed43d 100644 (file)
@@ -215,6 +215,11 @@ struct clk * __init rcar_gen4_cpg_clk_register(struct device *dev,
                div = cpg_pll_config->pll3_div;
                break;
 
+       case CLK_TYPE_GEN4_PLL4:
+               mult = cpg_pll_config->pll4_mult;
+               div = cpg_pll_config->pll4_div;
+               break;
+
        case CLK_TYPE_GEN4_PLL5:
                mult = cpg_pll_config->pll5_mult;
                div = cpg_pll_config->pll5_div;
index afc8c02..0b15dcf 100644 (file)
@@ -16,6 +16,7 @@ enum rcar_gen4_clk_types {
        CLK_TYPE_GEN4_PLL2X_3X, /* r8a779a0 only */
        CLK_TYPE_GEN4_PLL3,
        CLK_TYPE_GEN4_PLL5,
+       CLK_TYPE_GEN4_PLL4,
        CLK_TYPE_GEN4_PLL6,
        CLK_TYPE_GEN4_SDSRC,
        CLK_TYPE_GEN4_SDH,
@@ -56,6 +57,8 @@ struct rcar_gen4_cpg_pll_config {
        u8 pll2_div;
        u8 pll3_mult;
        u8 pll3_div;
+       u8 pll4_mult;
+       u8 pll4_div;
        u8 pll5_mult;
        u8 pll5_div;
        u8 pll6_mult;
index 5d2c3ed..1a0cdf0 100644 (file)
@@ -854,6 +854,12 @@ static const struct of_device_id cpg_mssr_match[] = {
                .data = &r8a779f0_cpg_mssr_info,
        },
 #endif
+#ifdef CONFIG_CLK_R8A779G0
+       {
+               .compatible = "renesas,r8a779g0-cpg-mssr",
+               .data = &r8a779g0_cpg_mssr_info,
+       },
+#endif
        { /* sentinel */ }
 };
 
index 16810dd..1c3c057 100644 (file)
@@ -179,6 +179,7 @@ extern const struct cpg_mssr_info r8a77990_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a77995_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a779a0_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a779f0_cpg_mssr_info;
+extern const struct cpg_mssr_info r8a779g0_cpg_mssr_info;
 
 void __init cpg_mssr_early_init(struct device_node *np,
                                const struct cpg_mssr_info *info);
index 486d065..e2999ab 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/pm_domain.h>
 #include <linux/reset-controller.h>
 #include <linux/slab.h>
+#include <linux/units.h>
 
 #include <dt-bindings/clock/renesas-cpg-mssr.h>
 
@@ -56,6 +57,8 @@
 #define GET_REG_SAMPLL_CLK1(val)       ((val >> 22) & 0xfff)
 #define GET_REG_SAMPLL_CLK2(val)       ((val >> 12) & 0xfff)
 
+#define MAX_VCLK_FREQ          (148500000)
+
 struct sd_hw_data {
        struct clk_hw hw;
        u32 conf;
@@ -64,6 +67,21 @@ struct sd_hw_data {
 
 #define to_sd_hw_data(_hw)     container_of(_hw, struct sd_hw_data, hw)
 
+struct rzg2l_pll5_param {
+       u32 pl5_fracin;
+       u8 pl5_refdiv;
+       u8 pl5_intin;
+       u8 pl5_postdiv1;
+       u8 pl5_postdiv2;
+       u8 pl5_spread;
+};
+
+struct rzg2l_pll5_mux_dsi_div_param {
+       u8 clksrc;
+       u8 dsi_div_a;
+       u8 dsi_div_b;
+};
+
 /**
  * struct rzg2l_cpg_priv - Clock Pulse Generator Private Data
  *
@@ -76,8 +94,8 @@ struct sd_hw_data {
  * @num_mod_clks: Number of Module Clocks in clks[]
  * @num_resets: Number of Module Resets in info->resets[]
  * @last_dt_core_clk: ID of the last Core Clock exported to DT
- * @notifiers: Notifier chain to save/restore clock state for system resume
  * @info: Pointer to platform data
+ * @pll5_mux_dsi_div_params: pll5 mux and dsi div parameters
  */
 struct rzg2l_cpg_priv {
        struct reset_controller_dev rcdev;
@@ -91,8 +109,9 @@ struct rzg2l_cpg_priv {
        unsigned int num_resets;
        unsigned int last_dt_core_clk;
 
-       struct raw_notifier_head notifiers;
        const struct rzg2l_cpg_info *info;
+
+       struct rzg2l_pll5_mux_dsi_div_param mux_dsi_div_params;
 };
 
 static void rzg2l_cpg_del_clk_provider(void *data)
@@ -266,6 +285,406 @@ rzg2l_cpg_sd_mux_clk_register(const struct cpg_core_clk *core,
        return clk_hw->clk;
 }
 
+static unsigned long
+rzg2l_cpg_get_foutpostdiv_rate(struct rzg2l_pll5_param *params,
+                              unsigned long rate)
+{
+       unsigned long foutpostdiv_rate;
+
+       params->pl5_intin = rate / MEGA;
+       params->pl5_fracin = div_u64(((u64)rate % MEGA) << 24, MEGA);
+       params->pl5_refdiv = 2;
+       params->pl5_postdiv1 = 1;
+       params->pl5_postdiv2 = 1;
+       params->pl5_spread = 0x16;
+
+       foutpostdiv_rate =
+               EXTAL_FREQ_IN_MEGA_HZ * MEGA / params->pl5_refdiv *
+               ((((params->pl5_intin << 24) + params->pl5_fracin)) >> 24) /
+               (params->pl5_postdiv1 * params->pl5_postdiv2);
+
+       return foutpostdiv_rate;
+}
+
+struct dsi_div_hw_data {
+       struct clk_hw hw;
+       u32 conf;
+       unsigned long rate;
+       struct rzg2l_cpg_priv *priv;
+};
+
+#define to_dsi_div_hw_data(_hw)        container_of(_hw, struct dsi_div_hw_data, hw)
+
+static unsigned long rzg2l_cpg_dsi_div_recalc_rate(struct clk_hw *hw,
+                                                  unsigned long parent_rate)
+{
+       struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
+       unsigned long rate = dsi_div->rate;
+
+       if (!rate)
+               rate = parent_rate;
+
+       return rate;
+}
+
+static unsigned long rzg2l_cpg_get_vclk_parent_rate(struct clk_hw *hw,
+                                                   unsigned long rate)
+{
+       struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = dsi_div->priv;
+       struct rzg2l_pll5_param params;
+       unsigned long parent_rate;
+
+       parent_rate = rzg2l_cpg_get_foutpostdiv_rate(&params, rate);
+
+       if (priv->mux_dsi_div_params.clksrc)
+               parent_rate /= 2;
+
+       return parent_rate;
+}
+
+static int rzg2l_cpg_dsi_div_determine_rate(struct clk_hw *hw,
+                                           struct clk_rate_request *req)
+{
+       if (req->rate > MAX_VCLK_FREQ)
+               req->rate = MAX_VCLK_FREQ;
+
+       req->best_parent_rate = rzg2l_cpg_get_vclk_parent_rate(hw, req->rate);
+
+       return 0;
+}
+
+static int rzg2l_cpg_dsi_div_set_rate(struct clk_hw *hw,
+                                     unsigned long rate,
+                                     unsigned long parent_rate)
+{
+       struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = dsi_div->priv;
+
+       /*
+        * MUX -->DIV_DSI_{A,B} -->M3 -->VCLK
+        *
+        * Based on the dot clock, the DSI divider clock sets the divider value,
+        * calculates the pll parameters for generating FOUTPOSTDIV and the clk
+        * source for the MUX and propagates that info to the parents.
+        */
+
+       if (!rate || rate > MAX_VCLK_FREQ)
+               return -EINVAL;
+
+       dsi_div->rate = rate;
+       writel(CPG_PL5_SDIV_DIV_DSI_A_WEN | CPG_PL5_SDIV_DIV_DSI_B_WEN |
+              (priv->mux_dsi_div_params.dsi_div_a << 0) |
+              (priv->mux_dsi_div_params.dsi_div_b << 8),
+              priv->base + CPG_PL5_SDIV);
+
+       return 0;
+}
+
+static const struct clk_ops rzg2l_cpg_dsi_div_ops = {
+       .recalc_rate = rzg2l_cpg_dsi_div_recalc_rate,
+       .determine_rate = rzg2l_cpg_dsi_div_determine_rate,
+       .set_rate = rzg2l_cpg_dsi_div_set_rate,
+};
+
+static struct clk * __init
+rzg2l_cpg_dsi_div_clk_register(const struct cpg_core_clk *core,
+                              struct clk **clks,
+                              struct rzg2l_cpg_priv *priv)
+{
+       struct dsi_div_hw_data *clk_hw_data;
+       const struct clk *parent;
+       const char *parent_name;
+       struct clk_init_data init;
+       struct clk_hw *clk_hw;
+       int ret;
+
+       parent = clks[core->parent & 0xffff];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
+       if (!clk_hw_data)
+               return ERR_PTR(-ENOMEM);
+
+       clk_hw_data->priv = priv;
+
+       parent_name = __clk_get_name(parent);
+       init.name = core->name;
+       init.ops = &rzg2l_cpg_dsi_div_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       clk_hw = &clk_hw_data->hw;
+       clk_hw->init = &init;
+
+       ret = devm_clk_hw_register(priv->dev, clk_hw);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return clk_hw->clk;
+}
+
+struct pll5_mux_hw_data {
+       struct clk_hw hw;
+       u32 conf;
+       unsigned long rate;
+       struct rzg2l_cpg_priv *priv;
+};
+
+#define to_pll5_mux_hw_data(_hw)       container_of(_hw, struct pll5_mux_hw_data, hw)
+
+static int rzg2l_cpg_pll5_4_clk_mux_determine_rate(struct clk_hw *hw,
+                                                  struct clk_rate_request *req)
+{
+       struct clk_hw *parent;
+       struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = hwdata->priv;
+
+       parent = clk_hw_get_parent_by_index(hw, priv->mux_dsi_div_params.clksrc);
+       req->best_parent_hw = parent;
+       req->best_parent_rate = req->rate;
+
+       return 0;
+}
+
+static int rzg2l_cpg_pll5_4_clk_mux_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = hwdata->priv;
+
+       /*
+        * FOUTPOSTDIV--->|
+        *  |             | -->MUX -->DIV_DSIA_B -->M3 -->VCLK
+        *  |--FOUT1PH0-->|
+        *
+        * Based on the dot clock, the DSI divider clock calculates the parent
+        * rate and clk source for the MUX. It propagates that info to
+        * pll5_4_clk_mux which sets the clock source for DSI divider clock.
+        */
+
+       writel(CPG_OTHERFUNC1_REG_RES0_ON_WEN | index,
+              priv->base + CPG_OTHERFUNC1_REG);
+
+       return 0;
+}
+
+static u8 rzg2l_cpg_pll5_4_clk_mux_get_parent(struct clk_hw *hw)
+{
+       struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = hwdata->priv;
+
+       return readl(priv->base + GET_REG_OFFSET(hwdata->conf));
+}
+
+static const struct clk_ops rzg2l_cpg_pll5_4_clk_mux_ops = {
+       .determine_rate = rzg2l_cpg_pll5_4_clk_mux_determine_rate,
+       .set_parent     = rzg2l_cpg_pll5_4_clk_mux_set_parent,
+       .get_parent     = rzg2l_cpg_pll5_4_clk_mux_get_parent,
+};
+
+static struct clk * __init
+rzg2l_cpg_pll5_4_mux_clk_register(const struct cpg_core_clk *core,
+                                 struct rzg2l_cpg_priv *priv)
+{
+       struct pll5_mux_hw_data *clk_hw_data;
+       struct clk_init_data init;
+       struct clk_hw *clk_hw;
+       int ret;
+
+       clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
+       if (!clk_hw_data)
+               return ERR_PTR(-ENOMEM);
+
+       clk_hw_data->priv = priv;
+       clk_hw_data->conf = core->conf;
+
+       init.name = core->name;
+       init.ops = &rzg2l_cpg_pll5_4_clk_mux_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.num_parents = core->num_parents;
+       init.parent_names = core->parent_names;
+
+       clk_hw = &clk_hw_data->hw;
+       clk_hw->init = &init;
+
+       ret = devm_clk_hw_register(priv->dev, clk_hw);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return clk_hw->clk;
+}
+
+struct sipll5 {
+       struct clk_hw hw;
+       u32 conf;
+       unsigned long foutpostdiv_rate;
+       struct rzg2l_cpg_priv *priv;
+};
+
+#define to_sipll5(_hw) container_of(_hw, struct sipll5, hw)
+
+static unsigned long rzg2l_cpg_get_vclk_rate(struct clk_hw *hw,
+                                            unsigned long rate)
+{
+       struct sipll5 *sipll5 = to_sipll5(hw);
+       struct rzg2l_cpg_priv *priv = sipll5->priv;
+       unsigned long vclk;
+
+       vclk = rate / ((1 << priv->mux_dsi_div_params.dsi_div_a) *
+                      (priv->mux_dsi_div_params.dsi_div_b + 1));
+
+       if (priv->mux_dsi_div_params.clksrc)
+               vclk /= 2;
+
+       return vclk;
+}
+
+static unsigned long rzg2l_cpg_sipll5_recalc_rate(struct clk_hw *hw,
+                                                 unsigned long parent_rate)
+{
+       struct sipll5 *sipll5 = to_sipll5(hw);
+       unsigned long pll5_rate = sipll5->foutpostdiv_rate;
+
+       if (!pll5_rate)
+               pll5_rate = parent_rate;
+
+       return pll5_rate;
+}
+
+static long rzg2l_cpg_sipll5_round_rate(struct clk_hw *hw,
+                                       unsigned long rate,
+                                       unsigned long *parent_rate)
+{
+       return rate;
+}
+
+static int rzg2l_cpg_sipll5_set_rate(struct clk_hw *hw,
+                                    unsigned long rate,
+                                    unsigned long parent_rate)
+{
+       struct sipll5 *sipll5 = to_sipll5(hw);
+       struct rzg2l_cpg_priv *priv = sipll5->priv;
+       struct rzg2l_pll5_param params;
+       unsigned long vclk_rate;
+       int ret;
+       u32 val;
+
+       /*
+        *  OSC --> PLL5 --> FOUTPOSTDIV-->|
+        *                   |             | -->MUX -->DIV_DSIA_B -->M3 -->VCLK
+        *                   |--FOUT1PH0-->|
+        *
+        * Based on the dot clock, the DSI divider clock calculates the parent
+        * rate and the pll5 parameters for generating FOUTPOSTDIV. It propagates
+        * that info to sipll5 which sets parameters for generating FOUTPOSTDIV.
+        *
+        * OSC --> PLL5 --> FOUTPOSTDIV
+        */
+
+       if (!rate)
+               return -EINVAL;
+
+       vclk_rate = rzg2l_cpg_get_vclk_rate(hw, rate);
+       sipll5->foutpostdiv_rate =
+               rzg2l_cpg_get_foutpostdiv_rate(&params, vclk_rate);
+
+       /* Put PLL5 into standby mode */
+       writel(CPG_SIPLL5_STBY_RESETB_WEN, priv->base + CPG_SIPLL5_STBY);
+       ret = readl_poll_timeout(priv->base + CPG_SIPLL5_MON, val,
+                                !(val & CPG_SIPLL5_MON_PLL5_LOCK), 100, 250000);
+       if (ret) {
+               dev_err(priv->dev, "failed to release pll5 lock");
+               return ret;
+       }
+
+       /* Output clock setting 1 */
+       writel(CPG_SIPLL5_CLK1_POSTDIV1_WEN | CPG_SIPLL5_CLK1_POSTDIV2_WEN |
+              CPG_SIPLL5_CLK1_REFDIV_WEN  | (params.pl5_postdiv1 << 0) |
+              (params.pl5_postdiv2 << 4) | (params.pl5_refdiv << 8),
+              priv->base + CPG_SIPLL5_CLK1);
+
+       /* Output clock setting, SSCG modulation value setting 3 */
+       writel((params.pl5_fracin << 8), priv->base + CPG_SIPLL5_CLK3);
+
+       /* Output clock setting 4 */
+       writel(CPG_SIPLL5_CLK4_RESV_LSB | (params.pl5_intin << 16),
+              priv->base + CPG_SIPLL5_CLK4);
+
+       /* Output clock setting 5 */
+       writel(params.pl5_spread, priv->base + CPG_SIPLL5_CLK5);
+
+       /* PLL normal mode setting */
+       writel(CPG_SIPLL5_STBY_DOWNSPREAD_WEN | CPG_SIPLL5_STBY_SSCG_EN_WEN |
+              CPG_SIPLL5_STBY_RESETB_WEN | CPG_SIPLL5_STBY_RESETB,
+              priv->base + CPG_SIPLL5_STBY);
+
+       /* PLL normal mode transition, output clock stability check */
+       ret = readl_poll_timeout(priv->base + CPG_SIPLL5_MON, val,
+                                (val & CPG_SIPLL5_MON_PLL5_LOCK), 100, 250000);
+       if (ret) {
+               dev_err(priv->dev, "failed to lock pll5");
+               return ret;
+       }
+
+       return 0;
+}
+
+static const struct clk_ops rzg2l_cpg_sipll5_ops = {
+       .recalc_rate = rzg2l_cpg_sipll5_recalc_rate,
+       .round_rate = rzg2l_cpg_sipll5_round_rate,
+       .set_rate = rzg2l_cpg_sipll5_set_rate,
+};
+
+static struct clk * __init
+rzg2l_cpg_sipll5_register(const struct cpg_core_clk *core,
+                         struct clk **clks,
+                         struct rzg2l_cpg_priv *priv)
+{
+       const struct clk *parent;
+       struct clk_init_data init;
+       const char *parent_name;
+       struct sipll5 *sipll5;
+       struct clk_hw *clk_hw;
+       int ret;
+
+       parent = clks[core->parent & 0xffff];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       sipll5 = devm_kzalloc(priv->dev, sizeof(*sipll5), GFP_KERNEL);
+       if (!sipll5)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = core->name;
+       parent_name = __clk_get_name(parent);
+       init.ops = &rzg2l_cpg_sipll5_ops;
+       init.flags = 0;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       sipll5->hw.init = &init;
+       sipll5->conf = core->conf;
+       sipll5->priv = priv;
+
+       writel(CPG_SIPLL5_STBY_SSCG_EN_WEN | CPG_SIPLL5_STBY_RESETB_WEN |
+              CPG_SIPLL5_STBY_RESETB, priv->base + CPG_SIPLL5_STBY);
+
+       clk_hw = &sipll5->hw;
+       clk_hw->init = &init;
+
+       ret = devm_clk_hw_register(priv->dev, clk_hw);
+       if (ret)
+               return ERR_PTR(ret);
+
+       priv->mux_dsi_div_params.clksrc = 1; /* Use clk src 1 for DSI */
+       priv->mux_dsi_div_params.dsi_div_a = 1; /* Divided by 2 */
+       priv->mux_dsi_div_params.dsi_div_b = 2; /* Divided by 3 */
+
+       return clk_hw->clk;
+}
+
 struct pll_clk {
        struct clk_hw hw;
        unsigned int conf;
@@ -291,7 +710,7 @@ static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
        val1 = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
        val2 = readl(priv->base + GET_REG_SAMPLL_CLK2(pll_clk->conf));
        mult = MDIV(val1) + KDIV(val1) / 65536;
-       div = PDIV(val1) * (1 << SDIV(val2));
+       div = PDIV(val1) << SDIV(val2);
 
        return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, div);
 }
@@ -420,6 +839,9 @@ rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
                clk = rzg2l_cpg_pll_clk_register(core, priv->clks,
                                                 priv->base, priv);
                break;
+       case CLK_TYPE_SIPLL5:
+               clk = rzg2l_cpg_sipll5_register(core, priv->clks, priv);
+               break;
        case CLK_TYPE_DIV:
                clk = rzg2l_cpg_div_clk_register(core, priv->clks,
                                                 priv->base, priv);
@@ -430,6 +852,12 @@ rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
        case CLK_TYPE_SD_MUX:
                clk = rzg2l_cpg_sd_mux_clk_register(core, priv->base, priv);
                break;
+       case CLK_TYPE_PLL5_4_MUX:
+               clk = rzg2l_cpg_pll5_4_mux_clk_register(core, priv);
+               break;
+       case CLK_TYPE_DSI_DIV:
+               clk = rzg2l_cpg_dsi_div_clk_register(core, priv->clks, priv);
+               break;
        default:
                goto fail;
        }
@@ -498,6 +926,9 @@ static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
        if (!enable)
                return 0;
 
+       if (!priv->info->has_clk_mon_regs)
+               return 0;
+
        for (i = 1000; i > 0; --i) {
                if (((readl(priv->base + CLK_MON_R(reg))) & bitmask))
                        break;
@@ -568,7 +999,10 @@ static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
        if (clock->sibling)
                return clock->enabled;
 
-       value = readl(priv->base + CLK_MON_R(clock->off));
+       if (priv->info->has_clk_mon_regs)
+               value = readl(priv->base + CLK_MON_R(clock->off));
+       else
+               value = readl(priv->base + clock->off);
 
        return value & bitmask;
 }
@@ -743,8 +1177,16 @@ static int rzg2l_cpg_status(struct reset_controller_dev *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;
+
+       if (info->has_clk_mon_regs) {
+               return !(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
+       } else if (monbit >= 0) {
+               u32 monbitmask = BIT(monbit);
 
-       return !(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
+               return !!(readl(priv->base + CPG_RST_MON) & monbitmask);
+       }
+       return -ENOTSUPP;
 }
 
 static const struct reset_control_ops rzg2l_cpg_reset_ops = {
@@ -947,6 +1389,12 @@ static int __init rzg2l_cpg_probe(struct platform_device *pdev)
 }
 
 static const struct of_device_id rzg2l_cpg_match[] = {
+#ifdef CONFIG_CLK_R9A07G043
+       {
+               .compatible = "renesas,r9a07g043-cpg",
+               .data = &r9a07g043_cpg_info,
+       },
+#endif
 #ifdef CONFIG_CLK_R9A07G044
        {
                .compatible = "renesas,r9a07g044-cpg",
@@ -959,6 +1407,12 @@ static const struct of_device_id rzg2l_cpg_match[] = {
                .data = &r9a07g054_cpg_info,
        },
 #endif
+#ifdef CONFIG_CLK_R9A09G011
+       {
+               .compatible = "renesas,r9a09g011-cpg",
+               .data = &r9a09g011_cpg_info,
+       },
+#endif
        { /* sentinel */ }
 };
 
index ce657be..cecbdf5 100644 (file)
@@ -9,6 +9,12 @@
 #ifndef __RENESAS_RZG2L_CPG_H__
 #define __RENESAS_RZG2L_CPG_H__
 
+#define CPG_SIPLL5_STBY                (0x140)
+#define CPG_SIPLL5_CLK1                (0x144)
+#define CPG_SIPLL5_CLK3                (0x14C)
+#define CPG_SIPLL5_CLK4                (0x150)
+#define CPG_SIPLL5_CLK5                (0x154)
+#define CPG_SIPLL5_MON         (0x15C)
 #define CPG_PL1_DDIV           (0x200)
 #define CPG_PL2_DDIV           (0x204)
 #define CPG_PL3A_DDIV          (0x208)
 #define CPG_PL3_SSEL           (0x408)
 #define CPG_PL6_SSEL           (0x414)
 #define CPG_PL6_ETH_SSEL       (0x418)
+#define CPG_PL5_SDIV           (0x420)
+#define CPG_RST_MON            (0x680)
+#define CPG_OTHERFUNC1_REG     (0xBE8)
+
+#define CPG_SIPLL5_STBY_RESETB         BIT(0)
+#define CPG_SIPLL5_STBY_RESETB_WEN     BIT(16)
+#define CPG_SIPLL5_STBY_SSCG_EN_WEN    BIT(18)
+#define CPG_SIPLL5_STBY_DOWNSPREAD_WEN BIT(20)
+#define CPG_SIPLL5_CLK1_POSTDIV1_WEN   BIT(16)
+#define CPG_SIPLL5_CLK1_POSTDIV2_WEN   BIT(20)
+#define CPG_SIPLL5_CLK1_REFDIV_WEN     BIT(24)
+#define CPG_SIPLL5_CLK4_RESV_LSB       (0xFF)
+#define CPG_SIPLL5_MON_PLL5_LOCK       BIT(4)
+
+#define CPG_OTHERFUNC1_REG_RES0_ON_WEN BIT(16)
+
+#define CPG_PL5_SDIV_DIV_DSI_A_WEN     BIT(16)
+#define CPG_PL5_SDIV_DIV_DSI_B_WEN     BIT(24)
 
 #define CPG_CLKSTATUS_SELSDHI0_STS     BIT(28)
 #define CPG_CLKSTATUS_SELSDHI1_STS     BIT(29)
@@ -34,6 +58,7 @@
                (((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
 #define DIVPL1A                DDIV_PACK(CPG_PL1_DDIV, 0, 2)
 #define DIVPL2A                DDIV_PACK(CPG_PL2_DDIV, 0, 3)
+#define DIVDSILPCLK    DDIV_PACK(CPG_PL2_DDIV, 12, 2)
 #define DIVPL3A                DDIV_PACK(CPG_PL3A_DDIV, 0, 3)
 #define DIVPL3B                DDIV_PACK(CPG_PL3A_DDIV, 4, 3)
 #define DIVPL3C                DDIV_PACK(CPG_PL3A_DDIV, 8, 3)
                (((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
 
 #define SEL_PLL3_3     SEL_PLL_PACK(CPG_PL3_SSEL, 8, 1)
+#define SEL_PLL5_4     SEL_PLL_PACK(CPG_OTHERFUNC1_REG, 0, 1)
 #define SEL_PLL6_2     SEL_PLL_PACK(CPG_PL6_ETH_SSEL, 0, 1)
 #define SEL_GPU2       SEL_PLL_PACK(CPG_PL6_SSEL, 12, 1)
 
 #define SEL_SDHI0      DDIV_PACK(CPG_PL2SDHI_DSEL, 0, 2)
 #define SEL_SDHI1      DDIV_PACK(CPG_PL2SDHI_DSEL, 4, 2)
 
+#define EXTAL_FREQ_IN_MEGA_HZ  (24)
+
 /**
  * Definitions of CPG Core Clocks
  *
@@ -86,6 +114,16 @@ enum clk_types {
 
        /* Clock with SD clock source selector */
        CLK_TYPE_SD_MUX,
+
+       /* Clock for SIPLL5 */
+       CLK_TYPE_SIPLL5,
+
+       /* Clock for PLL5_4 clock source selector */
+       CLK_TYPE_PLL5_4_MUX,
+
+       /* Clock for DSI divider */
+       CLK_TYPE_DSI_DIV,
+
 };
 
 #define DEF_TYPE(_name, _id, _type...) \
@@ -98,17 +136,36 @@ enum clk_types {
        DEF_TYPE(_name, _id, CLK_TYPE_IN)
 #define DEF_FIXED(_name, _id, _parent, _mult, _div) \
        DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult)
-#define DEF_DIV(_name, _id, _parent, _conf, _dtable, _flag) \
+#define DEF_DIV(_name, _id, _parent, _conf, _dtable) \
+       DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
+                .parent = _parent, .dtable = _dtable, \
+                .flag = CLK_DIVIDER_HIWORD_MASK)
+#define DEF_DIV_RO(_name, _id, _parent, _conf, _dtable) \
        DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
-                .parent = _parent, .dtable = _dtable, .flag = _flag)
-#define DEF_MUX(_name, _id, _conf, _parent_names, _num_parents, _flag, \
-               _mux_flags) \
+                .parent = _parent, .dtable = _dtable, \
+                .flag = CLK_DIVIDER_READ_ONLY)
+#define DEF_MUX(_name, _id, _conf, _parent_names) \
        DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \
-                .parent_names = _parent_names, .num_parents = _num_parents, \
-                .flag = _flag, .mux_flags = _mux_flags)
-#define DEF_SD_MUX(_name, _id, _conf, _parent_names, _num_parents) \
+                .parent_names = _parent_names, \
+                .num_parents = ARRAY_SIZE(_parent_names), \
+                .mux_flags = CLK_MUX_HIWORD_MASK)
+#define DEF_MUX_RO(_name, _id, _conf, _parent_names) \
+       DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \
+                .parent_names = _parent_names, \
+                .num_parents = ARRAY_SIZE(_parent_names), \
+                .mux_flags = CLK_MUX_READ_ONLY)
+#define DEF_SD_MUX(_name, _id, _conf, _parent_names) \
        DEF_TYPE(_name, _id, CLK_TYPE_SD_MUX, .conf = _conf, \
-                .parent_names = _parent_names, .num_parents = _num_parents)
+                .parent_names = _parent_names, \
+                .num_parents = ARRAY_SIZE(_parent_names))
+#define DEF_PLL5_FOUTPOSTDIV(_name, _id, _parent) \
+       DEF_TYPE(_name, _id, CLK_TYPE_SIPLL5, .parent = _parent)
+#define DEF_PLL5_4_MUX(_name, _id, _conf, _parent_names) \
+       DEF_TYPE(_name, _id, CLK_TYPE_PLL5_4_MUX, .conf = _conf, \
+                .parent_names = _parent_names, \
+                .num_parents = ARRAY_SIZE(_parent_names))
+#define DEF_DSI_DIV(_name, _id, _parent, _flag) \
+       DEF_TYPE(_name, _id, CLK_TYPE_DSI_DIV, .parent = _parent, .flag = _flag)
 
 /**
  * struct rzg2l_mod_clk - Module Clocks definitions
@@ -150,17 +207,22 @@ struct rzg2l_mod_clk {
  *
  * @off: register offset
  * @bit: reset bit
+ * @monbit: monitor bit in CPG_RST_MON register, -1 if none
  */
 struct rzg2l_reset {
        u16 off;
        u8 bit;
+       s8 monbit;
 };
 
-#define DEF_RST(_id, _off, _bit)       \
+#define DEF_RST_MON(_id, _off, _bit, _monbit)  \
        [_id] = { \
                .off = (_off), \
-               .bit = (_bit) \
+               .bit = (_bit), \
+               .monbit = (_monbit) \
        }
+#define DEF_RST(_id, _off, _bit)       \
+       DEF_RST_MON(_id, _off, _bit, -1)
 
 /**
  * struct rzg2l_cpg_info - SoC-specific CPG Description
@@ -180,6 +242,7 @@ struct rzg2l_reset {
  * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
  *                 should not be disabled without a knowledgeable driver
  * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
+ * @has_clk_mon_regs: Flag indicating whether the SoC has CLK_MON registers
  */
 struct rzg2l_cpg_info {
        /* Core Clocks */
@@ -200,9 +263,13 @@ struct rzg2l_cpg_info {
        /* Critical Module Clocks that should not be disabled */
        const unsigned int *crit_mod_clks;
        unsigned int num_crit_mod_clks;
+
+       bool has_clk_mon_regs;
 };
 
+extern const struct rzg2l_cpg_info r9a07g043_cpg_info;
 extern const struct rzg2l_cpg_info r9a07g044_cpg_info;
 extern const struct rzg2l_cpg_info r9a07g054_cpg_info;
+extern const struct rzg2l_cpg_info r9a09g011_cpg_info;
 
 #endif
index 606ae6c..f85902e 100644 (file)
@@ -1591,6 +1591,7 @@ static const char *const rk3568_cru_critical_clocks[] __initconst = {
        "hclk_php",
        "pclk_php",
        "hclk_usb",
+       "hclk_vo",
 };
 
 static const char *const rk3568_pmucru_critical_clocks[] __initconst = {
index 17e5d1c..239d9ee 100644 (file)
@@ -20,6 +20,7 @@ obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynos-arm64.o
 obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK)  += clk-exynos7.o
 obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK)  += clk-exynos7885.o
 obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK)  += clk-exynos850.o
+obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK)  += clk-exynosautov9.o
 obj-$(CONFIG_S3C2410_COMMON_CLK)+= clk-s3c2410.o
 obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o
 obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o
diff --git a/drivers/clk/samsung/clk-exynosautov9.c b/drivers/clk/samsung/clk-exynosautov9.c
new file mode 100644 (file)
index 0000000..d9e1f8e
--- /dev/null
@@ -0,0 +1,1733 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Author: Chanho Park <chanho61.park@samsung.com>
+ *
+ * Common Clock Framework support for ExynosAuto V9 SoC.
+ */
+
+#include <linux/clk.h>
+#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 <dt-bindings/clock/samsung,exynosautov9.h>
+
+#include "clk.h"
+#include "clk-exynos-arm64.h"
+
+/* ---- CMU_TOP ------------------------------------------------------------ */
+
+/* Register Offset definitions for CMU_TOP (0x1b240000) */
+#define PLL_LOCKTIME_PLL_SHARED0               0x0000
+#define PLL_LOCKTIME_PLL_SHARED1               0x0004
+#define PLL_LOCKTIME_PLL_SHARED2               0x0008
+#define PLL_LOCKTIME_PLL_SHARED3               0x000c
+#define PLL_LOCKTIME_PLL_SHARED4               0x0010
+#define PLL_CON0_PLL_SHARED0                   0x0100
+#define PLL_CON3_PLL_SHARED0                   0x010c
+#define PLL_CON0_PLL_SHARED1                   0x0140
+#define PLL_CON3_PLL_SHARED1                   0x014c
+#define PLL_CON0_PLL_SHARED2                   0x0180
+#define PLL_CON3_PLL_SHARED2                   0x018c
+#define PLL_CON0_PLL_SHARED3                   0x01c0
+#define PLL_CON3_PLL_SHARED3                   0x01cc
+#define PLL_CON0_PLL_SHARED4                   0x0200
+#define PLL_CON3_PLL_SHARED4                   0x020c
+
+/* MUX */
+#define CLK_CON_MUX_MUX_CLKCMU_ACC_BUS         0x1000
+#define CLK_CON_MUX_MUX_CLKCMU_APM_BUS         0x1004
+#define CLK_CON_MUX_MUX_CLKCMU_AUD_BUS         0x1008
+#define CLK_CON_MUX_MUX_CLKCMU_AUD_CPU         0x100c
+#define CLK_CON_MUX_MUX_CLKCMU_BUSC_BUS                0x1010
+#define CLK_CON_MUX_MUX_CLKCMU_BUSMC_BUS       0x1018
+#define CLK_CON_MUX_MUX_CLKCMU_CMU_BOOST       0x101c
+#define CLK_CON_MUX_MUX_CLKCMU_CORE_BUS                0x1020
+#define CLK_CON_MUX_MUX_CLKCMU_CPUCL0_CLUSTER  0x1024
+#define CLK_CON_MUX_MUX_CLKCMU_CPUCL0_SWITCH   0x102c
+#define CLK_CON_MUX_MUX_CLKCMU_CPUCL1_CLUSTER  0x1030
+#define CLK_CON_MUX_MUX_CLKCMU_CPUCL1_SWITCH   0x1034
+#define CLK_CON_MUX_MUX_CLKCMU_DPTX_BUS                0x1040
+#define CLK_CON_MUX_MUX_CLKCMU_DPTX_DPGTC      0x1044
+#define CLK_CON_MUX_MUX_CLKCMU_DPUM_BUS                0x1048
+#define CLK_CON_MUX_MUX_CLKCMU_DPUS0_BUS       0x104c
+#define CLK_CON_MUX_MUX_CLKCMU_DPUS1_BUS       0x1050
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS0_BUS       0x1054
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS0_PCIE      0x1058
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS1_BUS       0x105c
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS1_MMC_CARD  0x1060
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS1_USBDRD    0x1064
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS2_BUS       0x1068
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS2_ETHERNET  0x106c
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS2_UFS_EMBD  0x1070
+#define CLK_CON_MUX_MUX_CLKCMU_G2D_G2D         0x1074
+#define CLK_CON_MUX_MUX_CLKCMU_G2D_MSCL                0x1078
+#define CLK_CON_MUX_MUX_CLKCMU_G3D00_SWITCH    0x107c
+#define CLK_CON_MUX_MUX_CLKCMU_G3D01_SWITCH    0x1080
+#define CLK_CON_MUX_MUX_CLKCMU_G3D1_SWITCH     0x1084
+#define CLK_CON_MUX_MUX_CLKCMU_ISPB_BUS                0x108c
+#define CLK_CON_MUX_MUX_CLKCMU_MFC_MFC         0x1090
+#define CLK_CON_MUX_MUX_CLKCMU_MFC_WFD         0x1094
+#define CLK_CON_MUX_MUX_CLKCMU_MIF_SWITCH      0x109c
+#define CLK_CON_MUX_MUX_CLKCMU_MIF_BUSP                0x1098
+#define CLK_CON_MUX_MUX_CLKCMU_MIF_SWITCH      0x109c
+#define CLK_CON_MUX_MUX_CLKCMU_NPU_BUS         0x10a0
+#define CLK_CON_MUX_MUX_CLKCMU_PERIC0_BUS      0x10a4
+#define CLK_CON_MUX_MUX_CLKCMU_PERIC0_IP       0x10a8
+#define CLK_CON_MUX_MUX_CLKCMU_PERIC1_BUS      0x10ac
+#define CLK_CON_MUX_MUX_CLKCMU_PERIC1_IP       0x10b0
+#define CLK_CON_MUX_MUX_CLKCMU_PERIS_BUS       0x10b4
+#define CLK_CON_MUX_MUX_CMU_CMUREF             0x10c0
+
+/* DIV */
+#define CLK_CON_DIV_CLKCMU_ACC_BUS             0x1800
+#define CLK_CON_DIV_CLKCMU_APM_BUS             0x1804
+#define CLK_CON_DIV_CLKCMU_AUD_BUS             0x1808
+#define CLK_CON_DIV_CLKCMU_AUD_CPU             0x180c
+#define CLK_CON_DIV_CLKCMU_BUSC_BUS            0x1810
+#define CLK_CON_DIV_CLKCMU_BUSMC_BUS           0x1818
+#define CLK_CON_DIV_CLKCMU_CORE_BUS            0x181c
+#define CLK_CON_DIV_CLKCMU_CPUCL0_CLUSTER      0x1820
+#define CLK_CON_DIV_CLKCMU_CPUCL0_SWITCH       0x1828
+#define CLK_CON_DIV_CLKCMU_CPUCL1_CLUSTER      0x182c
+#define CLK_CON_DIV_CLKCMU_CPUCL1_SWITCH       0x1830
+#define CLK_CON_DIV_CLKCMU_DPTX_BUS            0x183c
+#define CLK_CON_DIV_CLKCMU_DPTX_DPGTC          0x1840
+#define CLK_CON_DIV_CLKCMU_DPUM_BUS            0x1844
+#define CLK_CON_DIV_CLKCMU_DPUS0_BUS           0x1848
+#define CLK_CON_DIV_CLKCMU_DPUS1_BUS           0x184c
+#define CLK_CON_DIV_CLKCMU_FSYS0_BUS           0x1850
+#define CLK_CON_DIV_CLKCMU_FSYS0_PCIE          0x1854
+#define CLK_CON_DIV_CLKCMU_FSYS1_BUS           0x1858
+#define CLK_CON_DIV_CLKCMU_FSYS1_USBDRD                0x185c
+#define CLK_CON_DIV_CLKCMU_FSYS2_BUS           0x1860
+#define CLK_CON_DIV_CLKCMU_FSYS2_ETHERNET      0x1864
+#define CLK_CON_DIV_CLKCMU_FSYS2_UFS_EMBD      0x1868
+#define CLK_CON_DIV_CLKCMU_G2D_G2D             0x186c
+#define CLK_CON_DIV_CLKCMU_G2D_MSCL            0x1870
+#define CLK_CON_DIV_CLKCMU_G3D00_SWITCH                0x1874
+#define CLK_CON_DIV_CLKCMU_G3D01_SWITCH                0x1878
+#define CLK_CON_DIV_CLKCMU_G3D1_SWITCH         0x187c
+#define CLK_CON_DIV_CLKCMU_ISPB_BUS            0x1884
+#define CLK_CON_DIV_CLKCMU_MFC_MFC             0x1888
+#define CLK_CON_DIV_CLKCMU_MFC_WFD             0x188c
+#define CLK_CON_DIV_CLKCMU_MIF_BUSP            0x1890
+#define CLK_CON_DIV_CLKCMU_NPU_BUS             0x1894
+#define CLK_CON_DIV_CLKCMU_PERIC0_BUS          0x1898
+#define CLK_CON_DIV_CLKCMU_PERIC0_IP           0x189c
+#define CLK_CON_DIV_CLKCMU_PERIC1_BUS          0x18a0
+#define CLK_CON_DIV_CLKCMU_PERIC1_IP           0x18a4
+#define CLK_CON_DIV_CLKCMU_PERIS_BUS           0x18a8
+#define CLK_CON_DIV_DIV_CLKCMU_CMU_BOOST       0x18b4
+
+#define CLK_CON_DIV_PLL_SHARED0_DIV2           0x18b8
+#define CLK_CON_DIV_PLL_SHARED0_DIV3           0x18bc
+#define CLK_CON_DIV_PLL_SHARED1_DIV2           0x18c0
+#define CLK_CON_DIV_PLL_SHARED1_DIV3           0x18c4
+#define CLK_CON_DIV_PLL_SHARED1_DIV4           0x18c8
+#define CLK_CON_DIV_PLL_SHARED2_DIV2           0x18cc
+#define CLK_CON_DIV_PLL_SHARED2_DIV3           0x18d0
+#define CLK_CON_DIV_PLL_SHARED2_DIV4           0x18d4
+#define CLK_CON_DIV_PLL_SHARED4_DIV2           0x18d4
+#define CLK_CON_DIV_PLL_SHARED4_DIV4           0x18d8
+
+/* GATE */
+#define CLK_CON_GAT_CLKCMU_CMU_BUSC_BOOST      0x2000
+#define CLK_CON_GAT_CLKCMU_CMU_BUSMC_BOOST     0x2004
+#define CLK_CON_GAT_CLKCMU_CMU_CORE_BOOST      0x2008
+#define CLK_CON_GAT_CLKCMU_CMU_CPUCL0_BOOST    0x2010
+#define CLK_CON_GAT_CLKCMU_CMU_CPUCL1_BOOST    0x2018
+#define CLK_CON_GAT_CLKCMU_CMU_MIF_BOOST       0x2020
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS1_MMC_CARD 0x2024
+#define CLK_CON_GAT_GATE_CLKCMU_MIF_SWITCH     0x2028
+#define CLK_CON_GAT_GATE_CLKCMU_ACC_BUS                0x202c
+#define CLK_CON_GAT_GATE_CLKCMU_APM_BUS                0x2030
+#define CLK_CON_GAT_GATE_CLKCMU_AUD_BUS                0x2034
+#define CLK_CON_GAT_GATE_CLKCMU_AUD_CPU                0x2038
+#define CLK_CON_GAT_GATE_CLKCMU_BUSC_BUS       0x203c
+#define CLK_CON_GAT_GATE_CLKCMU_BUSMC_BUS      0x2044
+#define CLK_CON_GAT_GATE_CLKCMU_CMU_BOOST      0x2048
+#define CLK_CON_GAT_GATE_CLKCMU_CORE_BUS       0x204c
+#define CLK_CON_GAT_GATE_CLKCMU_CPUCL0_CLUSTER 0x2050
+#define CLK_CON_GAT_GATE_CLKCMU_CPUCL0_SWITCH  0x2058
+#define CLK_CON_GAT_GATE_CLKCMU_CPUCL1_CLUSTER 0x205c
+#define CLK_CON_GAT_GATE_CLKCMU_CPUCL1_SWITCH  0x2060
+#define CLK_CON_GAT_GATE_CLKCMU_DPTX_BUS       0x206c
+#define CLK_CON_GAT_GATE_CLKCMU_DPTX_DPGTC     0x2070
+#define CLK_CON_GAT_GATE_CLKCMU_DPUM_BUS       0x2060
+#define CLK_CON_GAT_GATE_CLKCMU_DPUS0_BUS      0x2064
+#define CLK_CON_GAT_GATE_CLKCMU_DPUS1_BUS      0x207c
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS0_BUS      0x2080
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS0_PCIE     0x2084
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS1_BUS      0x2088
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS1_USBDRD   0x208c
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS2_BUS      0x2090
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS2_ETHERNET 0x2094
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS2_UFS_EMBD 0x2098
+#define CLK_CON_GAT_GATE_CLKCMU_G2D_G2D                0x209c
+#define CLK_CON_GAT_GATE_CLKCMU_G2D_MSCL       0x20a0
+#define CLK_CON_GAT_GATE_CLKCMU_G3D00_SWITCH   0x20a4
+#define CLK_CON_GAT_GATE_CLKCMU_G3D01_SWITCH   0x20a8
+#define CLK_CON_GAT_GATE_CLKCMU_G3D1_SWITCH    0x20ac
+#define CLK_CON_GAT_GATE_CLKCMU_ISPB_BUS       0x20b4
+#define CLK_CON_GAT_GATE_CLKCMU_MFC_MFC                0x20b8
+#define CLK_CON_GAT_GATE_CLKCMU_MFC_WFD                0x20bc
+#define CLK_CON_GAT_GATE_CLKCMU_MIF_BUSP       0x20c0
+#define CLK_CON_GAT_GATE_CLKCMU_NPU_BUS                0x20c4
+#define CLK_CON_GAT_GATE_CLKCMU_PERIC0_BUS     0x20c8
+#define CLK_CON_GAT_GATE_CLKCMU_PERIC0_IP      0x20cc
+#define CLK_CON_GAT_GATE_CLKCMU_PERIC1_BUS     0x20d0
+#define CLK_CON_GAT_GATE_CLKCMU_PERIC1_IP      0x20d4
+#define CLK_CON_GAT_GATE_CLKCMU_PERIS_BUS      0x20d8
+
+static const unsigned long top_clk_regs[] __initconst = {
+       PLL_LOCKTIME_PLL_SHARED0,
+       PLL_LOCKTIME_PLL_SHARED1,
+       PLL_LOCKTIME_PLL_SHARED2,
+       PLL_LOCKTIME_PLL_SHARED3,
+       PLL_LOCKTIME_PLL_SHARED4,
+       PLL_CON0_PLL_SHARED0,
+       PLL_CON3_PLL_SHARED0,
+       PLL_CON0_PLL_SHARED1,
+       PLL_CON3_PLL_SHARED1,
+       PLL_CON0_PLL_SHARED2,
+       PLL_CON3_PLL_SHARED2,
+       PLL_CON0_PLL_SHARED3,
+       PLL_CON3_PLL_SHARED3,
+       PLL_CON0_PLL_SHARED4,
+       PLL_CON3_PLL_SHARED4,
+       CLK_CON_MUX_MUX_CLKCMU_ACC_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_APM_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_AUD_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_AUD_CPU,
+       CLK_CON_MUX_MUX_CLKCMU_BUSC_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_CMU_BOOST,
+       CLK_CON_MUX_MUX_CLKCMU_CORE_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_CPUCL0_CLUSTER,
+       CLK_CON_MUX_MUX_CLKCMU_CPUCL0_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_CPUCL1_CLUSTER,
+       CLK_CON_MUX_MUX_CLKCMU_CPUCL1_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_DPTX_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_DPTX_DPGTC,
+       CLK_CON_MUX_MUX_CLKCMU_DPUM_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_DPUS0_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_DPUS1_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS0_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS0_PCIE,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS1_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS1_MMC_CARD,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS1_USBDRD,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS2_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS2_ETHERNET,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS2_UFS_EMBD,
+       CLK_CON_MUX_MUX_CLKCMU_G2D_G2D,
+       CLK_CON_MUX_MUX_CLKCMU_G2D_MSCL,
+       CLK_CON_MUX_MUX_CLKCMU_G3D00_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_G3D01_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_G3D1_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_ISPB_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_MFC_MFC,
+       CLK_CON_MUX_MUX_CLKCMU_MFC_WFD,
+       CLK_CON_MUX_MUX_CLKCMU_MIF_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_MIF_BUSP,
+       CLK_CON_MUX_MUX_CLKCMU_MIF_SWITCH,
+       CLK_CON_MUX_MUX_CLKCMU_NPU_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_PERIC0_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_PERIC0_IP,
+       CLK_CON_MUX_MUX_CLKCMU_PERIC1_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_PERIC1_IP,
+       CLK_CON_MUX_MUX_CLKCMU_PERIS_BUS,
+       CLK_CON_MUX_MUX_CMU_CMUREF,
+       CLK_CON_DIV_CLKCMU_ACC_BUS,
+       CLK_CON_DIV_CLKCMU_APM_BUS,
+       CLK_CON_DIV_CLKCMU_AUD_BUS,
+       CLK_CON_DIV_CLKCMU_AUD_CPU,
+       CLK_CON_DIV_CLKCMU_BUSC_BUS,
+       CLK_CON_DIV_CLKCMU_BUSMC_BUS,
+       CLK_CON_DIV_CLKCMU_CORE_BUS,
+       CLK_CON_DIV_CLKCMU_CPUCL0_CLUSTER,
+       CLK_CON_DIV_CLKCMU_CPUCL0_SWITCH,
+       CLK_CON_DIV_CLKCMU_CPUCL1_CLUSTER,
+       CLK_CON_DIV_CLKCMU_CPUCL1_SWITCH,
+       CLK_CON_DIV_CLKCMU_DPTX_BUS,
+       CLK_CON_DIV_CLKCMU_DPTX_DPGTC,
+       CLK_CON_DIV_CLKCMU_DPUM_BUS,
+       CLK_CON_DIV_CLKCMU_DPUS0_BUS,
+       CLK_CON_DIV_CLKCMU_DPUS1_BUS,
+       CLK_CON_DIV_CLKCMU_FSYS0_BUS,
+       CLK_CON_DIV_CLKCMU_FSYS0_PCIE,
+       CLK_CON_DIV_CLKCMU_FSYS1_BUS,
+       CLK_CON_DIV_CLKCMU_FSYS1_USBDRD,
+       CLK_CON_DIV_CLKCMU_FSYS2_BUS,
+       CLK_CON_DIV_CLKCMU_FSYS2_ETHERNET,
+       CLK_CON_DIV_CLKCMU_FSYS2_UFS_EMBD,
+       CLK_CON_DIV_CLKCMU_G2D_G2D,
+       CLK_CON_DIV_CLKCMU_G2D_MSCL,
+       CLK_CON_DIV_CLKCMU_G3D00_SWITCH,
+       CLK_CON_DIV_CLKCMU_G3D01_SWITCH,
+       CLK_CON_DIV_CLKCMU_G3D1_SWITCH,
+       CLK_CON_DIV_CLKCMU_ISPB_BUS,
+       CLK_CON_DIV_CLKCMU_MFC_MFC,
+       CLK_CON_DIV_CLKCMU_MFC_WFD,
+       CLK_CON_DIV_CLKCMU_MIF_BUSP,
+       CLK_CON_DIV_CLKCMU_NPU_BUS,
+       CLK_CON_DIV_CLKCMU_PERIC0_BUS,
+       CLK_CON_DIV_CLKCMU_PERIC0_IP,
+       CLK_CON_DIV_CLKCMU_PERIC1_BUS,
+       CLK_CON_DIV_CLKCMU_PERIC1_IP,
+       CLK_CON_DIV_CLKCMU_PERIS_BUS,
+       CLK_CON_DIV_DIV_CLKCMU_CMU_BOOST,
+       CLK_CON_DIV_PLL_SHARED0_DIV2,
+       CLK_CON_DIV_PLL_SHARED0_DIV3,
+       CLK_CON_DIV_PLL_SHARED1_DIV2,
+       CLK_CON_DIV_PLL_SHARED1_DIV3,
+       CLK_CON_DIV_PLL_SHARED1_DIV4,
+       CLK_CON_DIV_PLL_SHARED2_DIV2,
+       CLK_CON_DIV_PLL_SHARED2_DIV3,
+       CLK_CON_DIV_PLL_SHARED2_DIV4,
+       CLK_CON_DIV_PLL_SHARED4_DIV2,
+       CLK_CON_DIV_PLL_SHARED4_DIV4,
+       CLK_CON_GAT_CLKCMU_CMU_BUSC_BOOST,
+       CLK_CON_GAT_CLKCMU_CMU_BUSMC_BOOST,
+       CLK_CON_GAT_CLKCMU_CMU_CORE_BOOST,
+       CLK_CON_GAT_CLKCMU_CMU_CPUCL0_BOOST,
+       CLK_CON_GAT_CLKCMU_CMU_CPUCL1_BOOST,
+       CLK_CON_GAT_CLKCMU_CMU_MIF_BOOST,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS1_MMC_CARD,
+       CLK_CON_GAT_GATE_CLKCMU_MIF_SWITCH,
+       CLK_CON_GAT_GATE_CLKCMU_ACC_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_APM_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_AUD_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_AUD_CPU,
+       CLK_CON_GAT_GATE_CLKCMU_BUSC_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_BUSMC_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_CMU_BOOST,
+       CLK_CON_GAT_GATE_CLKCMU_CORE_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_CPUCL0_CLUSTER,
+       CLK_CON_GAT_GATE_CLKCMU_CPUCL0_SWITCH,
+       CLK_CON_GAT_GATE_CLKCMU_CPUCL1_CLUSTER,
+       CLK_CON_GAT_GATE_CLKCMU_CPUCL1_SWITCH,
+       CLK_CON_GAT_GATE_CLKCMU_DPTX_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_DPTX_DPGTC,
+       CLK_CON_GAT_GATE_CLKCMU_DPUM_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_DPUS0_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_DPUS1_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS0_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS0_PCIE,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS1_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS1_USBDRD,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS2_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS2_ETHERNET,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS2_UFS_EMBD,
+       CLK_CON_GAT_GATE_CLKCMU_G2D_G2D,
+       CLK_CON_GAT_GATE_CLKCMU_G2D_MSCL,
+       CLK_CON_GAT_GATE_CLKCMU_G3D00_SWITCH,
+       CLK_CON_GAT_GATE_CLKCMU_G3D01_SWITCH,
+       CLK_CON_GAT_GATE_CLKCMU_G3D1_SWITCH,
+       CLK_CON_GAT_GATE_CLKCMU_ISPB_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_MFC_MFC,
+       CLK_CON_GAT_GATE_CLKCMU_MFC_WFD,
+       CLK_CON_GAT_GATE_CLKCMU_MIF_BUSP,
+       CLK_CON_GAT_GATE_CLKCMU_NPU_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_PERIC0_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_PERIC0_IP,
+       CLK_CON_GAT_GATE_CLKCMU_PERIC1_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_PERIC1_IP,
+       CLK_CON_GAT_GATE_CLKCMU_PERIS_BUS,
+};
+
+static const struct samsung_pll_clock top_pll_clks[] __initconst = {
+       /* CMU_TOP_PURECLKCOMP */
+       PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared0_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED0, PLL_CON3_PLL_SHARED0, NULL),
+       PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared1_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED1, PLL_CON3_PLL_SHARED1, NULL),
+       PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared2_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED2, PLL_CON3_PLL_SHARED2, NULL),
+       PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared3_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED3, PLL_CON3_PLL_SHARED3, NULL),
+       PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared4_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED4, PLL_CON3_PLL_SHARED4, NULL),
+};
+
+/* List of parent clocks for Muxes in CMU_TOP */
+PNAME(mout_shared0_pll_p) = { "oscclk", "fout_shared0_pll" };
+PNAME(mout_shared1_pll_p) = { "oscclk", "fout_shared1_pll" };
+PNAME(mout_shared2_pll_p) = { "oscclk", "fout_shared2_pll" };
+PNAME(mout_shared3_pll_p) = { "oscclk", "fout_shared3_pll" };
+PNAME(mout_shared4_pll_p) = { "oscclk", "fout_shared4_pll" };
+
+PNAME(mout_clkcmu_cmu_boost_p) = { "dout_shared2_div3", "dout_shared1_div4",
+                                  "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_cmu_cmuref_p) = { "oscclk", "dout_cmu_boost" };
+PNAME(mout_clkcmu_acc_bus_p) = { "dout_shared1_div3", "dout_shared2_div3",
+                                "dout_shared1_div4", "dout_shared2_div4" };
+PNAME(mout_clkcmu_apm_bus_p) = { "dout_shared2_div3", "dout_shared1_div4",
+                                "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_aud_cpu_p) = { "dout_shared0_div2", "dout_shared1_div2",
+                                "dout_shared2_div2", "dout_shared0_div3",
+                                "dout_shared4_div2", "dout_shared1_div3",
+                                "fout_shared3_pll" };
+PNAME(mout_clkcmu_aud_bus_p) = { "dout_shared4_div2", "dout_shared1_div3",
+                                 "dout_shared2_div3", "dout_shared1_div4" };
+PNAME(mout_clkcmu_busc_bus_p) = { "dout_shared2_div3", "dout_shared1_div4",
+                                 "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_core_bus_p) = { "dout_shared0_div2", "dout_shared1_div2",
+                                 "dout_shared2_div2", "dout_shared0_div3",
+                                 "dout_shared4_div2", "dout_shared1_div3",
+                                 "dout_shared2_div3", "fout_shared3_pll" };
+PNAME(mout_clkcmu_cpucl0_switch_p) = {
+       "dout_shared0_div2", "dout_shared1_div2",
+       "dout_shared2_div2", "dout_shared4_div2" };
+PNAME(mout_clkcmu_cpucl0_cluster_p) = {
+       "fout_shared2_pll", "fout_shared4_pll",
+       "dout_shared0_div2", "dout_shared1_div2",
+       "dout_shared2_div2", "dout_shared4_div2",
+       "dout_shared2_div3", "fout_shared3_pll" };
+PNAME(mout_clkcmu_dptx_bus_p) = { "dout_shared4_div2", "dout_shared2_div3",
+                                 "dout_shared1_div4", "dout_shared2_div4" };
+PNAME(mout_clkcmu_dptx_dpgtc_p) = { "oscclk", "dout_shared2_div3",
+                                   "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_dpum_bus_p) = { "dout_shared1_div3", "dout_shared2_div3",
+                                 "dout_shared1_div4", "dout_shared2_div4",
+                                 "dout_shared4_div4", "fout_shared3_pll" };
+PNAME(mout_clkcmu_fsys0_bus_p) = {
+       "dout_shared4_div2", "dout_shared2_div3",
+       "dout_shared1_div4", "dout_shared2_div4" };
+PNAME(mout_clkcmu_fsys0_pcie_p) = { "oscclk", "dout_shared2_div4" };
+PNAME(mout_clkcmu_fsys1_bus_p) = { "dout_shared2_div3", "dout_shared1_div4",
+                                   "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_fsys1_usbdrd_p) = {
+       "oscclk", "dout_shared2_div3",
+       "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_fsys1_mmc_card_p) = {
+       "oscclk", "dout_shared2_div2",
+       "dout_shared4_div2", "dout_shared2_div3" };
+PNAME(mout_clkcmu_fsys2_ethernet_p) = {
+       "oscclk", "dout_shared2_div2",
+       "dout_shared0_div3", "dout_shared2_div3",
+       "dout_shared1_div4", "fout_shared3_pll" };
+PNAME(mout_clkcmu_g2d_g2d_p) = { "dout_shared2_div2", "dout_shared0_div3",
+                                "dout_shared4_div2", "dout_shared1_div3",
+                                "dout_shared2_div3", "dout_shared1_div4",
+                                "dout_shared2_div4", "dout_shared4_div4" };
+PNAME(mout_clkcmu_g3d0_switch_p) = { "dout_shared0_div2", "dout_shared1_div2",
+                                    "dout_shared2_div2", "dout_shared4_div2" };
+PNAME(mout_clkcmu_g3d1_switch_p) = { "dout_shared2_div2", "dout_shared4_div2",
+                                    "dout_shared2_div3", "dout_shared1_div4" };
+PNAME(mout_clkcmu_mif_switch_p) = { "fout_shared0_pll", "fout_shared1_pll",
+                                   "fout_shared2_pll", "fout_shared4_pll",
+                                   "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared2_div2", "fout_shared3_pll" };
+PNAME(mout_clkcmu_npu_bus_p) = { "dout_shared1_div2", "dout_shared2_div2",
+                                "dout_shared0_div3", "dout_shared4_div2",
+                                "dout_shared1_div3", "dout_shared2_div3",
+                                "dout_shared1_div4", "fout_shared3_pll" };
+PNAME(mout_clkcmu_peric0_bus_p) = { "dout_shared2_div3", "dout_shared2_div4" };
+
+static const struct samsung_mux_clock top_mux_clks[] __initconst = {
+       /* CMU_TOP_PURECLKCOMP */
+       MUX(MOUT_SHARED0_PLL, "mout_shared0_pll", mout_shared0_pll_p,
+           PLL_CON0_PLL_SHARED0, 4, 1),
+       MUX(MOUT_SHARED1_PLL, "mout_shared1_pll", mout_shared1_pll_p,
+           PLL_CON0_PLL_SHARED1, 4, 1),
+       MUX(MOUT_SHARED2_PLL, "mout_shared2_pll", mout_shared2_pll_p,
+           PLL_CON0_PLL_SHARED2, 4, 1),
+       MUX(MOUT_SHARED3_PLL, "mout_shared3_pll", mout_shared3_pll_p,
+           PLL_CON0_PLL_SHARED3, 4, 1),
+       MUX(MOUT_SHARED4_PLL, "mout_shared4_pll", mout_shared4_pll_p,
+           PLL_CON0_PLL_SHARED4, 4, 1),
+
+       /* BOOST */
+       MUX(MOUT_CLKCMU_CMU_BOOST, "mout_clkcmu_cmu_boost",
+           mout_clkcmu_cmu_boost_p, CLK_CON_MUX_MUX_CLKCMU_CMU_BOOST, 0, 2),
+       MUX(MOUT_CLKCMU_CMU_CMUREF, "mout_clkcmu_cmu_cmuref",
+           mout_clkcmu_cmu_cmuref_p, CLK_CON_MUX_MUX_CMU_CMUREF, 0, 1),
+
+       /* ACC */
+       MUX(MOUT_CLKCMU_ACC_BUS, "mout_clkcmu_acc_bus", mout_clkcmu_acc_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_ACC_BUS, 0, 2),
+
+       /* APM */
+       MUX(MOUT_CLKCMU_APM_BUS, "mout_clkcmu_apm_bus", mout_clkcmu_apm_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_APM_BUS, 0, 2),
+
+       /* AUD */
+       MUX(MOUT_CLKCMU_AUD_CPU, "mout_clkcmu_aud_cpu", mout_clkcmu_aud_cpu_p,
+           CLK_CON_MUX_MUX_CLKCMU_AUD_CPU, 0, 3),
+       MUX(MOUT_CLKCMU_AUD_BUS, "mout_clkcmu_aud_bus", mout_clkcmu_aud_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_AUD_BUS, 0, 2),
+
+       /* BUSC */
+       MUX(MOUT_CLKCMU_BUSC_BUS, "mout_clkcmu_busc_bus",
+           mout_clkcmu_busc_bus_p, CLK_CON_MUX_MUX_CLKCMU_BUSC_BUS, 0, 2),
+
+       /* BUSMC */
+       MUX(MOUT_CLKCMU_BUSMC_BUS, "mout_clkcmu_busmc_bus",
+           mout_clkcmu_busc_bus_p, CLK_CON_MUX_MUX_CLKCMU_BUSMC_BUS, 0, 2),
+
+       /* CORE */
+       MUX(MOUT_CLKCMU_CORE_BUS, "mout_clkcmu_core_bus",
+           mout_clkcmu_core_bus_p, CLK_CON_MUX_MUX_CLKCMU_CORE_BUS, 0, 3),
+
+       /* CPUCL0 */
+       MUX(MOUT_CLKCMU_CPUCL0_SWITCH, "mout_clkcmu_cpucl0_switch",
+           mout_clkcmu_cpucl0_switch_p, CLK_CON_MUX_MUX_CLKCMU_CPUCL0_SWITCH,
+           0, 2),
+       MUX(MOUT_CLKCMU_CPUCL0_CLUSTER, "mout_clkcmu_cpucl0_cluster",
+           mout_clkcmu_cpucl0_cluster_p,
+           CLK_CON_MUX_MUX_CLKCMU_CPUCL0_CLUSTER, 0, 3),
+
+       /* CPUCL1 */
+       MUX(MOUT_CLKCMU_CPUCL1_SWITCH, "mout_clkcmu_cpucl1_switch",
+           mout_clkcmu_cpucl0_switch_p, CLK_CON_MUX_MUX_CLKCMU_CPUCL1_SWITCH,
+           0, 2),
+       MUX(MOUT_CLKCMU_CPUCL1_CLUSTER, "mout_clkcmu_cpucl1_cluster",
+           mout_clkcmu_cpucl0_cluster_p,
+           CLK_CON_MUX_MUX_CLKCMU_CPUCL1_CLUSTER, 0, 3),
+
+       /* DPTX */
+       MUX(MOUT_CLKCMU_DPTX_BUS, "mout_clkcmu_dptx_bus",
+           mout_clkcmu_dptx_bus_p, CLK_CON_MUX_MUX_CLKCMU_DPTX_BUS, 0, 2),
+       MUX(MOUT_CLKCMU_DPTX_DPGTC, "mout_clkcmu_dptx_dpgtc",
+           mout_clkcmu_dptx_dpgtc_p, CLK_CON_MUX_MUX_CLKCMU_DPTX_DPGTC, 0, 2),
+
+       /* DPUM */
+       MUX(MOUT_CLKCMU_DPUM_BUS, "mout_clkcmu_dpum_bus",
+           mout_clkcmu_dpum_bus_p, CLK_CON_MUX_MUX_CLKCMU_DPUM_BUS, 0, 3),
+
+       /* DPUS */
+       MUX(MOUT_CLKCMU_DPUS0_BUS, "mout_clkcmu_dpus0_bus",
+           mout_clkcmu_dpum_bus_p, CLK_CON_MUX_MUX_CLKCMU_DPUS0_BUS, 0, 3),
+       MUX(MOUT_CLKCMU_DPUS1_BUS, "mout_clkcmu_dpus1_bus",
+           mout_clkcmu_dpum_bus_p, CLK_CON_MUX_MUX_CLKCMU_DPUS1_BUS, 0, 3),
+
+       /* FSYS0 */
+       MUX(MOUT_CLKCMU_FSYS0_BUS, "mout_clkcmu_fsys0_bus",
+           mout_clkcmu_fsys0_bus_p, CLK_CON_MUX_MUX_CLKCMU_FSYS0_BUS, 0, 2),
+       MUX(MOUT_CLKCMU_FSYS0_PCIE, "mout_clkcmu_fsys0_pcie",
+           mout_clkcmu_fsys0_pcie_p, CLK_CON_MUX_MUX_CLKCMU_FSYS0_PCIE, 0, 1),
+
+       /* FSYS1 */
+       MUX(MOUT_CLKCMU_FSYS1_BUS, "mout_clkcmu_fsys1_bus",
+           mout_clkcmu_fsys1_bus_p, CLK_CON_MUX_MUX_CLKCMU_FSYS1_BUS, 0, 2),
+       MUX(MOUT_CLKCMU_FSYS1_USBDRD, "mout_clkcmu_fsys1_usbdrd",
+           mout_clkcmu_fsys1_usbdrd_p, CLK_CON_MUX_MUX_CLKCMU_FSYS1_USBDRD,
+           0, 2),
+       MUX(MOUT_CLKCMU_FSYS1_MMC_CARD, "mout_clkcmu_fsys1_mmc_card",
+           mout_clkcmu_fsys1_mmc_card_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS1_MMC_CARD, 0, 2),
+
+       /* FSYS2 */
+       MUX(MOUT_CLKCMU_FSYS2_BUS, "mout_clkcmu_fsys2_bus",
+           mout_clkcmu_fsys0_bus_p, CLK_CON_MUX_MUX_CLKCMU_FSYS2_BUS, 0, 2),
+       MUX(MOUT_CLKCMU_FSYS2_UFS_EMBD, "mout_clkcmu_fsys2_ufs_embd",
+           mout_clkcmu_fsys1_usbdrd_p, CLK_CON_MUX_MUX_CLKCMU_FSYS2_UFS_EMBD,
+           0, 2),
+       MUX(MOUT_CLKCMU_FSYS2_ETHERNET, "mout_clkcmu_fsys2_ethernet",
+           mout_clkcmu_fsys2_ethernet_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS2_ETHERNET, 0, 3),
+
+       /* G2D */
+       MUX(MOUT_CLKCMU_G2D_G2D, "mout_clkcmu_g2d_g2d", mout_clkcmu_g2d_g2d_p,
+           CLK_CON_MUX_MUX_CLKCMU_G2D_G2D, 0, 3),
+       MUX(MOUT_CLKCMU_G2D_MSCL, "mout_clkcmu_g2d_mscl",
+           mout_clkcmu_fsys1_bus_p, CLK_CON_MUX_MUX_CLKCMU_G2D_MSCL, 0, 2),
+
+       /* G3D0 */
+       MUX(MOUT_CLKCMU_G3D00_SWITCH, "mout_clkcmu_g3d00_switch",
+           mout_clkcmu_g3d0_switch_p, CLK_CON_MUX_MUX_CLKCMU_G3D00_SWITCH,
+           0, 2),
+       MUX(MOUT_CLKCMU_G3D01_SWITCH, "mout_clkcmu_g3d01_switch",
+           mout_clkcmu_g3d0_switch_p, CLK_CON_MUX_MUX_CLKCMU_G3D01_SWITCH,
+           0, 2),
+
+       /* G3D1 */
+       MUX(MOUT_CLKCMU_G3D1_SWITCH, "mout_clkcmu_g3d1_switch",
+           mout_clkcmu_g3d1_switch_p, CLK_CON_MUX_MUX_CLKCMU_G3D1_SWITCH,
+           0, 2),
+
+       /* ISPB */
+       MUX(MOUT_CLKCMU_ISPB_BUS, "mout_clkcmu_ispb_bus",
+           mout_clkcmu_acc_bus_p, CLK_CON_MUX_MUX_CLKCMU_ISPB_BUS, 0, 2),
+
+       /* MFC */
+       MUX(MOUT_CLKCMU_MFC_MFC, "mout_clkcmu_mfc_mfc",
+           mout_clkcmu_g3d1_switch_p, CLK_CON_MUX_MUX_CLKCMU_MFC_MFC, 0, 2),
+       MUX(MOUT_CLKCMU_MFC_WFD, "mout_clkcmu_mfc_wfd",
+           mout_clkcmu_fsys0_bus_p, CLK_CON_MUX_MUX_CLKCMU_MFC_WFD, 0, 2),
+
+       /* MIF */
+       MUX(MOUT_CLKCMU_MIF_SWITCH, "mout_clkcmu_mif_switch",
+           mout_clkcmu_mif_switch_p, CLK_CON_MUX_MUX_CLKCMU_MIF_SWITCH, 0, 3),
+       MUX(MOUT_CLKCMU_MIF_BUSP, "mout_clkcmu_mif_busp",
+           mout_clkcmu_fsys1_bus_p, CLK_CON_MUX_MUX_CLKCMU_MIF_BUSP, 0, 2),
+
+       /* NPU */
+       MUX(MOUT_CLKCMU_NPU_BUS, "mout_clkcmu_npu_bus", mout_clkcmu_npu_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_NPU_BUS, 0, 3),
+
+       /* PERIC0 */
+       MUX(MOUT_CLKCMU_PERIC0_BUS, "mout_clkcmu_peric0_bus",
+           mout_clkcmu_peric0_bus_p, CLK_CON_MUX_MUX_CLKCMU_PERIC0_BUS, 0, 1),
+       MUX(MOUT_CLKCMU_PERIC0_IP, "mout_clkcmu_peric0_ip",
+           mout_clkcmu_peric0_bus_p, CLK_CON_MUX_MUX_CLKCMU_PERIC0_IP, 0, 1),
+
+       /* PERIC1 */
+       MUX(MOUT_CLKCMU_PERIC1_BUS, "mout_clkcmu_peric1_bus",
+           mout_clkcmu_peric0_bus_p, CLK_CON_MUX_MUX_CLKCMU_PERIC1_BUS, 0, 1),
+       MUX(MOUT_CLKCMU_PERIC1_IP, "mout_clkcmu_peric1_ip",
+           mout_clkcmu_peric0_bus_p, CLK_CON_MUX_MUX_CLKCMU_PERIC1_IP, 0, 1),
+
+       /* PERIS */
+       MUX(MOUT_CLKCMU_PERIS_BUS, "mout_clkcmu_peris_bus",
+           mout_clkcmu_peric0_bus_p, CLK_CON_MUX_MUX_CLKCMU_PERIS_BUS, 0, 1),
+};
+
+static const struct samsung_div_clock top_div_clks[] __initconst = {
+       /* CMU_TOP_PURECLKCOMP */
+       DIV(DOUT_SHARED0_DIV3, "dout_shared0_div3", "mout_shared0_pll",
+           CLK_CON_DIV_PLL_SHARED0_DIV3, 0, 2),
+       DIV(DOUT_SHARED0_DIV2, "dout_shared0_div2", "mout_shared0_pll",
+           CLK_CON_DIV_PLL_SHARED0_DIV2, 0, 1),
+
+       DIV(DOUT_SHARED1_DIV3, "dout_shared1_div3", "mout_shared1_pll",
+           CLK_CON_DIV_PLL_SHARED1_DIV3, 0, 2),
+       DIV(DOUT_SHARED1_DIV2, "dout_shared1_div2", "mout_shared1_pll",
+           CLK_CON_DIV_PLL_SHARED1_DIV2, 0, 1),
+       DIV(DOUT_SHARED1_DIV4, "dout_shared1_div4", "dout_shared1_div2",
+           CLK_CON_DIV_PLL_SHARED1_DIV4, 0, 1),
+
+       DIV(DOUT_SHARED2_DIV3, "dout_shared2_div3", "mout_shared2_pll",
+           CLK_CON_DIV_PLL_SHARED2_DIV3, 0, 2),
+       DIV(DOUT_SHARED2_DIV2, "dout_shared2_div2", "mout_shared2_pll",
+           CLK_CON_DIV_PLL_SHARED2_DIV2, 0, 1),
+       DIV(DOUT_SHARED2_DIV4, "dout_shared2_div4", "dout_shared2_div2",
+           CLK_CON_DIV_PLL_SHARED2_DIV4, 0, 1),
+
+       DIV(DOUT_SHARED4_DIV2, "dout_shared4_div2", "mout_shared4_pll",
+           CLK_CON_DIV_PLL_SHARED4_DIV2, 0, 1),
+       DIV(DOUT_SHARED4_DIV4, "dout_shared4_div4", "dout_shared4_div2",
+           CLK_CON_DIV_PLL_SHARED4_DIV4, 0, 1),
+
+       /* BOOST */
+       DIV(DOUT_CLKCMU_CMU_BOOST, "dout_clkcmu_cmu_boost",
+           "gout_clkcmu_cmu_boost", CLK_CON_DIV_DIV_CLKCMU_CMU_BOOST, 0, 2),
+
+       /* ACC */
+       DIV(DOUT_CLKCMU_ACC_BUS, "dout_clkcmu_acc_bus", "gout_clkcmu_acc_bus",
+           CLK_CON_DIV_CLKCMU_ACC_BUS, 0, 4),
+
+       /* APM */
+       DIV(DOUT_CLKCMU_APM_BUS, "dout_clkcmu_apm_bus", "gout_clkcmu_apm_bus",
+           CLK_CON_DIV_CLKCMU_APM_BUS, 0, 3),
+
+       /* AUD */
+       DIV(DOUT_CLKCMU_AUD_CPU, "dout_clkcmu_aud_cpu", "gout_clkcmu_aud_cpu",
+           CLK_CON_DIV_CLKCMU_AUD_CPU, 0, 3),
+       DIV(DOUT_CLKCMU_AUD_BUS, "dout_clkcmu_aud_bus", "gout_clkcmu_aud_bus",
+           CLK_CON_DIV_CLKCMU_AUD_BUS, 0, 4),
+
+       /* BUSC */
+       DIV(DOUT_CLKCMU_BUSC_BUS, "dout_clkcmu_busc_bus",
+           "gout_clkcmu_busc_bus", CLK_CON_DIV_CLKCMU_BUSC_BUS, 0, 4),
+
+       /* BUSMC */
+       DIV(DOUT_CLKCMU_BUSMC_BUS, "dout_clkcmu_busmc_bus",
+           "gout_clkcmu_busmc_bus", CLK_CON_DIV_CLKCMU_BUSMC_BUS, 0, 4),
+
+       /* CORE */
+       DIV(DOUT_CLKCMU_CORE_BUS, "dout_clkcmu_core_bus",
+           "gout_clkcmu_core_bus", CLK_CON_DIV_CLKCMU_CORE_BUS, 0, 4),
+
+       /* CPUCL0 */
+       DIV(DOUT_CLKCMU_CPUCL0_SWITCH, "dout_clkcmu_cpucl0_switch",
+           "gout_clkcmu_cpucl0_switch", CLK_CON_DIV_CLKCMU_CPUCL0_SWITCH,
+           0, 3),
+       DIV(DOUT_CLKCMU_CPUCL0_CLUSTER, "dout_clkcmu_cpucl0_cluster",
+           "gout_clkcmu_cpucl0_cluster", CLK_CON_DIV_CLKCMU_CPUCL0_CLUSTER,
+           0, 3),
+
+       /* CPUCL1 */
+       DIV(DOUT_CLKCMU_CPUCL1_SWITCH, "dout_clkcmu_cpucl1_switch",
+           "gout_clkcmu_cpucl1_switch", CLK_CON_DIV_CLKCMU_CPUCL1_SWITCH,
+           0, 3),
+       DIV(DOUT_CLKCMU_CPUCL1_CLUSTER, "dout_clkcmu_cpucl1_cluster",
+           "gout_clkcmu_cpucl1_cluster", CLK_CON_DIV_CLKCMU_CPUCL1_CLUSTER,
+           0, 3),
+
+       /* DPTX */
+       DIV(DOUT_CLKCMU_DPTX_BUS, "dout_clkcmu_dptx_bus",
+           "gout_clkcmu_dptx_bus", CLK_CON_DIV_CLKCMU_DPTX_BUS, 0, 4),
+       DIV(DOUT_CLKCMU_DPTX_DPGTC, "dout_clkcmu_dptx_dpgtc",
+           "gout_clkcmu_dptx_dpgtc", CLK_CON_DIV_CLKCMU_DPTX_DPGTC, 0, 3),
+
+       /* DPUM */
+       DIV(DOUT_CLKCMU_DPUM_BUS, "dout_clkcmu_dpum_bus",
+           "gout_clkcmu_dpum_bus", CLK_CON_DIV_CLKCMU_DPUM_BUS, 0, 4),
+
+       /* DPUS */
+       DIV(DOUT_CLKCMU_DPUS0_BUS, "dout_clkcmu_dpus0_bus",
+           "gout_clkcmu_dpus0_bus", CLK_CON_DIV_CLKCMU_DPUS0_BUS, 0, 4),
+       DIV(DOUT_CLKCMU_DPUS1_BUS, "dout_clkcmu_dpus1_bus",
+           "gout_clkcmu_dpus1_bus", CLK_CON_DIV_CLKCMU_DPUS1_BUS, 0, 4),
+
+       /* FSYS0 */
+       DIV(DOUT_CLKCMU_FSYS0_BUS, "dout_clkcmu_fsys0_bus",
+           "gout_clkcmu_fsys0_bus", CLK_CON_DIV_CLKCMU_FSYS0_BUS, 0, 4),
+
+       /* FSYS1 */
+       DIV(DOUT_CLKCMU_FSYS1_BUS, "dout_clkcmu_fsys1_bus",
+           "gout_clkcmu_fsys1_bus", CLK_CON_DIV_CLKCMU_FSYS1_BUS, 0, 4),
+       DIV(DOUT_CLKCMU_FSYS1_USBDRD, "dout_clkcmu_fsys1_usbdrd",
+           "gout_clkcmu_fsys1_usbdrd", CLK_CON_DIV_CLKCMU_FSYS1_USBDRD, 0, 4),
+
+       /* FSYS2 */
+       DIV(DOUT_CLKCMU_FSYS2_BUS, "dout_clkcmu_fsys2_bus",
+           "gout_clkcmu_fsys2_bus", CLK_CON_DIV_CLKCMU_FSYS2_BUS, 0, 4),
+       DIV(DOUT_CLKCMU_FSYS2_UFS_EMBD, "dout_clkcmu_fsys2_ufs_embd",
+           "gout_clkcmu_fsys2_ufs_embd", CLK_CON_DIV_CLKCMU_FSYS2_UFS_EMBD,
+           0, 3),
+       DIV(DOUT_CLKCMU_FSYS2_ETHERNET, "dout_clkcmu_fsys2_ethernet",
+           "gout_clkcmu_fsys2_ethernet", CLK_CON_DIV_CLKCMU_FSYS2_ETHERNET,
+           0, 3),
+
+       /* G2D */
+       DIV(DOUT_CLKCMU_G2D_G2D, "dout_clkcmu_g2d_g2d", "gout_clkcmu_g2d_g2d",
+           CLK_CON_DIV_CLKCMU_G2D_G2D, 0, 4),
+       DIV(DOUT_CLKCMU_G2D_MSCL, "dout_clkcmu_g2d_mscl",
+           "gout_clkcmu_g2d_mscl", CLK_CON_DIV_CLKCMU_G2D_MSCL, 0, 4),
+
+       /* G3D0 */
+       DIV(DOUT_CLKCMU_G3D00_SWITCH, "dout_clkcmu_g3d00_switch",
+           "gout_clkcmu_g3d00_switch", CLK_CON_DIV_CLKCMU_G3D00_SWITCH, 0, 3),
+       DIV(DOUT_CLKCMU_G3D01_SWITCH, "dout_clkcmu_g3d01_switch",
+           "gout_clkcmu_g3d01_switch", CLK_CON_DIV_CLKCMU_G3D01_SWITCH, 0, 3),
+
+       /* G3D1 */
+       DIV(DOUT_CLKCMU_G3D1_SWITCH, "dout_clkcmu_g3d1_switch",
+           "gout_clkcmu_g3d1_switch", CLK_CON_DIV_CLKCMU_G3D1_SWITCH, 0, 3),
+
+       /* ISPB */
+       DIV(DOUT_CLKCMU_ISPB_BUS, "dout_clkcmu_ispb_bus",
+           "gout_clkcmu_ispb_bus", CLK_CON_DIV_CLKCMU_ISPB_BUS, 0, 4),
+
+       /* MFC */
+       DIV(DOUT_CLKCMU_MFC_MFC, "dout_clkcmu_mfc_mfc", "gout_clkcmu_mfc_mfc",
+           CLK_CON_DIV_CLKCMU_MFC_MFC, 0, 4),
+       DIV(DOUT_CLKCMU_MFC_WFD, "dout_clkcmu_mfc_wfd", "gout_clkcmu_mfc_wfd",
+           CLK_CON_DIV_CLKCMU_MFC_WFD, 0, 4),
+
+       /* MIF */
+       DIV(DOUT_CLKCMU_MIF_BUSP, "dout_clkcmu_mif_busp",
+           "gout_clkcmu_mif_busp", CLK_CON_DIV_CLKCMU_MIF_BUSP, 0, 4),
+
+       /* NPU */
+       DIV(DOUT_CLKCMU_NPU_BUS, "dout_clkcmu_npu_bus", "gout_clkcmu_npu_bus",
+           CLK_CON_DIV_CLKCMU_NPU_BUS, 0, 4),
+
+       /* PERIC0 */
+       DIV(DOUT_CLKCMU_PERIC0_BUS, "dout_clkcmu_peric0_bus",
+           "gout_clkcmu_peric0_bus", CLK_CON_DIV_CLKCMU_PERIC0_BUS, 0, 4),
+       DIV(DOUT_CLKCMU_PERIC0_IP, "dout_clkcmu_peric0_ip",
+           "gout_clkcmu_peric0_ip", CLK_CON_DIV_CLKCMU_PERIC0_IP, 0, 4),
+
+       /* PERIC1 */
+       DIV(DOUT_CLKCMU_PERIC1_BUS, "dout_clkcmu_peric1_bus",
+           "gout_clkcmu_peric1_bus", CLK_CON_DIV_CLKCMU_PERIC1_BUS, 0, 4),
+       DIV(DOUT_CLKCMU_PERIC1_IP, "dout_clkcmu_peric1_ip",
+           "gout_clkcmu_peric1_ip", CLK_CON_DIV_CLKCMU_PERIC1_IP, 0, 4),
+
+       /* PERIS */
+       DIV(DOUT_CLKCMU_PERIS_BUS, "dout_clkcmu_peris_bus",
+           "gout_clkcmu_peris_bus", CLK_CON_DIV_CLKCMU_PERIS_BUS, 0, 4),
+};
+
+static const struct samsung_fixed_factor_clock top_fixed_factor_clks[] __initconst = {
+       FFACTOR(DOUT_CLKCMU_FSYS0_PCIE, "dout_clkcmu_fsys0_pcie",
+               "gout_clkcmu_fsys0_pcie", 1, 4, 0),
+};
+
+static const struct samsung_gate_clock top_gate_clks[] __initconst = {
+       /* BOOST */
+       GATE(GOUT_CLKCMU_CMU_BOOST, "gout_clkcmu_cmu_boost",
+            "mout_clkcmu_cmu_boost", CLK_CON_GAT_GATE_CLKCMU_CMU_BOOST,
+            21, 0, 0),
+
+       GATE(GOUT_CLKCMU_CPUCL0_BOOST, "gout_clkcmu_cpucl0_boost",
+            "dout_cmu_boost", CLK_CON_GAT_CLKCMU_CMU_CPUCL0_BOOST, 21, 0, 0),
+       GATE(GOUT_CLKCMU_CPUCL1_BOOST, "gout_clkcmu_cpucl1_boost",
+            "dout_cmu_boost", CLK_CON_GAT_CLKCMU_CMU_CPUCL1_BOOST, 21, 0, 0),
+       GATE(GOUT_CLKCMU_CORE_BOOST, "gout_clkcmu_core_boost",
+            "dout_cmu_boost", CLK_CON_GAT_CLKCMU_CMU_CORE_BOOST, 21, 0, 0),
+       GATE(GOUT_CLKCMU_BUSC_BOOST, "gout_clkcmu_busc_boost",
+            "dout_cmu_boost", CLK_CON_GAT_CLKCMU_CMU_BUSC_BOOST, 21, 0, 0),
+
+       GATE(GOUT_CLKCMU_BUSMC_BOOST, "gout_clkcmu_busmc_boost",
+            "dout_cmu_boost", CLK_CON_GAT_CLKCMU_CMU_BUSMC_BOOST, 21, 0, 0),
+       GATE(GOUT_CLKCMU_MIF_BOOST, "gout_clkcmu_mif_boost", "dout_cmu_boost",
+            CLK_CON_GAT_CLKCMU_CMU_MIF_BOOST, 21, 0, 0),
+
+       /* ACC */
+       GATE(GOUT_CLKCMU_ACC_BUS, "gout_clkcmu_acc_bus", "mout_clkcmu_acc_bus",
+            CLK_CON_GAT_GATE_CLKCMU_ACC_BUS, 21, 0, 0),
+
+       /* APM */
+       GATE(GOUT_CLKCMU_APM_BUS, "gout_clkcmu_apm_bus", "mout_clkcmu_apm_bus",
+            CLK_CON_GAT_GATE_CLKCMU_APM_BUS, 21, CLK_IGNORE_UNUSED, 0),
+
+       /* AUD */
+       GATE(GOUT_CLKCMU_AUD_CPU, "gout_clkcmu_aud_cpu", "mout_clkcmu_aud_cpu",
+            CLK_CON_GAT_GATE_CLKCMU_AUD_CPU, 21, 0, 0),
+       GATE(GOUT_CLKCMU_AUD_BUS, "gout_clkcmu_aud_bus", "mout_clkcmu_aud_bus",
+            CLK_CON_GAT_GATE_CLKCMU_AUD_BUS, 21, 0, 0),
+
+       /* BUSC */
+       GATE(GOUT_CLKCMU_BUSC_BUS, "gout_clkcmu_busc_bus",
+            "mout_clkcmu_busc_bus", CLK_CON_GAT_GATE_CLKCMU_BUSC_BUS, 21,
+            CLK_IS_CRITICAL, 0),
+
+       /* BUSMC */
+       GATE(GOUT_CLKCMU_BUSMC_BUS, "gout_clkcmu_busmc_bus",
+            "mout_clkcmu_busmc_bus", CLK_CON_GAT_GATE_CLKCMU_BUSMC_BUS, 21,
+            CLK_IS_CRITICAL, 0),
+
+       /* CORE */
+       GATE(GOUT_CLKCMU_CORE_BUS, "gout_clkcmu_core_bus",
+            "mout_clkcmu_core_bus", CLK_CON_GAT_GATE_CLKCMU_CORE_BUS,
+            21, 0, 0),
+
+       /* CPUCL0 */
+       GATE(GOUT_CLKCMU_CPUCL0_SWITCH, "gout_clkcmu_cpucl0_switch",
+            "mout_clkcmu_cpucl0_switch",
+            CLK_CON_GAT_GATE_CLKCMU_CPUCL0_SWITCH, 21, CLK_IGNORE_UNUSED, 0),
+       GATE(GOUT_CLKCMU_CPUCL0_CLUSTER, "gout_clkcmu_cpucl0_cluster",
+            "mout_clkcmu_cpucl0_cluster",
+            CLK_CON_GAT_GATE_CLKCMU_CPUCL0_CLUSTER, 21, CLK_IGNORE_UNUSED, 0),
+
+       /* CPUCL1 */
+       GATE(GOUT_CLKCMU_CPUCL1_SWITCH, "gout_clkcmu_cpucl1_switch",
+            "mout_clkcmu_cpucl1_switch",
+            CLK_CON_GAT_GATE_CLKCMU_CPUCL1_SWITCH, 21, CLK_IGNORE_UNUSED, 0),
+       GATE(GOUT_CLKCMU_CPUCL1_CLUSTER, "gout_clkcmu_cpucl1_cluster",
+            "mout_clkcmu_cpucl1_cluster",
+            CLK_CON_GAT_GATE_CLKCMU_CPUCL1_CLUSTER, 21, CLK_IGNORE_UNUSED, 0),
+
+       /* DPTX */
+       GATE(GOUT_CLKCMU_DPTX_BUS, "gout_clkcmu_dptx_bus",
+            "mout_clkcmu_dptx_bus", CLK_CON_GAT_GATE_CLKCMU_DPTX_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_DPTX_DPGTC, "gout_clkcmu_dptx_dpgtc",
+            "mout_clkcmu_dptx_dpgtc", CLK_CON_GAT_GATE_CLKCMU_DPTX_DPGTC,
+            21, 0, 0),
+
+       /* DPUM */
+       GATE(GOUT_CLKCMU_DPUM_BUS, "gout_clkcmu_dpum_bus",
+            "mout_clkcmu_dpum_bus", CLK_CON_GAT_GATE_CLKCMU_DPUM_BUS,
+            21, 0, 0),
+
+       /* DPUS */
+       GATE(GOUT_CLKCMU_DPUS0_BUS, "gout_clkcmu_dpus0_bus",
+            "mout_clkcmu_dpus0_bus", CLK_CON_GAT_GATE_CLKCMU_DPUS0_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_DPUS1_BUS, "gout_clkcmu_dpus1_bus",
+            "mout_clkcmu_dpus1_bus", CLK_CON_GAT_GATE_CLKCMU_DPUS1_BUS,
+            21, 0, 0),
+
+       /* FSYS0 */
+       GATE(GOUT_CLKCMU_FSYS0_BUS, "gout_clkcmu_fsys0_bus",
+            "mout_clkcmu_fsys0_bus", CLK_CON_GAT_GATE_CLKCMU_FSYS0_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_FSYS0_PCIE, "gout_clkcmu_fsys0_pcie",
+            "mout_clkcmu_fsys0_pcie", CLK_CON_GAT_GATE_CLKCMU_FSYS0_PCIE,
+            21, 0, 0),
+
+       /* FSYS1 */
+       GATE(GOUT_CLKCMU_FSYS1_BUS, "gout_clkcmu_fsys1_bus",
+            "mout_clkcmu_fsys1_bus", CLK_CON_GAT_GATE_CLKCMU_FSYS1_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_FSYS1_USBDRD, "gout_clkcmu_fsys1_usbdrd",
+            "mout_clkcmu_fsys1_usbdrd", CLK_CON_GAT_GATE_CLKCMU_FSYS1_USBDRD,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_FSYS1_MMC_CARD, "gout_clkcmu_fsys1_mmc_card",
+            "mout_clkcmu_fsys1_mmc_card",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS1_MMC_CARD, 21, 0, 0),
+
+       /* FSYS2 */
+       GATE(GOUT_CLKCMU_FSYS2_BUS, "gout_clkcmu_fsys2_bus",
+            "mout_clkcmu_fsys2_bus", CLK_CON_GAT_GATE_CLKCMU_FSYS2_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_FSYS2_UFS_EMBD, "gout_clkcmu_fsys2_ufs_embd",
+            "mout_clkcmu_fsys2_ufs_embd",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS2_UFS_EMBD, 21, 0, 0),
+       GATE(GOUT_CLKCMU_FSYS2_ETHERNET, "gout_clkcmu_fsys2_ethernet",
+            "mout_clkcmu_fsys2_ethernet",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS2_ETHERNET, 21, 0, 0),
+
+       /* G2D */
+       GATE(GOUT_CLKCMU_G2D_G2D, "gout_clkcmu_g2d_g2d",
+            "mout_clkcmu_g2d_g2d", CLK_CON_GAT_GATE_CLKCMU_G2D_G2D, 21, 0, 0),
+       GATE(GOUT_CLKCMU_G2D_MSCL, "gout_clkcmu_g2d_mscl",
+            "mout_clkcmu_g2d_mscl", CLK_CON_GAT_GATE_CLKCMU_G2D_MSCL,
+            21, 0, 0),
+
+       /* G3D0 */
+       GATE(GOUT_CLKCMU_G3D00_SWITCH, "gout_clkcmu_g3d00_switch",
+            "mout_clkcmu_g3d00_switch", CLK_CON_GAT_GATE_CLKCMU_G3D00_SWITCH,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_G3D01_SWITCH, "gout_clkcmu_g3d01_switch",
+            "mout_clkcmu_g3d01_switch", CLK_CON_GAT_GATE_CLKCMU_G3D01_SWITCH,
+            21, 0, 0),
+
+       /* G3D1 */
+       GATE(GOUT_CLKCMU_G3D1_SWITCH, "gout_clkcmu_g3d1_switch",
+            "mout_clkcmu_g3d1_switch", CLK_CON_GAT_GATE_CLKCMU_G3D1_SWITCH,
+            21, 0, 0),
+
+       /* ISPB */
+       GATE(GOUT_CLKCMU_ISPB_BUS, "gout_clkcmu_ispb_bus",
+            "mout_clkcmu_ispb_bus", CLK_CON_GAT_GATE_CLKCMU_ISPB_BUS,
+            21, 0, 0),
+
+       /* MFC */
+       GATE(GOUT_CLKCMU_MFC_MFC, "gout_clkcmu_mfc_mfc", "mout_clkcmu_mfc_mfc",
+            CLK_CON_GAT_GATE_CLKCMU_MFC_MFC, 21, 0, 0),
+       GATE(GOUT_CLKCMU_MFC_WFD, "gout_clkcmu_mfc_wfd", "mout_clkcmu_mfc_wfd",
+            CLK_CON_GAT_GATE_CLKCMU_MFC_WFD, 21, 0, 0),
+
+       /* MIF */
+       GATE(GOUT_CLKCMU_MIF_SWITCH, "gout_clkcmu_mif_switch",
+            "mout_clkcmu_mif_switch", CLK_CON_GAT_GATE_CLKCMU_MIF_SWITCH,
+            21, CLK_IGNORE_UNUSED, 0),
+       GATE(GOUT_CLKCMU_MIF_BUSP, "gout_clkcmu_mif_busp",
+            "mout_clkcmu_mif_busp", CLK_CON_GAT_GATE_CLKCMU_MIF_BUSP,
+            21, CLK_IGNORE_UNUSED, 0),
+
+       /* NPU */
+       GATE(GOUT_CLKCMU_NPU_BUS, "gout_clkcmu_npu_bus", "mout_clkcmu_npu_bus",
+            CLK_CON_GAT_GATE_CLKCMU_NPU_BUS, 21, 0, 0),
+
+       /* PERIC0 */
+       GATE(GOUT_CLKCMU_PERIC0_BUS, "gout_clkcmu_peric0_bus",
+            "mout_clkcmu_peric0_bus", CLK_CON_GAT_GATE_CLKCMU_PERIC0_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_PERIC0_IP, "gout_clkcmu_peric0_ip",
+            "mout_clkcmu_peric0_ip", CLK_CON_GAT_GATE_CLKCMU_PERIC0_IP,
+            21, 0, 0),
+
+       /* PERIC1 */
+       GATE(GOUT_CLKCMU_PERIC1_BUS, "gout_clkcmu_peric1_bus",
+            "mout_clkcmu_peric1_bus", CLK_CON_GAT_GATE_CLKCMU_PERIC1_BUS,
+            21, 0, 0),
+       GATE(GOUT_CLKCMU_PERIC1_IP, "gout_clkcmu_peric1_ip",
+            "mout_clkcmu_peric1_ip", CLK_CON_GAT_GATE_CLKCMU_PERIC1_IP,
+            21, 0, 0),
+
+       /* PERIS */
+       GATE(GOUT_CLKCMU_PERIS_BUS, "gout_clkcmu_peris_bus",
+            "mout_clkcmu_peris_bus", CLK_CON_GAT_GATE_CLKCMU_PERIS_BUS,
+            21, CLK_IGNORE_UNUSED, 0),
+};
+
+static const struct samsung_cmu_info top_cmu_info __initconst = {
+       .pll_clks               = top_pll_clks,
+       .nr_pll_clks            = ARRAY_SIZE(top_pll_clks),
+       .mux_clks               = top_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(top_mux_clks),
+       .div_clks               = top_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(top_div_clks),
+       .fixed_factor_clks      = top_fixed_factor_clks,
+       .nr_fixed_factor_clks   = ARRAY_SIZE(top_fixed_factor_clks),
+       .gate_clks              = top_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(top_gate_clks),
+       .nr_clk_ids             = TOP_NR_CLK,
+       .clk_regs               = top_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(top_clk_regs),
+};
+
+static void __init exynosautov9_cmu_top_init(struct device_node *np)
+{
+       exynos_arm64_register_cmu(NULL, np, &top_cmu_info);
+}
+
+/* Register CMU_TOP early, as it's a dependency for other early domains */
+CLK_OF_DECLARE(exynosautov9_cmu_top, "samsung,exynosautov9-cmu-top",
+              exynosautov9_cmu_top_init);
+
+/* ---- CMU_BUSMC ---------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_BUSMC (0x1b200000) */
+#define PLL_CON0_MUX_CLKCMU_BUSMC_BUS_USER                             0x0600
+#define CLK_CON_DIV_DIV_CLK_BUSMC_BUSP                                 0x1800
+#define CLK_CON_GAT_GOUT_BLK_BUSMC_UID_QE_PDMA0_IPCLKPORT_PCLK         0x2078
+#define CLK_CON_GAT_GOUT_BLK_BUSMC_UID_QE_SPDMA_IPCLKPORT_PCLK         0x2080
+
+static const unsigned long busmc_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_BUSMC_BUS_USER,
+       CLK_CON_DIV_DIV_CLK_BUSMC_BUSP,
+       CLK_CON_GAT_GOUT_BLK_BUSMC_UID_QE_PDMA0_IPCLKPORT_PCLK,
+       CLK_CON_GAT_GOUT_BLK_BUSMC_UID_QE_SPDMA_IPCLKPORT_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_BUSMC */
+PNAME(mout_busmc_bus_user_p) = { "oscclk", "dout_clkcmu_busmc_bus" };
+
+static const struct samsung_mux_clock busmc_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_BUSMC_BUS_USER, "mout_busmc_bus_user",
+           mout_busmc_bus_user_p, PLL_CON0_MUX_CLKCMU_BUSMC_BUS_USER, 4, 1),
+};
+
+static const struct samsung_div_clock busmc_div_clks[] __initconst = {
+       DIV(CLK_DOUT_BUSMC_BUSP, "dout_busmc_busp", "mout_busmc_bus_user",
+           CLK_CON_DIV_DIV_CLK_BUSMC_BUSP, 0, 3),
+};
+
+static const struct samsung_gate_clock busmc_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_BUSMC_PDMA0_PCLK, "gout_busmc_pdma0_pclk",
+            "dout_busmc_busp",
+            CLK_CON_GAT_GOUT_BLK_BUSMC_UID_QE_PDMA0_IPCLKPORT_PCLK, 21,
+            0, 0),
+       GATE(CLK_GOUT_BUSMC_SPDMA_PCLK, "gout_busmc_spdma_pclk",
+            "dout_busmc_busp",
+            CLK_CON_GAT_GOUT_BLK_BUSMC_UID_QE_SPDMA_IPCLKPORT_PCLK, 21,
+            0, 0),
+};
+
+static const struct samsung_cmu_info busmc_cmu_info __initconst = {
+       .mux_clks               = busmc_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(busmc_mux_clks),
+       .div_clks               = busmc_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(busmc_div_clks),
+       .gate_clks              = busmc_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(busmc_gate_clks),
+       .nr_clk_ids             = BUSMC_NR_CLK,
+       .clk_regs               = busmc_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(busmc_clk_regs),
+       .clk_name               = "dout_clkcmu_busmc_bus",
+};
+
+/* ---- CMU_CORE ----------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_CORE (0x1b030000) */
+#define PLL_CON0_MUX_CLKCMU_CORE_BUS_USER                              0x0600
+#define CLK_CON_MUX_MUX_CORE_CMUREF                                    0x1000
+#define CLK_CON_DIV_DIV_CLK_CORE_BUSP                                  0x1800
+#define CLK_CON_GAT_CLK_BLK_CORE_UID_CCI_IPCLKPORT_CLK                 0x2000
+#define CLK_CON_GAT_CLK_BLK_CORE_UID_CCI_IPCLKPORT_PCLK                        0x2004
+#define CLK_CON_GAT_CLK_BLK_CORE_UID_CORE_CMU_CORE_IPCLKPORT_PCLK      0x2008
+
+static const unsigned long core_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_CORE_BUS_USER,
+       CLK_CON_MUX_MUX_CORE_CMUREF,
+       CLK_CON_DIV_DIV_CLK_CORE_BUSP,
+       CLK_CON_GAT_CLK_BLK_CORE_UID_CCI_IPCLKPORT_CLK,
+       CLK_CON_GAT_CLK_BLK_CORE_UID_CCI_IPCLKPORT_PCLK,
+       CLK_CON_GAT_CLK_BLK_CORE_UID_CORE_CMU_CORE_IPCLKPORT_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_CORE */
+PNAME(mout_core_bus_user_p) = { "oscclk", "dout_clkcmu_core_bus" };
+
+static const struct samsung_mux_clock core_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_CORE_BUS_USER, "mout_core_bus_user", mout_core_bus_user_p,
+           PLL_CON0_MUX_CLKCMU_CORE_BUS_USER, 4, 1),
+};
+
+static const struct samsung_div_clock core_div_clks[] __initconst = {
+       DIV(CLK_DOUT_CORE_BUSP, "dout_core_busp", "mout_core_bus_user",
+           CLK_CON_DIV_DIV_CLK_CORE_BUSP, 0, 3),
+};
+
+static const struct samsung_gate_clock core_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_CORE_CCI_CLK, "gout_core_cci_clk", "mout_core_bus_user",
+            CLK_CON_GAT_CLK_BLK_CORE_UID_CCI_IPCLKPORT_CLK, 21,
+            CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_CORE_CCI_PCLK, "gout_core_cci_pclk", "dout_core_busp",
+            CLK_CON_GAT_CLK_BLK_CORE_UID_CCI_IPCLKPORT_PCLK, 21,
+            CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_CORE_CMU_CORE_PCLK, "gout_core_cmu_core_pclk",
+            "dout_core_busp",
+            CLK_CON_GAT_CLK_BLK_CORE_UID_CORE_CMU_CORE_IPCLKPORT_PCLK, 21,
+            CLK_IS_CRITICAL, 0),
+};
+
+static const struct samsung_cmu_info core_cmu_info __initconst = {
+       .mux_clks               = core_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(core_mux_clks),
+       .div_clks               = core_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(core_div_clks),
+       .gate_clks              = core_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(core_gate_clks),
+       .nr_clk_ids             = CORE_NR_CLK,
+       .clk_regs               = core_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(core_clk_regs),
+       .clk_name               = "dout_clkcmu_core_bus",
+};
+
+/* ---- CMU_FSYS2 ---------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_FSYS2 (0x17c00000) */
+#define PLL_CON0_MUX_CLKCMU_FSYS2_BUS_USER     0x0600
+#define PLL_CON0_MUX_CLKCMU_FSYS2_UFS_EMBD_USER        0x0620
+#define PLL_CON0_MUX_CLKCMU_FSYS2_ETHERNET_USER        0x0610
+#define CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD0_IPCLKPORT_I_ACLK      0x2098
+#define CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD0_IPCLKPORT_I_CLK_UNIPRO        0x209c
+#define CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD1_IPCLKPORT_I_ACLK      0x20a4
+#define CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD1_IPCLKPORT_I_CLK_UNIPRO        0x20a8
+
+static const unsigned long fsys2_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_FSYS2_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS2_UFS_EMBD_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS2_ETHERNET_USER,
+       CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD0_IPCLKPORT_I_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD0_IPCLKPORT_I_CLK_UNIPRO,
+       CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD1_IPCLKPORT_I_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD1_IPCLKPORT_I_CLK_UNIPRO,
+};
+
+/* List of parent clocks for Muxes in CMU_FSYS2 */
+PNAME(mout_fsys2_bus_user_p) = { "oscclk", "dout_clkcmu_fsys2_bus" };
+PNAME(mout_fsys2_ufs_embd_user_p) = { "oscclk", "dout_clkcmu_fsys2_ufs_embd" };
+PNAME(mout_fsys2_ethernet_user_p) = { "oscclk", "dout_clkcmu_fsys2_ethernet" };
+
+static const struct samsung_mux_clock fsys2_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_FSYS2_BUS_USER, "mout_fsys2_bus_user",
+           mout_fsys2_bus_user_p, PLL_CON0_MUX_CLKCMU_FSYS2_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_FSYS2_UFS_EMBD_USER, "mout_fsys2_ufs_embd_user",
+           mout_fsys2_ufs_embd_user_p,
+           PLL_CON0_MUX_CLKCMU_FSYS2_UFS_EMBD_USER, 4, 1),
+       MUX(CLK_MOUT_FSYS2_ETHERNET_USER, "mout_fsys2_ethernet_user",
+           mout_fsys2_ethernet_user_p,
+           PLL_CON0_MUX_CLKCMU_FSYS2_ETHERNET_USER, 4, 1),
+};
+
+static const struct samsung_gate_clock fsys2_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_FSYS2_UFS_EMBD0_ACLK, "gout_fsys2_ufs_embd0_aclk",
+            "mout_fsys2_ufs_embd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD0_IPCLKPORT_I_ACLK, 21,
+            0, 0),
+       GATE(CLK_GOUT_FSYS2_UFS_EMBD0_UNIPRO, "gout_fsys2_ufs_embd0_unipro",
+            "mout_fsys2_ufs_embd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD0_IPCLKPORT_I_CLK_UNIPRO,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS2_UFS_EMBD1_ACLK, "gout_fsys2_ufs_embd1_aclk",
+            "mout_fsys2_ufs_embd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD1_IPCLKPORT_I_ACLK, 21,
+            0, 0),
+       GATE(CLK_GOUT_FSYS2_UFS_EMBD1_UNIPRO, "gout_fsys2_ufs_embd1_unipro",
+            "mout_fsys2_ufs_embd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS2_UID_UFS_EMBD1_IPCLKPORT_I_CLK_UNIPRO,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info fsys2_cmu_info __initconst = {
+       .mux_clks               = fsys2_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(fsys2_mux_clks),
+       .gate_clks              = fsys2_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(fsys2_gate_clks),
+       .nr_clk_ids             = FSYS2_NR_CLK,
+       .clk_regs               = fsys2_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(fsys2_clk_regs),
+       .clk_name               = "dout_clkcmu_fsys2_bus",
+};
+
+/* ---- CMU_PERIC0 --------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_PERIC0 (0x10200000) */
+#define PLL_CON0_MUX_CLKCMU_PERIC0_BUS_USER    0x0600
+#define PLL_CON0_MUX_CLKCMU_PERIC0_IP_USER     0x0610
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI00_USI   0x1000
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI01_USI   0x1004
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI02_USI   0x1008
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI03_USI   0x100c
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI04_USI   0x1010
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI05_USI   0x1014
+#define CLK_CON_MUX_MUX_CLK_PERIC0_USI_I2C     0x1018
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI00_USI   0x1800
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI01_USI   0x1804
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI02_USI   0x1808
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI03_USI   0x180c
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI04_USI   0x1810
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI05_USI   0x1814
+#define CLK_CON_DIV_DIV_CLK_PERIC0_USI_I2C     0x1818
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_0  0x2014
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_1  0x2018
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_2  0x2024
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_3  0x2028
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_4  0x202c
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_5  0x2030
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_6  0x2034
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_7  0x2038
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_8  0x203c
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_9  0x2040
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_10 0x201c
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_11 0x2020
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_0   0x2044
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_1   0x2048
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_2   0x2058
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_3   0x205c
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_4   0x2060
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_7   0x206c
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_5   0x2064
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_6   0x2068
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_8   0x2070
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_9   0x2074
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_10  0x204c
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_11  0x2050
+
+static const unsigned long peric0_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_PERIC0_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_PERIC0_IP_USER,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI00_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI01_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI02_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI03_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI04_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI05_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC0_USI_I2C,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI00_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI01_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI02_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI03_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI04_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI05_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC0_USI_I2C,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_0,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_1,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_2,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_3,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_4,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_5,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_6,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_7,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_8,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_9,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_10,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_11,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_0,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_1,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_2,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_3,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_4,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_7,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_5,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_6,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_8,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_9,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_10,
+       CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_11,
+};
+
+/* List of parent clocks for Muxes in CMU_PERIC0 */
+PNAME(mout_peric0_bus_user_p) = { "oscclk", "dout_clkcmu_peric0_bus" };
+PNAME(mout_peric0_ip_user_p) = { "oscclk", "dout_clkcmu_peric0_ip" };
+PNAME(mout_peric0_usi_p) = { "oscclk", "mout_peric0_ip_user" };
+
+static const struct samsung_mux_clock peric0_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_PERIC0_BUS_USER, "mout_peric0_bus_user",
+           mout_peric0_bus_user_p, PLL_CON0_MUX_CLKCMU_PERIC0_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_PERIC0_IP_USER, "mout_peric0_ip_user",
+           mout_peric0_ip_user_p, PLL_CON0_MUX_CLKCMU_PERIC0_IP_USER, 4, 1),
+       /* USI00 ~ USI05 */
+       MUX(CLK_MOUT_PERIC0_USI00_USI, "mout_peric0_usi00_usi",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI00_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC0_USI01_USI, "mout_peric0_usi01_usi",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI01_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC0_USI02_USI, "mout_peric0_usi02_usi",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI02_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC0_USI03_USI, "mout_peric0_usi03_usi",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI03_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC0_USI04_USI, "mout_peric0_usi04_usi",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI04_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC0_USI05_USI, "mout_peric0_usi05_usi",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI05_USI, 0, 1),
+       /* USI_I2C */
+       MUX(CLK_MOUT_PERIC0_USI_I2C, "mout_peric0_usi_i2c",
+           mout_peric0_usi_p, CLK_CON_MUX_MUX_CLK_PERIC0_USI_I2C, 0, 1),
+};
+
+static const struct samsung_div_clock peric0_div_clks[] __initconst = {
+       /* USI00 ~ USI05 */
+       DIV(CLK_DOUT_PERIC0_USI00_USI, "dout_peric0_usi00_usi",
+           "mout_peric0_usi00_usi", CLK_CON_DIV_DIV_CLK_PERIC0_USI00_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC0_USI01_USI, "dout_peric0_usi01_usi",
+           "mout_peric0_usi01_usi", CLK_CON_DIV_DIV_CLK_PERIC0_USI01_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC0_USI02_USI, "dout_peric0_usi02_usi",
+           "mout_peric0_usi02_usi", CLK_CON_DIV_DIV_CLK_PERIC0_USI02_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC0_USI03_USI, "dout_peric0_usi03_usi",
+           "mout_peric0_usi03_usi", CLK_CON_DIV_DIV_CLK_PERIC0_USI03_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC0_USI04_USI, "dout_peric0_usi04_usi",
+           "mout_peric0_usi04_usi", CLK_CON_DIV_DIV_CLK_PERIC0_USI04_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC0_USI05_USI, "dout_peric0_usi05_usi",
+           "mout_peric0_usi05_usi", CLK_CON_DIV_DIV_CLK_PERIC0_USI05_USI,
+           0, 4),
+       /* USI_I2C */
+       DIV(CLK_DOUT_PERIC0_USI_I2C, "dout_peric0_usi_i2c",
+           "mout_peric0_usi_i2c", CLK_CON_DIV_DIV_CLK_PERIC0_USI_I2C, 0, 4),
+};
+
+static const struct samsung_gate_clock peric0_gate_clks[] __initconst = {
+       /* IPCLK */
+       GATE(CLK_GOUT_PERIC0_IPCLK_0, "gout_peric0_ipclk_0",
+            "dout_peric0_usi00_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_0,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_1, "gout_peric0_ipclk_1",
+            "dout_peric0_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_1,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_2, "gout_peric0_ipclk_2",
+            "dout_peric0_usi01_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_2,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_3, "gout_peric0_ipclk_3",
+            "dout_peric0_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_3,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_4, "gout_peric0_ipclk_4",
+            "dout_peric0_usi02_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_4,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_5, "gout_peric0_ipclk_5",
+            "dout_peric0_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_5,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_6, "gout_peric0_ipclk_6",
+            "dout_peric0_usi03_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_6,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_7, "gout_peric0_ipclk_7",
+            "dout_peric0_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_7,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_8, "gout_peric0_ipclk_8",
+            "dout_peric0_usi04_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_8,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_9, "gout_peric0_ipclk_9",
+            "dout_peric0_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_9,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_10, "gout_peric0_ipclk_10",
+            "dout_peric0_usi05_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_10,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_IPCLK_11, "gout_peric0_ipclk_11",
+            "dout_peric0_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_IPCLK_11,
+            21, 0, 0),
+
+       /* PCLK */
+       GATE(CLK_GOUT_PERIC0_PCLK_0, "gout_peric0_pclk_0",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_0,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_2, "gout_peric0_pclk_2",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_2,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_3, "gout_peric0_pclk_3",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_3,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_4, "gout_peric0_pclk_4",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_4,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_5, "gout_peric0_pclk_5",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_5,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_6, "gout_peric0_pclk_6",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_6,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_7, "gout_peric0_pclk_7",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_7,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_8, "gout_peric0_pclk_8",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_8,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_9, "gout_peric0_pclk_9",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_9,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_10, "gout_peric0_pclk_10",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_10,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_11, "gout_peric0_pclk_11",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_11,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info peric0_cmu_info __initconst = {
+       .mux_clks               = peric0_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(peric0_mux_clks),
+       .div_clks               = peric0_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(peric0_div_clks),
+       .gate_clks              = peric0_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(peric0_gate_clks),
+       .nr_clk_ids             = PERIC0_NR_CLK,
+       .clk_regs               = peric0_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(peric0_clk_regs),
+       .clk_name               = "dout_clkcmu_peric0_bus",
+};
+
+/* ---- CMU_PERIC1 --------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_PERIC1 (0x10800000) */
+#define PLL_CON0_MUX_CLKCMU_PERIC1_BUS_USER    0x0600
+#define PLL_CON0_MUX_CLKCMU_PERIC1_IP_USER     0x0610
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI06_USI   0x1000
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI07_USI   0x1004
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI08_USI   0x1008
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI09_USI   0x100c
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI10_USI   0x1010
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI11_USI   0x1014
+#define CLK_CON_MUX_MUX_CLK_PERIC1_USI_I2C     0x1018
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI06_USI   0x1800
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI07_USI   0x1804
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI08_USI   0x1808
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI09_USI   0x180c
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI10_USI   0x1810
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI11_USI   0x1814
+#define CLK_CON_DIV_DIV_CLK_PERIC1_USI_I2C     0x1818
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_0  0x2014
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_1  0x2018
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_2  0x2024
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_3  0x2028
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_4  0x202c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_5  0x2030
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_6  0x2034
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_7  0x2038
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_8  0x203c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_9  0x2040
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_10 0x201c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_11 0x2020
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_0   0x2044
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_1   0x2048
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2   0x2058
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_3   0x205c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_4   0x2060
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7   0x206c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_5   0x2064
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_6   0x2068
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_8   0x2070
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_9   0x2074
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_10  0x204c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_11  0x2050
+
+static const unsigned long peric1_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_PERIC1_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_PERIC1_IP_USER,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI06_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI07_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI08_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI09_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI10_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI11_USI,
+       CLK_CON_MUX_MUX_CLK_PERIC1_USI_I2C,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI06_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI07_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI08_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI09_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI10_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI11_USI,
+       CLK_CON_DIV_DIV_CLK_PERIC1_USI_I2C,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_0,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_1,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_2,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_3,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_4,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_5,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_6,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_7,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_8,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_9,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_10,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_11,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_0,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_1,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_3,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_4,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_5,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_6,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_8,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_9,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_10,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_11,
+};
+
+/* List of parent clocks for Muxes in CMU_PERIC1 */
+PNAME(mout_peric1_bus_user_p) = { "oscclk", "dout_clkcmu_peric1_bus" };
+PNAME(mout_peric1_ip_user_p) = { "oscclk", "dout_clkcmu_peric1_ip" };
+PNAME(mout_peric1_usi_p) = { "oscclk", "mout_peric1_ip_user" };
+
+static const struct samsung_mux_clock peric1_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_PERIC1_BUS_USER, "mout_peric1_bus_user",
+           mout_peric1_bus_user_p, PLL_CON0_MUX_CLKCMU_PERIC1_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_PERIC1_IP_USER, "mout_peric1_ip_user",
+           mout_peric1_ip_user_p, PLL_CON0_MUX_CLKCMU_PERIC1_IP_USER, 4, 1),
+       /* USI06 ~ USI11 */
+       MUX(CLK_MOUT_PERIC1_USI06_USI, "mout_peric1_usi06_usi",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI06_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC1_USI07_USI, "mout_peric1_usi07_usi",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI07_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC1_USI08_USI, "mout_peric1_usi08_usi",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI08_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC1_USI09_USI, "mout_peric1_usi09_usi",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI09_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC1_USI10_USI, "mout_peric1_usi10_usi",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI10_USI, 0, 1),
+       MUX(CLK_MOUT_PERIC1_USI11_USI, "mout_peric1_usi11_usi",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI11_USI, 0, 1),
+       /* USI_I2C */
+       MUX(CLK_MOUT_PERIC1_USI_I2C, "mout_peric1_usi_i2c",
+           mout_peric1_usi_p, CLK_CON_MUX_MUX_CLK_PERIC1_USI_I2C, 0, 1),
+};
+
+static const struct samsung_div_clock peric1_div_clks[] __initconst = {
+       /* USI06 ~ USI11 */
+       DIV(CLK_DOUT_PERIC1_USI06_USI, "dout_peric1_usi06_usi",
+           "mout_peric1_usi06_usi", CLK_CON_DIV_DIV_CLK_PERIC1_USI06_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC1_USI07_USI, "dout_peric1_usi07_usi",
+           "mout_peric1_usi07_usi", CLK_CON_DIV_DIV_CLK_PERIC1_USI07_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC1_USI08_USI, "dout_peric1_usi08_usi",
+           "mout_peric1_usi08_usi", CLK_CON_DIV_DIV_CLK_PERIC1_USI08_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC1_USI09_USI, "dout_peric1_usi09_usi",
+           "mout_peric1_usi09_usi", CLK_CON_DIV_DIV_CLK_PERIC1_USI09_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC1_USI10_USI, "dout_peric1_usi10_usi",
+           "mout_peric1_usi10_usi", CLK_CON_DIV_DIV_CLK_PERIC1_USI10_USI,
+           0, 4),
+       DIV(CLK_DOUT_PERIC1_USI11_USI, "dout_peric1_usi11_usi",
+           "mout_peric1_usi11_usi", CLK_CON_DIV_DIV_CLK_PERIC1_USI11_USI,
+           0, 4),
+       /* USI_I2C */
+       DIV(CLK_DOUT_PERIC1_USI_I2C, "dout_peric1_usi_i2c",
+           "mout_peric1_usi_i2c", CLK_CON_DIV_DIV_CLK_PERIC1_USI_I2C, 0, 4),
+};
+
+static const struct samsung_gate_clock peric1_gate_clks[] __initconst = {
+       /* IPCLK */
+       GATE(CLK_GOUT_PERIC1_IPCLK_0, "gout_peric1_ipclk_0",
+            "dout_peric1_usi06_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_0,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_1, "gout_peric1_ipclk_1",
+            "dout_peric1_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_1,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_2, "gout_peric1_ipclk_2",
+            "dout_peric1_usi07_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_2,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_3, "gout_peric1_ipclk_3",
+            "dout_peric1_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_3,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_4, "gout_peric1_ipclk_4",
+            "dout_peric1_usi08_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_4,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_5, "gout_peric1_ipclk_5",
+            "dout_peric1_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_5,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_6, "gout_peric1_ipclk_6",
+            "dout_peric1_usi09_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_6,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_7, "gout_peric1_ipclk_7",
+            "dout_peric1_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_7,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_8, "gout_peric1_ipclk_8",
+            "dout_peric1_usi10_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_8,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_9, "gout_peric1_ipclk_9",
+            "dout_peric1_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_9,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_10, "gout_peric1_ipclk_10",
+            "dout_peric1_usi11_usi",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_10,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_IPCLK_11, "gout_peric1_ipclk_11",
+            "dout_peric1_usi_i2c",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_11,
+            21, 0, 0),
+
+       /* PCLK */
+       GATE(CLK_GOUT_PERIC1_PCLK_0, "gout_peric1_pclk_0",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_0,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_2, "gout_peric1_pclk_2",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_3, "gout_peric1_pclk_3",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_3,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_4, "gout_peric1_pclk_4",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_4,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_5, "gout_peric1_pclk_5",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_5,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_6, "gout_peric1_pclk_6",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_6,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_7, "gout_peric1_pclk_7",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_8, "gout_peric1_pclk_8",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_8,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_9, "gout_peric1_pclk_9",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_9,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_10, "gout_peric1_pclk_10",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_10,
+            21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_11, "gout_peric1_pclk_11",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_11,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info peric1_cmu_info __initconst = {
+       .mux_clks               = peric1_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(peric1_mux_clks),
+       .div_clks               = peric1_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(peric1_div_clks),
+       .gate_clks              = peric1_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(peric1_gate_clks),
+       .nr_clk_ids             = PERIC1_NR_CLK,
+       .clk_regs               = peric1_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(peric1_clk_regs),
+       .clk_name               = "dout_clkcmu_peric1_bus",
+};
+
+/* ---- CMU_PERIS ---------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_PERIS (0x10020000) */
+#define PLL_CON0_MUX_CLKCMU_PERIS_BUS_USER     0x0600
+#define CLK_CON_GAT_GOUT_BLK_PERIS_UID_SYSREG_PERIS_IPCLKPORT_PCLK     0x2058
+#define CLK_CON_GAT_GOUT_BLK_PERIS_UID_WDT_CLUSTER0_IPCLKPORT_PCLK     0x205c
+#define CLK_CON_GAT_GOUT_BLK_PERIS_UID_WDT_CLUSTER1_IPCLKPORT_PCLK     0x2060
+
+static const unsigned long peris_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_PERIS_BUS_USER,
+       CLK_CON_GAT_GOUT_BLK_PERIS_UID_SYSREG_PERIS_IPCLKPORT_PCLK,
+       CLK_CON_GAT_GOUT_BLK_PERIS_UID_WDT_CLUSTER0_IPCLKPORT_PCLK,
+       CLK_CON_GAT_GOUT_BLK_PERIS_UID_WDT_CLUSTER1_IPCLKPORT_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_PERIS */
+PNAME(mout_peris_bus_user_p) = { "oscclk", "dout_clkcmu_peris_bus" };
+
+static const struct samsung_mux_clock peris_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_PERIS_BUS_USER, "mout_peris_bus_user",
+           mout_peris_bus_user_p, PLL_CON0_MUX_CLKCMU_PERIS_BUS_USER, 4, 1),
+};
+
+static const struct samsung_gate_clock peris_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_SYSREG_PERIS_PCLK, "gout_sysreg_peris_pclk",
+            "mout_peris_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIS_UID_SYSREG_PERIS_IPCLKPORT_PCLK,
+            21, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_GOUT_WDT_CLUSTER0, "gout_wdt_cluster0", "mout_peris_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIS_UID_WDT_CLUSTER0_IPCLKPORT_PCLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_WDT_CLUSTER1, "gout_wdt_cluster1", "mout_peris_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIS_UID_WDT_CLUSTER1_IPCLKPORT_PCLK,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info peris_cmu_info __initconst = {
+       .mux_clks               = peris_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(peris_mux_clks),
+       .gate_clks              = peris_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(peris_gate_clks),
+       .nr_clk_ids             = PERIS_NR_CLK,
+       .clk_regs               = peris_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(peris_clk_regs),
+       .clk_name               = "dout_clkcmu_peris_bus",
+};
+
+static int __init exynosautov9_cmu_probe(struct platform_device *pdev)
+{
+       const struct samsung_cmu_info *info;
+       struct device *dev = &pdev->dev;
+
+       info = of_device_get_match_data(dev);
+       exynos_arm64_register_cmu(dev, dev->of_node, info);
+
+       return 0;
+}
+
+static const struct of_device_id exynosautov9_cmu_of_match[] = {
+       {
+               .compatible = "samsung,exynosautov9-cmu-busmc",
+               .data = &busmc_cmu_info,
+       }, {
+               .compatible = "samsung,exynosautov9-cmu-core",
+               .data = &core_cmu_info,
+       }, {
+               .compatible = "samsung,exynosautov9-cmu-fsys2",
+               .data = &fsys2_cmu_info,
+       }, {
+               .compatible = "samsung,exynosautov9-cmu-peric0",
+               .data = &peric0_cmu_info,
+       }, {
+               .compatible = "samsung,exynosautov9-cmu-peric1",
+               .data = &peric1_cmu_info,
+       }, {
+               .compatible = "samsung,exynosautov9-cmu-peris",
+               .data = &peris_cmu_info,
+       }, {
+       },
+};
+
+static struct platform_driver exynosautov9_cmu_driver __refdata = {
+       .driver = {
+               .name = "exynosautov9-cmu",
+               .of_match_table = exynosautov9_cmu_of_match,
+               .suppress_bind_attrs = true,
+       },
+       .probe = exynosautov9_cmu_probe,
+};
+
+static int __init exynosautov9_cmu_init(void)
+{
+       return platform_driver_register(&exynosautov9_cmu_driver);
+}
+core_initcall(exynosautov9_cmu_init);
diff --git a/drivers/clk/stm32/Makefile b/drivers/clk/stm32/Makefile
new file mode 100644 (file)
index 0000000..95bd223
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_COMMON_CLK_STM32MP135)    += clk-stm32mp13.o clk-stm32-core.o reset-stm32.o
diff --git a/drivers/clk/stm32/clk-stm32-core.c b/drivers/clk/stm32/clk-stm32-core.c
new file mode 100644 (file)
index 0000000..45a279e
--- /dev/null
@@ -0,0 +1,695 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+
+#include "clk-stm32-core.h"
+#include "reset-stm32.h"
+
+static DEFINE_SPINLOCK(rlock);
+
+static int stm32_rcc_clock_init(struct device *dev,
+                               const struct of_device_id *match,
+                               void __iomem *base)
+{
+       const struct stm32_rcc_match_data *data = match->data;
+       struct clk_hw_onecell_data *clk_data = data->hw_clks;
+       struct device_node *np = dev_of_node(dev);
+       struct clk_hw **hws;
+       int n, max_binding;
+
+       max_binding =  data->maxbinding;
+
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, max_binding), GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       clk_data->num = max_binding;
+
+       hws = clk_data->hws;
+
+       for (n = 0; n < max_binding; n++)
+               hws[n] = ERR_PTR(-ENOENT);
+
+       for (n = 0; n < data->num_clocks; n++) {
+               const struct clock_config *cfg_clock = &data->tab_clocks[n];
+               struct clk_hw *hw = ERR_PTR(-ENOENT);
+
+               if (data->check_security &&
+                   data->check_security(base, cfg_clock))
+                       continue;
+
+               if (cfg_clock->func)
+                       hw = (*cfg_clock->func)(dev, data, base, &rlock,
+                                               cfg_clock);
+
+               if (IS_ERR(hw)) {
+                       dev_err(dev, "Can't register clk %d: %ld\n", n,
+                               PTR_ERR(hw));
+                       return PTR_ERR(hw);
+               }
+
+               if (cfg_clock->id != NO_ID)
+                       hws[cfg_clock->id] = hw;
+       }
+
+       return of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
+}
+
+int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
+                  void __iomem *base)
+{
+       const struct of_device_id *match;
+       int err;
+
+       match = of_match_node(match_data, dev_of_node(dev));
+       if (!match) {
+               dev_err(dev, "match data not found\n");
+               return -ENODEV;
+       }
+
+       /* RCC Reset Configuration */
+       err = stm32_rcc_reset_init(dev, match, base);
+       if (err) {
+               pr_err("stm32 reset failed to initialize\n");
+               return err;
+       }
+
+       /* RCC Clock Configuration */
+       err = stm32_rcc_clock_init(dev, match, base);
+       if (err) {
+               pr_err("stm32 clock failed to initialize\n");
+               return err;
+       }
+
+       return 0;
+}
+
+static u8 stm32_mux_get_parent(void __iomem *base,
+                              struct clk_stm32_clock_data *data,
+                              u16 mux_id)
+{
+       const struct stm32_mux_cfg *mux = &data->muxes[mux_id];
+       u32 mask = BIT(mux->width) - 1;
+       u32 val;
+
+       val = readl(base + mux->offset) >> mux->shift;
+       val &= mask;
+
+       return val;
+}
+
+static int stm32_mux_set_parent(void __iomem *base,
+                               struct clk_stm32_clock_data *data,
+                               u16 mux_id, u8 index)
+{
+       const struct stm32_mux_cfg *mux = &data->muxes[mux_id];
+
+       u32 mask = BIT(mux->width) - 1;
+       u32 reg = readl(base + mux->offset);
+       u32 val = index << mux->shift;
+
+       reg &= ~(mask << mux->shift);
+       reg |= val;
+
+       writel(reg, base + mux->offset);
+
+       return 0;
+}
+
+static void stm32_gate_endisable(void __iomem *base,
+                                struct clk_stm32_clock_data *data,
+                                u16 gate_id, int enable)
+{
+       const struct stm32_gate_cfg *gate = &data->gates[gate_id];
+       void __iomem *addr = base + gate->offset;
+
+       if (enable) {
+               if (data->gate_cpt[gate_id]++ > 0)
+                       return;
+
+               if (gate->set_clr != 0)
+                       writel(BIT(gate->bit_idx), addr);
+               else
+                       writel(readl(addr) | BIT(gate->bit_idx), addr);
+       } else {
+               if (--data->gate_cpt[gate_id] > 0)
+                       return;
+
+               if (gate->set_clr != 0)
+                       writel(BIT(gate->bit_idx), addr + gate->set_clr);
+               else
+                       writel(readl(addr) & ~BIT(gate->bit_idx), addr);
+       }
+}
+
+static void stm32_gate_disable_unused(void __iomem *base,
+                                     struct clk_stm32_clock_data *data,
+                                     u16 gate_id)
+{
+       const struct stm32_gate_cfg *gate = &data->gates[gate_id];
+       void __iomem *addr = base + gate->offset;
+
+       if (data->gate_cpt[gate_id] > 0)
+               return;
+
+       if (gate->set_clr != 0)
+               writel(BIT(gate->bit_idx), addr + gate->set_clr);
+       else
+               writel(readl(addr) & ~BIT(gate->bit_idx), addr);
+}
+
+static int stm32_gate_is_enabled(void __iomem *base,
+                                struct clk_stm32_clock_data *data,
+                                u16 gate_id)
+{
+       const struct stm32_gate_cfg *gate = &data->gates[gate_id];
+
+       return (readl(base + gate->offset) & BIT(gate->bit_idx)) != 0;
+}
+
+static unsigned int _get_table_div(const struct clk_div_table *table,
+                                  unsigned int val)
+{
+       const struct clk_div_table *clkt;
+
+       for (clkt = table; clkt->div; clkt++)
+               if (clkt->val == val)
+                       return clkt->div;
+       return 0;
+}
+
+static unsigned int _get_div(const struct clk_div_table *table,
+                            unsigned int val, unsigned long flags, u8 width)
+{
+       if (flags & CLK_DIVIDER_ONE_BASED)
+               return val;
+       if (flags & CLK_DIVIDER_POWER_OF_TWO)
+               return 1 << val;
+       if (table)
+               return _get_table_div(table, val);
+       return val + 1;
+}
+
+static unsigned long stm32_divider_get_rate(void __iomem *base,
+                                           struct clk_stm32_clock_data *data,
+                                           u16 div_id,
+                                           unsigned long parent_rate)
+{
+       const struct stm32_div_cfg *divider = &data->dividers[div_id];
+       unsigned int val;
+       unsigned int div;
+
+       val =  readl(base + divider->offset) >> divider->shift;
+       val &= clk_div_mask(divider->width);
+       div = _get_div(divider->table, val, divider->flags, divider->width);
+
+       if (!div) {
+               WARN(!(divider->flags & CLK_DIVIDER_ALLOW_ZERO),
+                    "%d: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set\n",
+                    div_id);
+               return parent_rate;
+       }
+
+       return DIV_ROUND_UP_ULL((u64)parent_rate, div);
+}
+
+static int stm32_divider_set_rate(void __iomem *base,
+                                 struct clk_stm32_clock_data *data,
+                                 u16 div_id, unsigned long rate,
+                                 unsigned long parent_rate)
+{
+       const struct stm32_div_cfg *divider = &data->dividers[div_id];
+       int value;
+       u32 val;
+
+       value = divider_get_val(rate, parent_rate, divider->table,
+                               divider->width, divider->flags);
+       if (value < 0)
+               return value;
+
+       if (divider->flags & CLK_DIVIDER_HIWORD_MASK) {
+               val = clk_div_mask(divider->width) << (divider->shift + 16);
+       } else {
+               val = readl(base + divider->offset);
+               val &= ~(clk_div_mask(divider->width) << divider->shift);
+       }
+
+       val |= (u32)value << divider->shift;
+
+       writel(val, base + divider->offset);
+
+       return 0;
+}
+
+static u8 clk_stm32_mux_get_parent(struct clk_hw *hw)
+{
+       struct clk_stm32_mux *mux = to_clk_stm32_mux(hw);
+
+       return stm32_mux_get_parent(mux->base, mux->clock_data, mux->mux_id);
+}
+
+static int clk_stm32_mux_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk_stm32_mux *mux = to_clk_stm32_mux(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(mux->lock, flags);
+
+       stm32_mux_set_parent(mux->base, mux->clock_data, mux->mux_id, index);
+
+       spin_unlock_irqrestore(mux->lock, flags);
+
+       return 0;
+}
+
+const struct clk_ops clk_stm32_mux_ops = {
+       .get_parent     = clk_stm32_mux_get_parent,
+       .set_parent     = clk_stm32_mux_set_parent,
+};
+
+static void clk_stm32_gate_endisable(struct clk_hw *hw, int enable)
+{
+       struct clk_stm32_gate *gate = to_clk_stm32_gate(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(gate->lock, flags);
+
+       stm32_gate_endisable(gate->base, gate->clock_data, gate->gate_id, enable);
+
+       spin_unlock_irqrestore(gate->lock, flags);
+}
+
+static int clk_stm32_gate_enable(struct clk_hw *hw)
+{
+       clk_stm32_gate_endisable(hw, 1);
+
+       return 0;
+}
+
+static void clk_stm32_gate_disable(struct clk_hw *hw)
+{
+       clk_stm32_gate_endisable(hw, 0);
+}
+
+static int clk_stm32_gate_is_enabled(struct clk_hw *hw)
+{
+       struct clk_stm32_gate *gate = to_clk_stm32_gate(hw);
+
+       return stm32_gate_is_enabled(gate->base, gate->clock_data, gate->gate_id);
+}
+
+static void clk_stm32_gate_disable_unused(struct clk_hw *hw)
+{
+       struct clk_stm32_gate *gate = to_clk_stm32_gate(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(gate->lock, flags);
+
+       stm32_gate_disable_unused(gate->base, gate->clock_data, gate->gate_id);
+
+       spin_unlock_irqrestore(gate->lock, flags);
+}
+
+const struct clk_ops clk_stm32_gate_ops = {
+       .enable         = clk_stm32_gate_enable,
+       .disable        = clk_stm32_gate_disable,
+       .is_enabled     = clk_stm32_gate_is_enabled,
+       .disable_unused = clk_stm32_gate_disable_unused,
+};
+
+static int clk_stm32_divider_set_rate(struct clk_hw *hw, unsigned long rate,
+                                     unsigned long parent_rate)
+{
+       struct clk_stm32_div *div = to_clk_stm32_divider(hw);
+       unsigned long flags = 0;
+       int ret;
+
+       if (div->div_id == NO_STM32_DIV)
+               return rate;
+
+       spin_lock_irqsave(div->lock, flags);
+
+       ret = stm32_divider_set_rate(div->base, div->clock_data, div->div_id, rate, parent_rate);
+
+       spin_unlock_irqrestore(div->lock, flags);
+
+       return ret;
+}
+
+static long clk_stm32_divider_round_rate(struct clk_hw *hw, unsigned long rate,
+                                        unsigned long *prate)
+{
+       struct clk_stm32_div *div = to_clk_stm32_divider(hw);
+       const struct stm32_div_cfg *divider;
+
+       if (div->div_id == NO_STM32_DIV)
+               return rate;
+
+       divider = &div->clock_data->dividers[div->div_id];
+
+       /* if read only, just return current value */
+       if (divider->flags & CLK_DIVIDER_READ_ONLY) {
+               u32 val;
+
+               val =  readl(div->base + divider->offset) >> divider->shift;
+               val &= clk_div_mask(divider->width);
+
+               return divider_ro_round_rate(hw, rate, prate, divider->table,
+                               divider->width, divider->flags,
+                               val);
+       }
+
+       return divider_round_rate_parent(hw, clk_hw_get_parent(hw),
+                                        rate, prate, divider->table,
+                                        divider->width, divider->flags);
+}
+
+static unsigned long clk_stm32_divider_recalc_rate(struct clk_hw *hw,
+                                                  unsigned long parent_rate)
+{
+       struct clk_stm32_div *div = to_clk_stm32_divider(hw);
+
+       if (div->div_id == NO_STM32_DIV)
+               return parent_rate;
+
+       return stm32_divider_get_rate(div->base, div->clock_data, div->div_id, parent_rate);
+}
+
+const struct clk_ops clk_stm32_divider_ops = {
+       .recalc_rate    = clk_stm32_divider_recalc_rate,
+       .round_rate     = clk_stm32_divider_round_rate,
+       .set_rate       = clk_stm32_divider_set_rate,
+};
+
+static int clk_stm32_composite_set_rate(struct clk_hw *hw, unsigned long rate,
+                                       unsigned long parent_rate)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       unsigned long flags = 0;
+       int ret;
+
+       if (composite->div_id == NO_STM32_DIV)
+               return rate;
+
+       spin_lock_irqsave(composite->lock, flags);
+
+       ret = stm32_divider_set_rate(composite->base, composite->clock_data,
+                                    composite->div_id, rate, parent_rate);
+
+       spin_unlock_irqrestore(composite->lock, flags);
+
+       return ret;
+}
+
+static unsigned long clk_stm32_composite_recalc_rate(struct clk_hw *hw,
+                                                    unsigned long parent_rate)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       if (composite->div_id == NO_STM32_DIV)
+               return parent_rate;
+
+       return stm32_divider_get_rate(composite->base, composite->clock_data,
+                                     composite->div_id, parent_rate);
+}
+
+static long clk_stm32_composite_round_rate(struct clk_hw *hw, unsigned long rate,
+                                          unsigned long *prate)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       const struct stm32_div_cfg *divider;
+
+       if (composite->div_id == NO_STM32_DIV)
+               return rate;
+
+       divider = &composite->clock_data->dividers[composite->div_id];
+
+       /* if read only, just return current value */
+       if (divider->flags & CLK_DIVIDER_READ_ONLY) {
+               u32 val;
+
+               val =  readl(composite->base + divider->offset) >> divider->shift;
+               val &= clk_div_mask(divider->width);
+
+               return divider_ro_round_rate(hw, rate, prate, divider->table,
+                               divider->width, divider->flags,
+                               val);
+       }
+
+       return divider_round_rate_parent(hw, clk_hw_get_parent(hw),
+                                        rate, prate, divider->table,
+                                        divider->width, divider->flags);
+}
+
+static u8 clk_stm32_composite_get_parent(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       return stm32_mux_get_parent(composite->base, composite->clock_data, composite->mux_id);
+}
+
+static int clk_stm32_composite_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(composite->lock, flags);
+
+       stm32_mux_set_parent(composite->base, composite->clock_data, composite->mux_id, index);
+
+       spin_unlock_irqrestore(composite->lock, flags);
+
+       if (composite->clock_data->is_multi_mux) {
+               struct clk_hw *other_mux_hw = composite->clock_data->is_multi_mux(hw);
+
+               if (other_mux_hw) {
+                       struct clk_hw *hwp = clk_hw_get_parent_by_index(hw, index);
+
+                       clk_hw_reparent(other_mux_hw, hwp);
+               }
+       }
+
+       return 0;
+}
+
+static int clk_stm32_composite_is_enabled(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       if (composite->gate_id == NO_STM32_GATE)
+               return (__clk_get_enable_count(hw->clk) > 0);
+
+       return stm32_gate_is_enabled(composite->base, composite->clock_data, composite->gate_id);
+}
+
+#define MUX_SAFE_POSITION 0
+
+static int clk_stm32_has_safe_mux(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       const struct stm32_mux_cfg *mux = &composite->clock_data->muxes[composite->mux_id];
+
+       return !!(mux->flags & MUX_SAFE);
+}
+
+static void clk_stm32_set_safe_position_mux(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       if (!clk_stm32_composite_is_enabled(hw)) {
+               unsigned long flags = 0;
+
+               if (composite->clock_data->is_multi_mux) {
+                       struct clk_hw *other_mux_hw = NULL;
+
+                       other_mux_hw = composite->clock_data->is_multi_mux(hw);
+
+                       if (!other_mux_hw || clk_stm32_composite_is_enabled(other_mux_hw))
+                               return;
+               }
+
+               spin_lock_irqsave(composite->lock, flags);
+
+               stm32_mux_set_parent(composite->base, composite->clock_data,
+                                    composite->mux_id, MUX_SAFE_POSITION);
+
+               spin_unlock_irqrestore(composite->lock, flags);
+       }
+}
+
+static void clk_stm32_safe_restore_position_mux(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       int sel = clk_hw_get_parent_index(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(composite->lock, flags);
+
+       stm32_mux_set_parent(composite->base, composite->clock_data, composite->mux_id, sel);
+
+       spin_unlock_irqrestore(composite->lock, flags);
+}
+
+static void clk_stm32_composite_gate_endisable(struct clk_hw *hw, int enable)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(composite->lock, flags);
+
+       stm32_gate_endisable(composite->base, composite->clock_data, composite->gate_id, enable);
+
+       spin_unlock_irqrestore(composite->lock, flags);
+}
+
+static int clk_stm32_composite_gate_enable(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       if (composite->gate_id == NO_STM32_GATE)
+               return 0;
+
+       clk_stm32_composite_gate_endisable(hw, 1);
+
+       if (composite->mux_id != NO_STM32_MUX && clk_stm32_has_safe_mux(hw))
+               clk_stm32_safe_restore_position_mux(hw);
+
+       return 0;
+}
+
+static void clk_stm32_composite_gate_disable(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+
+       if (composite->gate_id == NO_STM32_GATE)
+               return;
+
+       clk_stm32_composite_gate_endisable(hw, 0);
+
+       if (composite->mux_id != NO_STM32_MUX && clk_stm32_has_safe_mux(hw))
+               clk_stm32_set_safe_position_mux(hw);
+}
+
+static void clk_stm32_composite_disable_unused(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       unsigned long flags = 0;
+
+       if (composite->gate_id == NO_STM32_GATE)
+               return;
+
+       spin_lock_irqsave(composite->lock, flags);
+
+       stm32_gate_disable_unused(composite->base, composite->clock_data, composite->gate_id);
+
+       spin_unlock_irqrestore(composite->lock, flags);
+}
+
+const struct clk_ops clk_stm32_composite_ops = {
+       .set_rate       = clk_stm32_composite_set_rate,
+       .recalc_rate    = clk_stm32_composite_recalc_rate,
+       .round_rate     = clk_stm32_composite_round_rate,
+       .get_parent     = clk_stm32_composite_get_parent,
+       .set_parent     = clk_stm32_composite_set_parent,
+       .enable         = clk_stm32_composite_gate_enable,
+       .disable        = clk_stm32_composite_gate_disable,
+       .is_enabled     = clk_stm32_composite_is_enabled,
+       .disable_unused = clk_stm32_composite_disable_unused,
+};
+
+struct clk_hw *clk_stm32_mux_register(struct device *dev,
+                                     const struct stm32_rcc_match_data *data,
+                                     void __iomem *base,
+                                     spinlock_t *lock,
+                                     const struct clock_config *cfg)
+{
+       struct clk_stm32_mux *mux = cfg->clock_cfg;
+       struct clk_hw *hw = &mux->hw;
+       int err;
+
+       mux->base = base;
+       mux->lock = lock;
+       mux->clock_data = data->clock_data;
+
+       err = clk_hw_register(dev, hw);
+       if (err)
+               return ERR_PTR(err);
+
+       return hw;
+}
+
+struct clk_hw *clk_stm32_gate_register(struct device *dev,
+                                      const struct stm32_rcc_match_data *data,
+                                      void __iomem *base,
+                                      spinlock_t *lock,
+                                      const struct clock_config *cfg)
+{
+       struct clk_stm32_gate *gate = cfg->clock_cfg;
+       struct clk_hw *hw = &gate->hw;
+       int err;
+
+       gate->base = base;
+       gate->lock = lock;
+       gate->clock_data = data->clock_data;
+
+       err = clk_hw_register(dev, hw);
+       if (err)
+               return ERR_PTR(err);
+
+       return hw;
+}
+
+struct clk_hw *clk_stm32_div_register(struct device *dev,
+                                     const struct stm32_rcc_match_data *data,
+                                     void __iomem *base,
+                                     spinlock_t *lock,
+                                     const struct clock_config *cfg)
+{
+       struct clk_stm32_div *div = cfg->clock_cfg;
+       struct clk_hw *hw = &div->hw;
+       int err;
+
+       div->base = base;
+       div->lock = lock;
+       div->clock_data = data->clock_data;
+
+       err = clk_hw_register(dev, hw);
+       if (err)
+               return ERR_PTR(err);
+
+       return hw;
+}
+
+struct clk_hw *clk_stm32_composite_register(struct device *dev,
+                                           const struct stm32_rcc_match_data *data,
+                                           void __iomem *base,
+                                           spinlock_t *lock,
+                                           const struct clock_config *cfg)
+{
+       struct clk_stm32_composite *composite = cfg->clock_cfg;
+       struct clk_hw *hw = &composite->hw;
+       int err;
+
+       composite->base = base;
+       composite->lock = lock;
+       composite->clock_data = data->clock_data;
+
+       err = clk_hw_register(dev, hw);
+       if (err)
+               return ERR_PTR(err);
+
+       return hw;
+}
diff --git a/drivers/clk/stm32/clk-stm32-core.h b/drivers/clk/stm32/clk-stm32-core.h
new file mode 100644 (file)
index 0000000..76cffda
--- /dev/null
@@ -0,0 +1,188 @@
+/* SPDX-License-Identifier: GPL-2.0  */
+/*
+ * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
+ */
+
+#include <linux/clk-provider.h>
+
+struct stm32_rcc_match_data;
+
+struct stm32_mux_cfg {
+       u16     offset;
+       u8      shift;
+       u8      width;
+       u8      flags;
+       u32     *table;
+       u8      ready;
+};
+
+struct stm32_gate_cfg {
+       u16     offset;
+       u8      bit_idx;
+       u8      set_clr;
+};
+
+struct stm32_div_cfg {
+       u16     offset;
+       u8      shift;
+       u8      width;
+       u8      flags;
+       u8      ready;
+       const struct clk_div_table *table;
+};
+
+struct stm32_composite_cfg {
+       int     mux;
+       int     gate;
+       int     div;
+};
+
+#define NO_ID 0xFFFFFFFF
+
+#define NO_STM32_MUX           0xFFFF
+#define NO_STM32_DIV           0xFFFF
+#define NO_STM32_GATE          0xFFFF
+
+struct clock_config {
+       unsigned long   id;
+       int             sec_id;
+       void            *clock_cfg;
+
+       struct clk_hw *(*func)(struct device *dev,
+                              const struct stm32_rcc_match_data *data,
+                              void __iomem *base,
+                              spinlock_t *lock,
+                              const struct clock_config *cfg);
+};
+
+struct clk_stm32_clock_data {
+       u16 *gate_cpt;
+       const struct stm32_gate_cfg     *gates;
+       const struct stm32_mux_cfg      *muxes;
+       const struct stm32_div_cfg      *dividers;
+       struct clk_hw *(*is_multi_mux)(struct clk_hw *hw);
+};
+
+struct stm32_rcc_match_data {
+       struct clk_hw_onecell_data      *hw_clks;
+       unsigned int                    num_clocks;
+       const struct clock_config       *tab_clocks;
+       unsigned int                    maxbinding;
+       struct clk_stm32_clock_data     *clock_data;
+       u32                             clear_offset;
+       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);
+
+/* MUX define */
+#define MUX_NO_RDY             0xFF
+#define MUX_SAFE               BIT(7)
+
+/* DIV define */
+#define DIV_NO_RDY             0xFF
+
+/* Definition of clock structure */
+struct clk_stm32_mux {
+       u16 mux_id;
+       struct clk_hw hw;
+       void __iomem *base;
+       struct clk_stm32_clock_data *clock_data;
+       spinlock_t *lock; /* spin lock */
+};
+
+#define to_clk_stm32_mux(_hw) container_of(_hw, struct clk_stm32_mux, hw)
+
+struct clk_stm32_gate {
+       u16 gate_id;
+       struct clk_hw hw;
+       void __iomem *base;
+       struct clk_stm32_clock_data *clock_data;
+       spinlock_t *lock; /* spin lock */
+};
+
+#define to_clk_stm32_gate(_hw) container_of(_hw, struct clk_stm32_gate, hw)
+
+struct clk_stm32_div {
+       u16 div_id;
+       struct clk_hw hw;
+       void __iomem *base;
+       struct clk_stm32_clock_data *clock_data;
+       spinlock_t *lock; /* spin lock */
+};
+
+#define to_clk_stm32_divider(_hw) container_of(_hw, struct clk_stm32_div, hw)
+
+struct clk_stm32_composite {
+       u16 gate_id;
+       u16 mux_id;
+       u16 div_id;
+       struct clk_hw hw;
+       void __iomem *base;
+       struct clk_stm32_clock_data *clock_data;
+       spinlock_t *lock; /* spin lock */
+};
+
+#define to_clk_stm32_composite(_hw) container_of(_hw, struct clk_stm32_composite, hw)
+
+/* Clock operators */
+extern const struct clk_ops clk_stm32_mux_ops;
+extern const struct clk_ops clk_stm32_gate_ops;
+extern const struct clk_ops clk_stm32_divider_ops;
+extern const struct clk_ops clk_stm32_composite_ops;
+
+/* Clock registering */
+struct clk_hw *clk_stm32_mux_register(struct device *dev,
+                                     const struct stm32_rcc_match_data *data,
+                                     void __iomem *base,
+                                     spinlock_t *lock,
+                                     const struct clock_config *cfg);
+
+struct clk_hw *clk_stm32_gate_register(struct device *dev,
+                                      const struct stm32_rcc_match_data *data,
+                                      void __iomem *base,
+                                      spinlock_t *lock,
+                                      const struct clock_config *cfg);
+
+struct clk_hw *clk_stm32_div_register(struct device *dev,
+                                     const struct stm32_rcc_match_data *data,
+                                     void __iomem *base,
+                                     spinlock_t *lock,
+                                     const struct clock_config *cfg);
+
+struct clk_hw *clk_stm32_composite_register(struct device *dev,
+                                           const struct stm32_rcc_match_data *data,
+                                           void __iomem *base,
+                                           spinlock_t *lock,
+                                           const struct clock_config *cfg);
+
+#define STM32_CLOCK_CFG(_binding, _clk, _sec_id, _struct, _register)\
+{\
+       .id             = (_binding),\
+       .sec_id         = (_sec_id),\
+       .clock_cfg      = (_struct) {_clk},\
+       .func           = (_register),\
+}
+
+#define STM32_MUX_CFG(_binding, _clk, _sec_id)\
+       STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_mux *,\
+                       &clk_stm32_mux_register)
+
+#define STM32_GATE_CFG(_binding, _clk, _sec_id)\
+       STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_gate *,\
+                       &clk_stm32_gate_register)
+
+#define STM32_DIV_CFG(_binding, _clk, _sec_id)\
+       STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_div *,\
+                       &clk_stm32_div_register)
+
+#define STM32_COMPOSITE_CFG(_binding, _clk, _sec_id)\
+       STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_composite *,\
+                       &clk_stm32_composite_register)
diff --git a/drivers/clk/stm32/clk-stm32mp13.c b/drivers/clk/stm32/clk-stm32mp13.c
new file mode 100644 (file)
index 0000000..1192eee
--- /dev/null
@@ -0,0 +1,1620 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
+ */
+
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/clock/stm32mp13-clks.h>
+#include "clk-stm32-core.h"
+#include "stm32mp13_rcc.h"
+
+#define RCC_CLR_OFFSET         0x4
+
+/* STM32 Gates definition */
+enum enum_gate_cfg {
+       GATE_MCO1,
+       GATE_MCO2,
+       GATE_DBGCK,
+       GATE_TRACECK,
+       GATE_DDRC1,
+       GATE_DDRC1LP,
+       GATE_DDRPHYC,
+       GATE_DDRPHYCLP,
+       GATE_DDRCAPB,
+       GATE_DDRCAPBLP,
+       GATE_AXIDCG,
+       GATE_DDRPHYCAPB,
+       GATE_DDRPHYCAPBLP,
+       GATE_TIM2,
+       GATE_TIM3,
+       GATE_TIM4,
+       GATE_TIM5,
+       GATE_TIM6,
+       GATE_TIM7,
+       GATE_LPTIM1,
+       GATE_SPI2,
+       GATE_SPI3,
+       GATE_USART3,
+       GATE_UART4,
+       GATE_UART5,
+       GATE_UART7,
+       GATE_UART8,
+       GATE_I2C1,
+       GATE_I2C2,
+       GATE_SPDIF,
+       GATE_TIM1,
+       GATE_TIM8,
+       GATE_SPI1,
+       GATE_USART6,
+       GATE_SAI1,
+       GATE_SAI2,
+       GATE_DFSDM,
+       GATE_ADFSDM,
+       GATE_FDCAN,
+       GATE_LPTIM2,
+       GATE_LPTIM3,
+       GATE_LPTIM4,
+       GATE_LPTIM5,
+       GATE_VREF,
+       GATE_DTS,
+       GATE_PMBCTRL,
+       GATE_HDP,
+       GATE_SYSCFG,
+       GATE_DCMIPP,
+       GATE_DDRPERFM,
+       GATE_IWDG2APB,
+       GATE_USBPHY,
+       GATE_STGENRO,
+       GATE_LTDC,
+       GATE_RTCAPB,
+       GATE_TZC,
+       GATE_ETZPC,
+       GATE_IWDG1APB,
+       GATE_BSEC,
+       GATE_STGENC,
+       GATE_USART1,
+       GATE_USART2,
+       GATE_SPI4,
+       GATE_SPI5,
+       GATE_I2C3,
+       GATE_I2C4,
+       GATE_I2C5,
+       GATE_TIM12,
+       GATE_TIM13,
+       GATE_TIM14,
+       GATE_TIM15,
+       GATE_TIM16,
+       GATE_TIM17,
+       GATE_DMA1,
+       GATE_DMA2,
+       GATE_DMAMUX1,
+       GATE_DMA3,
+       GATE_DMAMUX2,
+       GATE_ADC1,
+       GATE_ADC2,
+       GATE_USBO,
+       GATE_TSC,
+       GATE_GPIOA,
+       GATE_GPIOB,
+       GATE_GPIOC,
+       GATE_GPIOD,
+       GATE_GPIOE,
+       GATE_GPIOF,
+       GATE_GPIOG,
+       GATE_GPIOH,
+       GATE_GPIOI,
+       GATE_PKA,
+       GATE_SAES,
+       GATE_CRYP1,
+       GATE_HASH1,
+       GATE_RNG1,
+       GATE_BKPSRAM,
+       GATE_AXIMC,
+       GATE_MCE,
+       GATE_ETH1CK,
+       GATE_ETH1TX,
+       GATE_ETH1RX,
+       GATE_ETH1MAC,
+       GATE_FMC,
+       GATE_QSPI,
+       GATE_SDMMC1,
+       GATE_SDMMC2,
+       GATE_CRC1,
+       GATE_USBH,
+       GATE_ETH2CK,
+       GATE_ETH2TX,
+       GATE_ETH2RX,
+       GATE_ETH2MAC,
+       GATE_ETH1STP,
+       GATE_ETH2STP,
+       GATE_MDMA,
+       GATE_NB
+};
+
+#define _CFG_GATE(_id, _offset, _bit_idx, _offset_clr)\
+       [(_id)] = {\
+               .offset         = (_offset),\
+               .bit_idx        = (_bit_idx),\
+               .set_clr        = (_offset_clr),\
+       }
+
+#define CFG_GATE(_id, _offset, _bit_idx)\
+       _CFG_GATE(_id, _offset, _bit_idx, 0)
+
+#define CFG_GATE_SETCLR(_id, _offset, _bit_idx)\
+       _CFG_GATE(_id, _offset, _bit_idx, RCC_CLR_OFFSET)
+
+static struct stm32_gate_cfg stm32mp13_gates[] = {
+       CFG_GATE(GATE_MCO1,             RCC_MCO1CFGR,           12),
+       CFG_GATE(GATE_MCO2,             RCC_MCO2CFGR,           12),
+       CFG_GATE(GATE_DBGCK,            RCC_DBGCFGR,            8),
+       CFG_GATE(GATE_TRACECK,          RCC_DBGCFGR,            9),
+       CFG_GATE(GATE_DDRC1,            RCC_DDRITFCR,           0),
+       CFG_GATE(GATE_DDRC1LP,          RCC_DDRITFCR,           1),
+       CFG_GATE(GATE_DDRPHYC,          RCC_DDRITFCR,           4),
+       CFG_GATE(GATE_DDRPHYCLP,        RCC_DDRITFCR,           5),
+       CFG_GATE(GATE_DDRCAPB,          RCC_DDRITFCR,           6),
+       CFG_GATE(GATE_DDRCAPBLP,        RCC_DDRITFCR,           7),
+       CFG_GATE(GATE_AXIDCG,           RCC_DDRITFCR,           8),
+       CFG_GATE(GATE_DDRPHYCAPB,       RCC_DDRITFCR,           9),
+       CFG_GATE(GATE_DDRPHYCAPBLP,     RCC_DDRITFCR,           10),
+       CFG_GATE_SETCLR(GATE_TIM2,      RCC_MP_APB1ENSETR,      0),
+       CFG_GATE_SETCLR(GATE_TIM3,      RCC_MP_APB1ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_TIM4,      RCC_MP_APB1ENSETR,      2),
+       CFG_GATE_SETCLR(GATE_TIM5,      RCC_MP_APB1ENSETR,      3),
+       CFG_GATE_SETCLR(GATE_TIM6,      RCC_MP_APB1ENSETR,      4),
+       CFG_GATE_SETCLR(GATE_TIM7,      RCC_MP_APB1ENSETR,      5),
+       CFG_GATE_SETCLR(GATE_LPTIM1,    RCC_MP_APB1ENSETR,      9),
+       CFG_GATE_SETCLR(GATE_SPI2,      RCC_MP_APB1ENSETR,      11),
+       CFG_GATE_SETCLR(GATE_SPI3,      RCC_MP_APB1ENSETR,      12),
+       CFG_GATE_SETCLR(GATE_USART3,    RCC_MP_APB1ENSETR,      15),
+       CFG_GATE_SETCLR(GATE_UART4,     RCC_MP_APB1ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_UART5,     RCC_MP_APB1ENSETR,      17),
+       CFG_GATE_SETCLR(GATE_UART7,     RCC_MP_APB1ENSETR,      18),
+       CFG_GATE_SETCLR(GATE_UART8,     RCC_MP_APB1ENSETR,      19),
+       CFG_GATE_SETCLR(GATE_I2C1,      RCC_MP_APB1ENSETR,      21),
+       CFG_GATE_SETCLR(GATE_I2C2,      RCC_MP_APB1ENSETR,      22),
+       CFG_GATE_SETCLR(GATE_SPDIF,     RCC_MP_APB1ENSETR,      26),
+       CFG_GATE_SETCLR(GATE_TIM1,      RCC_MP_APB2ENSETR,      0),
+       CFG_GATE_SETCLR(GATE_TIM8,      RCC_MP_APB2ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_SPI1,      RCC_MP_APB2ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_USART6,    RCC_MP_APB2ENSETR,      13),
+       CFG_GATE_SETCLR(GATE_SAI1,      RCC_MP_APB2ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_SAI2,      RCC_MP_APB2ENSETR,      17),
+       CFG_GATE_SETCLR(GATE_DFSDM,     RCC_MP_APB2ENSETR,      20),
+       CFG_GATE_SETCLR(GATE_ADFSDM,    RCC_MP_APB2ENSETR,      21),
+       CFG_GATE_SETCLR(GATE_FDCAN,     RCC_MP_APB2ENSETR,      24),
+       CFG_GATE_SETCLR(GATE_LPTIM2,    RCC_MP_APB3ENSETR,      0),
+       CFG_GATE_SETCLR(GATE_LPTIM3,    RCC_MP_APB3ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_LPTIM4,    RCC_MP_APB3ENSETR,      2),
+       CFG_GATE_SETCLR(GATE_LPTIM5,    RCC_MP_APB3ENSETR,      3),
+       CFG_GATE_SETCLR(GATE_VREF,      RCC_MP_APB3ENSETR,      13),
+       CFG_GATE_SETCLR(GATE_DTS,       RCC_MP_APB3ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_PMBCTRL,   RCC_MP_APB3ENSETR,      17),
+       CFG_GATE_SETCLR(GATE_HDP,       RCC_MP_APB3ENSETR,      20),
+       CFG_GATE_SETCLR(GATE_SYSCFG,    RCC_MP_NS_APB3ENSETR,   0),
+       CFG_GATE_SETCLR(GATE_DCMIPP,    RCC_MP_APB4ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_DDRPERFM,  RCC_MP_APB4ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_IWDG2APB,  RCC_MP_APB4ENSETR,      15),
+       CFG_GATE_SETCLR(GATE_USBPHY,    RCC_MP_APB4ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_STGENRO,   RCC_MP_APB4ENSETR,      20),
+       CFG_GATE_SETCLR(GATE_LTDC,      RCC_MP_NS_APB4ENSETR,   0),
+       CFG_GATE_SETCLR(GATE_RTCAPB,    RCC_MP_APB5ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_TZC,       RCC_MP_APB5ENSETR,      11),
+       CFG_GATE_SETCLR(GATE_ETZPC,     RCC_MP_APB5ENSETR,      13),
+       CFG_GATE_SETCLR(GATE_IWDG1APB,  RCC_MP_APB5ENSETR,      15),
+       CFG_GATE_SETCLR(GATE_BSEC,      RCC_MP_APB5ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_STGENC,    RCC_MP_APB5ENSETR,      20),
+       CFG_GATE_SETCLR(GATE_USART1,    RCC_MP_APB6ENSETR,      0),
+       CFG_GATE_SETCLR(GATE_USART2,    RCC_MP_APB6ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_SPI4,      RCC_MP_APB6ENSETR,      2),
+       CFG_GATE_SETCLR(GATE_SPI5,      RCC_MP_APB6ENSETR,      3),
+       CFG_GATE_SETCLR(GATE_I2C3,      RCC_MP_APB6ENSETR,      4),
+       CFG_GATE_SETCLR(GATE_I2C4,      RCC_MP_APB6ENSETR,      5),
+       CFG_GATE_SETCLR(GATE_I2C5,      RCC_MP_APB6ENSETR,      6),
+       CFG_GATE_SETCLR(GATE_TIM12,     RCC_MP_APB6ENSETR,      7),
+       CFG_GATE_SETCLR(GATE_TIM13,     RCC_MP_APB6ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_TIM14,     RCC_MP_APB6ENSETR,      9),
+       CFG_GATE_SETCLR(GATE_TIM15,     RCC_MP_APB6ENSETR,      10),
+       CFG_GATE_SETCLR(GATE_TIM16,     RCC_MP_APB6ENSETR,      11),
+       CFG_GATE_SETCLR(GATE_TIM17,     RCC_MP_APB6ENSETR,      12),
+       CFG_GATE_SETCLR(GATE_DMA1,      RCC_MP_AHB2ENSETR,      0),
+       CFG_GATE_SETCLR(GATE_DMA2,      RCC_MP_AHB2ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_DMAMUX1,   RCC_MP_AHB2ENSETR,      2),
+       CFG_GATE_SETCLR(GATE_DMA3,      RCC_MP_AHB2ENSETR,      3),
+       CFG_GATE_SETCLR(GATE_DMAMUX2,   RCC_MP_AHB2ENSETR,      4),
+       CFG_GATE_SETCLR(GATE_ADC1,      RCC_MP_AHB2ENSETR,      5),
+       CFG_GATE_SETCLR(GATE_ADC2,      RCC_MP_AHB2ENSETR,      6),
+       CFG_GATE_SETCLR(GATE_USBO,      RCC_MP_AHB2ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_TSC,       RCC_MP_AHB4ENSETR,      15),
+       CFG_GATE_SETCLR(GATE_GPIOA,     RCC_MP_NS_AHB4ENSETR,   0),
+       CFG_GATE_SETCLR(GATE_GPIOB,     RCC_MP_NS_AHB4ENSETR,   1),
+       CFG_GATE_SETCLR(GATE_GPIOC,     RCC_MP_NS_AHB4ENSETR,   2),
+       CFG_GATE_SETCLR(GATE_GPIOD,     RCC_MP_NS_AHB4ENSETR,   3),
+       CFG_GATE_SETCLR(GATE_GPIOE,     RCC_MP_NS_AHB4ENSETR,   4),
+       CFG_GATE_SETCLR(GATE_GPIOF,     RCC_MP_NS_AHB4ENSETR,   5),
+       CFG_GATE_SETCLR(GATE_GPIOG,     RCC_MP_NS_AHB4ENSETR,   6),
+       CFG_GATE_SETCLR(GATE_GPIOH,     RCC_MP_NS_AHB4ENSETR,   7),
+       CFG_GATE_SETCLR(GATE_GPIOI,     RCC_MP_NS_AHB4ENSETR,   8),
+       CFG_GATE_SETCLR(GATE_PKA,       RCC_MP_AHB5ENSETR,      2),
+       CFG_GATE_SETCLR(GATE_SAES,      RCC_MP_AHB5ENSETR,      3),
+       CFG_GATE_SETCLR(GATE_CRYP1,     RCC_MP_AHB5ENSETR,      4),
+       CFG_GATE_SETCLR(GATE_HASH1,     RCC_MP_AHB5ENSETR,      5),
+       CFG_GATE_SETCLR(GATE_RNG1,      RCC_MP_AHB5ENSETR,      6),
+       CFG_GATE_SETCLR(GATE_BKPSRAM,   RCC_MP_AHB5ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_AXIMC,     RCC_MP_AHB5ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_MCE,       RCC_MP_AHB6ENSETR,      1),
+       CFG_GATE_SETCLR(GATE_ETH1CK,    RCC_MP_AHB6ENSETR,      7),
+       CFG_GATE_SETCLR(GATE_ETH1TX,    RCC_MP_AHB6ENSETR,      8),
+       CFG_GATE_SETCLR(GATE_ETH1RX,    RCC_MP_AHB6ENSETR,      9),
+       CFG_GATE_SETCLR(GATE_ETH1MAC,   RCC_MP_AHB6ENSETR,      10),
+       CFG_GATE_SETCLR(GATE_FMC,       RCC_MP_AHB6ENSETR,      12),
+       CFG_GATE_SETCLR(GATE_QSPI,      RCC_MP_AHB6ENSETR,      14),
+       CFG_GATE_SETCLR(GATE_SDMMC1,    RCC_MP_AHB6ENSETR,      16),
+       CFG_GATE_SETCLR(GATE_SDMMC2,    RCC_MP_AHB6ENSETR,      17),
+       CFG_GATE_SETCLR(GATE_CRC1,      RCC_MP_AHB6ENSETR,      20),
+       CFG_GATE_SETCLR(GATE_USBH,      RCC_MP_AHB6ENSETR,      24),
+       CFG_GATE_SETCLR(GATE_ETH2CK,    RCC_MP_AHB6ENSETR,      27),
+       CFG_GATE_SETCLR(GATE_ETH2TX,    RCC_MP_AHB6ENSETR,      28),
+       CFG_GATE_SETCLR(GATE_ETH2RX,    RCC_MP_AHB6ENSETR,      29),
+       CFG_GATE_SETCLR(GATE_ETH2MAC,   RCC_MP_AHB6ENSETR,      30),
+       CFG_GATE_SETCLR(GATE_ETH1STP,   RCC_MP_AHB6LPENSETR,    11),
+       CFG_GATE_SETCLR(GATE_ETH2STP,   RCC_MP_AHB6LPENSETR,    31),
+       CFG_GATE_SETCLR(GATE_MDMA,      RCC_MP_NS_AHB6ENSETR,   0),
+};
+
+/* STM32 Divivers definition */
+enum enum_div_cfg {
+       DIV_RTC,
+       DIV_HSI,
+       DIV_MCO1,
+       DIV_MCO2,
+       DIV_TRACE,
+       DIV_ETH1PTP,
+       DIV_ETH2PTP,
+       DIV_NB
+};
+
+static const struct clk_div_table ck_trace_div_table[] = {
+       { 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 },
+       { 4, 16 }, { 5, 16 }, { 6, 16 }, { 7, 16 },
+       { 0 },
+};
+
+#define CFG_DIV(_id, _offset, _shift, _width, _flags, _table, _ready)\
+       [(_id)] = {\
+               .offset = (_offset),\
+               .shift  = (_shift),\
+               .width  = (_width),\
+               .flags  = (_flags),\
+               .table  = (_table),\
+               .ready  = (_ready),\
+       }
+
+static const struct stm32_div_cfg stm32mp13_dividers[DIV_NB] = {
+       CFG_DIV(DIV_RTC, RCC_RTCDIVR, 0, 6, 0, NULL, DIV_NO_RDY),
+       CFG_DIV(DIV_MCO1, RCC_MCO1CFGR, 4, 4, 0, NULL, DIV_NO_RDY),
+       CFG_DIV(DIV_MCO2, RCC_MCO2CFGR, 4, 4, 0, NULL, DIV_NO_RDY),
+       CFG_DIV(DIV_TRACE, RCC_DBGCFGR, 0, 3, 0, ck_trace_div_table, DIV_NO_RDY),
+       CFG_DIV(DIV_ETH1PTP, RCC_ETH12CKSELR, 4, 4, 0, NULL, DIV_NO_RDY),
+       CFG_DIV(DIV_ETH2PTP, RCC_ETH12CKSELR, 12, 4, 0, NULL, DIV_NO_RDY),
+};
+
+/* STM32 Muxes definition */
+enum enum_mux_cfg {
+       MUX_ADC1,
+       MUX_ADC2,
+       MUX_DCMIPP,
+       MUX_ETH1,
+       MUX_ETH2,
+       MUX_FDCAN,
+       MUX_FMC,
+       MUX_I2C12,
+       MUX_I2C3,
+       MUX_I2C4,
+       MUX_I2C5,
+       MUX_LPTIM1,
+       MUX_LPTIM2,
+       MUX_LPTIM3,
+       MUX_LPTIM45,
+       MUX_MCO1,
+       MUX_MCO2,
+       MUX_QSPI,
+       MUX_RNG1,
+       MUX_SAES,
+       MUX_SAI1,
+       MUX_SAI2,
+       MUX_SDMMC1,
+       MUX_SDMMC2,
+       MUX_SPDIF,
+       MUX_SPI1,
+       MUX_SPI23,
+       MUX_SPI4,
+       MUX_SPI5,
+       MUX_STGEN,
+       MUX_UART1,
+       MUX_UART2,
+       MUX_UART4,
+       MUX_UART6,
+       MUX_UART35,
+       MUX_UART78,
+       MUX_USBO,
+       MUX_USBPHY,
+       MUX_NB
+};
+
+#define _CFG_MUX(_id, _offset, _shift, _witdh, _ready, _flags)\
+       [_id] = {\
+               .offset         = (_offset),\
+               .shift          = (_shift),\
+               .width          = (_witdh),\
+               .ready          = (_ready),\
+               .flags          = (_flags),\
+       }
+
+#define CFG_MUX(_id, _offset, _shift, _witdh)\
+       _CFG_MUX(_id, _offset, _shift, _witdh, MUX_NO_RDY, 0)
+
+#define CFG_MUX_SAFE(_id, _offset, _shift, _witdh)\
+       _CFG_MUX(_id, _offset, _shift, _witdh, MUX_NO_RDY, MUX_SAFE)
+
+static const struct stm32_mux_cfg stm32mp13_muxes[] = {
+       CFG_MUX(MUX_I2C12,      RCC_I2C12CKSELR,        0, 3),
+       CFG_MUX(MUX_LPTIM45,    RCC_LPTIM45CKSELR,      0, 3),
+       CFG_MUX(MUX_SPI23,      RCC_SPI2S23CKSELR,      0, 3),
+       CFG_MUX(MUX_UART35,     RCC_UART35CKSELR,       0, 3),
+       CFG_MUX(MUX_UART78,     RCC_UART78CKSELR,       0, 3),
+       CFG_MUX(MUX_ADC1,       RCC_ADC12CKSELR,        0, 2),
+       CFG_MUX(MUX_ADC2,       RCC_ADC12CKSELR,        2, 2),
+       CFG_MUX(MUX_DCMIPP,     RCC_DCMIPPCKSELR,       0, 2),
+       CFG_MUX(MUX_ETH1,       RCC_ETH12CKSELR,        0, 2),
+       CFG_MUX(MUX_ETH2,       RCC_ETH12CKSELR,        8, 2),
+       CFG_MUX(MUX_FDCAN,      RCC_FDCANCKSELR,        0, 2),
+       CFG_MUX(MUX_I2C3,       RCC_I2C345CKSELR,       0, 3),
+       CFG_MUX(MUX_I2C4,       RCC_I2C345CKSELR,       3, 3),
+       CFG_MUX(MUX_I2C5,       RCC_I2C345CKSELR,       6, 3),
+       CFG_MUX(MUX_LPTIM1,     RCC_LPTIM1CKSELR,       0, 3),
+       CFG_MUX(MUX_LPTIM2,     RCC_LPTIM23CKSELR,      0, 3),
+       CFG_MUX(MUX_LPTIM3,     RCC_LPTIM23CKSELR,      3, 3),
+       CFG_MUX(MUX_MCO1,       RCC_MCO1CFGR,           0, 3),
+       CFG_MUX(MUX_MCO2,       RCC_MCO2CFGR,           0, 3),
+       CFG_MUX(MUX_RNG1,       RCC_RNG1CKSELR,         0, 2),
+       CFG_MUX(MUX_SAES,       RCC_SAESCKSELR,         0, 2),
+       CFG_MUX(MUX_SAI1,       RCC_SAI1CKSELR,         0, 3),
+       CFG_MUX(MUX_SAI2,       RCC_SAI2CKSELR,         0, 3),
+       CFG_MUX(MUX_SPDIF,      RCC_SPDIFCKSELR,        0, 2),
+       CFG_MUX(MUX_SPI1,       RCC_SPI2S1CKSELR,       0, 3),
+       CFG_MUX(MUX_SPI4,       RCC_SPI45CKSELR,        0, 3),
+       CFG_MUX(MUX_SPI5,       RCC_SPI45CKSELR,        3, 3),
+       CFG_MUX(MUX_STGEN,      RCC_STGENCKSELR,        0, 2),
+       CFG_MUX(MUX_UART1,      RCC_UART12CKSELR,       0, 3),
+       CFG_MUX(MUX_UART2,      RCC_UART12CKSELR,       3, 3),
+       CFG_MUX(MUX_UART4,      RCC_UART4CKSELR,        0, 3),
+       CFG_MUX(MUX_UART6,      RCC_UART6CKSELR,        0, 3),
+       CFG_MUX(MUX_USBO,       RCC_USBCKSELR,          4, 1),
+       CFG_MUX(MUX_USBPHY,     RCC_USBCKSELR,          0, 2),
+       CFG_MUX_SAFE(MUX_FMC,   RCC_FMCCKSELR,          0, 2),
+       CFG_MUX_SAFE(MUX_QSPI,  RCC_QSPICKSELR,         0, 2),
+       CFG_MUX_SAFE(MUX_SDMMC1, RCC_SDMMC12CKSELR,     0, 3),
+       CFG_MUX_SAFE(MUX_SDMMC2, RCC_SDMMC12CKSELR,     3, 3),
+};
+
+struct clk_stm32_securiy {
+       u32     offset;
+       u8      bit_idx;
+       unsigned long scmi_id;
+};
+
+enum security_clk {
+       SECF_NONE,
+       SECF_LPTIM2,
+       SECF_LPTIM3,
+       SECF_VREF,
+       SECF_DCMIPP,
+       SECF_USBPHY,
+       SECF_TZC,
+       SECF_ETZPC,
+       SECF_IWDG1,
+       SECF_BSEC,
+       SECF_STGENC,
+       SECF_STGENRO,
+       SECF_USART1,
+       SECF_USART2,
+       SECF_SPI4,
+       SECF_SPI5,
+       SECF_I2C3,
+       SECF_I2C4,
+       SECF_I2C5,
+       SECF_TIM12,
+       SECF_TIM13,
+       SECF_TIM14,
+       SECF_TIM15,
+       SECF_TIM16,
+       SECF_TIM17,
+       SECF_DMA3,
+       SECF_DMAMUX2,
+       SECF_ADC1,
+       SECF_ADC2,
+       SECF_USBO,
+       SECF_TSC,
+       SECF_PKA,
+       SECF_SAES,
+       SECF_CRYP1,
+       SECF_HASH1,
+       SECF_RNG1,
+       SECF_BKPSRAM,
+       SECF_MCE,
+       SECF_FMC,
+       SECF_QSPI,
+       SECF_SDMMC1,
+       SECF_SDMMC2,
+       SECF_ETH1CK,
+       SECF_ETH1TX,
+       SECF_ETH1RX,
+       SECF_ETH1MAC,
+       SECF_ETH1STP,
+       SECF_ETH2CK,
+       SECF_ETH2TX,
+       SECF_ETH2RX,
+       SECF_ETH2MAC,
+       SECF_ETH2STP,
+       SECF_MCO1,
+       SECF_MCO2
+};
+
+#define SECF(_sec_id, _offset, _bit_idx)[_sec_id] = {\
+       .offset = _offset,\
+       .bit_idx        = _bit_idx,\
+       .scmi_id        = -1,\
+}
+
+static const struct clk_stm32_securiy stm32mp13_security[] = {
+       SECF(SECF_LPTIM2, RCC_APB3SECSR, RCC_APB3SECSR_LPTIM2SECF),
+       SECF(SECF_LPTIM3, RCC_APB3SECSR, RCC_APB3SECSR_LPTIM3SECF),
+       SECF(SECF_VREF, RCC_APB3SECSR, RCC_APB3SECSR_VREFSECF),
+       SECF(SECF_DCMIPP, RCC_APB4SECSR, RCC_APB4SECSR_DCMIPPSECF),
+       SECF(SECF_USBPHY, RCC_APB4SECSR, RCC_APB4SECSR_USBPHYSECF),
+       SECF(SECF_TZC, RCC_APB5SECSR, RCC_APB5SECSR_TZCSECF),
+       SECF(SECF_ETZPC, RCC_APB5SECSR, RCC_APB5SECSR_ETZPCSECF),
+       SECF(SECF_IWDG1, RCC_APB5SECSR, RCC_APB5SECSR_IWDG1SECF),
+       SECF(SECF_BSEC, RCC_APB5SECSR, RCC_APB5SECSR_BSECSECF),
+       SECF(SECF_STGENC, RCC_APB5SECSR, RCC_APB5SECSR_STGENCSECF),
+       SECF(SECF_STGENRO, RCC_APB5SECSR, RCC_APB5SECSR_STGENROSECF),
+       SECF(SECF_USART1, RCC_APB6SECSR, RCC_APB6SECSR_USART1SECF),
+       SECF(SECF_USART2, RCC_APB6SECSR, RCC_APB6SECSR_USART2SECF),
+       SECF(SECF_SPI4, RCC_APB6SECSR, RCC_APB6SECSR_SPI4SECF),
+       SECF(SECF_SPI5, RCC_APB6SECSR, RCC_APB6SECSR_SPI5SECF),
+       SECF(SECF_I2C3, RCC_APB6SECSR, RCC_APB6SECSR_I2C3SECF),
+       SECF(SECF_I2C4, RCC_APB6SECSR, RCC_APB6SECSR_I2C4SECF),
+       SECF(SECF_I2C5, RCC_APB6SECSR, RCC_APB6SECSR_I2C5SECF),
+       SECF(SECF_TIM12, RCC_APB6SECSR, RCC_APB6SECSR_TIM12SECF),
+       SECF(SECF_TIM13, RCC_APB6SECSR, RCC_APB6SECSR_TIM13SECF),
+       SECF(SECF_TIM14, RCC_APB6SECSR, RCC_APB6SECSR_TIM14SECF),
+       SECF(SECF_TIM15, RCC_APB6SECSR, RCC_APB6SECSR_TIM15SECF),
+       SECF(SECF_TIM16, RCC_APB6SECSR, RCC_APB6SECSR_TIM16SECF),
+       SECF(SECF_TIM17, RCC_APB6SECSR, RCC_APB6SECSR_TIM17SECF),
+       SECF(SECF_DMA3, RCC_AHB2SECSR, RCC_AHB2SECSR_DMA3SECF),
+       SECF(SECF_DMAMUX2, RCC_AHB2SECSR, RCC_AHB2SECSR_DMAMUX2SECF),
+       SECF(SECF_ADC1, RCC_AHB2SECSR, RCC_AHB2SECSR_ADC1SECF),
+       SECF(SECF_ADC2, RCC_AHB2SECSR, RCC_AHB2SECSR_ADC2SECF),
+       SECF(SECF_USBO, RCC_AHB2SECSR, RCC_AHB2SECSR_USBOSECF),
+       SECF(SECF_TSC, RCC_AHB4SECSR, RCC_AHB4SECSR_TSCSECF),
+       SECF(SECF_PKA, RCC_AHB5SECSR, RCC_AHB5SECSR_PKASECF),
+       SECF(SECF_SAES, RCC_AHB5SECSR, RCC_AHB5SECSR_SAESSECF),
+       SECF(SECF_CRYP1, RCC_AHB5SECSR, RCC_AHB5SECSR_CRYP1SECF),
+       SECF(SECF_HASH1, RCC_AHB5SECSR, RCC_AHB5SECSR_HASH1SECF),
+       SECF(SECF_RNG1, RCC_AHB5SECSR, RCC_AHB5SECSR_RNG1SECF),
+       SECF(SECF_BKPSRAM, RCC_AHB5SECSR, RCC_AHB5SECSR_BKPSRAMSECF),
+       SECF(SECF_MCE, RCC_AHB6SECSR, RCC_AHB6SECSR_MCESECF),
+       SECF(SECF_FMC, RCC_AHB6SECSR, RCC_AHB6SECSR_FMCSECF),
+       SECF(SECF_QSPI, RCC_AHB6SECSR, RCC_AHB6SECSR_QSPISECF),
+       SECF(SECF_SDMMC1, RCC_AHB6SECSR, RCC_AHB6SECSR_SDMMC1SECF),
+       SECF(SECF_SDMMC2, RCC_AHB6SECSR, RCC_AHB6SECSR_SDMMC2SECF),
+       SECF(SECF_ETH1CK, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH1CKSECF),
+       SECF(SECF_ETH1TX, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH1TXSECF),
+       SECF(SECF_ETH1RX, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH1RXSECF),
+       SECF(SECF_ETH1MAC, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH1MACSECF),
+       SECF(SECF_ETH1STP, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH1STPSECF),
+       SECF(SECF_ETH2CK, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH2CKSECF),
+       SECF(SECF_ETH2TX, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH2TXSECF),
+       SECF(SECF_ETH2RX, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH2RXSECF),
+       SECF(SECF_ETH2MAC, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH2MACSECF),
+       SECF(SECF_ETH2STP, RCC_AHB6SECSR, RCC_AHB6SECSR_ETH2STPSECF),
+       SECF(SECF_MCO1, RCC_SECCFGR, RCC_SECCFGR_MCO1SEC),
+       SECF(SECF_MCO2, RCC_SECCFGR, RCC_SECCFGR_MCO2SEC),
+};
+
+static const char * const adc12_src[] = {
+       "pll4_r", "ck_per", "pll3_q"
+};
+
+static const char * const dcmipp_src[] = {
+       "ck_axi", "pll2_q", "pll4_p", "ck_per",
+};
+
+static const char * const eth12_src[] = {
+       "pll4_p", "pll3_q"
+};
+
+static const char * const fdcan_src[] = {
+       "ck_hse", "pll3_q", "pll4_q", "pll4_r"
+};
+
+static const char * const fmc_src[] = {
+       "ck_axi", "pll3_r", "pll4_p", "ck_per"
+};
+
+static const char * const i2c12_src[] = {
+       "pclk1", "pll4_r", "ck_hsi", "ck_csi"
+};
+
+static const char * const i2c345_src[] = {
+       "pclk6", "pll4_r", "ck_hsi", "ck_csi"
+};
+
+static const char * const lptim1_src[] = {
+       "pclk1", "pll4_p", "pll3_q", "ck_lse", "ck_lsi", "ck_per"
+};
+
+static const char * const lptim23_src[] = {
+       "pclk3", "pll4_q", "ck_per", "ck_lse", "ck_lsi"
+};
+
+static const char * const lptim45_src[] = {
+       "pclk3", "pll4_p", "pll3_q", "ck_lse", "ck_lsi", "ck_per"
+};
+
+static const char * const mco1_src[] = {
+       "ck_hsi", "ck_hse", "ck_csi", "ck_lsi", "ck_lse"
+};
+
+static const char * const mco2_src[] = {
+       "ck_mpu", "ck_axi", "ck_mlahb", "pll4_p", "ck_hse", "ck_hsi"
+};
+
+static const char * const qspi_src[] = {
+       "ck_axi", "pll3_r", "pll4_p", "ck_per"
+};
+
+static const char * const rng1_src[] = {
+       "ck_csi", "pll4_r", "ck_lse", "ck_lsi"
+};
+
+static const char * const saes_src[] = {
+       "ck_axi", "ck_per", "pll4_r", "ck_lsi"
+};
+
+static const char * const sai1_src[] = {
+       "pll4_q", "pll3_q", "i2s_ckin", "ck_per", "pll3_r"
+};
+
+static const char * const sai2_src[] = {
+       "pll4_q", "pll3_q", "i2s_ckin", "ck_per", "spdif_ck_symb", "pll3_r"
+};
+
+static const char * const sdmmc12_src[] = {
+       "ck_axi", "pll3_r", "pll4_p", "ck_hsi"
+};
+
+static const char * const spdif_src[] = {
+       "pll4_p", "pll3_q", "ck_hsi"
+};
+
+static const char * const spi123_src[] = {
+       "pll4_p", "pll3_q", "i2s_ckin", "ck_per", "pll3_r"
+};
+
+static const char * const spi4_src[] = {
+       "pclk6", "pll4_q", "ck_hsi", "ck_csi", "ck_hse", "i2s_ckin"
+};
+
+static const char * const spi5_src[] = {
+       "pclk6", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
+};
+
+static const char * const stgen_src[] = {
+       "ck_hsi", "ck_hse"
+};
+
+static const char * const usart12_src[] = {
+       "pclk6", "pll3_q", "ck_hsi", "ck_csi", "pll4_q", "ck_hse"
+};
+
+static const char * const usart34578_src[] = {
+       "pclk1", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
+};
+
+static const char * const usart6_src[] = {
+       "pclk2", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
+};
+
+static const char * const usbo_src[] = {
+       "pll4_r", "ck_usbo_48m"
+};
+
+static const char * const usbphy_src[] = {
+       "ck_hse", "pll4_r", "clk-hse-div2"
+};
+
+/* Timer clocks */
+static struct clk_stm32_gate tim2_k = {
+       .gate_id = GATE_TIM2,
+       .hw.init = CLK_HW_INIT("tim2_k", "timg1_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim3_k = {
+       .gate_id = GATE_TIM3,
+       .hw.init = CLK_HW_INIT("tim3_k", "timg1_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim4_k = {
+       .gate_id = GATE_TIM4,
+       .hw.init = CLK_HW_INIT("tim4_k", "timg1_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim5_k = {
+       .gate_id = GATE_TIM5,
+       .hw.init = CLK_HW_INIT("tim5_k", "timg1_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim6_k = {
+       .gate_id = GATE_TIM6,
+       .hw.init = CLK_HW_INIT("tim6_k", "timg1_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim7_k = {
+       .gate_id = GATE_TIM7,
+       .hw.init = CLK_HW_INIT("tim7_k", "timg1_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim1_k = {
+       .gate_id = GATE_TIM1,
+       .hw.init = CLK_HW_INIT("tim1_k", "timg2_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim8_k = {
+       .gate_id = GATE_TIM8,
+       .hw.init = CLK_HW_INIT("tim8_k", "timg2_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim12_k = {
+       .gate_id = GATE_TIM12,
+       .hw.init = CLK_HW_INIT("tim12_k", "timg3_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim13_k = {
+       .gate_id = GATE_TIM13,
+       .hw.init = CLK_HW_INIT("tim13_k", "timg3_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim14_k = {
+       .gate_id = GATE_TIM14,
+       .hw.init = CLK_HW_INIT("tim14_k", "timg3_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim15_k = {
+       .gate_id = GATE_TIM15,
+       .hw.init = CLK_HW_INIT("tim15_k", "timg3_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim16_k = {
+       .gate_id = GATE_TIM16,
+       .hw.init = CLK_HW_INIT("tim16_k", "timg3_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_gate tim17_k = {
+       .gate_id = GATE_TIM17,
+       .hw.init = CLK_HW_INIT("tim17_k", "timg3_ck", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+/* Peripheral clocks */
+static struct clk_stm32_gate sai1 = {
+       .gate_id = GATE_SAI1,
+       .hw.init = CLK_HW_INIT("sai1", "pclk2", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate sai2 = {
+       .gate_id = GATE_SAI2,
+       .hw.init = CLK_HW_INIT("sai2", "pclk2", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate syscfg = {
+       .gate_id = GATE_SYSCFG,
+       .hw.init = CLK_HW_INIT("syscfg", "pclk3", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate vref = {
+       .gate_id = GATE_VREF,
+       .hw.init = CLK_HW_INIT("vref", "pclk3", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate dts = {
+       .gate_id = GATE_DTS,
+       .hw.init = CLK_HW_INIT("dts", "pclk3", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate pmbctrl = {
+       .gate_id = GATE_PMBCTRL,
+       .hw.init = CLK_HW_INIT("pmbctrl", "pclk3", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate hdp = {
+       .gate_id = GATE_HDP,
+       .hw.init = CLK_HW_INIT("hdp", "pclk3", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate iwdg2 = {
+       .gate_id = GATE_IWDG2APB,
+       .hw.init = CLK_HW_INIT("iwdg2", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate stgenro = {
+       .gate_id = GATE_STGENRO,
+       .hw.init = CLK_HW_INIT("stgenro", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpioa = {
+       .gate_id = GATE_GPIOA,
+       .hw.init = CLK_HW_INIT("gpioa", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpiob = {
+       .gate_id = GATE_GPIOB,
+       .hw.init = CLK_HW_INIT("gpiob", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpioc = {
+       .gate_id = GATE_GPIOC,
+       .hw.init = CLK_HW_INIT("gpioc", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpiod = {
+       .gate_id = GATE_GPIOD,
+       .hw.init = CLK_HW_INIT("gpiod", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpioe = {
+       .gate_id = GATE_GPIOE,
+       .hw.init = CLK_HW_INIT("gpioe", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpiof = {
+       .gate_id = GATE_GPIOF,
+       .hw.init = CLK_HW_INIT("gpiof", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpiog = {
+       .gate_id = GATE_GPIOG,
+       .hw.init = CLK_HW_INIT("gpiog", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpioh = {
+       .gate_id = GATE_GPIOH,
+       .hw.init = CLK_HW_INIT("gpioh", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate gpioi = {
+       .gate_id = GATE_GPIOI,
+       .hw.init = CLK_HW_INIT("gpioi", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate tsc = {
+       .gate_id = GATE_TSC,
+       .hw.init = CLK_HW_INIT("tsc", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate ddrperfm = {
+       .gate_id = GATE_DDRPERFM,
+       .hw.init = CLK_HW_INIT("ddrperfm", "pclk4", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate tzpc = {
+       .gate_id = GATE_TZC,
+       .hw.init = CLK_HW_INIT("tzpc", "pclk5", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate iwdg1 = {
+       .gate_id = GATE_IWDG1APB,
+       .hw.init = CLK_HW_INIT("iwdg1", "pclk5", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate bsec = {
+       .gate_id = GATE_BSEC,
+       .hw.init = CLK_HW_INIT("bsec", "pclk5", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate dma1 = {
+       .gate_id = GATE_DMA1,
+       .hw.init = CLK_HW_INIT("dma1", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate dma2 = {
+       .gate_id = GATE_DMA2,
+       .hw.init = CLK_HW_INIT("dma2", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate dmamux1 = {
+       .gate_id = GATE_DMAMUX1,
+       .hw.init = CLK_HW_INIT("dmamux1", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate dma3 = {
+       .gate_id = GATE_DMA3,
+       .hw.init = CLK_HW_INIT("dma3", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate dmamux2 = {
+       .gate_id = GATE_DMAMUX2,
+       .hw.init = CLK_HW_INIT("dmamux2", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate adc1 = {
+       .gate_id = GATE_ADC1,
+       .hw.init = CLK_HW_INIT("adc1", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate adc2 = {
+       .gate_id = GATE_ADC2,
+       .hw.init = CLK_HW_INIT("adc2", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate pka = {
+       .gate_id = GATE_PKA,
+       .hw.init = CLK_HW_INIT("pka", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate cryp1 = {
+       .gate_id = GATE_CRYP1,
+       .hw.init = CLK_HW_INIT("cryp1", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate hash1 = {
+       .gate_id = GATE_HASH1,
+       .hw.init = CLK_HW_INIT("hash1", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate bkpsram = {
+       .gate_id = GATE_BKPSRAM,
+       .hw.init = CLK_HW_INIT("bkpsram", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate mdma = {
+       .gate_id = GATE_MDMA,
+       .hw.init = CLK_HW_INIT("mdma", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth1tx = {
+       .gate_id = GATE_ETH1TX,
+       .hw.init = CLK_HW_INIT("eth1tx", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth1rx = {
+       .gate_id = GATE_ETH1RX,
+       .hw.init = CLK_HW_INIT("eth1rx", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth1mac = {
+       .gate_id = GATE_ETH1MAC,
+       .hw.init = CLK_HW_INIT("eth1mac", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth2tx = {
+       .gate_id = GATE_ETH2TX,
+       .hw.init = CLK_HW_INIT("eth2tx", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth2rx = {
+       .gate_id = GATE_ETH2RX,
+       .hw.init = CLK_HW_INIT("eth2rx", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth2mac = {
+       .gate_id = GATE_ETH2MAC,
+       .hw.init = CLK_HW_INIT("eth2mac", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate crc1 = {
+       .gate_id = GATE_CRC1,
+       .hw.init = CLK_HW_INIT("crc1", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate usbh = {
+       .gate_id = GATE_USBH,
+       .hw.init = CLK_HW_INIT("usbh", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth1stp = {
+       .gate_id = GATE_ETH1STP,
+       .hw.init = CLK_HW_INIT("eth1stp", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate eth2stp = {
+       .gate_id = GATE_ETH2STP,
+       .hw.init = CLK_HW_INIT("eth2stp", "ck_axi", &clk_stm32_gate_ops, 0),
+};
+
+/* Kernel clocks */
+static struct clk_stm32_composite sdmmc1_k = {
+       .gate_id = GATE_SDMMC1,
+       .mux_id = MUX_SDMMC1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("sdmmc1_k", sdmmc12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite sdmmc2_k = {
+       .gate_id = GATE_SDMMC2,
+       .mux_id = MUX_SDMMC2,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("sdmmc2_k", sdmmc12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite fmc_k = {
+       .gate_id = GATE_FMC,
+       .mux_id = MUX_FMC,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("fmc_k", fmc_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite qspi_k = {
+       .gate_id = GATE_QSPI,
+       .mux_id = MUX_QSPI,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("qspi_k", qspi_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite spi2_k = {
+       .gate_id = GATE_SPI2,
+       .mux_id = MUX_SPI23,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("spi2_k", spi123_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite spi3_k = {
+       .gate_id = GATE_SPI3,
+       .mux_id = MUX_SPI23,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("spi3_k", spi123_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite i2c1_k = {
+       .gate_id = GATE_I2C1,
+       .mux_id = MUX_I2C12,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("i2c1_k", i2c12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite i2c2_k = {
+       .gate_id = GATE_I2C2,
+       .mux_id = MUX_I2C12,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("i2c2_k", i2c12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite lptim4_k = {
+       .gate_id = GATE_LPTIM4,
+       .mux_id = MUX_LPTIM45,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("lptim4_k", lptim45_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite lptim5_k = {
+       .gate_id = GATE_LPTIM5,
+       .mux_id = MUX_LPTIM45,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("lptim5_k", lptim45_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite usart3_k = {
+       .gate_id = GATE_USART3,
+       .mux_id = MUX_UART35,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("usart3_k", usart34578_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite uart5_k = {
+       .gate_id = GATE_UART5,
+       .mux_id = MUX_UART35,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("uart5_k", usart34578_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite uart7_k = {
+       .gate_id = GATE_UART7,
+       .mux_id = MUX_UART78,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("uart7_k", usart34578_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite uart8_k = {
+       .gate_id = GATE_UART8,
+       .mux_id = MUX_UART78,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("uart8_k", usart34578_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite sai1_k = {
+       .gate_id = GATE_SAI1,
+       .mux_id = MUX_SAI1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("sai1_k", sai1_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite adfsdm_k = {
+       .gate_id = GATE_ADFSDM,
+       .mux_id = MUX_SAI1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("adfsdm_k", sai1_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite sai2_k = {
+       .gate_id = GATE_SAI2,
+       .mux_id = MUX_SAI2,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("sai2_k", sai2_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite adc1_k = {
+       .gate_id = GATE_ADC1,
+       .mux_id = MUX_ADC1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("adc1_k", adc12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite adc2_k = {
+       .gate_id = GATE_ADC2,
+       .mux_id = MUX_ADC2,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("adc2_k", adc12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite rng1_k = {
+       .gate_id = GATE_RNG1,
+       .mux_id = MUX_RNG1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("rng1_k", rng1_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite usbphy_k = {
+       .gate_id = GATE_USBPHY,
+       .mux_id = MUX_USBPHY,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("usbphy_k", usbphy_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite stgen_k = {
+       .gate_id = GATE_STGENC,
+       .mux_id = MUX_STGEN,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("stgen_k", stgen_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite spdif_k = {
+       .gate_id = GATE_SPDIF,
+       .mux_id = MUX_SPDIF,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("spdif_k", spdif_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite spi1_k = {
+       .gate_id = GATE_SPI1,
+       .mux_id = MUX_SPI1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("spi1_k", spi123_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite spi4_k = {
+       .gate_id = GATE_SPI4,
+       .mux_id = MUX_SPI4,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("spi4_k", spi4_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite spi5_k = {
+       .gate_id = GATE_SPI5,
+       .mux_id = MUX_SPI5,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("spi5_k", spi5_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite i2c3_k = {
+       .gate_id = GATE_I2C3,
+       .mux_id = MUX_I2C3,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("i2c3_k", i2c345_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite i2c4_k = {
+       .gate_id = GATE_I2C4,
+       .mux_id = MUX_I2C4,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("i2c4_k", i2c345_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite i2c5_k = {
+       .gate_id = GATE_I2C5,
+       .mux_id = MUX_I2C5,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("i2c5_k", i2c345_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite lptim1_k = {
+       .gate_id = GATE_LPTIM1,
+       .mux_id = MUX_LPTIM1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("lptim1_k", lptim1_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite lptim2_k = {
+       .gate_id = GATE_LPTIM2,
+       .mux_id = MUX_LPTIM2,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("lptim2_k", lptim23_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite lptim3_k = {
+       .gate_id = GATE_LPTIM3,
+       .mux_id = MUX_LPTIM3,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("lptim3_k", lptim23_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite usart1_k = {
+       .gate_id = GATE_USART1,
+       .mux_id = MUX_UART1,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("usart1_k", usart12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite usart2_k = {
+       .gate_id = GATE_USART2,
+       .mux_id = MUX_UART2,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("usart2_k", usart12_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite uart4_k = {
+       .gate_id = GATE_UART4,
+       .mux_id = MUX_UART4,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("uart4_k", usart34578_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite uart6_k = {
+       .gate_id = GATE_USART6,
+       .mux_id = MUX_UART6,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("uart6_k", usart6_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite fdcan_k = {
+       .gate_id = GATE_FDCAN,
+       .mux_id = MUX_FDCAN,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("fdcan_k", fdcan_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite dcmipp_k = {
+       .gate_id = GATE_DCMIPP,
+       .mux_id = MUX_DCMIPP,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("dcmipp_k", dcmipp_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite usbo_k = {
+       .gate_id = GATE_USBO,
+       .mux_id = MUX_USBO,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("usbo_k", usbo_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite saes_k = {
+       .gate_id = GATE_SAES,
+       .mux_id = MUX_SAES,
+       .div_id = NO_STM32_DIV,
+       .hw.init = CLK_HW_INIT_PARENTS("saes_k", saes_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_gate dfsdm_k = {
+       .gate_id = GATE_DFSDM,
+       .hw.init = CLK_HW_INIT("dfsdm_k", "ck_mlahb", &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_gate ltdc_px = {
+       .gate_id = GATE_LTDC,
+       .hw.init = CLK_HW_INIT("ltdc_px", "pll4_q", &clk_stm32_gate_ops, CLK_SET_RATE_PARENT),
+};
+
+static struct clk_stm32_mux ck_ker_eth1 = {
+       .mux_id = MUX_ETH1,
+       .hw.init = CLK_HW_INIT_PARENTS("ck_ker_eth1", eth12_src, &clk_stm32_mux_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_gate eth1ck_k = {
+       .gate_id = GATE_ETH1CK,
+       .hw.init = CLK_HW_INIT_HW("eth1ck_k", &ck_ker_eth1.hw, &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_div eth1ptp_k = {
+       .div_id = DIV_ETH1PTP,
+       .hw.init = CLK_HW_INIT_HW("eth1ptp_k", &ck_ker_eth1.hw, &clk_stm32_divider_ops,
+                                 CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_mux ck_ker_eth2 = {
+       .mux_id = MUX_ETH2,
+       .hw.init = CLK_HW_INIT_PARENTS("ck_ker_eth2", eth12_src, &clk_stm32_mux_ops,
+                                           CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_gate eth2ck_k = {
+       .gate_id = GATE_ETH2CK,
+       .hw.init = CLK_HW_INIT_HW("eth2ck_k", &ck_ker_eth2.hw, &clk_stm32_gate_ops, 0),
+};
+
+static struct clk_stm32_div eth2ptp_k = {
+       .div_id = DIV_ETH2PTP,
+       .hw.init = CLK_HW_INIT_HW("eth2ptp_k", &ck_ker_eth2.hw, &clk_stm32_divider_ops,
+                                 CLK_SET_RATE_NO_REPARENT),
+};
+
+static struct clk_stm32_composite ck_mco1 = {
+       .gate_id = GATE_MCO1,
+       .mux_id = MUX_MCO1,
+       .div_id = DIV_MCO1,
+       .hw.init = CLK_HW_INIT_PARENTS("ck_mco1", mco1_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT |
+                                      CLK_IGNORE_UNUSED),
+};
+
+static struct clk_stm32_composite ck_mco2 = {
+       .gate_id = GATE_MCO2,
+       .mux_id = MUX_MCO2,
+       .div_id = DIV_MCO2,
+       .hw.init = CLK_HW_INIT_PARENTS("ck_mco2", mco2_src, &clk_stm32_composite_ops,
+                                      CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_NO_REPARENT |
+                                      CLK_IGNORE_UNUSED),
+};
+
+/* Debug clocks */
+static struct clk_stm32_gate ck_sys_dbg = {
+       .gate_id = GATE_DBGCK,
+       .hw.init = CLK_HW_INIT("ck_sys_dbg", "ck_axi", &clk_stm32_gate_ops, CLK_IS_CRITICAL),
+};
+
+static struct clk_stm32_composite ck_trace = {
+       .gate_id = GATE_TRACECK,
+       .mux_id = NO_STM32_MUX,
+       .div_id = DIV_TRACE,
+       .hw.init = CLK_HW_INIT("ck_trace", "ck_axi", &clk_stm32_composite_ops, CLK_IGNORE_UNUSED),
+};
+
+static const struct clock_config stm32mp13_clock_cfg[] = {
+       /* Timer clocks */
+       STM32_GATE_CFG(TIM2_K, tim2_k, SECF_NONE),
+       STM32_GATE_CFG(TIM3_K, tim3_k, SECF_NONE),
+       STM32_GATE_CFG(TIM4_K, tim4_k, SECF_NONE),
+       STM32_GATE_CFG(TIM5_K, tim5_k, SECF_NONE),
+       STM32_GATE_CFG(TIM6_K, tim6_k, SECF_NONE),
+       STM32_GATE_CFG(TIM7_K, tim7_k, SECF_NONE),
+       STM32_GATE_CFG(TIM1_K, tim1_k, SECF_NONE),
+       STM32_GATE_CFG(TIM8_K, tim8_k, SECF_NONE),
+       STM32_GATE_CFG(TIM12_K, tim12_k, SECF_TIM12),
+       STM32_GATE_CFG(TIM13_K, tim13_k, SECF_TIM13),
+       STM32_GATE_CFG(TIM14_K, tim14_k, SECF_TIM14),
+       STM32_GATE_CFG(TIM15_K, tim15_k, SECF_TIM15),
+       STM32_GATE_CFG(TIM16_K, tim16_k, SECF_TIM16),
+       STM32_GATE_CFG(TIM17_K, tim17_k, SECF_TIM17),
+
+       /* Peripheral clocks */
+       STM32_GATE_CFG(SAI1, sai1, SECF_NONE),
+       STM32_GATE_CFG(SAI2, sai2, SECF_NONE),
+       STM32_GATE_CFG(SYSCFG, syscfg, SECF_NONE),
+       STM32_GATE_CFG(VREF, vref, SECF_VREF),
+       STM32_GATE_CFG(DTS, dts, SECF_NONE),
+       STM32_GATE_CFG(PMBCTRL, pmbctrl, SECF_NONE),
+       STM32_GATE_CFG(HDP, hdp, SECF_NONE),
+       STM32_GATE_CFG(IWDG2, iwdg2, SECF_NONE),
+       STM32_GATE_CFG(STGENRO, stgenro, SECF_STGENRO),
+       STM32_GATE_CFG(TZPC, tzpc, SECF_TZC),
+       STM32_GATE_CFG(IWDG1, iwdg1, SECF_IWDG1),
+       STM32_GATE_CFG(BSEC, bsec, SECF_BSEC),
+       STM32_GATE_CFG(DMA1, dma1, SECF_NONE),
+       STM32_GATE_CFG(DMA2, dma2, SECF_NONE),
+       STM32_GATE_CFG(DMAMUX1, dmamux1, SECF_NONE),
+       STM32_GATE_CFG(DMA3, dma3, SECF_DMA3),
+       STM32_GATE_CFG(DMAMUX2, dmamux2, SECF_DMAMUX2),
+       STM32_GATE_CFG(ADC1, adc1, SECF_ADC1),
+       STM32_GATE_CFG(ADC2, adc2, SECF_ADC2),
+       STM32_GATE_CFG(GPIOA, gpioa, SECF_NONE),
+       STM32_GATE_CFG(GPIOB, gpiob, SECF_NONE),
+       STM32_GATE_CFG(GPIOC, gpioc, SECF_NONE),
+       STM32_GATE_CFG(GPIOD, gpiod, SECF_NONE),
+       STM32_GATE_CFG(GPIOE, gpioe, SECF_NONE),
+       STM32_GATE_CFG(GPIOF, gpiof, SECF_NONE),
+       STM32_GATE_CFG(GPIOG, gpiog, SECF_NONE),
+       STM32_GATE_CFG(GPIOH, gpioh, SECF_NONE),
+       STM32_GATE_CFG(GPIOI, gpioi, SECF_NONE),
+       STM32_GATE_CFG(TSC, tsc, SECF_TZC),
+       STM32_GATE_CFG(PKA, pka, SECF_PKA),
+       STM32_GATE_CFG(CRYP1, cryp1, SECF_CRYP1),
+       STM32_GATE_CFG(HASH1, hash1, SECF_HASH1),
+       STM32_GATE_CFG(BKPSRAM, bkpsram, SECF_BKPSRAM),
+       STM32_GATE_CFG(MDMA, mdma, SECF_NONE),
+       STM32_GATE_CFG(ETH1TX, eth1tx, SECF_ETH1TX),
+       STM32_GATE_CFG(ETH1RX, eth1rx, SECF_ETH1RX),
+       STM32_GATE_CFG(ETH1MAC, eth1mac, SECF_ETH1MAC),
+       STM32_GATE_CFG(ETH2TX, eth2tx, SECF_ETH2TX),
+       STM32_GATE_CFG(ETH2RX, eth2rx, SECF_ETH2RX),
+       STM32_GATE_CFG(ETH2MAC, eth2mac, SECF_ETH2MAC),
+       STM32_GATE_CFG(CRC1, crc1, SECF_NONE),
+       STM32_GATE_CFG(USBH, usbh, SECF_NONE),
+       STM32_GATE_CFG(DDRPERFM, ddrperfm, SECF_NONE),
+       STM32_GATE_CFG(ETH1STP, eth1stp, SECF_ETH1STP),
+       STM32_GATE_CFG(ETH2STP, eth2stp, SECF_ETH2STP),
+
+       /* Kernel clocks */
+       STM32_COMPOSITE_CFG(SDMMC1_K, sdmmc1_k, SECF_SDMMC1),
+       STM32_COMPOSITE_CFG(SDMMC2_K, sdmmc2_k, SECF_SDMMC2),
+       STM32_COMPOSITE_CFG(FMC_K, fmc_k, SECF_FMC),
+       STM32_COMPOSITE_CFG(QSPI_K, qspi_k, SECF_QSPI),
+       STM32_COMPOSITE_CFG(SPI2_K, spi2_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(SPI3_K, spi3_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(I2C1_K, i2c1_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(I2C2_K, i2c2_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(LPTIM4_K, lptim4_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(LPTIM5_K, lptim5_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(USART3_K, usart3_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(UART5_K, uart5_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(UART7_K, uart7_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(UART8_K, uart8_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(SAI1_K, sai1_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(SAI2_K, sai2_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(ADFSDM_K, adfsdm_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(ADC1_K, adc1_k, SECF_ADC1),
+       STM32_COMPOSITE_CFG(ADC2_K, adc2_k, SECF_ADC2),
+       STM32_COMPOSITE_CFG(RNG1_K, rng1_k, SECF_RNG1),
+       STM32_COMPOSITE_CFG(USBPHY_K, usbphy_k, SECF_USBPHY),
+       STM32_COMPOSITE_CFG(STGEN_K, stgen_k, SECF_STGENC),
+       STM32_COMPOSITE_CFG(SPDIF_K, spdif_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(SPI1_K, spi1_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(SPI4_K, spi4_k, SECF_SPI4),
+       STM32_COMPOSITE_CFG(SPI5_K, spi5_k, SECF_SPI5),
+       STM32_COMPOSITE_CFG(I2C3_K, i2c3_k, SECF_I2C3),
+       STM32_COMPOSITE_CFG(I2C4_K, i2c4_k, SECF_I2C4),
+       STM32_COMPOSITE_CFG(I2C5_K, i2c5_k, SECF_I2C5),
+       STM32_COMPOSITE_CFG(LPTIM1_K, lptim1_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(LPTIM2_K, lptim2_k, SECF_LPTIM2),
+       STM32_COMPOSITE_CFG(LPTIM3_K, lptim3_k, SECF_LPTIM3),
+       STM32_COMPOSITE_CFG(USART1_K, usart1_k, SECF_USART1),
+       STM32_COMPOSITE_CFG(USART2_K, usart2_k, SECF_USART2),
+       STM32_COMPOSITE_CFG(UART4_K, uart4_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(USART6_K, uart6_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(FDCAN_K, fdcan_k, SECF_NONE),
+       STM32_COMPOSITE_CFG(DCMIPP_K, dcmipp_k, SECF_DCMIPP),
+       STM32_COMPOSITE_CFG(USBO_K, usbo_k, SECF_USBO),
+       STM32_COMPOSITE_CFG(SAES_K, saes_k, SECF_SAES),
+       STM32_GATE_CFG(DFSDM_K, dfsdm_k, SECF_NONE),
+       STM32_GATE_CFG(LTDC_PX, ltdc_px, SECF_NONE),
+
+       STM32_MUX_CFG(NO_ID, ck_ker_eth1, SECF_ETH1CK),
+       STM32_GATE_CFG(ETH1CK_K, eth1ck_k, SECF_ETH1CK),
+       STM32_DIV_CFG(ETH1PTP_K, eth1ptp_k, SECF_ETH1CK),
+
+       STM32_MUX_CFG(NO_ID, ck_ker_eth2, SECF_ETH2CK),
+       STM32_GATE_CFG(ETH2CK_K, eth2ck_k, SECF_ETH2CK),
+       STM32_DIV_CFG(ETH2PTP_K, eth2ptp_k, SECF_ETH2CK),
+
+       STM32_GATE_CFG(CK_DBG, ck_sys_dbg, SECF_NONE),
+       STM32_COMPOSITE_CFG(CK_TRACE, ck_trace, SECF_NONE),
+
+       STM32_COMPOSITE_CFG(CK_MCO1, ck_mco1, SECF_MCO1),
+       STM32_COMPOSITE_CFG(CK_MCO2, ck_mco2, SECF_MCO2),
+};
+
+static int stm32mp13_clock_is_provided_by_secure(void __iomem *base,
+                                                const struct clock_config *cfg)
+{
+       int sec_id = cfg->sec_id;
+
+       if (sec_id != SECF_NONE) {
+               const struct clk_stm32_securiy *secf;
+
+               secf = &stm32mp13_security[sec_id];
+
+               return !!(readl(base + secf->offset) & BIT(secf->bit_idx));
+       }
+
+       return 0;
+}
+
+struct multi_mux {
+       struct clk_hw *hw1;
+       struct clk_hw *hw2;
+};
+
+static struct multi_mux *stm32_mp13_multi_mux[MUX_NB] = {
+       [MUX_SPI23]     = &(struct multi_mux){ &spi2_k.hw,      &spi3_k.hw },
+       [MUX_I2C12]     = &(struct multi_mux){ &i2c1_k.hw,      &i2c2_k.hw },
+       [MUX_LPTIM45]   = &(struct multi_mux){ &lptim4_k.hw,    &lptim5_k.hw },
+       [MUX_UART35]    = &(struct multi_mux){ &usart3_k.hw,    &uart5_k.hw },
+       [MUX_UART78]    = &(struct multi_mux){ &uart7_k.hw,     &uart8_k.hw },
+       [MUX_SAI1]      = &(struct multi_mux){ &sai1_k.hw,      &adfsdm_k.hw },
+};
+
+static struct clk_hw *stm32mp13_is_multi_mux(struct clk_hw *hw)
+{
+       struct clk_stm32_composite *composite = to_clk_stm32_composite(hw);
+       struct multi_mux *mmux = stm32_mp13_multi_mux[composite->mux_id];
+
+       if (mmux) {
+               if (!(mmux->hw1 == hw))
+                       return mmux->hw1;
+               else
+                       return mmux->hw2;
+       }
+
+       return NULL;
+}
+
+static u16 stm32mp13_cpt_gate[GATE_NB];
+
+static struct clk_stm32_clock_data stm32mp13_clock_data = {
+       .gate_cpt       = stm32mp13_cpt_gate,
+       .gates          = stm32mp13_gates,
+       .muxes          = stm32mp13_muxes,
+       .dividers       = stm32mp13_dividers,
+       .is_multi_mux   = stm32mp13_is_multi_mux,
+};
+
+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,
+};
+
+static const struct of_device_id stm32mp13_match_data[] = {
+       {
+               .compatible = "st,stm32mp13-rcc",
+               .data = &stm32mp13_data,
+       },
+       { }
+};
+MODULE_DEVICE_TABLE(of, stm32mp13_match_data);
+
+static int stm32mp1_rcc_init(struct device *dev)
+{
+       void __iomem *rcc_base;
+       int ret = -ENOMEM;
+
+       rcc_base = of_iomap(dev_of_node(dev), 0);
+       if (!rcc_base) {
+               dev_err(dev, "%pOFn: unable to map resource", dev_of_node(dev));
+               goto out;
+       }
+
+       ret = stm32_rcc_init(dev, stm32mp13_match_data, rcc_base);
+out:
+       if (ret) {
+               if (rcc_base)
+                       iounmap(rcc_base);
+
+               of_node_put(dev_of_node(dev));
+       }
+
+       return ret;
+}
+
+static int get_clock_deps(struct device *dev)
+{
+       static const char * const clock_deps_name[] = {
+               "hsi", "hse", "csi", "lsi", "lse",
+       };
+       size_t deps_size = sizeof(struct clk *) * ARRAY_SIZE(clock_deps_name);
+       struct clk **clk_deps;
+       int i;
+
+       clk_deps = devm_kzalloc(dev, deps_size, GFP_KERNEL);
+       if (!clk_deps)
+               return -ENOMEM;
+
+       for (i = 0; i < ARRAY_SIZE(clock_deps_name); i++) {
+               struct clk *clk = of_clk_get_by_name(dev_of_node(dev),
+                                                    clock_deps_name[i]);
+
+               if (IS_ERR(clk)) {
+                       if (PTR_ERR(clk) != -EINVAL && PTR_ERR(clk) != -ENOENT)
+                               return PTR_ERR(clk);
+               } else {
+                       /* Device gets a reference count on the clock */
+                       clk_deps[i] = devm_clk_get(dev, __clk_get_name(clk));
+                       clk_put(clk);
+               }
+       }
+
+       return 0;
+}
+
+static int stm32mp1_rcc_clocks_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       int ret = get_clock_deps(dev);
+
+       if (!ret)
+               ret = stm32mp1_rcc_init(dev);
+
+       return ret;
+}
+
+static int stm32mp1_rcc_clocks_remove(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *child, *np = dev_of_node(dev);
+
+       for_each_available_child_of_node(np, child)
+               of_clk_del_provider(child);
+
+       return 0;
+}
+
+static struct platform_driver stm32mp13_rcc_clocks_driver = {
+       .driver = {
+               .name = "stm32mp13_rcc",
+               .of_match_table = stm32mp13_match_data,
+       },
+       .probe = stm32mp1_rcc_clocks_probe,
+       .remove = stm32mp1_rcc_clocks_remove,
+};
+
+static int __init stm32mp13_clocks_init(void)
+{
+       return platform_driver_register(&stm32mp13_rcc_clocks_driver);
+}
+core_initcall(stm32mp13_clocks_init);
diff --git a/drivers/clk/stm32/reset-stm32.c b/drivers/clk/stm32/reset-stm32.c
new file mode 100644 (file)
index 0000000..0408701
--- /dev/null
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
+ */
+
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+
+#include "clk-stm32-core.h"
+
+#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,
+};
+
+int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
+                        void __iomem *base)
+{
+       const struct stm32_rcc_match_data *data = match->data;
+       struct stm32_reset_data *reset_data = NULL;
+
+       data = match->data;
+
+       reset_data = kzalloc(sizeof(*reset_data), GFP_KERNEL);
+       if (!reset_data)
+               return -ENOMEM;
+
+       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);
+}
diff --git a/drivers/clk/stm32/reset-stm32.h b/drivers/clk/stm32/reset-stm32.h
new file mode 100644 (file)
index 0000000..6eb6ea4
--- /dev/null
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0  */
+/*
+ * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
+ */
+
+int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
+                        void __iomem *base);
diff --git a/drivers/clk/stm32/stm32mp13_rcc.h b/drivers/clk/stm32/stm32mp13_rcc.h
new file mode 100644 (file)
index 0000000..a82512a
--- /dev/null
@@ -0,0 +1,1748 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
+/*
+ * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
+ *
+ * Configuration settings for the STM32MP13x CPU
+ */
+
+#ifndef STM32MP13_RCC_H
+#define STM32MP13_RCC_H
+/* RCC registers */
+#define RCC_SECCFGR                    0x0
+#define RCC_MP_SREQSETR                        0x100
+#define RCC_MP_SREQCLRR                        0x104
+#define RCC_MP_APRSTCR                 0x108
+#define RCC_MP_APRSTSR                 0x10c
+#define RCC_PWRLPDLYCR                 0x110
+#define RCC_MP_GRSTCSETR               0x114
+#define RCC_BR_RSTSCLRR                        0x118
+#define RCC_MP_RSTSSETR                        0x11c
+#define RCC_MP_RSTSCLRR                        0x120
+#define RCC_MP_IWDGFZSETR              0x124
+#define RCC_MP_IWDGFZCLRR              0x128
+#define RCC_MP_CIER                    0x200
+#define RCC_MP_CIFR                    0x204
+#define RCC_BDCR                       0x400
+#define RCC_RDLSICR                    0x404
+#define RCC_OCENSETR                   0x420
+#define RCC_OCENCLRR                   0x424
+#define RCC_OCRDYR                     0x428
+#define RCC_HSICFGR                    0x440
+#define RCC_CSICFGR                    0x444
+#define RCC_MCO1CFGR                   0x460
+#define RCC_MCO2CFGR                   0x464
+#define RCC_DBGCFGR                    0x468
+#define RCC_RCK12SELR                  0x480
+#define RCC_RCK3SELR                   0x484
+#define RCC_RCK4SELR                   0x488
+#define RCC_PLL1CR                     0x4a0
+#define RCC_PLL1CFGR1                  0x4a4
+#define RCC_PLL1CFGR2                  0x4a8
+#define RCC_PLL1FRACR                  0x4ac
+#define RCC_PLL1CSGR                   0x4b0
+#define RCC_PLL2CR                     0x4d0
+#define RCC_PLL2CFGR1                  0x4d4
+#define RCC_PLL2CFGR2                  0x4d8
+#define RCC_PLL2FRACR                  0x4dc
+#define RCC_PLL2CSGR                   0x4e0
+#define RCC_PLL3CR                     0x500
+#define RCC_PLL3CFGR1                  0x504
+#define RCC_PLL3CFGR2                  0x508
+#define RCC_PLL3FRACR                  0x50c
+#define RCC_PLL3CSGR                   0x510
+#define RCC_PLL4CR                     0x520
+#define RCC_PLL4CFGR1                  0x524
+#define RCC_PLL4CFGR2                  0x528
+#define RCC_PLL4FRACR                  0x52c
+#define RCC_PLL4CSGR                   0x530
+#define RCC_MPCKSELR                   0x540
+#define RCC_ASSCKSELR                  0x544
+#define RCC_MSSCKSELR                  0x548
+#define RCC_CPERCKSELR                 0x54c
+#define RCC_RTCDIVR                    0x560
+#define RCC_MPCKDIVR                   0x564
+#define RCC_AXIDIVR                    0x568
+#define RCC_MLAHBDIVR                  0x56c
+#define RCC_APB1DIVR                   0x570
+#define RCC_APB2DIVR                   0x574
+#define RCC_APB3DIVR                   0x578
+#define RCC_APB4DIVR                   0x57c
+#define RCC_APB5DIVR                   0x580
+#define RCC_APB6DIVR                   0x584
+#define RCC_TIMG1PRER                  0x5a0
+#define RCC_TIMG2PRER                  0x5a4
+#define RCC_TIMG3PRER                  0x5a8
+#define RCC_DDRITFCR                   0x5c0
+#define RCC_I2C12CKSELR                        0x600
+#define RCC_I2C345CKSELR               0x604
+#define RCC_SPI2S1CKSELR               0x608
+#define RCC_SPI2S23CKSELR              0x60c
+#define RCC_SPI45CKSELR                        0x610
+#define RCC_UART12CKSELR               0x614
+#define RCC_UART35CKSELR               0x618
+#define RCC_UART4CKSELR                        0x61c
+#define RCC_UART6CKSELR                        0x620
+#define RCC_UART78CKSELR               0x624
+#define RCC_LPTIM1CKSELR               0x628
+#define RCC_LPTIM23CKSELR              0x62c
+#define RCC_LPTIM45CKSELR              0x630
+#define RCC_SAI1CKSELR                 0x634
+#define RCC_SAI2CKSELR                 0x638
+#define RCC_FDCANCKSELR                        0x63c
+#define RCC_SPDIFCKSELR                        0x640
+#define RCC_ADC12CKSELR                        0x644
+#define RCC_SDMMC12CKSELR              0x648
+#define RCC_ETH12CKSELR                        0x64c
+#define RCC_USBCKSELR                  0x650
+#define RCC_QSPICKSELR                 0x654
+#define RCC_FMCCKSELR                  0x658
+#define RCC_RNG1CKSELR                 0x65c
+#define RCC_STGENCKSELR                        0x660
+#define RCC_DCMIPPCKSELR               0x664
+#define RCC_SAESCKSELR                 0x668
+#define RCC_APB1RSTSETR                        0x6a0
+#define RCC_APB1RSTCLRR                        0x6a4
+#define RCC_APB2RSTSETR                        0x6a8
+#define RCC_APB2RSTCLRR                        0x6ac
+#define RCC_APB3RSTSETR                        0x6b0
+#define RCC_APB3RSTCLRR                        0x6b4
+#define RCC_APB4RSTSETR                        0x6b8
+#define RCC_APB4RSTCLRR                        0x6bc
+#define RCC_APB5RSTSETR                        0x6c0
+#define RCC_APB5RSTCLRR                        0x6c4
+#define RCC_APB6RSTSETR                        0x6c8
+#define RCC_APB6RSTCLRR                        0x6cc
+#define RCC_AHB2RSTSETR                        0x6d0
+#define RCC_AHB2RSTCLRR                        0x6d4
+#define RCC_AHB4RSTSETR                        0x6e0
+#define RCC_AHB4RSTCLRR                        0x6e4
+#define RCC_AHB5RSTSETR                        0x6e8
+#define RCC_AHB5RSTCLRR                        0x6ec
+#define RCC_AHB6RSTSETR                        0x6f0
+#define RCC_AHB6RSTCLRR                        0x6f4
+#define RCC_MP_APB1ENSETR              0x700
+#define RCC_MP_APB1ENCLRR              0x704
+#define RCC_MP_APB2ENSETR              0x708
+#define RCC_MP_APB2ENCLRR              0x70c
+#define RCC_MP_APB3ENSETR              0x710
+#define RCC_MP_APB3ENCLRR              0x714
+#define RCC_MP_S_APB3ENSETR            0x718
+#define RCC_MP_S_APB3ENCLRR            0x71c
+#define RCC_MP_NS_APB3ENSETR           0x720
+#define RCC_MP_NS_APB3ENCLRR           0x724
+#define RCC_MP_APB4ENSETR              0x728
+#define RCC_MP_APB4ENCLRR              0x72c
+#define RCC_MP_S_APB4ENSETR            0x730
+#define RCC_MP_S_APB4ENCLRR            0x734
+#define RCC_MP_NS_APB4ENSETR           0x738
+#define RCC_MP_NS_APB4ENCLRR           0x73c
+#define RCC_MP_APB5ENSETR              0x740
+#define RCC_MP_APB5ENCLRR              0x744
+#define RCC_MP_APB6ENSETR              0x748
+#define RCC_MP_APB6ENCLRR              0x74c
+#define RCC_MP_AHB2ENSETR              0x750
+#define RCC_MP_AHB2ENCLRR              0x754
+#define RCC_MP_AHB4ENSETR              0x760
+#define RCC_MP_AHB4ENCLRR              0x764
+#define RCC_MP_S_AHB4ENSETR            0x768
+#define RCC_MP_S_AHB4ENCLRR            0x76c
+#define RCC_MP_NS_AHB4ENSETR           0x770
+#define RCC_MP_NS_AHB4ENCLRR           0x774
+#define RCC_MP_AHB5ENSETR              0x778
+#define RCC_MP_AHB5ENCLRR              0x77c
+#define RCC_MP_AHB6ENSETR              0x780
+#define RCC_MP_AHB6ENCLRR              0x784
+#define RCC_MP_S_AHB6ENSETR            0x788
+#define RCC_MP_S_AHB6ENCLRR            0x78c
+#define RCC_MP_NS_AHB6ENSETR           0x790
+#define RCC_MP_NS_AHB6ENCLRR           0x794
+#define RCC_MP_APB1LPENSETR            0x800
+#define RCC_MP_APB1LPENCLRR            0x804
+#define RCC_MP_APB2LPENSETR            0x808
+#define RCC_MP_APB2LPENCLRR            0x80c
+#define RCC_MP_APB3LPENSETR            0x810
+#define RCC_MP_APB3LPENCLRR            0x814
+#define RCC_MP_S_APB3LPENSETR          0x818
+#define RCC_MP_S_APB3LPENCLRR          0x81c
+#define RCC_MP_NS_APB3LPENSETR         0x820
+#define RCC_MP_NS_APB3LPENCLRR         0x824
+#define RCC_MP_APB4LPENSETR            0x828
+#define RCC_MP_APB4LPENCLRR            0x82c
+#define RCC_MP_S_APB4LPENSETR          0x830
+#define RCC_MP_S_APB4LPENCLRR          0x834
+#define RCC_MP_NS_APB4LPENSETR         0x838
+#define RCC_MP_NS_APB4LPENCLRR         0x83c
+#define RCC_MP_APB5LPENSETR            0x840
+#define RCC_MP_APB5LPENCLRR            0x844
+#define RCC_MP_APB6LPENSETR            0x848
+#define RCC_MP_APB6LPENCLRR            0x84c
+#define RCC_MP_AHB2LPENSETR            0x850
+#define RCC_MP_AHB2LPENCLRR            0x854
+#define RCC_MP_AHB4LPENSETR            0x858
+#define RCC_MP_AHB4LPENCLRR            0x85c
+#define RCC_MP_S_AHB4LPENSETR          0x868
+#define RCC_MP_S_AHB4LPENCLRR          0x86c
+#define RCC_MP_NS_AHB4LPENSETR         0x870
+#define RCC_MP_NS_AHB4LPENCLRR         0x874
+#define RCC_MP_AHB5LPENSETR            0x878
+#define RCC_MP_AHB5LPENCLRR            0x87c
+#define RCC_MP_AHB6LPENSETR            0x880
+#define RCC_MP_AHB6LPENCLRR            0x884
+#define RCC_MP_S_AHB6LPENSETR          0x888
+#define RCC_MP_S_AHB6LPENCLRR          0x88c
+#define RCC_MP_NS_AHB6LPENSETR         0x890
+#define RCC_MP_NS_AHB6LPENCLRR         0x894
+#define RCC_MP_S_AXIMLPENSETR          0x898
+#define RCC_MP_S_AXIMLPENCLRR          0x89c
+#define RCC_MP_NS_AXIMLPENSETR         0x8a0
+#define RCC_MP_NS_AXIMLPENCLRR         0x8a4
+#define RCC_MP_MLAHBLPENSETR           0x8a8
+#define RCC_MP_MLAHBLPENCLRR           0x8ac
+#define RCC_APB3SECSR                  0x8c0
+#define RCC_APB4SECSR                  0x8c4
+#define RCC_APB5SECSR                  0x8c8
+#define RCC_APB6SECSR                  0x8cc
+#define RCC_AHB2SECSR                  0x8d0
+#define RCC_AHB4SECSR                  0x8d4
+#define RCC_AHB5SECSR                  0x8d8
+#define RCC_AHB6SECSR                  0x8dc
+#define RCC_VERR                       0xff4
+#define RCC_IDR                                0xff8
+#define RCC_SIDR                       0xffc
+
+/* RCC_SECCFGR register fields */
+#define RCC_SECCFGR_HSISEC             0
+#define RCC_SECCFGR_CSISEC             1
+#define RCC_SECCFGR_HSESEC             2
+#define RCC_SECCFGR_LSISEC             3
+#define RCC_SECCFGR_LSESEC             4
+#define RCC_SECCFGR_PLL12SEC           8
+#define RCC_SECCFGR_PLL3SEC            9
+#define RCC_SECCFGR_PLL4SEC            10
+#define RCC_SECCFGR_MPUSEC             11
+#define RCC_SECCFGR_AXISEC             12
+#define RCC_SECCFGR_MLAHBSEC           13
+#define RCC_SECCFGR_APB3DIVSEC         16
+#define RCC_SECCFGR_APB4DIVSEC         17
+#define RCC_SECCFGR_APB5DIVSEC         18
+#define RCC_SECCFGR_APB6DIVSEC         19
+#define RCC_SECCFGR_TIMG3SEC           20
+#define RCC_SECCFGR_CPERSEC            21
+#define RCC_SECCFGR_MCO1SEC            22
+#define RCC_SECCFGR_MCO2SEC            23
+#define RCC_SECCFGR_STPSEC             24
+#define RCC_SECCFGR_RSTSEC             25
+#define RCC_SECCFGR_PWRSEC             31
+
+/* RCC_MP_SREQSETR register fields */
+#define RCC_MP_SREQSETR_STPREQ_P0      BIT(0)
+
+/* RCC_MP_SREQCLRR register fields */
+#define RCC_MP_SREQCLRR_STPREQ_P0      BIT(0)
+
+/* RCC_MP_APRSTCR register fields */
+#define RCC_MP_APRSTCR_RDCTLEN         BIT(0)
+#define RCC_MP_APRSTCR_RSTTO_MASK      GENMASK(14, 8)
+#define RCC_MP_APRSTCR_RSTTO_SHIFT     8
+
+/* RCC_MP_APRSTSR register fields */
+#define RCC_MP_APRSTSR_RSTTOV_MASK     GENMASK(14, 8)
+#define RCC_MP_APRSTSR_RSTTOV_SHIFT    8
+
+/* RCC_PWRLPDLYCR register fields */
+#define RCC_PWRLPDLYCR_PWRLP_DLY_MASK  GENMASK(21, 0)
+#define RCC_PWRLPDLYCR_PWRLP_DLY_SHIFT 0
+
+/* RCC_MP_GRSTCSETR register fields */
+#define RCC_MP_GRSTCSETR_MPSYSRST      BIT(0)
+#define RCC_MP_GRSTCSETR_MPUP0RST      BIT(4)
+
+/* RCC_BR_RSTSCLRR register fields */
+#define RCC_BR_RSTSCLRR_PORRSTF                BIT(0)
+#define RCC_BR_RSTSCLRR_BORRSTF                BIT(1)
+#define RCC_BR_RSTSCLRR_PADRSTF                BIT(2)
+#define RCC_BR_RSTSCLRR_HCSSRSTF       BIT(3)
+#define RCC_BR_RSTSCLRR_VCORERSTF      BIT(4)
+#define RCC_BR_RSTSCLRR_VCPURSTF       BIT(5)
+#define RCC_BR_RSTSCLRR_MPSYSRSTF      BIT(6)
+#define RCC_BR_RSTSCLRR_IWDG1RSTF      BIT(8)
+#define RCC_BR_RSTSCLRR_IWDG2RSTF      BIT(9)
+#define RCC_BR_RSTSCLRR_MPUP0RSTF      BIT(13)
+
+/* RCC_MP_RSTSSETR register fields */
+#define RCC_MP_RSTSSETR_PORRSTF                BIT(0)
+#define RCC_MP_RSTSSETR_BORRSTF                BIT(1)
+#define RCC_MP_RSTSSETR_PADRSTF                BIT(2)
+#define RCC_MP_RSTSSETR_HCSSRSTF       BIT(3)
+#define RCC_MP_RSTSSETR_VCORERSTF      BIT(4)
+#define RCC_MP_RSTSSETR_VCPURSTF       BIT(5)
+#define RCC_MP_RSTSSETR_MPSYSRSTF      BIT(6)
+#define RCC_MP_RSTSSETR_IWDG1RSTF      BIT(8)
+#define RCC_MP_RSTSSETR_IWDG2RSTF      BIT(9)
+#define RCC_MP_RSTSSETR_STP2RSTF       BIT(10)
+#define RCC_MP_RSTSSETR_STDBYRSTF      BIT(11)
+#define RCC_MP_RSTSSETR_CSTDBYRSTF     BIT(12)
+#define RCC_MP_RSTSSETR_MPUP0RSTF      BIT(13)
+#define RCC_MP_RSTSSETR_SPARE          BIT(15)
+
+/* RCC_MP_RSTSCLRR register fields */
+#define RCC_MP_RSTSCLRR_PORRSTF                BIT(0)
+#define RCC_MP_RSTSCLRR_BORRSTF                BIT(1)
+#define RCC_MP_RSTSCLRR_PADRSTF                BIT(2)
+#define RCC_MP_RSTSCLRR_HCSSRSTF       BIT(3)
+#define RCC_MP_RSTSCLRR_VCORERSTF      BIT(4)
+#define RCC_MP_RSTSCLRR_VCPURSTF       BIT(5)
+#define RCC_MP_RSTSCLRR_MPSYSRSTF      BIT(6)
+#define RCC_MP_RSTSCLRR_IWDG1RSTF      BIT(8)
+#define RCC_MP_RSTSCLRR_IWDG2RSTF      BIT(9)
+#define RCC_MP_RSTSCLRR_STP2RSTF       BIT(10)
+#define RCC_MP_RSTSCLRR_STDBYRSTF      BIT(11)
+#define RCC_MP_RSTSCLRR_CSTDBYRSTF     BIT(12)
+#define RCC_MP_RSTSCLRR_MPUP0RSTF      BIT(13)
+#define RCC_MP_RSTSCLRR_SPARE          BIT(15)
+
+/* RCC_MP_IWDGFZSETR register fields */
+#define RCC_MP_IWDGFZSETR_FZ_IWDG1     BIT(0)
+#define RCC_MP_IWDGFZSETR_FZ_IWDG2     BIT(1)
+
+/* RCC_MP_IWDGFZCLRR register fields */
+#define RCC_MP_IWDGFZCLRR_FZ_IWDG1     BIT(0)
+#define RCC_MP_IWDGFZCLRR_FZ_IWDG2     BIT(1)
+
+/* RCC_MP_CIER register fields */
+#define RCC_MP_CIER_LSIRDYIE           BIT(0)
+#define RCC_MP_CIER_LSERDYIE           BIT(1)
+#define RCC_MP_CIER_HSIRDYIE           BIT(2)
+#define RCC_MP_CIER_HSERDYIE           BIT(3)
+#define RCC_MP_CIER_CSIRDYIE           BIT(4)
+#define RCC_MP_CIER_PLL1DYIE           BIT(8)
+#define RCC_MP_CIER_PLL2DYIE           BIT(9)
+#define RCC_MP_CIER_PLL3DYIE           BIT(10)
+#define RCC_MP_CIER_PLL4DYIE           BIT(11)
+#define RCC_MP_CIER_LSECSSIE           BIT(16)
+#define RCC_MP_CIER_WKUPIE             BIT(20)
+
+/* RCC_MP_CIFR register fields */
+#define RCC_MP_CIFR_LSIRDYF            BIT(0)
+#define RCC_MP_CIFR_LSERDYF            BIT(1)
+#define RCC_MP_CIFR_HSIRDYF            BIT(2)
+#define RCC_MP_CIFR_HSERDYF            BIT(3)
+#define RCC_MP_CIFR_CSIRDYF            BIT(4)
+#define RCC_MP_CIFR_PLL1DYF            BIT(8)
+#define RCC_MP_CIFR_PLL2DYF            BIT(9)
+#define RCC_MP_CIFR_PLL3DYF            BIT(10)
+#define RCC_MP_CIFR_PLL4DYF            BIT(11)
+#define RCC_MP_CIFR_LSECSSF            BIT(16)
+#define RCC_MP_CIFR_WKUPF              BIT(20)
+
+/* RCC_BDCR register fields */
+#define RCC_BDCR_LSEON                 BIT(0)
+#define RCC_BDCR_LSEBYP                        BIT(1)
+#define RCC_BDCR_LSERDY                        BIT(2)
+#define RCC_BDCR_DIGBYP                        BIT(3)
+#define RCC_BDCR_LSEDRV_MASK           GENMASK(5, 4)
+#define RCC_BDCR_LSECSSON              BIT(8)
+#define RCC_BDCR_LSECSSD               BIT(9)
+#define RCC_BDCR_RTCSRC_MASK           GENMASK(17, 16)
+#define RCC_BDCR_RTCCKEN               BIT(20)
+#define RCC_BDCR_VSWRST                        BIT(31)
+#define RCC_BDCR_LSEDRV_SHIFT          4
+#define RCC_BDCR_RTCSRC_SHIFT          16
+
+/* RCC_RDLSICR register fields */
+#define RCC_RDLSICR_LSION              BIT(0)
+#define RCC_RDLSICR_LSIRDY             BIT(1)
+#define RCC_RDLSICR_MRD_MASK           GENMASK(20, 16)
+#define RCC_RDLSICR_EADLY_MASK         GENMASK(26, 24)
+#define RCC_RDLSICR_SPARE_MASK         GENMASK(31, 27)
+#define RCC_RDLSICR_MRD_SHIFT          16
+#define RCC_RDLSICR_EADLY_SHIFT                24
+#define RCC_RDLSICR_SPARE_SHIFT                27
+
+/* RCC_OCENSETR register fields */
+#define RCC_OCENSETR_HSION             BIT(0)
+#define RCC_OCENSETR_HSIKERON          BIT(1)
+#define RCC_OCENSETR_CSION             BIT(4)
+#define RCC_OCENSETR_CSIKERON          BIT(5)
+#define RCC_OCENSETR_DIGBYP            BIT(7)
+#define RCC_OCENSETR_HSEON             BIT(8)
+#define RCC_OCENSETR_HSEKERON          BIT(9)
+#define RCC_OCENSETR_HSEBYP            BIT(10)
+#define RCC_OCENSETR_HSECSSON          BIT(11)
+
+/* RCC_OCENCLRR register fields */
+#define RCC_OCENCLRR_HSION             BIT(0)
+#define RCC_OCENCLRR_HSIKERON          BIT(1)
+#define RCC_OCENCLRR_CSION             BIT(4)
+#define RCC_OCENCLRR_CSIKERON          BIT(5)
+#define RCC_OCENCLRR_DIGBYP            BIT(7)
+#define RCC_OCENCLRR_HSEON             BIT(8)
+#define RCC_OCENCLRR_HSEKERON          BIT(9)
+#define RCC_OCENCLRR_HSEBYP            BIT(10)
+
+/* RCC_OCRDYR register fields */
+#define RCC_OCRDYR_HSIRDY              BIT(0)
+#define RCC_OCRDYR_HSIDIVRDY           BIT(2)
+#define RCC_OCRDYR_CSIRDY              BIT(4)
+#define RCC_OCRDYR_HSERDY              BIT(8)
+#define RCC_OCRDYR_MPUCKRDY            BIT(23)
+#define RCC_OCRDYR_AXICKRDY            BIT(24)
+
+/* RCC_HSICFGR register fields */
+#define RCC_HSICFGR_HSIDIV_MASK                GENMASK(1, 0)
+#define RCC_HSICFGR_HSITRIM_MASK       GENMASK(14, 8)
+#define RCC_HSICFGR_HSICAL_MASK                GENMASK(27, 16)
+#define RCC_HSICFGR_HSIDIV_SHIFT       0
+#define RCC_HSICFGR_HSITRIM_SHIFT      8
+#define RCC_HSICFGR_HSICAL_SHIFT       16
+
+/* RCC_CSICFGR register fields */
+#define RCC_CSICFGR_CSITRIM_MASK       GENMASK(12, 8)
+#define RCC_CSICFGR_CSICAL_MASK                GENMASK(23, 16)
+#define RCC_CSICFGR_CSITRIM_SHIFT      8
+#define RCC_CSICFGR_CSICAL_SHIFT       16
+
+/* RCC_MCO1CFGR register fields */
+#define RCC_MCO1CFGR_MCO1SEL_MASK      GENMASK(2, 0)
+#define RCC_MCO1CFGR_MCO1DIV_MASK      GENMASK(7, 4)
+#define RCC_MCO1CFGR_MCO1ON            BIT(12)
+#define RCC_MCO1CFGR_MCO1SEL_SHIFT     0
+#define RCC_MCO1CFGR_MCO1DIV_SHIFT     4
+
+/* RCC_MCO2CFGR register fields */
+#define RCC_MCO2CFGR_MCO2SEL_MASK      GENMASK(2, 0)
+#define RCC_MCO2CFGR_MCO2DIV_MASK      GENMASK(7, 4)
+#define RCC_MCO2CFGR_MCO2ON            BIT(12)
+#define RCC_MCO2CFGR_MCO2SEL_SHIFT     0
+#define RCC_MCO2CFGR_MCO2DIV_SHIFT     4
+
+/* RCC_DBGCFGR register fields */
+#define RCC_DBGCFGR_TRACEDIV_MASK      GENMASK(2, 0)
+#define RCC_DBGCFGR_DBGCKEN            BIT(8)
+#define RCC_DBGCFGR_TRACECKEN          BIT(9)
+#define RCC_DBGCFGR_DBGRST             BIT(12)
+#define RCC_DBGCFGR_TRACEDIV_SHIFT     0
+
+/* RCC_RCK12SELR register fields */
+#define RCC_RCK12SELR_PLL12SRC_MASK    GENMASK(1, 0)
+#define RCC_RCK12SELR_PLL12SRCRDY      BIT(31)
+#define RCC_RCK12SELR_PLL12SRC_SHIFT   0
+
+/* RCC_RCK3SELR register fields */
+#define RCC_RCK3SELR_PLL3SRC_MASK      GENMASK(1, 0)
+#define RCC_RCK3SELR_PLL3SRCRDY                BIT(31)
+#define RCC_RCK3SELR_PLL3SRC_SHIFT     0
+
+/* RCC_RCK4SELR register fields */
+#define RCC_RCK4SELR_PLL4SRC_MASK      GENMASK(1, 0)
+#define RCC_RCK4SELR_PLL4SRCRDY                BIT(31)
+#define RCC_RCK4SELR_PLL4SRC_SHIFT     0
+
+/* RCC_PLL1CR register fields */
+#define RCC_PLL1CR_PLLON               BIT(0)
+#define RCC_PLL1CR_PLL1RDY             BIT(1)
+#define RCC_PLL1CR_SSCG_CTRL           BIT(2)
+#define RCC_PLL1CR_DIVPEN              BIT(4)
+#define RCC_PLL1CR_DIVQEN              BIT(5)
+#define RCC_PLL1CR_DIVREN              BIT(6)
+
+/* RCC_PLL1CFGR1 register fields */
+#define RCC_PLL1CFGR1_DIVN_MASK                GENMASK(8, 0)
+#define RCC_PLL1CFGR1_DIVM1_MASK       GENMASK(21, 16)
+#define RCC_PLL1CFGR1_DIVN_SHIFT       0
+#define RCC_PLL1CFGR1_DIVM1_SHIFT      16
+
+/* RCC_PLL1CFGR2 register fields */
+#define RCC_PLL1CFGR2_DIVP_MASK                GENMASK(6, 0)
+#define RCC_PLL1CFGR2_DIVQ_MASK                GENMASK(14, 8)
+#define RCC_PLL1CFGR2_DIVR_MASK                GENMASK(22, 16)
+#define RCC_PLL1CFGR2_DIVP_SHIFT       0
+#define RCC_PLL1CFGR2_DIVQ_SHIFT       8
+#define RCC_PLL1CFGR2_DIVR_SHIFT       16
+
+/* RCC_PLL1FRACR register fields */
+#define RCC_PLL1FRACR_FRACV_MASK       GENMASK(15, 3)
+#define RCC_PLL1FRACR_FRACLE           BIT(16)
+#define RCC_PLL1FRACR_FRACV_SHIFT      3
+
+/* RCC_PLL1CSGR register fields */
+#define RCC_PLL1CSGR_MOD_PER_MASK      GENMASK(12, 0)
+#define RCC_PLL1CSGR_TPDFN_DIS         BIT(13)
+#define RCC_PLL1CSGR_RPDFN_DIS         BIT(14)
+#define RCC_PLL1CSGR_SSCG_MODE         BIT(15)
+#define RCC_PLL1CSGR_INC_STEP_MASK     GENMASK(30, 16)
+#define RCC_PLL1CSGR_MOD_PER_SHIFT     0
+#define RCC_PLL1CSGR_INC_STEP_SHIFT    16
+
+/* RCC_PLL2CR register fields */
+#define RCC_PLL2CR_PLLON               BIT(0)
+#define RCC_PLL2CR_PLL2RDY             BIT(1)
+#define RCC_PLL2CR_SSCG_CTRL           BIT(2)
+#define RCC_PLL2CR_DIVPEN              BIT(4)
+#define RCC_PLL2CR_DIVQEN              BIT(5)
+#define RCC_PLL2CR_DIVREN              BIT(6)
+
+/* RCC_PLL2CFGR1 register fields */
+#define RCC_PLL2CFGR1_DIVN_MASK                GENMASK(8, 0)
+#define RCC_PLL2CFGR1_DIVM2_MASK       GENMASK(21, 16)
+#define RCC_PLL2CFGR1_DIVN_SHIFT       0
+#define RCC_PLL2CFGR1_DIVM2_SHIFT      16
+
+/* RCC_PLL2CFGR2 register fields */
+#define RCC_PLL2CFGR2_DIVP_MASK                GENMASK(6, 0)
+#define RCC_PLL2CFGR2_DIVQ_MASK                GENMASK(14, 8)
+#define RCC_PLL2CFGR2_DIVR_MASK                GENMASK(22, 16)
+#define RCC_PLL2CFGR2_DIVP_SHIFT       0
+#define RCC_PLL2CFGR2_DIVQ_SHIFT       8
+#define RCC_PLL2CFGR2_DIVR_SHIFT       16
+
+/* RCC_PLL2FRACR register fields */
+#define RCC_PLL2FRACR_FRACV_MASK       GENMASK(15, 3)
+#define RCC_PLL2FRACR_FRACLE           BIT(16)
+#define RCC_PLL2FRACR_FRACV_SHIFT      3
+
+/* RCC_PLL2CSGR register fields */
+#define RCC_PLL2CSGR_MOD_PER_MASK      GENMASK(12, 0)
+#define RCC_PLL2CSGR_TPDFN_DIS         BIT(13)
+#define RCC_PLL2CSGR_RPDFN_DIS         BIT(14)
+#define RCC_PLL2CSGR_SSCG_MODE         BIT(15)
+#define RCC_PLL2CSGR_INC_STEP_MASK     GENMASK(30, 16)
+#define RCC_PLL2CSGR_MOD_PER_SHIFT     0
+#define RCC_PLL2CSGR_INC_STEP_SHIFT    16
+
+/* RCC_PLL3CR register fields */
+#define RCC_PLL3CR_PLLON               BIT(0)
+#define RCC_PLL3CR_PLL3RDY             BIT(1)
+#define RCC_PLL3CR_SSCG_CTRL           BIT(2)
+#define RCC_PLL3CR_DIVPEN              BIT(4)
+#define RCC_PLL3CR_DIVQEN              BIT(5)
+#define RCC_PLL3CR_DIVREN              BIT(6)
+
+/* RCC_PLL3CFGR1 register fields */
+#define RCC_PLL3CFGR1_DIVN_MASK                GENMASK(8, 0)
+#define RCC_PLL3CFGR1_DIVM3_MASK       GENMASK(21, 16)
+#define RCC_PLL3CFGR1_IFRGE_MASK       GENMASK(25, 24)
+#define RCC_PLL3CFGR1_DIVN_SHIFT       0
+#define RCC_PLL3CFGR1_DIVM3_SHIFT      16
+#define RCC_PLL3CFGR1_IFRGE_SHIFT      24
+
+/* RCC_PLL3CFGR2 register fields */
+#define RCC_PLL3CFGR2_DIVP_MASK                GENMASK(6, 0)
+#define RCC_PLL3CFGR2_DIVQ_MASK                GENMASK(14, 8)
+#define RCC_PLL3CFGR2_DIVR_MASK                GENMASK(22, 16)
+#define RCC_PLL3CFGR2_DIVP_SHIFT       0
+#define RCC_PLL3CFGR2_DIVQ_SHIFT       8
+#define RCC_PLL3CFGR2_DIVR_SHIFT       16
+
+/* RCC_PLL3FRACR register fields */
+#define RCC_PLL3FRACR_FRACV_MASK       GENMASK(15, 3)
+#define RCC_PLL3FRACR_FRACLE           BIT(16)
+#define RCC_PLL3FRACR_FRACV_SHIFT      3
+
+/* RCC_PLL3CSGR register fields */
+#define RCC_PLL3CSGR_MOD_PER_MASK      GENMASK(12, 0)
+#define RCC_PLL3CSGR_TPDFN_DIS         BIT(13)
+#define RCC_PLL3CSGR_RPDFN_DIS         BIT(14)
+#define RCC_PLL3CSGR_SSCG_MODE         BIT(15)
+#define RCC_PLL3CSGR_INC_STEP_MASK     GENMASK(30, 16)
+#define RCC_PLL3CSGR_MOD_PER_SHIFT     0
+#define RCC_PLL3CSGR_INC_STEP_SHIFT    16
+
+/* RCC_PLL4CR register fields */
+#define RCC_PLL4CR_PLLON               BIT(0)
+#define RCC_PLL4CR_PLL4RDY             BIT(1)
+#define RCC_PLL4CR_SSCG_CTRL           BIT(2)
+#define RCC_PLL4CR_DIVPEN              BIT(4)
+#define RCC_PLL4CR_DIVQEN              BIT(5)
+#define RCC_PLL4CR_DIVREN              BIT(6)
+
+/* RCC_PLL4CFGR1 register fields */
+#define RCC_PLL4CFGR1_DIVN_MASK                GENMASK(8, 0)
+#define RCC_PLL4CFGR1_DIVM4_MASK       GENMASK(21, 16)
+#define RCC_PLL4CFGR1_IFRGE_MASK       GENMASK(25, 24)
+#define RCC_PLL4CFGR1_DIVN_SHIFT       0
+#define RCC_PLL4CFGR1_DIVM4_SHIFT      16
+#define RCC_PLL4CFGR1_IFRGE_SHIFT      24
+
+/* RCC_PLL4CFGR2 register fields */
+#define RCC_PLL4CFGR2_DIVP_MASK                GENMASK(6, 0)
+#define RCC_PLL4CFGR2_DIVQ_MASK                GENMASK(14, 8)
+#define RCC_PLL4CFGR2_DIVR_MASK                GENMASK(22, 16)
+#define RCC_PLL4CFGR2_DIVP_SHIFT       0
+#define RCC_PLL4CFGR2_DIVQ_SHIFT       8
+#define RCC_PLL4CFGR2_DIVR_SHIFT       16
+
+/* RCC_PLL4FRACR register fields */
+#define RCC_PLL4FRACR_FRACV_MASK       GENMASK(15, 3)
+#define RCC_PLL4FRACR_FRACLE           BIT(16)
+#define RCC_PLL4FRACR_FRACV_SHIFT      3
+
+/* RCC_PLL4CSGR register fields */
+#define RCC_PLL4CSGR_MOD_PER_MASK      GENMASK(12, 0)
+#define RCC_PLL4CSGR_TPDFN_DIS         BIT(13)
+#define RCC_PLL4CSGR_RPDFN_DIS         BIT(14)
+#define RCC_PLL4CSGR_SSCG_MODE         BIT(15)
+#define RCC_PLL4CSGR_INC_STEP_MASK     GENMASK(30, 16)
+#define RCC_PLL4CSGR_MOD_PER_SHIFT     0
+#define RCC_PLL4CSGR_INC_STEP_SHIFT    16
+
+/* RCC_MPCKSELR register fields */
+#define RCC_MPCKSELR_MPUSRC_MASK       GENMASK(1, 0)
+#define RCC_MPCKSELR_MPUSRCRDY         BIT(31)
+#define RCC_MPCKSELR_MPUSRC_SHIFT      0
+
+/* RCC_ASSCKSELR register fields */
+#define RCC_ASSCKSELR_AXISSRC_MASK     GENMASK(2, 0)
+#define RCC_ASSCKSELR_AXISSRCRDY       BIT(31)
+#define RCC_ASSCKSELR_AXISSRC_SHIFT    0
+
+/* RCC_MSSCKSELR register fields */
+#define RCC_MSSCKSELR_MLAHBSSRC_MASK   GENMASK(1, 0)
+#define RCC_MSSCKSELR_MLAHBSSRCRDY     BIT(31)
+#define RCC_MSSCKSELR_MLAHBSSRC_SHIFT  0
+
+/* RCC_CPERCKSELR register fields */
+#define RCC_CPERCKSELR_CKPERSRC_MASK   GENMASK(1, 0)
+#define RCC_CPERCKSELR_CKPERSRC_SHIFT  0
+
+/* RCC_RTCDIVR register fields */
+#define RCC_RTCDIVR_RTCDIV_MASK                GENMASK(5, 0)
+#define RCC_RTCDIVR_RTCDIV_SHIFT       0
+
+/* RCC_MPCKDIVR register fields */
+#define RCC_MPCKDIVR_MPUDIV_MASK       GENMASK(3, 0)
+#define RCC_MPCKDIVR_MPUDIVRDY         BIT(31)
+#define RCC_MPCKDIVR_MPUDIV_SHIFT      0
+
+/* RCC_AXIDIVR register fields */
+#define RCC_AXIDIVR_AXIDIV_MASK                GENMASK(2, 0)
+#define RCC_AXIDIVR_AXIDIVRDY          BIT(31)
+#define RCC_AXIDIVR_AXIDIV_SHIFT       0
+
+/* RCC_MLAHBDIVR register fields */
+#define RCC_MLAHBDIVR_MLAHBDIV_MASK    GENMASK(3, 0)
+#define RCC_MLAHBDIVR_MLAHBDIVRDY      BIT(31)
+#define RCC_MLAHBDIVR_MLAHBDIV_SHIFT   0
+
+/* RCC_APB1DIVR register fields */
+#define RCC_APB1DIVR_APB1DIV_MASK      GENMASK(2, 0)
+#define RCC_APB1DIVR_APB1DIVRDY                BIT(31)
+#define RCC_APB1DIVR_APB1DIV_SHIFT     0
+
+/* RCC_APB2DIVR register fields */
+#define RCC_APB2DIVR_APB2DIV_MASK      GENMASK(2, 0)
+#define RCC_APB2DIVR_APB2DIVRDY                BIT(31)
+#define RCC_APB2DIVR_APB2DIV_SHIFT     0
+
+/* RCC_APB3DIVR register fields */
+#define RCC_APB3DIVR_APB3DIV_MASK      GENMASK(2, 0)
+#define RCC_APB3DIVR_APB3DIVRDY                BIT(31)
+#define RCC_APB3DIVR_APB3DIV_SHIFT     0
+
+/* RCC_APB4DIVR register fields */
+#define RCC_APB4DIVR_APB4DIV_MASK      GENMASK(2, 0)
+#define RCC_APB4DIVR_APB4DIVRDY                BIT(31)
+#define RCC_APB4DIVR_APB4DIV_SHIFT     0
+
+/* RCC_APB5DIVR register fields */
+#define RCC_APB5DIVR_APB5DIV_MASK      GENMASK(2, 0)
+#define RCC_APB5DIVR_APB5DIVRDY                BIT(31)
+#define RCC_APB5DIVR_APB5DIV_SHIFT     0
+
+/* RCC_APB6DIVR register fields */
+#define RCC_APB6DIVR_APB6DIV_MASK      GENMASK(2, 0)
+#define RCC_APB6DIVR_APB6DIVRDY                BIT(31)
+#define RCC_APB6DIVR_APB6DIV_SHIFT     0
+
+/* RCC_TIMG1PRER register fields */
+#define RCC_TIMG1PRER_TIMG1PRE         BIT(0)
+#define RCC_TIMG1PRER_TIMG1PRERDY      BIT(31)
+
+/* RCC_TIMG2PRER register fields */
+#define RCC_TIMG2PRER_TIMG2PRE         BIT(0)
+#define RCC_TIMG2PRER_TIMG2PRERDY      BIT(31)
+
+/* RCC_TIMG3PRER register fields */
+#define RCC_TIMG3PRER_TIMG3PRE         BIT(0)
+#define RCC_TIMG3PRER_TIMG3PRERDY      BIT(31)
+
+/* RCC_DDRITFCR register fields */
+#define RCC_DDRITFCR_DDRC1EN           BIT(0)
+#define RCC_DDRITFCR_DDRC1LPEN         BIT(1)
+#define RCC_DDRITFCR_DDRPHYCEN         BIT(4)
+#define RCC_DDRITFCR_DDRPHYCLPEN       BIT(5)
+#define RCC_DDRITFCR_DDRCAPBEN         BIT(6)
+#define RCC_DDRITFCR_DDRCAPBLPEN       BIT(7)
+#define RCC_DDRITFCR_AXIDCGEN          BIT(8)
+#define RCC_DDRITFCR_DDRPHYCAPBEN      BIT(9)
+#define RCC_DDRITFCR_DDRPHYCAPBLPEN    BIT(10)
+#define RCC_DDRITFCR_KERDCG_DLY_MASK   GENMASK(13, 11)
+#define RCC_DDRITFCR_DDRCAPBRST                BIT(14)
+#define RCC_DDRITFCR_DDRCAXIRST                BIT(15)
+#define RCC_DDRITFCR_DDRCORERST                BIT(16)
+#define RCC_DDRITFCR_DPHYAPBRST                BIT(17)
+#define RCC_DDRITFCR_DPHYRST           BIT(18)
+#define RCC_DDRITFCR_DPHYCTLRST                BIT(19)
+#define RCC_DDRITFCR_DDRCKMOD_MASK     GENMASK(22, 20)
+#define RCC_DDRITFCR_GSKPMOD           BIT(23)
+#define RCC_DDRITFCR_GSKPCTRL          BIT(24)
+#define RCC_DDRITFCR_DFILP_WIDTH_MASK  GENMASK(27, 25)
+#define RCC_DDRITFCR_GSKP_DUR_MASK     GENMASK(31, 28)
+#define RCC_DDRITFCR_KERDCG_DLY_SHIFT  11
+#define RCC_DDRITFCR_DDRCKMOD_SHIFT    20
+#define RCC_DDRITFCR_DFILP_WIDTH_SHIFT 25
+#define RCC_DDRITFCR_GSKP_DUR_SHIFT    28
+
+/* RCC_I2C12CKSELR register fields */
+#define RCC_I2C12CKSELR_I2C12SRC_MASK  GENMASK(2, 0)
+#define RCC_I2C12CKSELR_I2C12SRC_SHIFT 0
+
+/* RCC_I2C345CKSELR register fields */
+#define RCC_I2C345CKSELR_I2C3SRC_MASK  GENMASK(2, 0)
+#define RCC_I2C345CKSELR_I2C4SRC_MASK  GENMASK(5, 3)
+#define RCC_I2C345CKSELR_I2C5SRC_MASK  GENMASK(8, 6)
+#define RCC_I2C345CKSELR_I2C3SRC_SHIFT 0
+#define RCC_I2C345CKSELR_I2C4SRC_SHIFT 3
+#define RCC_I2C345CKSELR_I2C5SRC_SHIFT 6
+
+/* RCC_SPI2S1CKSELR register fields */
+#define RCC_SPI2S1CKSELR_SPI1SRC_MASK  GENMASK(2, 0)
+#define RCC_SPI2S1CKSELR_SPI1SRC_SHIFT 0
+
+/* RCC_SPI2S23CKSELR register fields */
+#define RCC_SPI2S23CKSELR_SPI23SRC_MASK        GENMASK(2, 0)
+#define RCC_SPI2S23CKSELR_SPI23SRC_SHIFT       0
+
+/* RCC_SPI45CKSELR register fields */
+#define RCC_SPI45CKSELR_SPI4SRC_MASK   GENMASK(2, 0)
+#define RCC_SPI45CKSELR_SPI5SRC_MASK   GENMASK(5, 3)
+#define RCC_SPI45CKSELR_SPI4SRC_SHIFT  0
+#define RCC_SPI45CKSELR_SPI5SRC_SHIFT  3
+
+/* RCC_UART12CKSELR register fields */
+#define RCC_UART12CKSELR_UART1SRC_MASK GENMASK(2, 0)
+#define RCC_UART12CKSELR_UART2SRC_MASK GENMASK(5, 3)
+#define RCC_UART12CKSELR_UART1SRC_SHIFT        0
+#define RCC_UART12CKSELR_UART2SRC_SHIFT        3
+
+/* RCC_UART35CKSELR register fields */
+#define RCC_UART35CKSELR_UART35SRC_MASK        GENMASK(2, 0)
+#define RCC_UART35CKSELR_UART35SRC_SHIFT       0
+
+/* RCC_UART4CKSELR register fields */
+#define RCC_UART4CKSELR_UART4SRC_MASK  GENMASK(2, 0)
+#define RCC_UART4CKSELR_UART4SRC_SHIFT 0
+
+/* RCC_UART6CKSELR register fields */
+#define RCC_UART6CKSELR_UART6SRC_MASK  GENMASK(2, 0)
+#define RCC_UART6CKSELR_UART6SRC_SHIFT 0
+
+/* RCC_UART78CKSELR register fields */
+#define RCC_UART78CKSELR_UART78SRC_MASK        GENMASK(2, 0)
+#define RCC_UART78CKSELR_UART78SRC_SHIFT       0
+
+/* RCC_LPTIM1CKSELR register fields */
+#define RCC_LPTIM1CKSELR_LPTIM1SRC_MASK        GENMASK(2, 0)
+#define RCC_LPTIM1CKSELR_LPTIM1SRC_SHIFT       0
+
+/* RCC_LPTIM23CKSELR register fields */
+#define RCC_LPTIM23CKSELR_LPTIM2SRC_MASK       GENMASK(2, 0)
+#define RCC_LPTIM23CKSELR_LPTIM3SRC_MASK       GENMASK(5, 3)
+#define RCC_LPTIM23CKSELR_LPTIM2SRC_SHIFT      0
+#define RCC_LPTIM23CKSELR_LPTIM3SRC_SHIFT      3
+
+/* RCC_LPTIM45CKSELR register fields */
+#define RCC_LPTIM45CKSELR_LPTIM45SRC_MASK      GENMASK(2, 0)
+#define RCC_LPTIM45CKSELR_LPTIM45SRC_SHIFT     0
+
+/* RCC_SAI1CKSELR register fields */
+#define RCC_SAI1CKSELR_SAI1SRC_MASK    GENMASK(2, 0)
+#define RCC_SAI1CKSELR_SAI1SRC_SHIFT   0
+
+/* RCC_SAI2CKSELR register fields */
+#define RCC_SAI2CKSELR_SAI2SRC_MASK    GENMASK(2, 0)
+#define RCC_SAI2CKSELR_SAI2SRC_SHIFT   0
+
+/* RCC_FDCANCKSELR register fields */
+#define RCC_FDCANCKSELR_FDCANSRC_MASK  GENMASK(1, 0)
+#define RCC_FDCANCKSELR_FDCANSRC_SHIFT 0
+
+/* RCC_SPDIFCKSELR register fields */
+#define RCC_SPDIFCKSELR_SPDIFSRC_MASK  GENMASK(1, 0)
+#define RCC_SPDIFCKSELR_SPDIFSRC_SHIFT 0
+
+/* RCC_ADC12CKSELR register fields */
+#define RCC_ADC12CKSELR_ADC1SRC_MASK   GENMASK(1, 0)
+#define RCC_ADC12CKSELR_ADC2SRC_MASK   GENMASK(3, 2)
+#define RCC_ADC12CKSELR_ADC1SRC_SHIFT  0
+#define RCC_ADC12CKSELR_ADC2SRC_SHIFT  2
+
+/* RCC_SDMMC12CKSELR register fields */
+#define RCC_SDMMC12CKSELR_SDMMC1SRC_MASK       GENMASK(2, 0)
+#define RCC_SDMMC12CKSELR_SDMMC2SRC_MASK       GENMASK(5, 3)
+#define RCC_SDMMC12CKSELR_SDMMC1SRC_SHIFT      0
+#define RCC_SDMMC12CKSELR_SDMMC2SRC_SHIFT      3
+
+/* RCC_ETH12CKSELR register fields */
+#define RCC_ETH12CKSELR_ETH1SRC_MASK   GENMASK(1, 0)
+#define RCC_ETH12CKSELR_ETH1PTPDIV_MASK        GENMASK(7, 4)
+#define RCC_ETH12CKSELR_ETH2SRC_MASK   GENMASK(9, 8)
+#define RCC_ETH12CKSELR_ETH2PTPDIV_MASK        GENMASK(15, 12)
+#define RCC_ETH12CKSELR_ETH1SRC_SHIFT  0
+#define RCC_ETH12CKSELR_ETH1PTPDIV_SHIFT       4
+#define RCC_ETH12CKSELR_ETH2SRC_SHIFT  8
+#define RCC_ETH12CKSELR_ETH2PTPDIV_SHIFT       12
+
+/* RCC_USBCKSELR register fields */
+#define RCC_USBCKSELR_USBPHYSRC_MASK   GENMASK(1, 0)
+#define RCC_USBCKSELR_USBOSRC          BIT(4)
+#define RCC_USBCKSELR_USBPHYSRC_SHIFT  0
+
+/* RCC_QSPICKSELR register fields */
+#define RCC_QSPICKSELR_QSPISRC_MASK    GENMASK(1, 0)
+#define RCC_QSPICKSELR_QSPISRC_SHIFT   0
+
+/* RCC_FMCCKSELR register fields */
+#define RCC_FMCCKSELR_FMCSRC_MASK      GENMASK(1, 0)
+#define RCC_FMCCKSELR_FMCSRC_SHIFT     0
+
+/* RCC_RNG1CKSELR register fields */
+#define RCC_RNG1CKSELR_RNG1SRC_MASK    GENMASK(1, 0)
+#define RCC_RNG1CKSELR_RNG1SRC_SHIFT   0
+
+/* RCC_STGENCKSELR register fields */
+#define RCC_STGENCKSELR_STGENSRC_MASK  GENMASK(1, 0)
+#define RCC_STGENCKSELR_STGENSRC_SHIFT 0
+
+/* RCC_DCMIPPCKSELR register fields */
+#define RCC_DCMIPPCKSELR_DCMIPPSRC_MASK        GENMASK(1, 0)
+#define RCC_DCMIPPCKSELR_DCMIPPSRC_SHIFT       0
+
+/* RCC_SAESCKSELR register fields */
+#define RCC_SAESCKSELR_SAESSRC_MASK    GENMASK(1, 0)
+#define RCC_SAESCKSELR_SAESSRC_SHIFT   0
+
+/* RCC_APB1RSTSETR register fields */
+#define RCC_APB1RSTSETR_TIM2RST                BIT(0)
+#define RCC_APB1RSTSETR_TIM3RST                BIT(1)
+#define RCC_APB1RSTSETR_TIM4RST                BIT(2)
+#define RCC_APB1RSTSETR_TIM5RST                BIT(3)
+#define RCC_APB1RSTSETR_TIM6RST                BIT(4)
+#define RCC_APB1RSTSETR_TIM7RST                BIT(5)
+#define RCC_APB1RSTSETR_LPTIM1RST      BIT(9)
+#define RCC_APB1RSTSETR_SPI2RST                BIT(11)
+#define RCC_APB1RSTSETR_SPI3RST                BIT(12)
+#define RCC_APB1RSTSETR_USART3RST      BIT(15)
+#define RCC_APB1RSTSETR_UART4RST       BIT(16)
+#define RCC_APB1RSTSETR_UART5RST       BIT(17)
+#define RCC_APB1RSTSETR_UART7RST       BIT(18)
+#define RCC_APB1RSTSETR_UART8RST       BIT(19)
+#define RCC_APB1RSTSETR_I2C1RST                BIT(21)
+#define RCC_APB1RSTSETR_I2C2RST                BIT(22)
+#define RCC_APB1RSTSETR_SPDIFRST       BIT(26)
+
+/* RCC_APB1RSTCLRR register fields */
+#define RCC_APB1RSTCLRR_TIM2RST                BIT(0)
+#define RCC_APB1RSTCLRR_TIM3RST                BIT(1)
+#define RCC_APB1RSTCLRR_TIM4RST                BIT(2)
+#define RCC_APB1RSTCLRR_TIM5RST                BIT(3)
+#define RCC_APB1RSTCLRR_TIM6RST                BIT(4)
+#define RCC_APB1RSTCLRR_TIM7RST                BIT(5)
+#define RCC_APB1RSTCLRR_LPTIM1RST      BIT(9)
+#define RCC_APB1RSTCLRR_SPI2RST                BIT(11)
+#define RCC_APB1RSTCLRR_SPI3RST                BIT(12)
+#define RCC_APB1RSTCLRR_USART3RST      BIT(15)
+#define RCC_APB1RSTCLRR_UART4RST       BIT(16)
+#define RCC_APB1RSTCLRR_UART5RST       BIT(17)
+#define RCC_APB1RSTCLRR_UART7RST       BIT(18)
+#define RCC_APB1RSTCLRR_UART8RST       BIT(19)
+#define RCC_APB1RSTCLRR_I2C1RST                BIT(21)
+#define RCC_APB1RSTCLRR_I2C2RST                BIT(22)
+#define RCC_APB1RSTCLRR_SPDIFRST       BIT(26)
+
+/* RCC_APB2RSTSETR register fields */
+#define RCC_APB2RSTSETR_TIM1RST                BIT(0)
+#define RCC_APB2RSTSETR_TIM8RST                BIT(1)
+#define RCC_APB2RSTSETR_SPI1RST                BIT(8)
+#define RCC_APB2RSTSETR_USART6RST      BIT(13)
+#define RCC_APB2RSTSETR_SAI1RST                BIT(16)
+#define RCC_APB2RSTSETR_SAI2RST                BIT(17)
+#define RCC_APB2RSTSETR_DFSDMRST       BIT(20)
+#define RCC_APB2RSTSETR_FDCANRST       BIT(24)
+
+/* RCC_APB2RSTCLRR register fields */
+#define RCC_APB2RSTCLRR_TIM1RST                BIT(0)
+#define RCC_APB2RSTCLRR_TIM8RST                BIT(1)
+#define RCC_APB2RSTCLRR_SPI1RST                BIT(8)
+#define RCC_APB2RSTCLRR_USART6RST      BIT(13)
+#define RCC_APB2RSTCLRR_SAI1RST                BIT(16)
+#define RCC_APB2RSTCLRR_SAI2RST                BIT(17)
+#define RCC_APB2RSTCLRR_DFSDMRST       BIT(20)
+#define RCC_APB2RSTCLRR_FDCANRST       BIT(24)
+
+/* RCC_APB3RSTSETR register fields */
+#define RCC_APB3RSTSETR_LPTIM2RST      BIT(0)
+#define RCC_APB3RSTSETR_LPTIM3RST      BIT(1)
+#define RCC_APB3RSTSETR_LPTIM4RST      BIT(2)
+#define RCC_APB3RSTSETR_LPTIM5RST      BIT(3)
+#define RCC_APB3RSTSETR_SYSCFGRST      BIT(11)
+#define RCC_APB3RSTSETR_VREFRST                BIT(13)
+#define RCC_APB3RSTSETR_DTSRST         BIT(16)
+#define RCC_APB3RSTSETR_PMBCTRLRST     BIT(17)
+
+/* RCC_APB3RSTCLRR register fields */
+#define RCC_APB3RSTCLRR_LPTIM2RST      BIT(0)
+#define RCC_APB3RSTCLRR_LPTIM3RST      BIT(1)
+#define RCC_APB3RSTCLRR_LPTIM4RST      BIT(2)
+#define RCC_APB3RSTCLRR_LPTIM5RST      BIT(3)
+#define RCC_APB3RSTCLRR_SYSCFGRST      BIT(11)
+#define RCC_APB3RSTCLRR_VREFRST                BIT(13)
+#define RCC_APB3RSTCLRR_DTSRST         BIT(16)
+#define RCC_APB3RSTCLRR_PMBCTRLRST     BIT(17)
+
+/* RCC_APB4RSTSETR register fields */
+#define RCC_APB4RSTSETR_LTDCRST                BIT(0)
+#define RCC_APB4RSTSETR_DCMIPPRST      BIT(1)
+#define RCC_APB4RSTSETR_DDRPERFMRST    BIT(8)
+#define RCC_APB4RSTSETR_USBPHYRST      BIT(16)
+
+/* RCC_APB4RSTCLRR register fields */
+#define RCC_APB4RSTCLRR_LTDCRST                BIT(0)
+#define RCC_APB4RSTCLRR_DCMIPPRST      BIT(1)
+#define RCC_APB4RSTCLRR_DDRPERFMRST    BIT(8)
+#define RCC_APB4RSTCLRR_USBPHYRST      BIT(16)
+
+/* RCC_APB5RSTSETR register fields */
+#define RCC_APB5RSTSETR_STGENRST       BIT(20)
+
+/* RCC_APB5RSTCLRR register fields */
+#define RCC_APB5RSTCLRR_STGENRST       BIT(20)
+
+/* RCC_APB6RSTSETR register fields */
+#define RCC_APB6RSTSETR_USART1RST      BIT(0)
+#define RCC_APB6RSTSETR_USART2RST      BIT(1)
+#define RCC_APB6RSTSETR_SPI4RST                BIT(2)
+#define RCC_APB6RSTSETR_SPI5RST                BIT(3)
+#define RCC_APB6RSTSETR_I2C3RST                BIT(4)
+#define RCC_APB6RSTSETR_I2C4RST                BIT(5)
+#define RCC_APB6RSTSETR_I2C5RST                BIT(6)
+#define RCC_APB6RSTSETR_TIM12RST       BIT(7)
+#define RCC_APB6RSTSETR_TIM13RST       BIT(8)
+#define RCC_APB6RSTSETR_TIM14RST       BIT(9)
+#define RCC_APB6RSTSETR_TIM15RST       BIT(10)
+#define RCC_APB6RSTSETR_TIM16RST       BIT(11)
+#define RCC_APB6RSTSETR_TIM17RST       BIT(12)
+
+/* RCC_APB6RSTCLRR register fields */
+#define RCC_APB6RSTCLRR_USART1RST      BIT(0)
+#define RCC_APB6RSTCLRR_USART2RST      BIT(1)
+#define RCC_APB6RSTCLRR_SPI4RST                BIT(2)
+#define RCC_APB6RSTCLRR_SPI5RST                BIT(3)
+#define RCC_APB6RSTCLRR_I2C3RST                BIT(4)
+#define RCC_APB6RSTCLRR_I2C4RST                BIT(5)
+#define RCC_APB6RSTCLRR_I2C5RST                BIT(6)
+#define RCC_APB6RSTCLRR_TIM12RST       BIT(7)
+#define RCC_APB6RSTCLRR_TIM13RST       BIT(8)
+#define RCC_APB6RSTCLRR_TIM14RST       BIT(9)
+#define RCC_APB6RSTCLRR_TIM15RST       BIT(10)
+#define RCC_APB6RSTCLRR_TIM16RST       BIT(11)
+#define RCC_APB6RSTCLRR_TIM17RST       BIT(12)
+
+/* RCC_AHB2RSTSETR register fields */
+#define RCC_AHB2RSTSETR_DMA1RST                BIT(0)
+#define RCC_AHB2RSTSETR_DMA2RST                BIT(1)
+#define RCC_AHB2RSTSETR_DMAMUX1RST     BIT(2)
+#define RCC_AHB2RSTSETR_DMA3RST                BIT(3)
+#define RCC_AHB2RSTSETR_DMAMUX2RST     BIT(4)
+#define RCC_AHB2RSTSETR_ADC1RST                BIT(5)
+#define RCC_AHB2RSTSETR_ADC2RST                BIT(6)
+#define RCC_AHB2RSTSETR_USBORST                BIT(8)
+
+/* RCC_AHB2RSTCLRR register fields */
+#define RCC_AHB2RSTCLRR_DMA1RST                BIT(0)
+#define RCC_AHB2RSTCLRR_DMA2RST                BIT(1)
+#define RCC_AHB2RSTCLRR_DMAMUX1RST     BIT(2)
+#define RCC_AHB2RSTCLRR_DMA3RST                BIT(3)
+#define RCC_AHB2RSTCLRR_DMAMUX2RST     BIT(4)
+#define RCC_AHB2RSTCLRR_ADC1RST                BIT(5)
+#define RCC_AHB2RSTCLRR_ADC2RST                BIT(6)
+#define RCC_AHB2RSTCLRR_USBORST                BIT(8)
+
+/* RCC_AHB4RSTSETR register fields */
+#define RCC_AHB4RSTSETR_GPIOARST       BIT(0)
+#define RCC_AHB4RSTSETR_GPIOBRST       BIT(1)
+#define RCC_AHB4RSTSETR_GPIOCRST       BIT(2)
+#define RCC_AHB4RSTSETR_GPIODRST       BIT(3)
+#define RCC_AHB4RSTSETR_GPIOERST       BIT(4)
+#define RCC_AHB4RSTSETR_GPIOFRST       BIT(5)
+#define RCC_AHB4RSTSETR_GPIOGRST       BIT(6)
+#define RCC_AHB4RSTSETR_GPIOHRST       BIT(7)
+#define RCC_AHB4RSTSETR_GPIOIRST       BIT(8)
+#define RCC_AHB4RSTSETR_TSCRST         BIT(15)
+
+/* RCC_AHB4RSTCLRR register fields */
+#define RCC_AHB4RSTCLRR_GPIOARST       BIT(0)
+#define RCC_AHB4RSTCLRR_GPIOBRST       BIT(1)
+#define RCC_AHB4RSTCLRR_GPIOCRST       BIT(2)
+#define RCC_AHB4RSTCLRR_GPIODRST       BIT(3)
+#define RCC_AHB4RSTCLRR_GPIOERST       BIT(4)
+#define RCC_AHB4RSTCLRR_GPIOFRST       BIT(5)
+#define RCC_AHB4RSTCLRR_GPIOGRST       BIT(6)
+#define RCC_AHB4RSTCLRR_GPIOHRST       BIT(7)
+#define RCC_AHB4RSTCLRR_GPIOIRST       BIT(8)
+#define RCC_AHB4RSTCLRR_TSCRST         BIT(15)
+
+/* RCC_AHB5RSTSETR register fields */
+#define RCC_AHB5RSTSETR_PKARST         BIT(2)
+#define RCC_AHB5RSTSETR_SAESRST                BIT(3)
+#define RCC_AHB5RSTSETR_CRYP1RST       BIT(4)
+#define RCC_AHB5RSTSETR_HASH1RST       BIT(5)
+#define RCC_AHB5RSTSETR_RNG1RST                BIT(6)
+#define RCC_AHB5RSTSETR_AXIMCRST       BIT(16)
+
+/* RCC_AHB5RSTCLRR register fields */
+#define RCC_AHB5RSTCLRR_PKARST         BIT(2)
+#define RCC_AHB5RSTCLRR_SAESRST                BIT(3)
+#define RCC_AHB5RSTCLRR_CRYP1RST       BIT(4)
+#define RCC_AHB5RSTCLRR_HASH1RST       BIT(5)
+#define RCC_AHB5RSTCLRR_RNG1RST                BIT(6)
+#define RCC_AHB5RSTCLRR_AXIMCRST       BIT(16)
+
+/* RCC_AHB6RSTSETR register fields */
+#define RCC_AHB6RSTSETR_MDMARST                BIT(0)
+#define RCC_AHB6RSTSETR_MCERST         BIT(1)
+#define RCC_AHB6RSTSETR_ETH1MACRST     BIT(10)
+#define RCC_AHB6RSTSETR_FMCRST         BIT(12)
+#define RCC_AHB6RSTSETR_QSPIRST                BIT(14)
+#define RCC_AHB6RSTSETR_SDMMC1RST      BIT(16)
+#define RCC_AHB6RSTSETR_SDMMC2RST      BIT(17)
+#define RCC_AHB6RSTSETR_CRC1RST                BIT(20)
+#define RCC_AHB6RSTSETR_USBHRST                BIT(24)
+#define RCC_AHB6RSTSETR_ETH2MACRST     BIT(30)
+
+/* RCC_AHB6RSTCLRR register fields */
+#define RCC_AHB6RSTCLRR_MDMARST                BIT(0)
+#define RCC_AHB6RSTCLRR_MCERST         BIT(1)
+#define RCC_AHB6RSTCLRR_ETH1MACRST     BIT(10)
+#define RCC_AHB6RSTCLRR_FMCRST         BIT(12)
+#define RCC_AHB6RSTCLRR_QSPIRST                BIT(14)
+#define RCC_AHB6RSTCLRR_SDMMC1RST      BIT(16)
+#define RCC_AHB6RSTCLRR_SDMMC2RST      BIT(17)
+#define RCC_AHB6RSTCLRR_CRC1RST                BIT(20)
+#define RCC_AHB6RSTCLRR_USBHRST                BIT(24)
+#define RCC_AHB6RSTCLRR_ETH2MACRST     BIT(30)
+
+/* RCC_MP_APB1ENSETR register fields */
+#define RCC_MP_APB1ENSETR_TIM2EN       BIT(0)
+#define RCC_MP_APB1ENSETR_TIM3EN       BIT(1)
+#define RCC_MP_APB1ENSETR_TIM4EN       BIT(2)
+#define RCC_MP_APB1ENSETR_TIM5EN       BIT(3)
+#define RCC_MP_APB1ENSETR_TIM6EN       BIT(4)
+#define RCC_MP_APB1ENSETR_TIM7EN       BIT(5)
+#define RCC_MP_APB1ENSETR_LPTIM1EN     BIT(9)
+#define RCC_MP_APB1ENSETR_SPI2EN       BIT(11)
+#define RCC_MP_APB1ENSETR_SPI3EN       BIT(12)
+#define RCC_MP_APB1ENSETR_USART3EN     BIT(15)
+#define RCC_MP_APB1ENSETR_UART4EN      BIT(16)
+#define RCC_MP_APB1ENSETR_UART5EN      BIT(17)
+#define RCC_MP_APB1ENSETR_UART7EN      BIT(18)
+#define RCC_MP_APB1ENSETR_UART8EN      BIT(19)
+#define RCC_MP_APB1ENSETR_I2C1EN       BIT(21)
+#define RCC_MP_APB1ENSETR_I2C2EN       BIT(22)
+#define RCC_MP_APB1ENSETR_SPDIFEN      BIT(26)
+
+/* RCC_MP_APB1ENCLRR register fields */
+#define RCC_MP_APB1ENCLRR_TIM2EN       BIT(0)
+#define RCC_MP_APB1ENCLRR_TIM3EN       BIT(1)
+#define RCC_MP_APB1ENCLRR_TIM4EN       BIT(2)
+#define RCC_MP_APB1ENCLRR_TIM5EN       BIT(3)
+#define RCC_MP_APB1ENCLRR_TIM6EN       BIT(4)
+#define RCC_MP_APB1ENCLRR_TIM7EN       BIT(5)
+#define RCC_MP_APB1ENCLRR_LPTIM1EN     BIT(9)
+#define RCC_MP_APB1ENCLRR_SPI2EN       BIT(11)
+#define RCC_MP_APB1ENCLRR_SPI3EN       BIT(12)
+#define RCC_MP_APB1ENCLRR_USART3EN     BIT(15)
+#define RCC_MP_APB1ENCLRR_UART4EN      BIT(16)
+#define RCC_MP_APB1ENCLRR_UART5EN      BIT(17)
+#define RCC_MP_APB1ENCLRR_UART7EN      BIT(18)
+#define RCC_MP_APB1ENCLRR_UART8EN      BIT(19)
+#define RCC_MP_APB1ENCLRR_I2C1EN       BIT(21)
+#define RCC_MP_APB1ENCLRR_I2C2EN       BIT(22)
+#define RCC_MP_APB1ENCLRR_SPDIFEN      BIT(26)
+
+/* RCC_MP_APB2ENSETR register fields */
+#define RCC_MP_APB2ENSETR_TIM1EN       BIT(0)
+#define RCC_MP_APB2ENSETR_TIM8EN       BIT(1)
+#define RCC_MP_APB2ENSETR_SPI1EN       BIT(8)
+#define RCC_MP_APB2ENSETR_USART6EN     BIT(13)
+#define RCC_MP_APB2ENSETR_SAI1EN       BIT(16)
+#define RCC_MP_APB2ENSETR_SAI2EN       BIT(17)
+#define RCC_MP_APB2ENSETR_DFSDMEN      BIT(20)
+#define RCC_MP_APB2ENSETR_ADFSDMEN     BIT(21)
+#define RCC_MP_APB2ENSETR_FDCANEN      BIT(24)
+
+/* RCC_MP_APB2ENCLRR register fields */
+#define RCC_MP_APB2ENCLRR_TIM1EN       BIT(0)
+#define RCC_MP_APB2ENCLRR_TIM8EN       BIT(1)
+#define RCC_MP_APB2ENCLRR_SPI1EN       BIT(8)
+#define RCC_MP_APB2ENCLRR_USART6EN     BIT(13)
+#define RCC_MP_APB2ENCLRR_SAI1EN       BIT(16)
+#define RCC_MP_APB2ENCLRR_SAI2EN       BIT(17)
+#define RCC_MP_APB2ENCLRR_DFSDMEN      BIT(20)
+#define RCC_MP_APB2ENCLRR_ADFSDMEN     BIT(21)
+#define RCC_MP_APB2ENCLRR_FDCANEN      BIT(24)
+
+/* RCC_MP_APB3ENSETR register fields */
+#define RCC_MP_APB3ENSETR_LPTIM2EN     BIT(0)
+#define RCC_MP_APB3ENSETR_LPTIM3EN     BIT(1)
+#define RCC_MP_APB3ENSETR_LPTIM4EN     BIT(2)
+#define RCC_MP_APB3ENSETR_LPTIM5EN     BIT(3)
+#define RCC_MP_APB3ENSETR_VREFEN       BIT(13)
+#define RCC_MP_APB3ENSETR_DTSEN                BIT(16)
+#define RCC_MP_APB3ENSETR_PMBCTRLEN    BIT(17)
+#define RCC_MP_APB3ENSETR_HDPEN                BIT(20)
+
+/* RCC_MP_APB3ENCLRR register fields */
+#define RCC_MP_APB3ENCLRR_LPTIM2EN     BIT(0)
+#define RCC_MP_APB3ENCLRR_LPTIM3EN     BIT(1)
+#define RCC_MP_APB3ENCLRR_LPTIM4EN     BIT(2)
+#define RCC_MP_APB3ENCLRR_LPTIM5EN     BIT(3)
+#define RCC_MP_APB3ENCLRR_VREFEN       BIT(13)
+#define RCC_MP_APB3ENCLRR_DTSEN                BIT(16)
+#define RCC_MP_APB3ENCLRR_PMBCTRLEN    BIT(17)
+#define RCC_MP_APB3ENCLRR_HDPEN                BIT(20)
+
+/* RCC_MP_S_APB3ENSETR register fields */
+#define RCC_MP_S_APB3ENSETR_SYSCFGEN   BIT(0)
+
+/* RCC_MP_S_APB3ENCLRR register fields */
+#define RCC_MP_S_APB3ENCLRR_SYSCFGEN   BIT(0)
+
+/* RCC_MP_NS_APB3ENSETR register fields */
+#define RCC_MP_NS_APB3ENSETR_SYSCFGEN  BIT(0)
+
+/* RCC_MP_NS_APB3ENCLRR register fields */
+#define RCC_MP_NS_APB3ENCLRR_SYSCFGEN  BIT(0)
+
+/* RCC_MP_APB4ENSETR register fields */
+#define RCC_MP_APB4ENSETR_DCMIPPEN     BIT(1)
+#define RCC_MP_APB4ENSETR_DDRPERFMEN   BIT(8)
+#define RCC_MP_APB4ENSETR_IWDG2APBEN   BIT(15)
+#define RCC_MP_APB4ENSETR_USBPHYEN     BIT(16)
+#define RCC_MP_APB4ENSETR_STGENROEN    BIT(20)
+
+/* RCC_MP_APB4ENCLRR register fields */
+#define RCC_MP_APB4ENCLRR_DCMIPPEN     BIT(1)
+#define RCC_MP_APB4ENCLRR_DDRPERFMEN   BIT(8)
+#define RCC_MP_APB4ENCLRR_IWDG2APBEN   BIT(15)
+#define RCC_MP_APB4ENCLRR_USBPHYEN     BIT(16)
+#define RCC_MP_APB4ENCLRR_STGENROEN    BIT(20)
+
+/* RCC_MP_S_APB4ENSETR register fields */
+#define RCC_MP_S_APB4ENSETR_LTDCEN     BIT(0)
+
+/* RCC_MP_S_APB4ENCLRR register fields */
+#define RCC_MP_S_APB4ENCLRR_LTDCEN     BIT(0)
+
+/* RCC_MP_NS_APB4ENSETR register fields */
+#define RCC_MP_NS_APB4ENSETR_LTDCEN    BIT(0)
+
+/* RCC_MP_NS_APB4ENCLRR register fields */
+#define RCC_MP_NS_APB4ENCLRR_LTDCEN    BIT(0)
+
+/* RCC_MP_APB5ENSETR register fields */
+#define RCC_MP_APB5ENSETR_RTCAPBEN     BIT(8)
+#define RCC_MP_APB5ENSETR_TZCEN                BIT(11)
+#define RCC_MP_APB5ENSETR_ETZPCEN      BIT(13)
+#define RCC_MP_APB5ENSETR_IWDG1APBEN   BIT(15)
+#define RCC_MP_APB5ENSETR_BSECEN       BIT(16)
+#define RCC_MP_APB5ENSETR_STGENCEN     BIT(20)
+
+/* RCC_MP_APB5ENCLRR register fields */
+#define RCC_MP_APB5ENCLRR_RTCAPBEN     BIT(8)
+#define RCC_MP_APB5ENCLRR_TZCEN                BIT(11)
+#define RCC_MP_APB5ENCLRR_ETZPCEN      BIT(13)
+#define RCC_MP_APB5ENCLRR_IWDG1APBEN   BIT(15)
+#define RCC_MP_APB5ENCLRR_BSECEN       BIT(16)
+#define RCC_MP_APB5ENCLRR_STGENCEN     BIT(20)
+
+/* RCC_MP_APB6ENSETR register fields */
+#define RCC_MP_APB6ENSETR_USART1EN     BIT(0)
+#define RCC_MP_APB6ENSETR_USART2EN     BIT(1)
+#define RCC_MP_APB6ENSETR_SPI4EN       BIT(2)
+#define RCC_MP_APB6ENSETR_SPI5EN       BIT(3)
+#define RCC_MP_APB6ENSETR_I2C3EN       BIT(4)
+#define RCC_MP_APB6ENSETR_I2C4EN       BIT(5)
+#define RCC_MP_APB6ENSETR_I2C5EN       BIT(6)
+#define RCC_MP_APB6ENSETR_TIM12EN      BIT(7)
+#define RCC_MP_APB6ENSETR_TIM13EN      BIT(8)
+#define RCC_MP_APB6ENSETR_TIM14EN      BIT(9)
+#define RCC_MP_APB6ENSETR_TIM15EN      BIT(10)
+#define RCC_MP_APB6ENSETR_TIM16EN      BIT(11)
+#define RCC_MP_APB6ENSETR_TIM17EN      BIT(12)
+
+/* RCC_MP_APB6ENCLRR register fields */
+#define RCC_MP_APB6ENCLRR_USART1EN     BIT(0)
+#define RCC_MP_APB6ENCLRR_USART2EN     BIT(1)
+#define RCC_MP_APB6ENCLRR_SPI4EN       BIT(2)
+#define RCC_MP_APB6ENCLRR_SPI5EN       BIT(3)
+#define RCC_MP_APB6ENCLRR_I2C3EN       BIT(4)
+#define RCC_MP_APB6ENCLRR_I2C4EN       BIT(5)
+#define RCC_MP_APB6ENCLRR_I2C5EN       BIT(6)
+#define RCC_MP_APB6ENCLRR_TIM12EN      BIT(7)
+#define RCC_MP_APB6ENCLRR_TIM13EN      BIT(8)
+#define RCC_MP_APB6ENCLRR_TIM14EN      BIT(9)
+#define RCC_MP_APB6ENCLRR_TIM15EN      BIT(10)
+#define RCC_MP_APB6ENCLRR_TIM16EN      BIT(11)
+#define RCC_MP_APB6ENCLRR_TIM17EN      BIT(12)
+
+/* RCC_MP_AHB2ENSETR register fields */
+#define RCC_MP_AHB2ENSETR_DMA1EN       BIT(0)
+#define RCC_MP_AHB2ENSETR_DMA2EN       BIT(1)
+#define RCC_MP_AHB2ENSETR_DMAMUX1EN    BIT(2)
+#define RCC_MP_AHB2ENSETR_DMA3EN       BIT(3)
+#define RCC_MP_AHB2ENSETR_DMAMUX2EN    BIT(4)
+#define RCC_MP_AHB2ENSETR_ADC1EN       BIT(5)
+#define RCC_MP_AHB2ENSETR_ADC2EN       BIT(6)
+#define RCC_MP_AHB2ENSETR_USBOEN       BIT(8)
+
+/* RCC_MP_AHB2ENCLRR register fields */
+#define RCC_MP_AHB2ENCLRR_DMA1EN       BIT(0)
+#define RCC_MP_AHB2ENCLRR_DMA2EN       BIT(1)
+#define RCC_MP_AHB2ENCLRR_DMAMUX1EN    BIT(2)
+#define RCC_MP_AHB2ENCLRR_DMA3EN       BIT(3)
+#define RCC_MP_AHB2ENCLRR_DMAMUX2EN    BIT(4)
+#define RCC_MP_AHB2ENCLRR_ADC1EN       BIT(5)
+#define RCC_MP_AHB2ENCLRR_ADC2EN       BIT(6)
+#define RCC_MP_AHB2ENCLRR_USBOEN       BIT(8)
+
+/* RCC_MP_AHB4ENSETR register fields */
+#define RCC_MP_AHB4ENSETR_TSCEN                BIT(15)
+
+/* RCC_MP_AHB4ENCLRR register fields */
+#define RCC_MP_AHB4ENCLRR_TSCEN                BIT(15)
+
+/* RCC_MP_S_AHB4ENSETR register fields */
+#define RCC_MP_S_AHB4ENSETR_GPIOAEN    BIT(0)
+#define RCC_MP_S_AHB4ENSETR_GPIOBEN    BIT(1)
+#define RCC_MP_S_AHB4ENSETR_GPIOCEN    BIT(2)
+#define RCC_MP_S_AHB4ENSETR_GPIODEN    BIT(3)
+#define RCC_MP_S_AHB4ENSETR_GPIOEEN    BIT(4)
+#define RCC_MP_S_AHB4ENSETR_GPIOFEN    BIT(5)
+#define RCC_MP_S_AHB4ENSETR_GPIOGEN    BIT(6)
+#define RCC_MP_S_AHB4ENSETR_GPIOHEN    BIT(7)
+#define RCC_MP_S_AHB4ENSETR_GPIOIEN    BIT(8)
+
+/* RCC_MP_S_AHB4ENCLRR register fields */
+#define RCC_MP_S_AHB4ENCLRR_GPIOAEN    BIT(0)
+#define RCC_MP_S_AHB4ENCLRR_GPIOBEN    BIT(1)
+#define RCC_MP_S_AHB4ENCLRR_GPIOCEN    BIT(2)
+#define RCC_MP_S_AHB4ENCLRR_GPIODEN    BIT(3)
+#define RCC_MP_S_AHB4ENCLRR_GPIOEEN    BIT(4)
+#define RCC_MP_S_AHB4ENCLRR_GPIOFEN    BIT(5)
+#define RCC_MP_S_AHB4ENCLRR_GPIOGEN    BIT(6)
+#define RCC_MP_S_AHB4ENCLRR_GPIOHEN    BIT(7)
+#define RCC_MP_S_AHB4ENCLRR_GPIOIEN    BIT(8)
+
+/* RCC_MP_NS_AHB4ENSETR register fields */
+#define RCC_MP_NS_AHB4ENSETR_GPIOAEN   BIT(0)
+#define RCC_MP_NS_AHB4ENSETR_GPIOBEN   BIT(1)
+#define RCC_MP_NS_AHB4ENSETR_GPIOCEN   BIT(2)
+#define RCC_MP_NS_AHB4ENSETR_GPIODEN   BIT(3)
+#define RCC_MP_NS_AHB4ENSETR_GPIOEEN   BIT(4)
+#define RCC_MP_NS_AHB4ENSETR_GPIOFEN   BIT(5)
+#define RCC_MP_NS_AHB4ENSETR_GPIOGEN   BIT(6)
+#define RCC_MP_NS_AHB4ENSETR_GPIOHEN   BIT(7)
+#define RCC_MP_NS_AHB4ENSETR_GPIOIEN   BIT(8)
+
+/* RCC_MP_NS_AHB4ENCLRR register fields */
+#define RCC_MP_NS_AHB4ENCLRR_GPIOAEN   BIT(0)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOBEN   BIT(1)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOCEN   BIT(2)
+#define RCC_MP_NS_AHB4ENCLRR_GPIODEN   BIT(3)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOEEN   BIT(4)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOFEN   BIT(5)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOGEN   BIT(6)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOHEN   BIT(7)
+#define RCC_MP_NS_AHB4ENCLRR_GPIOIEN   BIT(8)
+
+/* RCC_MP_AHB5ENSETR register fields */
+#define RCC_MP_AHB5ENSETR_PKAEN                BIT(2)
+#define RCC_MP_AHB5ENSETR_SAESEN       BIT(3)
+#define RCC_MP_AHB5ENSETR_CRYP1EN      BIT(4)
+#define RCC_MP_AHB5ENSETR_HASH1EN      BIT(5)
+#define RCC_MP_AHB5ENSETR_RNG1EN       BIT(6)
+#define RCC_MP_AHB5ENSETR_BKPSRAMEN    BIT(8)
+#define RCC_MP_AHB5ENSETR_AXIMCEN      BIT(16)
+
+/* RCC_MP_AHB5ENCLRR register fields */
+#define RCC_MP_AHB5ENCLRR_PKAEN                BIT(2)
+#define RCC_MP_AHB5ENCLRR_SAESEN       BIT(3)
+#define RCC_MP_AHB5ENCLRR_CRYP1EN      BIT(4)
+#define RCC_MP_AHB5ENCLRR_HASH1EN      BIT(5)
+#define RCC_MP_AHB5ENCLRR_RNG1EN       BIT(6)
+#define RCC_MP_AHB5ENCLRR_BKPSRAMEN    BIT(8)
+#define RCC_MP_AHB5ENCLRR_AXIMCEN      BIT(16)
+
+/* RCC_MP_AHB6ENSETR register fields */
+#define RCC_MP_AHB6ENSETR_MCEEN                BIT(1)
+#define RCC_MP_AHB6ENSETR_ETH1CKEN     BIT(7)
+#define RCC_MP_AHB6ENSETR_ETH1TXEN     BIT(8)
+#define RCC_MP_AHB6ENSETR_ETH1RXEN     BIT(9)
+#define RCC_MP_AHB6ENSETR_ETH1MACEN    BIT(10)
+#define RCC_MP_AHB6ENSETR_FMCEN                BIT(12)
+#define RCC_MP_AHB6ENSETR_QSPIEN       BIT(14)
+#define RCC_MP_AHB6ENSETR_SDMMC1EN     BIT(16)
+#define RCC_MP_AHB6ENSETR_SDMMC2EN     BIT(17)
+#define RCC_MP_AHB6ENSETR_CRC1EN       BIT(20)
+#define RCC_MP_AHB6ENSETR_USBHEN       BIT(24)
+#define RCC_MP_AHB6ENSETR_ETH2CKEN     BIT(27)
+#define RCC_MP_AHB6ENSETR_ETH2TXEN     BIT(28)
+#define RCC_MP_AHB6ENSETR_ETH2RXEN     BIT(29)
+#define RCC_MP_AHB6ENSETR_ETH2MACEN    BIT(30)
+
+/* RCC_MP_AHB6ENCLRR register fields */
+#define RCC_MP_AHB6ENCLRR_MCEEN                BIT(1)
+#define RCC_MP_AHB6ENCLRR_ETH1CKEN     BIT(7)
+#define RCC_MP_AHB6ENCLRR_ETH1TXEN     BIT(8)
+#define RCC_MP_AHB6ENCLRR_ETH1RXEN     BIT(9)
+#define RCC_MP_AHB6ENCLRR_ETH1MACEN    BIT(10)
+#define RCC_MP_AHB6ENCLRR_FMCEN                BIT(12)
+#define RCC_MP_AHB6ENCLRR_QSPIEN       BIT(14)
+#define RCC_MP_AHB6ENCLRR_SDMMC1EN     BIT(16)
+#define RCC_MP_AHB6ENCLRR_SDMMC2EN     BIT(17)
+#define RCC_MP_AHB6ENCLRR_CRC1EN       BIT(20)
+#define RCC_MP_AHB6ENCLRR_USBHEN       BIT(24)
+#define RCC_MP_AHB6ENCLRR_ETH2CKEN     BIT(27)
+#define RCC_MP_AHB6ENCLRR_ETH2TXEN     BIT(28)
+#define RCC_MP_AHB6ENCLRR_ETH2RXEN     BIT(29)
+#define RCC_MP_AHB6ENCLRR_ETH2MACEN    BIT(30)
+
+/* RCC_MP_S_AHB6ENSETR register fields */
+#define RCC_MP_S_AHB6ENSETR_MDMAEN     BIT(0)
+
+/* RCC_MP_S_AHB6ENCLRR register fields */
+#define RCC_MP_S_AHB6ENCLRR_MDMAEN     BIT(0)
+
+/* RCC_MP_NS_AHB6ENSETR register fields */
+#define RCC_MP_NS_AHB6ENSETR_MDMAEN    BIT(0)
+
+/* RCC_MP_NS_AHB6ENCLRR register fields */
+#define RCC_MP_NS_AHB6ENCLRR_MDMAEN    BIT(0)
+
+/* RCC_MP_APB1LPENSETR register fields */
+#define RCC_MP_APB1LPENSETR_TIM2LPEN   BIT(0)
+#define RCC_MP_APB1LPENSETR_TIM3LPEN   BIT(1)
+#define RCC_MP_APB1LPENSETR_TIM4LPEN   BIT(2)
+#define RCC_MP_APB1LPENSETR_TIM5LPEN   BIT(3)
+#define RCC_MP_APB1LPENSETR_TIM6LPEN   BIT(4)
+#define RCC_MP_APB1LPENSETR_TIM7LPEN   BIT(5)
+#define RCC_MP_APB1LPENSETR_LPTIM1LPEN BIT(9)
+#define RCC_MP_APB1LPENSETR_SPI2LPEN   BIT(11)
+#define RCC_MP_APB1LPENSETR_SPI3LPEN   BIT(12)
+#define RCC_MP_APB1LPENSETR_USART3LPEN BIT(15)
+#define RCC_MP_APB1LPENSETR_UART4LPEN  BIT(16)
+#define RCC_MP_APB1LPENSETR_UART5LPEN  BIT(17)
+#define RCC_MP_APB1LPENSETR_UART7LPEN  BIT(18)
+#define RCC_MP_APB1LPENSETR_UART8LPEN  BIT(19)
+#define RCC_MP_APB1LPENSETR_I2C1LPEN   BIT(21)
+#define RCC_MP_APB1LPENSETR_I2C2LPEN   BIT(22)
+#define RCC_MP_APB1LPENSETR_SPDIFLPEN  BIT(26)
+
+/* RCC_MP_APB1LPENCLRR register fields */
+#define RCC_MP_APB1LPENCLRR_TIM2LPEN   BIT(0)
+#define RCC_MP_APB1LPENCLRR_TIM3LPEN   BIT(1)
+#define RCC_MP_APB1LPENCLRR_TIM4LPEN   BIT(2)
+#define RCC_MP_APB1LPENCLRR_TIM5LPEN   BIT(3)
+#define RCC_MP_APB1LPENCLRR_TIM6LPEN   BIT(4)
+#define RCC_MP_APB1LPENCLRR_TIM7LPEN   BIT(5)
+#define RCC_MP_APB1LPENCLRR_LPTIM1LPEN BIT(9)
+#define RCC_MP_APB1LPENCLRR_SPI2LPEN   BIT(11)
+#define RCC_MP_APB1LPENCLRR_SPI3LPEN   BIT(12)
+#define RCC_MP_APB1LPENCLRR_USART3LPEN BIT(15)
+#define RCC_MP_APB1LPENCLRR_UART4LPEN  BIT(16)
+#define RCC_MP_APB1LPENCLRR_UART5LPEN  BIT(17)
+#define RCC_MP_APB1LPENCLRR_UART7LPEN  BIT(18)
+#define RCC_MP_APB1LPENCLRR_UART8LPEN  BIT(19)
+#define RCC_MP_APB1LPENCLRR_I2C1LPEN   BIT(21)
+#define RCC_MP_APB1LPENCLRR_I2C2LPEN   BIT(22)
+#define RCC_MP_APB1LPENCLRR_SPDIFLPEN  BIT(26)
+
+/* RCC_MP_APB2LPENSETR register fields */
+#define RCC_MP_APB2LPENSETR_TIM1LPEN   BIT(0)
+#define RCC_MP_APB2LPENSETR_TIM8LPEN   BIT(1)
+#define RCC_MP_APB2LPENSETR_SPI1LPEN   BIT(8)
+#define RCC_MP_APB2LPENSETR_USART6LPEN BIT(13)
+#define RCC_MP_APB2LPENSETR_SAI1LPEN   BIT(16)
+#define RCC_MP_APB2LPENSETR_SAI2LPEN   BIT(17)
+#define RCC_MP_APB2LPENSETR_DFSDMLPEN  BIT(20)
+#define RCC_MP_APB2LPENSETR_ADFSDMLPEN BIT(21)
+#define RCC_MP_APB2LPENSETR_FDCANLPEN  BIT(24)
+
+/* RCC_MP_APB2LPENCLRR register fields */
+#define RCC_MP_APB2LPENCLRR_TIM1LPEN   BIT(0)
+#define RCC_MP_APB2LPENCLRR_TIM8LPEN   BIT(1)
+#define RCC_MP_APB2LPENCLRR_SPI1LPEN   BIT(8)
+#define RCC_MP_APB2LPENCLRR_USART6LPEN BIT(13)
+#define RCC_MP_APB2LPENCLRR_SAI1LPEN   BIT(16)
+#define RCC_MP_APB2LPENCLRR_SAI2LPEN   BIT(17)
+#define RCC_MP_APB2LPENCLRR_DFSDMLPEN  BIT(20)
+#define RCC_MP_APB2LPENCLRR_ADFSDMLPEN BIT(21)
+#define RCC_MP_APB2LPENCLRR_FDCANLPEN  BIT(24)
+
+/* RCC_MP_APB3LPENSETR register fields */
+#define RCC_MP_APB3LPENSETR_LPTIM2LPEN BIT(0)
+#define RCC_MP_APB3LPENSETR_LPTIM3LPEN BIT(1)
+#define RCC_MP_APB3LPENSETR_LPTIM4LPEN BIT(2)
+#define RCC_MP_APB3LPENSETR_LPTIM5LPEN BIT(3)
+#define RCC_MP_APB3LPENSETR_VREFLPEN   BIT(13)
+#define RCC_MP_APB3LPENSETR_DTSLPEN    BIT(16)
+#define RCC_MP_APB3LPENSETR_PMBCTRLLPEN        BIT(17)
+
+/* RCC_MP_APB3LPENCLRR register fields */
+#define RCC_MP_APB3LPENCLRR_LPTIM2LPEN BIT(0)
+#define RCC_MP_APB3LPENCLRR_LPTIM3LPEN BIT(1)
+#define RCC_MP_APB3LPENCLRR_LPTIM4LPEN BIT(2)
+#define RCC_MP_APB3LPENCLRR_LPTIM5LPEN BIT(3)
+#define RCC_MP_APB3LPENCLRR_VREFLPEN   BIT(13)
+#define RCC_MP_APB3LPENCLRR_DTSLPEN    BIT(16)
+#define RCC_MP_APB3LPENCLRR_PMBCTRLLPEN        BIT(17)
+
+/* RCC_MP_S_APB3LPENSETR register fields */
+#define RCC_MP_S_APB3LPENSETR_SYSCFGLPEN       BIT(0)
+
+/* RCC_MP_S_APB3LPENCLRR register fields */
+#define RCC_MP_S_APB3LPENCLRR_SYSCFGLPEN       BIT(0)
+
+/* RCC_MP_NS_APB3LPENSETR register fields */
+#define RCC_MP_NS_APB3LPENSETR_SYSCFGLPEN      BIT(0)
+
+/* RCC_MP_NS_APB3LPENCLRR register fields */
+#define RCC_MP_NS_APB3LPENCLRR_SYSCFGLPEN      BIT(0)
+
+/* RCC_MP_APB4LPENSETR register fields */
+#define RCC_MP_APB4LPENSETR_DCMIPPLPEN         BIT(1)
+#define RCC_MP_APB4LPENSETR_DDRPERFMLPEN       BIT(8)
+#define RCC_MP_APB4LPENSETR_IWDG2APBLPEN       BIT(15)
+#define RCC_MP_APB4LPENSETR_USBPHYLPEN         BIT(16)
+#define RCC_MP_APB4LPENSETR_STGENROLPEN                BIT(20)
+#define RCC_MP_APB4LPENSETR_STGENROSTPEN       BIT(21)
+
+/* RCC_MP_APB4LPENCLRR register fields */
+#define RCC_MP_APB4LPENCLRR_DCMIPPLPEN         BIT(1)
+#define RCC_MP_APB4LPENCLRR_DDRPERFMLPEN       BIT(8)
+#define RCC_MP_APB4LPENCLRR_IWDG2APBLPEN       BIT(15)
+#define RCC_MP_APB4LPENCLRR_USBPHYLPEN         BIT(16)
+#define RCC_MP_APB4LPENCLRR_STGENROLPEN                BIT(20)
+#define RCC_MP_APB4LPENCLRR_STGENROSTPEN       BIT(21)
+
+/* RCC_MP_S_APB4LPENSETR register fields */
+#define RCC_MP_S_APB4LPENSETR_LTDCLPEN BIT(0)
+
+/* RCC_MP_S_APB4LPENCLRR register fields */
+#define RCC_MP_S_APB4LPENCLRR_LTDCLPEN BIT(0)
+
+/* RCC_MP_NS_APB4LPENSETR register fields */
+#define RCC_MP_NS_APB4LPENSETR_LTDCLPEN        BIT(0)
+
+/* RCC_MP_NS_APB4LPENCLRR register fields */
+#define RCC_MP_NS_APB4LPENCLRR_LTDCLPEN        BIT(0)
+
+/* RCC_MP_APB5LPENSETR register fields */
+#define RCC_MP_APB5LPENSETR_RTCAPBLPEN         BIT(8)
+#define RCC_MP_APB5LPENSETR_TZCLPEN            BIT(11)
+#define RCC_MP_APB5LPENSETR_ETZPCLPEN          BIT(13)
+#define RCC_MP_APB5LPENSETR_IWDG1APBLPEN       BIT(15)
+#define RCC_MP_APB5LPENSETR_BSECLPEN           BIT(16)
+#define RCC_MP_APB5LPENSETR_STGENCLPEN         BIT(20)
+#define RCC_MP_APB5LPENSETR_STGENCSTPEN                BIT(21)
+
+/* RCC_MP_APB5LPENCLRR register fields */
+#define RCC_MP_APB5LPENCLRR_RTCAPBLPEN         BIT(8)
+#define RCC_MP_APB5LPENCLRR_TZCLPEN            BIT(11)
+#define RCC_MP_APB5LPENCLRR_ETZPCLPEN          BIT(13)
+#define RCC_MP_APB5LPENCLRR_IWDG1APBLPEN       BIT(15)
+#define RCC_MP_APB5LPENCLRR_BSECLPEN           BIT(16)
+#define RCC_MP_APB5LPENCLRR_STGENCLPEN         BIT(20)
+#define RCC_MP_APB5LPENCLRR_STGENCSTPEN                BIT(21)
+
+/* RCC_MP_APB6LPENSETR register fields */
+#define RCC_MP_APB6LPENSETR_USART1LPEN BIT(0)
+#define RCC_MP_APB6LPENSETR_USART2LPEN BIT(1)
+#define RCC_MP_APB6LPENSETR_SPI4LPEN   BIT(2)
+#define RCC_MP_APB6LPENSETR_SPI5LPEN   BIT(3)
+#define RCC_MP_APB6LPENSETR_I2C3LPEN   BIT(4)
+#define RCC_MP_APB6LPENSETR_I2C4LPEN   BIT(5)
+#define RCC_MP_APB6LPENSETR_I2C5LPEN   BIT(6)
+#define RCC_MP_APB6LPENSETR_TIM12LPEN  BIT(7)
+#define RCC_MP_APB6LPENSETR_TIM13LPEN  BIT(8)
+#define RCC_MP_APB6LPENSETR_TIM14LPEN  BIT(9)
+#define RCC_MP_APB6LPENSETR_TIM15LPEN  BIT(10)
+#define RCC_MP_APB6LPENSETR_TIM16LPEN  BIT(11)
+#define RCC_MP_APB6LPENSETR_TIM17LPEN  BIT(12)
+
+/* RCC_MP_APB6LPENCLRR register fields */
+#define RCC_MP_APB6LPENCLRR_USART1LPEN BIT(0)
+#define RCC_MP_APB6LPENCLRR_USART2LPEN BIT(1)
+#define RCC_MP_APB6LPENCLRR_SPI4LPEN   BIT(2)
+#define RCC_MP_APB6LPENCLRR_SPI5LPEN   BIT(3)
+#define RCC_MP_APB6LPENCLRR_I2C3LPEN   BIT(4)
+#define RCC_MP_APB6LPENCLRR_I2C4LPEN   BIT(5)
+#define RCC_MP_APB6LPENCLRR_I2C5LPEN   BIT(6)
+#define RCC_MP_APB6LPENCLRR_TIM12LPEN  BIT(7)
+#define RCC_MP_APB6LPENCLRR_TIM13LPEN  BIT(8)
+#define RCC_MP_APB6LPENCLRR_TIM14LPEN  BIT(9)
+#define RCC_MP_APB6LPENCLRR_TIM15LPEN  BIT(10)
+#define RCC_MP_APB6LPENCLRR_TIM16LPEN  BIT(11)
+#define RCC_MP_APB6LPENCLRR_TIM17LPEN  BIT(12)
+
+/* RCC_MP_AHB2LPENSETR register fields */
+#define RCC_MP_AHB2LPENSETR_DMA1LPEN   BIT(0)
+#define RCC_MP_AHB2LPENSETR_DMA2LPEN   BIT(1)
+#define RCC_MP_AHB2LPENSETR_DMAMUX1LPEN        BIT(2)
+#define RCC_MP_AHB2LPENSETR_DMA3LPEN   BIT(3)
+#define RCC_MP_AHB2LPENSETR_DMAMUX2LPEN        BIT(4)
+#define RCC_MP_AHB2LPENSETR_ADC1LPEN   BIT(5)
+#define RCC_MP_AHB2LPENSETR_ADC2LPEN   BIT(6)
+#define RCC_MP_AHB2LPENSETR_USBOLPEN   BIT(8)
+
+/* RCC_MP_AHB2LPENCLRR register fields */
+#define RCC_MP_AHB2LPENCLRR_DMA1LPEN   BIT(0)
+#define RCC_MP_AHB2LPENCLRR_DMA2LPEN   BIT(1)
+#define RCC_MP_AHB2LPENCLRR_DMAMUX1LPEN        BIT(2)
+#define RCC_MP_AHB2LPENCLRR_DMA3LPEN   BIT(3)
+#define RCC_MP_AHB2LPENCLRR_DMAMUX2LPEN        BIT(4)
+#define RCC_MP_AHB2LPENCLRR_ADC1LPEN   BIT(5)
+#define RCC_MP_AHB2LPENCLRR_ADC2LPEN   BIT(6)
+#define RCC_MP_AHB2LPENCLRR_USBOLPEN   BIT(8)
+
+/* RCC_MP_AHB4LPENSETR register fields */
+#define RCC_MP_AHB4LPENSETR_TSCLPEN    BIT(15)
+
+/* RCC_MP_AHB4LPENCLRR register fields */
+#define RCC_MP_AHB4LPENCLRR_TSCLPEN    BIT(15)
+
+/* RCC_MP_S_AHB4LPENSETR register fields */
+#define RCC_MP_S_AHB4LPENSETR_GPIOALPEN        BIT(0)
+#define RCC_MP_S_AHB4LPENSETR_GPIOBLPEN        BIT(1)
+#define RCC_MP_S_AHB4LPENSETR_GPIOCLPEN        BIT(2)
+#define RCC_MP_S_AHB4LPENSETR_GPIODLPEN        BIT(3)
+#define RCC_MP_S_AHB4LPENSETR_GPIOELPEN        BIT(4)
+#define RCC_MP_S_AHB4LPENSETR_GPIOFLPEN        BIT(5)
+#define RCC_MP_S_AHB4LPENSETR_GPIOGLPEN        BIT(6)
+#define RCC_MP_S_AHB4LPENSETR_GPIOHLPEN        BIT(7)
+#define RCC_MP_S_AHB4LPENSETR_GPIOILPEN        BIT(8)
+
+/* RCC_MP_S_AHB4LPENCLRR register fields */
+#define RCC_MP_S_AHB4LPENCLRR_GPIOALPEN        BIT(0)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOBLPEN        BIT(1)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOCLPEN        BIT(2)
+#define RCC_MP_S_AHB4LPENCLRR_GPIODLPEN        BIT(3)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOELPEN        BIT(4)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOFLPEN        BIT(5)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOGLPEN        BIT(6)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOHLPEN        BIT(7)
+#define RCC_MP_S_AHB4LPENCLRR_GPIOILPEN        BIT(8)
+
+/* RCC_MP_NS_AHB4LPENSETR register fields */
+#define RCC_MP_NS_AHB4LPENSETR_GPIOALPEN BIT(0)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOBLPEN BIT(1)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOCLPEN BIT(2)
+#define RCC_MP_NS_AHB4LPENSETR_GPIODLPEN BIT(3)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOELPEN BIT(4)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOFLPEN BIT(5)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOGLPEN BIT(6)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOHLPEN BIT(7)
+#define RCC_MP_NS_AHB4LPENSETR_GPIOILPEN BIT(8)
+
+/* RCC_MP_NS_AHB4LPENCLRR register fields */
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOALPEN BIT(0)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOBLPEN BIT(1)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOCLPEN BIT(2)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIODLPEN BIT(3)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOELPEN BIT(4)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOFLPEN BIT(5)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOGLPEN BIT(6)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOHLPEN BIT(7)
+#define RCC_MP_NS_AHB4LPENCLRR_GPIOILPEN BIT(8)
+
+/* RCC_MP_AHB5LPENSETR register fields */
+#define RCC_MP_AHB5LPENSETR_PKALPEN    BIT(2)
+#define RCC_MP_AHB5LPENSETR_SAESLPEN   BIT(3)
+#define RCC_MP_AHB5LPENSETR_CRYP1LPEN  BIT(4)
+#define RCC_MP_AHB5LPENSETR_HASH1LPEN  BIT(5)
+#define RCC_MP_AHB5LPENSETR_RNG1LPEN   BIT(6)
+#define RCC_MP_AHB5LPENSETR_BKPSRAMLPEN        BIT(8)
+
+/* RCC_MP_AHB5LPENCLRR register fields */
+#define RCC_MP_AHB5LPENCLRR_PKALPEN    BIT(2)
+#define RCC_MP_AHB5LPENCLRR_SAESLPEN   BIT(3)
+#define RCC_MP_AHB5LPENCLRR_CRYP1LPEN  BIT(4)
+#define RCC_MP_AHB5LPENCLRR_HASH1LPEN  BIT(5)
+#define RCC_MP_AHB5LPENCLRR_RNG1LPEN   BIT(6)
+#define RCC_MP_AHB5LPENCLRR_BKPSRAMLPEN        BIT(8)
+
+/* RCC_MP_AHB6LPENSETR register fields */
+#define RCC_MP_AHB6LPENSETR_MCELPEN    BIT(1)
+#define RCC_MP_AHB6LPENSETR_ETH1CKLPEN BIT(7)
+#define RCC_MP_AHB6LPENSETR_ETH1TXLPEN BIT(8)
+#define RCC_MP_AHB6LPENSETR_ETH1RXLPEN BIT(9)
+#define RCC_MP_AHB6LPENSETR_ETH1MACLPEN        BIT(10)
+#define RCC_MP_AHB6LPENSETR_ETH1STPEN  BIT(11)
+#define RCC_MP_AHB6LPENSETR_FMCLPEN    BIT(12)
+#define RCC_MP_AHB6LPENSETR_QSPILPEN   BIT(14)
+#define RCC_MP_AHB6LPENSETR_SDMMC1LPEN BIT(16)
+#define RCC_MP_AHB6LPENSETR_SDMMC2LPEN BIT(17)
+#define RCC_MP_AHB6LPENSETR_CRC1LPEN   BIT(20)
+#define RCC_MP_AHB6LPENSETR_USBHLPEN   BIT(24)
+#define RCC_MP_AHB6LPENSETR_ETH2CKLPEN BIT(27)
+#define RCC_MP_AHB6LPENSETR_ETH2TXLPEN BIT(28)
+#define RCC_MP_AHB6LPENSETR_ETH2RXLPEN BIT(29)
+#define RCC_MP_AHB6LPENSETR_ETH2MACLPEN        BIT(30)
+#define RCC_MP_AHB6LPENSETR_ETH2STPEN  BIT(31)
+
+/* RCC_MP_AHB6LPENCLRR register fields */
+#define RCC_MP_AHB6LPENCLRR_MCELPEN    BIT(1)
+#define RCC_MP_AHB6LPENCLRR_ETH1CKLPEN BIT(7)
+#define RCC_MP_AHB6LPENCLRR_ETH1TXLPEN BIT(8)
+#define RCC_MP_AHB6LPENCLRR_ETH1RXLPEN BIT(9)
+#define RCC_MP_AHB6LPENCLRR_ETH1MACLPEN        BIT(10)
+#define RCC_MP_AHB6LPENCLRR_ETH1STPEN  BIT(11)
+#define RCC_MP_AHB6LPENCLRR_FMCLPEN    BIT(12)
+#define RCC_MP_AHB6LPENCLRR_QSPILPEN   BIT(14)
+#define RCC_MP_AHB6LPENCLRR_SDMMC1LPEN BIT(16)
+#define RCC_MP_AHB6LPENCLRR_SDMMC2LPEN BIT(17)
+#define RCC_MP_AHB6LPENCLRR_CRC1LPEN   BIT(20)
+#define RCC_MP_AHB6LPENCLRR_USBHLPEN   BIT(24)
+#define RCC_MP_AHB6LPENCLRR_ETH2CKLPEN BIT(27)
+#define RCC_MP_AHB6LPENCLRR_ETH2TXLPEN BIT(28)
+#define RCC_MP_AHB6LPENCLRR_ETH2RXLPEN BIT(29)
+#define RCC_MP_AHB6LPENCLRR_ETH2MACLPEN        BIT(30)
+#define RCC_MP_AHB6LPENCLRR_ETH2STPEN  BIT(31)
+
+/* RCC_MP_S_AHB6LPENSETR register fields */
+#define RCC_MP_S_AHB6LPENSETR_MDMALPEN BIT(0)
+
+/* RCC_MP_S_AHB6LPENCLRR register fields */
+#define RCC_MP_S_AHB6LPENCLRR_MDMALPEN BIT(0)
+
+/* RCC_MP_NS_AHB6LPENSETR register fields */
+#define RCC_MP_NS_AHB6LPENSETR_MDMALPEN        BIT(0)
+
+/* RCC_MP_NS_AHB6LPENCLRR register fields */
+#define RCC_MP_NS_AHB6LPENCLRR_MDMALPEN        BIT(0)
+
+/* RCC_MP_S_AXIMLPENSETR register fields */
+#define RCC_MP_S_AXIMLPENSETR_SYSRAMLPEN BIT(0)
+
+/* RCC_MP_S_AXIMLPENCLRR register fields */
+#define RCC_MP_S_AXIMLPENCLRR_SYSRAMLPEN BIT(0)
+
+/* RCC_MP_NS_AXIMLPENSETR register fields */
+#define RCC_MP_NS_AXIMLPENSETR_SYSRAMLPEN BIT(0)
+
+/* RCC_MP_NS_AXIMLPENCLRR register fields */
+#define RCC_MP_NS_AXIMLPENCLRR_SYSRAMLPEN BIT(0)
+
+/* RCC_MP_MLAHBLPENSETR register fields */
+#define RCC_MP_MLAHBLPENSETR_SRAM1LPEN BIT(0)
+#define RCC_MP_MLAHBLPENSETR_SRAM2LPEN BIT(1)
+#define RCC_MP_MLAHBLPENSETR_SRAM3LPEN BIT(2)
+
+/* RCC_MP_MLAHBLPENCLRR register fields */
+#define RCC_MP_MLAHBLPENCLRR_SRAM1LPEN BIT(0)
+#define RCC_MP_MLAHBLPENCLRR_SRAM2LPEN BIT(1)
+#define RCC_MP_MLAHBLPENCLRR_SRAM3LPEN BIT(2)
+
+/* RCC_APB3SECSR register fields */
+#define RCC_APB3SECSR_LPTIM2SECF       0
+#define RCC_APB3SECSR_LPTIM3SECF       1
+#define RCC_APB3SECSR_VREFSECF         13
+
+/* RCC_APB4SECSR register fields */
+#define RCC_APB4SECSR_DCMIPPSECF       1
+#define RCC_APB4SECSR_USBPHYSECF       16
+
+/* RCC_APB5SECSR register fields */
+#define RCC_APB5SECSR_RTCSECF          8
+#define RCC_APB5SECSR_TZCSECF          11
+#define RCC_APB5SECSR_ETZPCSECF                13
+#define RCC_APB5SECSR_IWDG1SECF                15
+#define RCC_APB5SECSR_BSECSECF         16
+#define RCC_APB5SECSR_STGENCSECF_MASK  GENMASK(21, 20)
+#define RCC_APB5SECSR_STGENCSECF       20
+#define RCC_APB5SECSR_STGENROSECF      21
+
+/* RCC_APB6SECSR register fields */
+#define RCC_APB6SECSR_USART1SECF        0
+#define RCC_APB6SECSR_USART2SECF       1
+#define RCC_APB6SECSR_SPI4SECF         2
+#define RCC_APB6SECSR_SPI5SECF         3
+#define RCC_APB6SECSR_I2C3SECF         4
+#define RCC_APB6SECSR_I2C4SECF         5
+#define RCC_APB6SECSR_I2C5SECF         6
+#define RCC_APB6SECSR_TIM12SECF                7
+#define RCC_APB6SECSR_TIM13SECF                8
+#define RCC_APB6SECSR_TIM14SECF                9
+#define RCC_APB6SECSR_TIM15SECF                10
+#define RCC_APB6SECSR_TIM16SECF                11
+#define RCC_APB6SECSR_TIM17SECF                12
+
+/* RCC_AHB2SECSR register fields */
+#define RCC_AHB2SECSR_DMA3SECF         3
+#define RCC_AHB2SECSR_DMAMUX2SECF      4
+#define RCC_AHB2SECSR_ADC1SECF         5
+#define RCC_AHB2SECSR_ADC2SECF         6
+#define RCC_AHB2SECSR_USBOSECF         8
+
+/* RCC_AHB4SECSR register fields */
+#define RCC_AHB4SECSR_TSCSECF          15
+
+/* RCC_AHB5SECSR register fields */
+#define RCC_AHB5SECSR_PKASECF          2
+#define RCC_AHB5SECSR_SAESSECF         3
+#define RCC_AHB5SECSR_CRYP1SECF                4
+#define RCC_AHB5SECSR_HASH1SECF                5
+#define RCC_AHB5SECSR_RNG1SECF         6
+#define RCC_AHB5SECSR_BKPSRAMSECF      8
+
+/* RCC_AHB6SECSR register fields */
+#define RCC_AHB6SECSR_MCESECF          1
+#define RCC_AHB6SECSR_FMCSECF          12
+#define RCC_AHB6SECSR_QSPISECF         14
+#define RCC_AHB6SECSR_SDMMC1SECF       16
+#define RCC_AHB6SECSR_SDMMC2SECF       17
+
+#define RCC_AHB6SECSR_ETH1SECF_MASK    GENMASK(11, 7)
+#define RCC_AHB6SECSR_ETH2SECF_MASK    GENMASK(31, 27)
+#define RCC_AHB6SECSR_ETH1SECF_SHIFT   7
+#define RCC_AHB6SECSR_ETH2SECF_SHIFT   27
+
+#define RCC_AHB6SECSR_ETH1CKSECF       7
+#define RCC_AHB6SECSR_ETH1TXSECF       8
+#define RCC_AHB6SECSR_ETH1RXSECF       9
+#define RCC_AHB6SECSR_ETH1MACSECF      10
+#define RCC_AHB6SECSR_ETH1STPSECF      11
+
+#define RCC_AHB6SECSR_ETH2CKSECF       27
+#define RCC_AHB6SECSR_ETH2TXSECF       28
+#define RCC_AHB6SECSR_ETH2RXSECF       29
+#define RCC_AHB6SECSR_ETH2MACSECF      30
+#define RCC_AHB6SECSR_ETH2STPSECF      31
+
+/* RCC_VERR register fields */
+#define RCC_VERR_MINREV_MASK           GENMASK(3, 0)
+#define RCC_VERR_MAJREV_MASK           GENMASK(7, 4)
+#define RCC_VERR_MINREV_SHIFT          0
+#define RCC_VERR_MAJREV_SHIFT          4
+
+/* RCC_IDR register fields */
+#define RCC_IDR_ID_MASK                        GENMASK(31, 0)
+#define RCC_IDR_ID_SHIFT               0
+
+/* RCC_SIDR register fields */
+#define RCC_SIDR_SID_MASK              GENMASK(31, 0)
+#define RCC_SIDR_SID_SHIFT             0
+
+#endif /* STM32MP13_RCC_H */
+
index 712e103..29a8c71 100644 (file)
@@ -98,6 +98,8 @@ static SUNXI_CCU_GATE(r_apb1_ir_clk,  "r-apb1-ir",    "r-apb1",
                      0x1cc, BIT(0), 0);
 static SUNXI_CCU_GATE(r_apb1_w1_clk,   "r-apb1-w1",    "r-apb1",
                      0x1ec, BIT(0), 0);
+static SUNXI_CCU_GATE(r_apb1_rtc_clk,  "r-apb1-rtc",   "r-apb1",
+                     0x20c, BIT(0), CLK_IGNORE_UNUSED);
 
 /* Information of IR(RX) mod clock is gathered from BSP source code */
 static const char * const r_mod0_default_parents[] = { "osc32k", "osc24M" };
@@ -147,6 +149,7 @@ static struct ccu_common *sun50i_h616_r_ccu_clks[] = {
        &r_apb2_i2c_clk.common,
        &r_apb2_rsb_clk.common,
        &r_apb1_ir_clk.common,
+       &r_apb1_rtc_clk.common,
        &ir_clk.common,
 };
 
@@ -164,6 +167,7 @@ static struct clk_hw_onecell_data sun50i_h6_r_hw_clks = {
                [CLK_R_APB2_RSB]        = &r_apb2_rsb_clk.common.hw,
                [CLK_R_APB1_IR]         = &r_apb1_ir_clk.common.hw,
                [CLK_R_APB1_W1]         = &r_apb1_w1_clk.common.hw,
+               [CLK_R_APB1_RTC]        = &r_apb1_rtc_clk.common.hw,
                [CLK_IR]                = &ir_clk.common.hw,
                [CLK_W1]                = &w1_clk.common.hw,
        },
@@ -179,6 +183,7 @@ static struct clk_hw_onecell_data sun50i_h616_r_hw_clks = {
                [CLK_R_APB2_I2C]        = &r_apb2_i2c_clk.common.hw,
                [CLK_R_APB2_RSB]        = &r_apb2_rsb_clk.common.hw,
                [CLK_R_APB1_IR]         = &r_apb1_ir_clk.common.hw,
+               [CLK_R_APB1_RTC]        = &r_apb1_rtc_clk.common.hw,
                [CLK_IR]                = &ir_clk.common.hw,
        },
        .num    = CLK_NUMBER,
index 7e290b8..10e9b66 100644 (file)
@@ -14,6 +14,6 @@
 
 #define CLK_R_APB2     3
 
-#define CLK_NUMBER     (CLK_R_APB2_RSB + 1)
+#define CLK_NUMBER     (CLK_R_APB1_RTC + 1)
 
 #endif /* _CCU_SUN50I_H6_R_H */
index 49a2474..21e9185 100644 (file)
@@ -704,6 +704,13 @@ static CLK_FIXED_FACTOR_HWS(pll_periph0_2x_clk, "pll-periph0-2x",
                            pll_periph0_parents,
                            1, 2, 0);
 
+static const struct clk_hw *pll_periph0_2x_hws[] = {
+       &pll_periph0_2x_clk.hw
+};
+
+static CLK_FIXED_FACTOR_HWS(pll_system_32k_clk, "pll-system-32k",
+                           pll_periph0_2x_hws, 36621, 1, 0);
+
 static const struct clk_hw *pll_periph1_parents[] = {
        &pll_periph1_clk.common.hw
 };
@@ -852,6 +859,7 @@ static struct clk_hw_onecell_data sun50i_h616_hw_clks = {
                [CLK_PLL_DDR1]          = &pll_ddr1_clk.common.hw,
                [CLK_PLL_PERIPH0]       = &pll_periph0_clk.common.hw,
                [CLK_PLL_PERIPH0_2X]    = &pll_periph0_2x_clk.hw,
+               [CLK_PLL_SYSTEM_32K]    = &pll_system_32k_clk.hw,
                [CLK_PLL_PERIPH1]       = &pll_periph1_clk.common.hw,
                [CLK_PLL_PERIPH1_2X]    = &pll_periph1_2x_clk.hw,
                [CLK_PLL_GPU]           = &pll_gpu_clk.common.hw,
index dd671b4..fdd2f4d 100644 (file)
@@ -51,6 +51,6 @@
 
 #define CLK_BUS_DRAM           56
 
-#define CLK_NUMBER             (CLK_BUS_HDCP + 1)
+#define CLK_NUMBER             (CLK_PLL_SYSTEM_32K + 1)
 
 #endif /* _CCU_SUN50I_H616_H_ */
index 6ecf18f..3748a39 100644 (file)
@@ -164,15 +164,18 @@ static unsigned long tegra_bpmp_clk_recalc_rate(struct clk_hw *hw,
        return response.rate;
 }
 
-static long tegra_bpmp_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                                     unsigned long *parent_rate)
+static int tegra_bpmp_clk_determine_rate(struct clk_hw *hw,
+                                        struct clk_rate_request *rate_req)
 {
        struct tegra_bpmp_clk *clk = to_tegra_bpmp_clk(hw);
        struct cmd_clk_round_rate_response response;
        struct cmd_clk_round_rate_request request;
        struct tegra_bpmp_clk_message msg;
+       unsigned long rate;
        int err;
 
+       rate = min(max(rate_req->rate, rate_req->min_rate), rate_req->max_rate);
+
        memset(&request, 0, sizeof(request));
        request.rate = min_t(u64, rate, S64_MAX);
 
@@ -188,7 +191,9 @@ static long tegra_bpmp_clk_round_rate(struct clk_hw *hw, unsigned long rate,
        if (err < 0)
                return err;
 
-       return response.rate;
+       rate_req->rate = (unsigned long)response.rate;
+
+       return 0;
 }
 
 static int tegra_bpmp_clk_set_parent(struct clk_hw *hw, u8 index)
@@ -290,7 +295,7 @@ static const struct clk_ops tegra_bpmp_clk_rate_ops = {
        .unprepare = tegra_bpmp_clk_unprepare,
        .is_prepared = tegra_bpmp_clk_is_prepared,
        .recalc_rate = tegra_bpmp_clk_recalc_rate,
-       .round_rate = tegra_bpmp_clk_round_rate,
+       .determine_rate = tegra_bpmp_clk_determine_rate,
        .set_rate = tegra_bpmp_clk_set_rate,
 };
 
@@ -299,7 +304,7 @@ static const struct clk_ops tegra_bpmp_clk_mux_rate_ops = {
        .unprepare = tegra_bpmp_clk_unprepare,
        .is_prepared = tegra_bpmp_clk_is_prepared,
        .recalc_rate = tegra_bpmp_clk_recalc_rate,
-       .round_rate = tegra_bpmp_clk_round_rate,
+       .determine_rate = tegra_bpmp_clk_determine_rate,
        .set_parent = tegra_bpmp_clk_set_parent,
        .get_parent = tegra_bpmp_clk_get_parent,
        .set_rate = tegra_bpmp_clk_set_rate,
@@ -448,15 +453,29 @@ static int tegra_bpmp_probe_clocks(struct tegra_bpmp *bpmp,
        return count;
 }
 
+static unsigned int
+tegra_bpmp_clk_id_to_index(const struct tegra_bpmp_clk_info *clocks,
+                          unsigned int num_clocks, unsigned int id)
+{
+       unsigned int i;
+
+       for (i = 0; i < num_clocks; i++)
+               if (clocks[i].id == id)
+                       return i;
+
+       return UINT_MAX;
+}
+
 static const struct tegra_bpmp_clk_info *
 tegra_bpmp_clk_find(const struct tegra_bpmp_clk_info *clocks,
                    unsigned int num_clocks, unsigned int id)
 {
        unsigned int i;
 
-       for (i = 0; i < num_clocks; i++)
-               if (clocks[i].id == id)
-                       return &clocks[i];
+       i = tegra_bpmp_clk_id_to_index(clocks, num_clocks, id);
+
+       if (i < num_clocks)
+               return &clocks[i];
 
        return NULL;
 }
@@ -539,31 +558,57 @@ tegra_bpmp_clk_register(struct tegra_bpmp *bpmp,
        return clk;
 }
 
+static void tegra_bpmp_register_clocks_one(struct tegra_bpmp *bpmp,
+                                          struct tegra_bpmp_clk_info *infos,
+                                          unsigned int i,
+                                          unsigned int count)
+{
+       unsigned int j;
+       struct tegra_bpmp_clk_info *info;
+       struct tegra_bpmp_clk *clk;
+
+       if (bpmp->clocks[i]) {
+               /* already registered */
+               return;
+       }
+
+       info = &infos[i];
+       for (j = 0; j < info->num_parents; ++j) {
+               unsigned int p_id = info->parents[j];
+               unsigned int p_i = tegra_bpmp_clk_id_to_index(infos, count,
+                                                             p_id);
+               if (p_i < count)
+                       tegra_bpmp_register_clocks_one(bpmp, infos, p_i, count);
+       }
+
+       clk = tegra_bpmp_clk_register(bpmp, info, infos, count);
+       if (IS_ERR(clk)) {
+               dev_err(bpmp->dev,
+                       "failed to register clock %u (%s): %ld\n",
+                       info->id, info->name, PTR_ERR(clk));
+               /* intentionally store the error pointer to
+                * bpmp->clocks[i] to avoid re-attempting the
+                * registration later
+                */
+       }
+
+       bpmp->clocks[i] = clk;
+}
+
 static int tegra_bpmp_register_clocks(struct tegra_bpmp *bpmp,
                                      struct tegra_bpmp_clk_info *infos,
                                      unsigned int count)
 {
-       struct tegra_bpmp_clk *clk;
        unsigned int i;
 
        bpmp->num_clocks = count;
 
-       bpmp->clocks = devm_kcalloc(bpmp->dev, count, sizeof(clk), GFP_KERNEL);
+       bpmp->clocks = devm_kcalloc(bpmp->dev, count, sizeof(struct tegra_bpmp_clk), GFP_KERNEL);
        if (!bpmp->clocks)
                return -ENOMEM;
 
        for (i = 0; i < count; i++) {
-               struct tegra_bpmp_clk_info *info = &infos[i];
-
-               clk = tegra_bpmp_clk_register(bpmp, info, infos, count);
-               if (IS_ERR(clk)) {
-                       dev_err(bpmp->dev,
-                               "failed to register clock %u (%s): %ld\n",
-                               info->id, info->name, PTR_ERR(clk));
-                       continue;
-               }
-
-               bpmp->clocks[i] = clk;
+               tegra_bpmp_register_clocks_one(bpmp, infos, i, count);
        }
 
        return 0;
index 6144447..4143392 100644 (file)
@@ -271,6 +271,7 @@ struct tegra_dfll {
        struct clk                      *ref_clk;
        struct clk                      *i2c_clk;
        struct clk                      *dfll_clk;
+       struct reset_control            *dfll_rst;
        struct reset_control            *dvco_rst;
        unsigned long                   ref_rate;
        unsigned long                   i2c_clk_rate;
@@ -666,7 +667,7 @@ static int dfll_force_output(struct tegra_dfll *td, unsigned int out_sel)
 }
 
 /**
- * dfll_load_lut - load the voltage lookup table
+ * dfll_load_i2c_lut - load the voltage lookup table
  * @td: struct tegra_dfll *
  *
  * Load the voltage-to-PMIC register value lookup table into the DFLL
@@ -897,7 +898,7 @@ static void dfll_set_frequency_request(struct tegra_dfll *td,
 }
 
 /**
- * tegra_dfll_request_rate - set the next rate for the DFLL to tune to
+ * dfll_request_rate - set the next rate for the DFLL to tune to
  * @td: DFLL instance
  * @rate: clock rate to target
  *
@@ -1005,7 +1006,7 @@ static void dfll_set_open_loop_config(struct tegra_dfll *td)
 }
 
 /**
- * tegra_dfll_lock - switch from open-loop to closed-loop mode
+ * dfll_lock - switch from open-loop to closed-loop mode
  * @td: DFLL instance
  *
  * Switch from OPEN_LOOP state to CLOSED_LOOP state. Returns 0 upon success,
@@ -1046,7 +1047,7 @@ static int dfll_lock(struct tegra_dfll *td)
 }
 
 /**
- * tegra_dfll_unlock - switch from closed-loop to open-loop mode
+ * dfll_unlock - switch from closed-loop to open-loop mode
  * @td: DFLL instance
  *
  * Switch from CLOSED_LOOP state to OPEN_LOOP state. Returns 0 upon success,
@@ -1464,6 +1465,7 @@ static int dfll_init(struct tegra_dfll *td)
                return -EINVAL;
        }
 
+       reset_control_deassert(td->dfll_rst);
        reset_control_deassert(td->dvco_rst);
 
        ret = clk_prepare(td->ref_clk);
@@ -1509,6 +1511,7 @@ di_err1:
        clk_unprepare(td->ref_clk);
 
        reset_control_assert(td->dvco_rst);
+       reset_control_assert(td->dfll_rst);
 
        return ret;
 }
@@ -1530,6 +1533,7 @@ int tegra_dfll_suspend(struct device *dev)
        }
 
        reset_control_assert(td->dvco_rst);
+       reset_control_assert(td->dfll_rst);
 
        return 0;
 }
@@ -1548,6 +1552,7 @@ int tegra_dfll_resume(struct device *dev)
 {
        struct tegra_dfll *td = dev_get_drvdata(dev);
 
+       reset_control_deassert(td->dfll_rst);
        reset_control_deassert(td->dvco_rst);
 
        pm_runtime_get_sync(td->dev);
@@ -1951,6 +1956,12 @@ int tegra_dfll_register(struct platform_device *pdev,
 
        td->soc = soc;
 
+       td->dfll_rst = devm_reset_control_get_optional(td->dev, "dfll");
+       if (IS_ERR(td->dfll_rst)) {
+               dev_err(td->dev, "couldn't get dfll reset\n");
+               return PTR_ERR(td->dfll_rst);
+       }
+
        td->dvco_rst = devm_reset_control_get(td->dev, "dvco");
        if (IS_ERR(td->dvco_rst)) {
                dev_err(td->dev, "couldn't get dvco reset\n");
@@ -2087,6 +2098,7 @@ struct tegra_dfll_soc_data *tegra_dfll_unregister(struct platform_device *pdev)
        clk_unprepare(td->i2c_clk);
 
        reset_control_assert(td->dvco_rst);
+       reset_control_assert(td->dfll_rst);
 
        return td->soc;
 }
index 064066e..617360e 100644 (file)
@@ -232,8 +232,7 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec,
                                              void *data)
 {
        struct omap_clkctrl_provider *provider = data;
-       struct omap_clkctrl_clk *entry;
-       bool found = false;
+       struct omap_clkctrl_clk *entry = NULL, *iter;
 
        if (clkspec->args_count != 2)
                return ERR_PTR(-EINVAL);
@@ -241,15 +240,15 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec,
        pr_debug("%s: looking for %x:%x\n", __func__,
                 clkspec->args[0], clkspec->args[1]);
 
-       list_for_each_entry(entry, &provider->clocks, node) {
-               if (entry->reg_offset == clkspec->args[0] &&
-                   entry->bit_offset == clkspec->args[1]) {
-                       found = true;
+       list_for_each_entry(iter, &provider->clocks, node) {
+               if (iter->reg_offset == clkspec->args[0] &&
+                   iter->bit_offset == clkspec->args[1]) {
+                       entry = iter;
                        break;
                }
        }
 
-       if (!found)
+       if (!entry)
                return ERR_PTR(-EINVAL);
 
        return entry->clk;
index 8d60319..779b990 100644 (file)
@@ -255,7 +255,7 @@ int __init ti_clk_add_component(struct device_node *node, struct clk_hw *hw,
                return -EINVAL;
        }
 
-       parent_names = kzalloc((sizeof(char *) * num_parents), GFP_KERNEL);
+       parent_names = kcalloc(num_parents, sizeof(char *), GFP_KERNEL);
        if (!parent_names)
                return -ENOMEM;
 
index 937b6bb..4deb37f 100644 (file)
 #include "clk.h"
 
 #define to_clk_prcmu(_hw) container_of(_hw, struct clk_prcmu, hw)
+#define to_clk_prcmu_clkout(_hw) container_of(_hw, struct clk_prcmu_clkout, hw)
 
 struct clk_prcmu {
        struct clk_hw hw;
        u8 cg_sel;
-       int is_prepared;
-       int is_enabled;
        int opp_requested;
 };
 
+struct clk_prcmu_clkout {
+       struct clk_hw hw;
+       u8 clkout_id;
+       u8 source;
+       u8 divider;
+};
+
 /* PRCMU clock operations. */
 
 static int clk_prcmu_prepare(struct clk_hw *hw)
 {
-       int ret;
        struct clk_prcmu *clk = to_clk_prcmu(hw);
 
-       ret = prcmu_request_clock(clk->cg_sel, true);
-       if (!ret)
-               clk->is_prepared = 1;
-
-       return ret;
+       return prcmu_request_clock(clk->cg_sel, true);
 }
 
 static void clk_prcmu_unprepare(struct clk_hw *hw)
@@ -42,34 +43,7 @@ static void clk_prcmu_unprepare(struct clk_hw *hw)
        struct clk_prcmu *clk = to_clk_prcmu(hw);
        if (prcmu_request_clock(clk->cg_sel, false))
                pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
-                       clk_hw_get_name(hw));
-       else
-               clk->is_prepared = 0;
-}
-
-static int clk_prcmu_is_prepared(struct clk_hw *hw)
-{
-       struct clk_prcmu *clk = to_clk_prcmu(hw);
-       return clk->is_prepared;
-}
-
-static int clk_prcmu_enable(struct clk_hw *hw)
-{
-       struct clk_prcmu *clk = to_clk_prcmu(hw);
-       clk->is_enabled = 1;
-       return 0;
-}
-
-static void clk_prcmu_disable(struct clk_hw *hw)
-{
-       struct clk_prcmu *clk = to_clk_prcmu(hw);
-       clk->is_enabled = 0;
-}
-
-static int clk_prcmu_is_enabled(struct clk_hw *hw)
-{
-       struct clk_prcmu *clk = to_clk_prcmu(hw);
-       return clk->is_enabled;
+                      clk_hw_get_name(hw));
 }
 
 static unsigned long clk_prcmu_recalc_rate(struct clk_hw *hw,
@@ -118,7 +92,6 @@ static int clk_prcmu_opp_prepare(struct clk_hw *hw)
                return err;
        }
 
-       clk->is_prepared = 1;
        return 0;
 }
 
@@ -137,8 +110,6 @@ static void clk_prcmu_opp_unprepare(struct clk_hw *hw)
                                        (char *)clk_hw_get_name(hw));
                clk->opp_requested = 0;
        }
-
-       clk->is_prepared = 0;
 }
 
 static int clk_prcmu_opp_volt_prepare(struct clk_hw *hw)
@@ -163,7 +134,6 @@ static int clk_prcmu_opp_volt_prepare(struct clk_hw *hw)
                return err;
        }
 
-       clk->is_prepared = 1;
        return 0;
 }
 
@@ -181,17 +151,11 @@ static void clk_prcmu_opp_volt_unprepare(struct clk_hw *hw)
                prcmu_request_ape_opp_100_voltage(false);
                clk->opp_requested = 0;
        }
-
-       clk->is_prepared = 0;
 }
 
 static const struct clk_ops clk_prcmu_scalable_ops = {
        .prepare = clk_prcmu_prepare,
        .unprepare = clk_prcmu_unprepare,
-       .is_prepared = clk_prcmu_is_prepared,
-       .enable = clk_prcmu_enable,
-       .disable = clk_prcmu_disable,
-       .is_enabled = clk_prcmu_is_enabled,
        .recalc_rate = clk_prcmu_recalc_rate,
        .round_rate = clk_prcmu_round_rate,
        .set_rate = clk_prcmu_set_rate,
@@ -200,57 +164,43 @@ static const struct clk_ops clk_prcmu_scalable_ops = {
 static const struct clk_ops clk_prcmu_gate_ops = {
        .prepare = clk_prcmu_prepare,
        .unprepare = clk_prcmu_unprepare,
-       .is_prepared = clk_prcmu_is_prepared,
-       .enable = clk_prcmu_enable,
-       .disable = clk_prcmu_disable,
-       .is_enabled = clk_prcmu_is_enabled,
        .recalc_rate = clk_prcmu_recalc_rate,
 };
 
 static const struct clk_ops clk_prcmu_scalable_rate_ops = {
-       .is_enabled = clk_prcmu_is_enabled,
        .recalc_rate = clk_prcmu_recalc_rate,
        .round_rate = clk_prcmu_round_rate,
        .set_rate = clk_prcmu_set_rate,
 };
 
 static const struct clk_ops clk_prcmu_rate_ops = {
-       .is_enabled = clk_prcmu_is_enabled,
        .recalc_rate = clk_prcmu_recalc_rate,
 };
 
 static const struct clk_ops clk_prcmu_opp_gate_ops = {
        .prepare = clk_prcmu_opp_prepare,
        .unprepare = clk_prcmu_opp_unprepare,
-       .is_prepared = clk_prcmu_is_prepared,
-       .enable = clk_prcmu_enable,
-       .disable = clk_prcmu_disable,
-       .is_enabled = clk_prcmu_is_enabled,
        .recalc_rate = clk_prcmu_recalc_rate,
 };
 
 static const struct clk_ops clk_prcmu_opp_volt_scalable_ops = {
        .prepare = clk_prcmu_opp_volt_prepare,
        .unprepare = clk_prcmu_opp_volt_unprepare,
-       .is_prepared = clk_prcmu_is_prepared,
-       .enable = clk_prcmu_enable,
-       .disable = clk_prcmu_disable,
-       .is_enabled = clk_prcmu_is_enabled,
        .recalc_rate = clk_prcmu_recalc_rate,
        .round_rate = clk_prcmu_round_rate,
        .set_rate = clk_prcmu_set_rate,
 };
 
-static struct clk *clk_reg_prcmu(const char *name,
-                                const char *parent_name,
-                                u8 cg_sel,
-                                unsigned long rate,
-                                unsigned long flags,
-                                const struct clk_ops *clk_prcmu_ops)
+static struct clk_hw *clk_reg_prcmu(const char *name,
+                                   const char *parent_name,
+                                   u8 cg_sel,
+                                   unsigned long rate,
+                                   unsigned long flags,
+                                   const struct clk_ops *clk_prcmu_ops)
 {
        struct clk_prcmu *clk;
        struct clk_init_data clk_prcmu_init;
-       struct clk *clk_reg;
+       int ret;
 
        if (!name) {
                pr_err("clk_prcmu: %s invalid arguments passed\n", __func__);
@@ -262,8 +212,6 @@ static struct clk *clk_reg_prcmu(const char *name,
                return ERR_PTR(-ENOMEM);
 
        clk->cg_sel = cg_sel;
-       clk->is_prepared = 1;
-       clk->is_enabled = 1;
        clk->opp_requested = 0;
        /* "rate" can be used for changing the initial frequency */
        if (rate)
@@ -276,11 +224,11 @@ static struct clk *clk_reg_prcmu(const char *name,
        clk_prcmu_init.num_parents = (parent_name ? 1 : 0);
        clk->hw.init = &clk_prcmu_init;
 
-       clk_reg = clk_register(NULL, &clk->hw);
-       if (IS_ERR_OR_NULL(clk_reg))
+       ret = clk_hw_register(NULL, &clk->hw);
+       if (ret)
                goto free_clk;
 
-       return clk_reg;
+       return &clk->hw;
 
 free_clk:
        kfree(clk);
@@ -288,59 +236,165 @@ free_clk:
        return ERR_PTR(-ENOMEM);
 }
 
-struct clk *clk_reg_prcmu_scalable(const char *name,
-                                  const char *parent_name,
-                                  u8 cg_sel,
-                                  unsigned long rate,
-                                  unsigned long flags)
+struct clk_hw *clk_reg_prcmu_scalable(const char *name,
+                                     const char *parent_name,
+                                     u8 cg_sel,
+                                     unsigned long rate,
+                                     unsigned long flags)
 {
        return clk_reg_prcmu(name, parent_name, cg_sel, rate, flags,
                        &clk_prcmu_scalable_ops);
 }
 
-struct clk *clk_reg_prcmu_gate(const char *name,
-                              const char *parent_name,
-                              u8 cg_sel,
-                              unsigned long flags)
+struct clk_hw *clk_reg_prcmu_gate(const char *name,
+                                 const char *parent_name,
+                                 u8 cg_sel,
+                                 unsigned long flags)
 {
        return clk_reg_prcmu(name, parent_name, cg_sel, 0, flags,
                        &clk_prcmu_gate_ops);
 }
 
-struct clk *clk_reg_prcmu_scalable_rate(const char *name,
-                                       const char *parent_name,
-                                       u8 cg_sel,
-                                       unsigned long rate,
-                                       unsigned long flags)
+struct clk_hw *clk_reg_prcmu_scalable_rate(const char *name,
+                                          const char *parent_name,
+                                          u8 cg_sel,
+                                          unsigned long rate,
+                                          unsigned long flags)
 {
        return clk_reg_prcmu(name, parent_name, cg_sel, rate, flags,
                        &clk_prcmu_scalable_rate_ops);
 }
 
-struct clk *clk_reg_prcmu_rate(const char *name,
-                              const char *parent_name,
-                              u8 cg_sel,
-                              unsigned long flags)
+struct clk_hw *clk_reg_prcmu_rate(const char *name,
+                                 const char *parent_name,
+                                 u8 cg_sel,
+                                 unsigned long flags)
 {
        return clk_reg_prcmu(name, parent_name, cg_sel, 0, flags,
                        &clk_prcmu_rate_ops);
 }
 
-struct clk *clk_reg_prcmu_opp_gate(const char *name,
-                                  const char *parent_name,
-                                  u8 cg_sel,
-                                  unsigned long flags)
+struct clk_hw *clk_reg_prcmu_opp_gate(const char *name,
+                                     const char *parent_name,
+                                     u8 cg_sel,
+                                     unsigned long flags)
 {
        return clk_reg_prcmu(name, parent_name, cg_sel, 0, flags,
                        &clk_prcmu_opp_gate_ops);
 }
 
-struct clk *clk_reg_prcmu_opp_volt_scalable(const char *name,
-                                           const char *parent_name,
-                                           u8 cg_sel,
-                                           unsigned long rate,
-                                           unsigned long flags)
+struct clk_hw *clk_reg_prcmu_opp_volt_scalable(const char *name,
+                                              const char *parent_name,
+                                              u8 cg_sel,
+                                              unsigned long rate,
+                                              unsigned long flags)
 {
        return clk_reg_prcmu(name, parent_name, cg_sel, rate, flags,
                        &clk_prcmu_opp_volt_scalable_ops);
 }
+
+/* The clkout (external) clock is special and need special ops */
+
+static int clk_prcmu_clkout_prepare(struct clk_hw *hw)
+{
+       struct clk_prcmu_clkout *clk = to_clk_prcmu_clkout(hw);
+
+       return prcmu_config_clkout(clk->clkout_id, clk->source, clk->divider);
+}
+
+static void clk_prcmu_clkout_unprepare(struct clk_hw *hw)
+{
+       struct clk_prcmu_clkout *clk = to_clk_prcmu_clkout(hw);
+       int ret;
+
+       /* The clkout clock is disabled by dividing by 0 */
+       ret = prcmu_config_clkout(clk->clkout_id, clk->source, 0);
+       if (ret)
+               pr_err("clk_prcmu: %s failed to disable %s\n", __func__,
+                      clk_hw_get_name(hw));
+}
+
+static unsigned long clk_prcmu_clkout_recalc_rate(struct clk_hw *hw,
+                                                 unsigned long parent_rate)
+{
+       struct clk_prcmu_clkout *clk = to_clk_prcmu_clkout(hw);
+
+       return (parent_rate / clk->divider);
+}
+
+static u8 clk_prcmu_clkout_get_parent(struct clk_hw *hw)
+{
+       struct clk_prcmu_clkout *clk = to_clk_prcmu_clkout(hw);
+
+       return clk->source;
+}
+
+static int clk_prcmu_clkout_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk_prcmu_clkout *clk = to_clk_prcmu_clkout(hw);
+
+       clk->source = index;
+       /* Make sure the change reaches the hardware immediately */
+       if (clk_hw_is_prepared(hw))
+               return clk_prcmu_clkout_prepare(hw);
+       return 0;
+}
+
+static const struct clk_ops clk_prcmu_clkout_ops = {
+       .prepare = clk_prcmu_clkout_prepare,
+       .unprepare = clk_prcmu_clkout_unprepare,
+       .recalc_rate = clk_prcmu_clkout_recalc_rate,
+       .get_parent = clk_prcmu_clkout_get_parent,
+       .set_parent = clk_prcmu_clkout_set_parent,
+};
+
+struct clk_hw *clk_reg_prcmu_clkout(const char *name,
+                                   const char * const *parent_names,
+                                   int num_parents,
+                                   u8 source, u8 divider)
+
+{
+       struct clk_prcmu_clkout *clk;
+       struct clk_init_data clk_prcmu_clkout_init;
+       u8 clkout_id;
+       int ret;
+
+       if (!name) {
+               pr_err("clk_prcmu_clkout: %s invalid arguments passed\n", __func__);
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (!strcmp(name, "clkout1"))
+               clkout_id = 0;
+       else if (!strcmp(name, "clkout2"))
+               clkout_id = 1;
+       else {
+               pr_err("clk_prcmu_clkout: %s bad clock name\n", __func__);
+               return ERR_PTR(-EINVAL);
+       }
+
+       clk = kzalloc(sizeof(*clk), GFP_KERNEL);
+       if (!clk)
+               return ERR_PTR(-ENOMEM);
+
+       clk->clkout_id = clkout_id;
+       clk->source = source;
+       clk->divider = divider;
+
+       clk_prcmu_clkout_init.name = name;
+       clk_prcmu_clkout_init.ops = &clk_prcmu_clkout_ops;
+       clk_prcmu_clkout_init.flags = CLK_GET_RATE_NOCACHE;
+       clk_prcmu_clkout_init.parent_names = parent_names;
+       clk_prcmu_clkout_init.num_parents = num_parents;
+       clk->hw.init = &clk_prcmu_clkout_init;
+
+       ret = clk_hw_register(NULL, &clk->hw);
+       if (ret)
+               goto free_clkout;
+
+       return &clk->hw;
+free_clkout:
+       kfree(clk);
+       pr_err("clk_prcmu_clkout: %s failed to register clk\n", __func__);
+       return ERR_PTR(-ENOMEM);
+}
index 40cd9fc..91003cf 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/types.h>
 
 struct clk;
+struct clk_hw;
 
 struct clk *clk_reg_prcc_pclk(const char *name,
                              const char *parent_name,
@@ -26,38 +27,43 @@ struct clk *clk_reg_prcc_kclk(const char *name,
                              u32 cg_sel,
                              unsigned long flags);
 
-struct clk *clk_reg_prcmu_scalable(const char *name,
-                                  const char *parent_name,
-                                  u8 cg_sel,
-                                  unsigned long rate,
-                                  unsigned long flags);
-
-struct clk *clk_reg_prcmu_gate(const char *name,
-                              const char *parent_name,
-                              u8 cg_sel,
-                              unsigned long flags);
-
-struct clk *clk_reg_prcmu_scalable_rate(const char *name,
-                                       const char *parent_name,
-                                       u8 cg_sel,
-                                       unsigned long rate,
-                                       unsigned long flags);
-
-struct clk *clk_reg_prcmu_rate(const char *name,
-                              const char *parent_name,
-                              u8 cg_sel,
-                              unsigned long flags);
-
-struct clk *clk_reg_prcmu_opp_gate(const char *name,
-                                  const char *parent_name,
-                                  u8 cg_sel,
-                                  unsigned long flags);
-
-struct clk *clk_reg_prcmu_opp_volt_scalable(const char *name,
-                                           const char *parent_name,
-                                           u8 cg_sel,
-                                           unsigned long rate,
-                                           unsigned long flags);
+struct clk_hw *clk_reg_prcmu_scalable(const char *name,
+                                     const char *parent_name,
+                                     u8 cg_sel,
+                                     unsigned long rate,
+                                     unsigned long flags);
+
+struct clk_hw *clk_reg_prcmu_gate(const char *name,
+                                 const char *parent_name,
+                                 u8 cg_sel,
+                                 unsigned long flags);
+
+struct clk_hw *clk_reg_prcmu_scalable_rate(const char *name,
+                                          const char *parent_name,
+                                          u8 cg_sel,
+                                          unsigned long rate,
+                                          unsigned long flags);
+
+struct clk_hw *clk_reg_prcmu_rate(const char *name,
+                                 const char *parent_name,
+                                 u8 cg_sel,
+                                 unsigned long flags);
+
+struct clk_hw *clk_reg_prcmu_opp_gate(const char *name,
+                                     const char *parent_name,
+                                     u8 cg_sel,
+                                     unsigned long flags);
+
+struct clk_hw *clk_reg_prcmu_opp_volt_scalable(const char *name,
+                                              const char *parent_name,
+                                              u8 cg_sel,
+                                              unsigned long rate,
+                                              unsigned long flags);
+
+struct clk_hw *clk_reg_prcmu_clkout(const char *name,
+                                   const char * const *parent_names,
+                                   int num_parents,
+                                   u8 source, u8 divider);
 
 struct clk *clk_reg_sysctrl_gate(struct device *dev,
                                 const char *name,
index fcd5d04..f7e4894 100644 (file)
@@ -58,7 +58,7 @@ static void __iomem *u8500_prcc_reset_base(struct u8500_prcc_reset *ur,
        prcc_num = id / PRCC_PERIPHS_PER_CLUSTER;
        index = prcc_num_to_index(prcc_num);
 
-       if (index > ARRAY_SIZE(ur->base))
+       if (index >= ARRAY_SIZE(ur->base))
                return NULL;
 
        return ur->base[index];
index e86ed2e..8e2f6c6 100644 (file)
@@ -15,9 +15,9 @@
 #include "prcc.h"
 #include "reset-prcc.h"
 
-static struct clk *prcmu_clk[PRCMU_NUM_CLKS];
 static struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER];
 static struct clk *prcc_kclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER];
+static struct clk_hw *clkout_clk[2];
 
 #define PRCC_SHOW(clk, base, bit) \
        clk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit]
@@ -46,6 +46,82 @@ static struct clk *ux500_twocell_get(struct of_phandle_args *clkspec,
        return PRCC_SHOW(clk_data, base, bit);
 }
 
+static struct clk_hw_onecell_data u8500_prcmu_hw_clks = {
+       .hws = {
+               /*
+                * This assignment makes sure the dynamic array
+                * gets the right size.
+                */
+               [PRCMU_NUM_CLKS] = NULL,
+       },
+       .num = PRCMU_NUM_CLKS,
+};
+
+/* Essentially names for the first PRCMU_CLKSRC_* defines */
+static const char * const u8500_clkout_parents[] = {
+       "clk38m_to_clkgen",
+       "aclk",
+       /* Just called "sysclk" in documentation */
+       "ab8500_sysclk",
+       "lcdclk",
+       "sdmmcclk",
+       "tvclk",
+       "timclk",
+       /* CLK009 is not implemented, add it if you need it */
+       "clk009",
+};
+
+static struct clk_hw *ux500_clkout_get(struct of_phandle_args *clkspec,
+                                      void *data)
+{
+       u32 id, source, divider;
+       struct clk_hw *clkout;
+
+       if (clkspec->args_count != 3)
+               return  ERR_PTR(-EINVAL);
+
+       id = clkspec->args[0];
+       source = clkspec->args[1];
+       divider = clkspec->args[2];
+
+       if (id > 1) {
+               pr_err("%s: invalid clkout ID %d\n", __func__, id);
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (clkout_clk[id]) {
+               pr_info("%s: clkout%d already registered, not reconfiguring\n",
+                       __func__, id + 1);
+               return clkout_clk[id];
+       }
+
+       if (source > 7) {
+               pr_err("%s: invalid source ID %d\n", __func__, source);
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (divider == 0 || divider > 63) {
+               pr_err("%s: invalid divider %d\n", __func__, divider);
+               return ERR_PTR(-EINVAL);
+       }
+
+       pr_debug("registering clkout%d with source %d and divider %d\n",
+                id + 1, source, divider);
+
+       clkout = clk_reg_prcmu_clkout(id ? "clkout2" : "clkout1",
+                                     u8500_clkout_parents,
+                                     ARRAY_SIZE(u8500_clkout_parents),
+                                     source, divider);
+       if (IS_ERR(clkout)) {
+               pr_err("failed to register clkout%d\n",  id + 1);
+               return ERR_CAST(clkout);
+       }
+
+       clkout_clk[id] = clkout;
+
+       return clkout;
+}
+
 static void u8500_clk_init(struct device_node *np)
 {
        struct prcmu_fw_version *fw_version;
@@ -77,19 +153,29 @@ static void u8500_clk_init(struct device_node *np)
        }
 
        /* Clock sources */
-       clk = clk_reg_prcmu_gate("soc0_pll", NULL, PRCMU_PLLSOC0,
-                               CLK_IGNORE_UNUSED);
-       prcmu_clk[PRCMU_PLLSOC0] = clk;
+       u8500_prcmu_hw_clks.hws[PRCMU_PLLSOC0] =
+               clk_reg_prcmu_gate("soc0_pll", NULL, PRCMU_PLLSOC0,
+                                  CLK_IGNORE_UNUSED);
 
-       clk = clk_reg_prcmu_gate("soc1_pll", NULL, PRCMU_PLLSOC1,
-                               CLK_IGNORE_UNUSED);
-       prcmu_clk[PRCMU_PLLSOC1] = clk;
+       u8500_prcmu_hw_clks.hws[PRCMU_PLLSOC1] =
+               clk_reg_prcmu_gate("soc1_pll", NULL, PRCMU_PLLSOC1,
+                                  CLK_IGNORE_UNUSED);
 
-       clk = clk_reg_prcmu_gate("ddr_pll", NULL, PRCMU_PLLDDR,
-                               CLK_IGNORE_UNUSED);
-       prcmu_clk[PRCMU_PLLDDR] = clk;
+       u8500_prcmu_hw_clks.hws[PRCMU_PLLDDR] =
+               clk_reg_prcmu_gate("ddr_pll", NULL, PRCMU_PLLDDR,
+                                  CLK_IGNORE_UNUSED);
 
-       /* FIXME: Add sys, ulp and int clocks here. */
+       /*
+        * Read-only clocks that only return their current rate, only used
+        * as parents to other clocks and not visible in the device tree.
+        * clk38m_to_clkgen is the same as the SYSCLK, i.e. the root clock.
+        */
+       clk_reg_prcmu_rate("clk38m_to_clkgen", NULL, PRCMU_SYSCLK,
+                          CLK_IGNORE_UNUSED);
+       clk_reg_prcmu_rate("aclk", NULL, PRCMU_ACLK,
+                          CLK_IGNORE_UNUSED);
+
+       /* TODO: add CLK009 if needed */
 
        rtc_clk = clk_register_fixed_rate(NULL, "rtc32k", "NULL",
                                CLK_IGNORE_UNUSED,
@@ -113,146 +199,106 @@ static void u8500_clk_init(struct device_node *np)
        }
 
        if (sgaclk_parent)
-               clk = clk_reg_prcmu_gate("sgclk", sgaclk_parent,
-                                       PRCMU_SGACLK, 0);
+               u8500_prcmu_hw_clks.hws[PRCMU_SGACLK] =
+                       clk_reg_prcmu_gate("sgclk", sgaclk_parent,
+                                          PRCMU_SGACLK, 0);
        else
-               clk = clk_reg_prcmu_gate("sgclk", NULL, PRCMU_SGACLK, 0);
-       prcmu_clk[PRCMU_SGACLK] = clk;
-
-       clk = clk_reg_prcmu_gate("uartclk", NULL, PRCMU_UARTCLK, 0);
-       prcmu_clk[PRCMU_UARTCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("msp02clk", NULL, PRCMU_MSP02CLK, 0);
-       prcmu_clk[PRCMU_MSP02CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("msp1clk", NULL, PRCMU_MSP1CLK, 0);
-       prcmu_clk[PRCMU_MSP1CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("i2cclk", NULL, PRCMU_I2CCLK, 0);
-       prcmu_clk[PRCMU_I2CCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("slimclk", NULL, PRCMU_SLIMCLK, 0);
-       prcmu_clk[PRCMU_SLIMCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("per1clk", NULL, PRCMU_PER1CLK, 0);
-       prcmu_clk[PRCMU_PER1CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("per2clk", NULL, PRCMU_PER2CLK, 0);
-       prcmu_clk[PRCMU_PER2CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("per3clk", NULL, PRCMU_PER3CLK, 0);
-       prcmu_clk[PRCMU_PER3CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("per5clk", NULL, PRCMU_PER5CLK, 0);
-       prcmu_clk[PRCMU_PER5CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("per6clk", NULL, PRCMU_PER6CLK, 0);
-       prcmu_clk[PRCMU_PER6CLK] = clk;
-
-       clk = clk_reg_prcmu_gate("per7clk", NULL, PRCMU_PER7CLK, 0);
-       prcmu_clk[PRCMU_PER7CLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("lcdclk", NULL, PRCMU_LCDCLK, 0,
-                               CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_LCDCLK] = clk;
-
-       clk = clk_reg_prcmu_opp_gate("bmlclk", NULL, PRCMU_BMLCLK, 0);
-       prcmu_clk[PRCMU_BMLCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("hsitxclk", NULL, PRCMU_HSITXCLK, 0,
-                               CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_HSITXCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("hsirxclk", NULL, PRCMU_HSIRXCLK, 0,
-                               CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_HSIRXCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("hdmiclk", NULL, PRCMU_HDMICLK, 0,
-                               CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_HDMICLK] = clk;
-
-       clk = clk_reg_prcmu_gate("apeatclk", NULL, PRCMU_APEATCLK, 0);
-       prcmu_clk[PRCMU_APEATCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("apetraceclk", NULL, PRCMU_APETRACECLK, 0,
-                               CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_APETRACECLK] = clk;
-
-       clk = clk_reg_prcmu_gate("mcdeclk", NULL, PRCMU_MCDECLK, 0);
-       prcmu_clk[PRCMU_MCDECLK] = clk;
-
-       clk = clk_reg_prcmu_opp_gate("ipi2cclk", NULL, PRCMU_IPI2CCLK, 0);
-       prcmu_clk[PRCMU_IPI2CCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("dsialtclk", NULL, PRCMU_DSIALTCLK, 0);
-       prcmu_clk[PRCMU_DSIALTCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("dmaclk", NULL, PRCMU_DMACLK, 0);
-       prcmu_clk[PRCMU_DMACLK] = clk;
-
-       clk = clk_reg_prcmu_gate("b2r2clk", NULL, PRCMU_B2R2CLK, 0);
-       prcmu_clk[PRCMU_B2R2CLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("tvclk", NULL, PRCMU_TVCLK, 0,
-                               CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_TVCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("sspclk", NULL, PRCMU_SSPCLK, 0);
-       prcmu_clk[PRCMU_SSPCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("rngclk", NULL, PRCMU_RNGCLK, 0);
-       prcmu_clk[PRCMU_RNGCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("uiccclk", NULL, PRCMU_UICCCLK, 0);
-       prcmu_clk[PRCMU_UICCCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("timclk", NULL, PRCMU_TIMCLK, 0);
-       prcmu_clk[PRCMU_TIMCLK] = clk;
-
-       clk = clk_reg_prcmu_gate("ab8500_sysclk", NULL, PRCMU_SYSCLK, 0);
-       prcmu_clk[PRCMU_SYSCLK] = clk;
-
-       clk = clk_reg_prcmu_opp_volt_scalable("sdmmcclk", NULL, PRCMU_SDMMCCLK,
-                                       100000000, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_SDMMCCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("dsi_pll", "hdmiclk",
-                               PRCMU_PLLDSI, 0, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_PLLDSI] = clk;
-
-       clk = clk_reg_prcmu_scalable("dsi0clk", "dsi_pll",
-                               PRCMU_DSI0CLK, 0, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_DSI0CLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("dsi1clk", "dsi_pll",
-                               PRCMU_DSI1CLK, 0, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_DSI1CLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("dsi0escclk", "tvclk",
-                               PRCMU_DSI0ESCCLK, 0, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_DSI0ESCCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("dsi1escclk", "tvclk",
-                               PRCMU_DSI1ESCCLK, 0, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_DSI1ESCCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable("dsi2escclk", "tvclk",
-                               PRCMU_DSI2ESCCLK, 0, CLK_SET_RATE_GATE);
-       prcmu_clk[PRCMU_DSI2ESCCLK] = clk;
-
-       clk = clk_reg_prcmu_scalable_rate("armss", NULL,
-                               PRCMU_ARMSS, 0, CLK_IGNORE_UNUSED);
-       prcmu_clk[PRCMU_ARMSS] = clk;
+               u8500_prcmu_hw_clks.hws[PRCMU_SGACLK] =
+                       clk_reg_prcmu_gate("sgclk", NULL, PRCMU_SGACLK, 0);
+
+       u8500_prcmu_hw_clks.hws[PRCMU_UARTCLK] =
+               clk_reg_prcmu_gate("uartclk", NULL, PRCMU_UARTCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_MSP02CLK] =
+               clk_reg_prcmu_gate("msp02clk", NULL, PRCMU_MSP02CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_MSP1CLK] =
+               clk_reg_prcmu_gate("msp1clk", NULL, PRCMU_MSP1CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_I2CCLK] =
+               clk_reg_prcmu_gate("i2cclk", NULL, PRCMU_I2CCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_SLIMCLK] =
+               clk_reg_prcmu_gate("slimclk", NULL, PRCMU_SLIMCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_PER1CLK] =
+               clk_reg_prcmu_gate("per1clk", NULL, PRCMU_PER1CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_PER2CLK] =
+               clk_reg_prcmu_gate("per2clk", NULL, PRCMU_PER2CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_PER3CLK] =
+               clk_reg_prcmu_gate("per3clk", NULL, PRCMU_PER3CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_PER5CLK] =
+               clk_reg_prcmu_gate("per5clk", NULL, PRCMU_PER5CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_PER6CLK] =
+               clk_reg_prcmu_gate("per6clk", NULL, PRCMU_PER6CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_PER7CLK] =
+               clk_reg_prcmu_gate("per7clk", NULL, PRCMU_PER7CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_LCDCLK] =
+               clk_reg_prcmu_scalable("lcdclk", NULL, PRCMU_LCDCLK, 0,
+                                      CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_BMLCLK] =
+               clk_reg_prcmu_opp_gate("bmlclk", NULL, PRCMU_BMLCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_HSITXCLK] =
+               clk_reg_prcmu_scalable("hsitxclk", NULL, PRCMU_HSITXCLK, 0,
+                                      CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_HSIRXCLK] =
+               clk_reg_prcmu_scalable("hsirxclk", NULL, PRCMU_HSIRXCLK, 0,
+                                      CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_HDMICLK] =
+               clk_reg_prcmu_scalable("hdmiclk", NULL, PRCMU_HDMICLK, 0,
+                                      CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_APEATCLK] =
+               clk_reg_prcmu_gate("apeatclk", NULL, PRCMU_APEATCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_APETRACECLK] =
+               clk_reg_prcmu_scalable("apetraceclk", NULL, PRCMU_APETRACECLK, 0,
+                                      CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_MCDECLK] =
+               clk_reg_prcmu_gate("mcdeclk", NULL, PRCMU_MCDECLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_IPI2CCLK] =
+               clk_reg_prcmu_opp_gate("ipi2cclk", NULL, PRCMU_IPI2CCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_DSIALTCLK] =
+               clk_reg_prcmu_gate("dsialtclk", NULL, PRCMU_DSIALTCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_DMACLK] =
+               clk_reg_prcmu_gate("dmaclk", NULL, PRCMU_DMACLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_B2R2CLK] =
+               clk_reg_prcmu_gate("b2r2clk", NULL, PRCMU_B2R2CLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_TVCLK] =
+               clk_reg_prcmu_scalable("tvclk", NULL, PRCMU_TVCLK, 0,
+                                      CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_SSPCLK] =
+               clk_reg_prcmu_gate("sspclk", NULL, PRCMU_SSPCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_RNGCLK] =
+               clk_reg_prcmu_gate("rngclk", NULL, PRCMU_RNGCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_UICCCLK] =
+               clk_reg_prcmu_gate("uiccclk", NULL, PRCMU_UICCCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_TIMCLK] =
+               clk_reg_prcmu_gate("timclk", NULL, PRCMU_TIMCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_SYSCLK] =
+               clk_reg_prcmu_gate("ab8500_sysclk", NULL, PRCMU_SYSCLK, 0);
+       u8500_prcmu_hw_clks.hws[PRCMU_SDMMCCLK] =
+               clk_reg_prcmu_opp_volt_scalable("sdmmcclk", NULL,
+                                               PRCMU_SDMMCCLK, 100000000,
+                                               CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_PLLDSI] =
+               clk_reg_prcmu_scalable("dsi_pll", "hdmiclk",
+                                      PRCMU_PLLDSI, 0, CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_DSI0CLK] =
+               clk_reg_prcmu_scalable("dsi0clk", "dsi_pll",
+                                      PRCMU_DSI0CLK, 0, CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_DSI1CLK] =
+               clk_reg_prcmu_scalable("dsi1clk", "dsi_pll",
+                                      PRCMU_DSI1CLK, 0, CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_DSI0ESCCLK] =
+               clk_reg_prcmu_scalable("dsi0escclk", "tvclk",
+                                      PRCMU_DSI0ESCCLK, 0, CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_DSI1ESCCLK] =
+               clk_reg_prcmu_scalable("dsi1escclk", "tvclk",
+                                      PRCMU_DSI1ESCCLK, 0, CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_DSI2ESCCLK] =
+               clk_reg_prcmu_scalable("dsi2escclk", "tvclk",
+                                      PRCMU_DSI2ESCCLK, 0, CLK_SET_RATE_GATE);
+       u8500_prcmu_hw_clks.hws[PRCMU_ARMSS] =
+               clk_reg_prcmu_scalable_rate("armss", NULL,
+                                           PRCMU_ARMSS, 0, CLK_IGNORE_UNUSED);
 
        twd_clk = clk_register_fixed_factor(NULL, "smp_twd", "armss",
                                CLK_IGNORE_UNUSED, 1, 2);
 
-       /*
-        * FIXME: Add special handled PRCMU clocks here:
-        * 1. clkout0yuv, use PRCMU as parent + need regulator + pinctrl.
-        * 2. ab9540_clkout1yuv, see clkout0yuv
-        */
-
        /* PRCC P-clocks */
        clk = clk_reg_prcc_pclk("p1_pclk0", "per1clk", bases[CLKRST1_INDEX],
                                BIT(0), 0);
@@ -546,13 +592,13 @@ static void u8500_clk_init(struct device_node *np)
        PRCC_KCLK_STORE(clk, 6, 0);
 
        for_each_child_of_node(np, child) {
-               static struct clk_onecell_data clk_data;
+               if (of_node_name_eq(child, "prcmu-clock"))
+                       of_clk_add_hw_provider(child, of_clk_hw_onecell_get,
+                                              &u8500_prcmu_hw_clks);
+
+               if (of_node_name_eq(child, "clkout-clock"))
+                       of_clk_add_hw_provider(child, ux500_clkout_get, NULL);
 
-               if (of_node_name_eq(child, "prcmu-clock")) {
-                       clk_data.clks = prcmu_clk;
-                       clk_data.clk_num = ARRAY_SIZE(prcmu_clk);
-                       of_clk_add_provider(child, of_clk_src_onecell_get, &clk_data);
-               }
                if (of_node_name_eq(child, "prcc-periph-clock"))
                        of_clk_add_provider(child, ux500_twocell_get, prcc_pclk);
 
diff --git a/include/dt-bindings/clock/en7523-clk.h b/include/dt-bindings/clock/en7523-clk.h
new file mode 100644 (file)
index 0000000..717d23a
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+
+#ifndef _DT_BINDINGS_CLOCK_AIROHA_EN7523_H_
+#define _DT_BINDINGS_CLOCK_AIROHA_EN7523_H_
+
+#define EN7523_CLK_GSW         0
+#define EN7523_CLK_EMI         1
+#define EN7523_CLK_BUS         2
+#define EN7523_CLK_SLIC                3
+#define EN7523_CLK_SPI         4
+#define EN7523_CLK_NPU         5
+#define EN7523_CLK_CRYPTO      6
+#define EN7523_CLK_PCIE                7
+
+#define EN7523_NUM_CLOCKS      8
+
+#endif /* _DT_BINDINGS_CLOCK_AIROHA_EN7523_H_ */
index 01e8bab..07b8a28 100644 (file)
 
 #define IMX8MN_CLK_M7_CORE                     221
 
-#define IMX8MN_CLK_END                         222
+#define IMX8MN_CLK_GPT_3M                      222
+#define IMX8MN_CLK_GPT1                                223
+#define IMX8MN_CLK_GPT1_ROOT                   224
+#define IMX8MN_CLK_GPT2                                225
+#define IMX8MN_CLK_GPT2_ROOT                   226
+#define IMX8MN_CLK_GPT3                                227
+#define IMX8MN_CLK_GPT3_ROOT                   228
+#define IMX8MN_CLK_GPT4                                229
+#define IMX8MN_CLK_GPT4_ROOT                   230
+#define IMX8MN_CLK_GPT5                                231
+#define IMX8MN_CLK_GPT5_ROOT                   232
+#define IMX8MN_CLK_GPT6                                233
+#define IMX8MN_CLK_GPT6_ROOT                   234
+
+#define IMX8MN_CLK_END                         235
 
 #endif
index 235c7a0..9d5cc2d 100644 (file)
 #define IMX8MP_CLK_AUDIO_AXI                   310
 #define IMX8MP_CLK_HSIO_AXI                    311
 #define IMX8MP_CLK_MEDIA_ISP                   312
+#define IMX8MP_CLK_MEDIA_DISP2_PIX             313
+#define IMX8MP_CLK_CLKOUT1_SEL                 314
+#define IMX8MP_CLK_CLKOUT1_DIV                 315
+#define IMX8MP_CLK_CLKOUT1                     316
+#define IMX8MP_CLK_CLKOUT2_SEL                 317
+#define IMX8MP_CLK_CLKOUT2_DIV                 318
+#define IMX8MP_CLK_CLKOUT2                     319
 
-#define IMX8MP_CLK_END                         313
+#define IMX8MP_CLK_END                         320
 
 #define IMX8MP_CLK_AUDIOMIX_SAI1_IPG           0
 #define IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1         1
diff --git a/include/dt-bindings/clock/mt8186-clk.h b/include/dt-bindings/clock/mt8186-clk.h
new file mode 100644 (file)
index 0000000..a70bf67
--- /dev/null
@@ -0,0 +1,445 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
+/*
+ * Copyright (c) 2022 MediaTek Inc.
+ * Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT8186_H
+#define _DT_BINDINGS_CLK_MT8186_H
+
+/* MCUSYS */
+
+#define CLK_MCU_ARMPLL_LL_SEL          0
+#define CLK_MCU_ARMPLL_BL_SEL          1
+#define CLK_MCU_ARMPLL_BUS_SEL         2
+#define CLK_MCU_NR_CLK                 3
+
+/* TOPCKGEN */
+
+#define CLK_TOP_AXI                    0
+#define CLK_TOP_SCP                    1
+#define CLK_TOP_MFG                    2
+#define CLK_TOP_CAMTG                  3
+#define CLK_TOP_CAMTG1                 4
+#define CLK_TOP_CAMTG2                 5
+#define CLK_TOP_CAMTG3                 6
+#define CLK_TOP_CAMTG4                 7
+#define CLK_TOP_CAMTG5                 8
+#define CLK_TOP_CAMTG6                 9
+#define CLK_TOP_UART                   10
+#define CLK_TOP_SPI                    11
+#define CLK_TOP_MSDC50_0_HCLK          12
+#define CLK_TOP_MSDC50_0               13
+#define CLK_TOP_MSDC30_1               14
+#define CLK_TOP_AUDIO                  15
+#define CLK_TOP_AUD_INTBUS             16
+#define CLK_TOP_AUD_1                  17
+#define CLK_TOP_AUD_2                  18
+#define CLK_TOP_AUD_ENGEN1             19
+#define CLK_TOP_AUD_ENGEN2             20
+#define CLK_TOP_DISP_PWM               21
+#define CLK_TOP_SSPM                   22
+#define CLK_TOP_DXCC                   23
+#define CLK_TOP_USB_TOP                        24
+#define CLK_TOP_SRCK                   25
+#define CLK_TOP_SPM                    26
+#define CLK_TOP_I2C                    27
+#define CLK_TOP_PWM                    28
+#define CLK_TOP_SENINF                 29
+#define CLK_TOP_SENINF1                        30
+#define CLK_TOP_SENINF2                        31
+#define CLK_TOP_SENINF3                        32
+#define CLK_TOP_AES_MSDCFDE            33
+#define CLK_TOP_PWRAP_ULPOSC           34
+#define CLK_TOP_CAMTM                  35
+#define CLK_TOP_VENC                   36
+#define CLK_TOP_CAM                    37
+#define CLK_TOP_IMG1                   38
+#define CLK_TOP_IPE                    39
+#define CLK_TOP_DPMAIF                 40
+#define CLK_TOP_VDEC                   41
+#define CLK_TOP_DISP                   42
+#define CLK_TOP_MDP                    43
+#define CLK_TOP_AUDIO_H                        44
+#define CLK_TOP_UFS                    45
+#define CLK_TOP_AES_FDE                        46
+#define CLK_TOP_AUDIODSP               47
+#define CLK_TOP_DVFSRC                 48
+#define CLK_TOP_DSI_OCC                        49
+#define CLK_TOP_SPMI_MST               50
+#define CLK_TOP_SPINOR                 51
+#define CLK_TOP_NNA                    52
+#define CLK_TOP_NNA1                   53
+#define CLK_TOP_NNA2                   54
+#define CLK_TOP_SSUSB_XHCI             55
+#define CLK_TOP_SSUSB_TOP_1P           56
+#define CLK_TOP_SSUSB_XHCI_1P          57
+#define CLK_TOP_WPE                    58
+#define CLK_TOP_DPI                    59
+#define CLK_TOP_U3_OCC_250M            60
+#define CLK_TOP_U3_OCC_500M            61
+#define CLK_TOP_ADSP_BUS               62
+#define CLK_TOP_APLL_I2S0_MCK_SEL      63
+#define CLK_TOP_APLL_I2S1_MCK_SEL      64
+#define CLK_TOP_APLL_I2S2_MCK_SEL      65
+#define CLK_TOP_APLL_I2S4_MCK_SEL      66
+#define CLK_TOP_APLL_TDMOUT_MCK_SEL    67
+#define CLK_TOP_MAINPLL_D2             68
+#define CLK_TOP_MAINPLL_D2_D2          69
+#define CLK_TOP_MAINPLL_D2_D4          70
+#define CLK_TOP_MAINPLL_D2_D16         71
+#define CLK_TOP_MAINPLL_D3             72
+#define CLK_TOP_MAINPLL_D3_D2          73
+#define CLK_TOP_MAINPLL_D3_D4          74
+#define CLK_TOP_MAINPLL_D5             75
+#define CLK_TOP_MAINPLL_D5_D2          76
+#define CLK_TOP_MAINPLL_D5_D4          77
+#define CLK_TOP_MAINPLL_D7             78
+#define CLK_TOP_MAINPLL_D7_D2          79
+#define CLK_TOP_MAINPLL_D7_D4          80
+#define CLK_TOP_UNIVPLL                        81
+#define CLK_TOP_UNIVPLL_D2             82
+#define CLK_TOP_UNIVPLL_D2_D2          83
+#define CLK_TOP_UNIVPLL_D2_D4          84
+#define CLK_TOP_UNIVPLL_D3             85
+#define CLK_TOP_UNIVPLL_D3_D2          86
+#define CLK_TOP_UNIVPLL_D3_D4          87
+#define CLK_TOP_UNIVPLL_D3_D8          88
+#define CLK_TOP_UNIVPLL_D3_D32         89
+#define CLK_TOP_UNIVPLL_D5             90
+#define CLK_TOP_UNIVPLL_D5_D2          91
+#define CLK_TOP_UNIVPLL_D5_D4          92
+#define CLK_TOP_UNIVPLL_D7             93
+#define CLK_TOP_UNIVPLL_192M           94
+#define CLK_TOP_UNIVPLL_192M_D4                95
+#define CLK_TOP_UNIVPLL_192M_D8                96
+#define CLK_TOP_UNIVPLL_192M_D16       97
+#define CLK_TOP_UNIVPLL_192M_D32       98
+#define CLK_TOP_APLL1_D2               99
+#define CLK_TOP_APLL1_D4               100
+#define CLK_TOP_APLL1_D8               101
+#define CLK_TOP_APLL2_D2               102
+#define CLK_TOP_APLL2_D4               103
+#define CLK_TOP_APLL2_D8               104
+#define CLK_TOP_MMPLL_D2               105
+#define CLK_TOP_TVDPLL_D2              106
+#define CLK_TOP_TVDPLL_D4              107
+#define CLK_TOP_TVDPLL_D8              108
+#define CLK_TOP_TVDPLL_D16             109
+#define CLK_TOP_TVDPLL_D32             110
+#define CLK_TOP_MSDCPLL_D2             111
+#define CLK_TOP_ULPOSC1                        112
+#define CLK_TOP_ULPOSC1_D2             113
+#define CLK_TOP_ULPOSC1_D4             114
+#define CLK_TOP_ULPOSC1_D8             115
+#define CLK_TOP_ULPOSC1_D10            116
+#define CLK_TOP_ULPOSC1_D16            117
+#define CLK_TOP_ULPOSC1_D32            118
+#define CLK_TOP_ADSPPLL_D2             119
+#define CLK_TOP_ADSPPLL_D4             120
+#define CLK_TOP_ADSPPLL_D8             121
+#define CLK_TOP_NNAPLL_D2              122
+#define CLK_TOP_NNAPLL_D4              123
+#define CLK_TOP_NNAPLL_D8              124
+#define CLK_TOP_NNA2PLL_D2             125
+#define CLK_TOP_NNA2PLL_D4             126
+#define CLK_TOP_NNA2PLL_D8             127
+#define CLK_TOP_F_BIST2FPC             128
+#define CLK_TOP_466M_FMEM              129
+#define CLK_TOP_MPLL                   130
+#define CLK_TOP_APLL12_CK_DIV0         131
+#define CLK_TOP_APLL12_CK_DIV1         132
+#define CLK_TOP_APLL12_CK_DIV2         133
+#define CLK_TOP_APLL12_CK_DIV4         134
+#define CLK_TOP_APLL12_CK_DIV_TDMOUT_M 135
+#define CLK_TOP_NR_CLK                 136
+
+/* INFRACFG_AO */
+
+#define CLK_INFRA_AO_PMIC_TMR          0
+#define CLK_INFRA_AO_PMIC_AP           1
+#define CLK_INFRA_AO_PMIC_MD           2
+#define CLK_INFRA_AO_PMIC_CONN         3
+#define CLK_INFRA_AO_SCP_CORE          4
+#define CLK_INFRA_AO_SEJ               5
+#define CLK_INFRA_AO_APXGPT            6
+#define CLK_INFRA_AO_ICUSB             7
+#define CLK_INFRA_AO_GCE               8
+#define CLK_INFRA_AO_THERM             9
+#define CLK_INFRA_AO_I2C_AP            10
+#define CLK_INFRA_AO_I2C_CCU           11
+#define CLK_INFRA_AO_I2C_SSPM          12
+#define CLK_INFRA_AO_I2C_RSV           13
+#define CLK_INFRA_AO_PWM_HCLK          14
+#define CLK_INFRA_AO_PWM1              15
+#define CLK_INFRA_AO_PWM2              16
+#define CLK_INFRA_AO_PWM3              17
+#define CLK_INFRA_AO_PWM4              18
+#define CLK_INFRA_AO_PWM5              19
+#define CLK_INFRA_AO_PWM               20
+#define CLK_INFRA_AO_UART0             21
+#define CLK_INFRA_AO_UART1             22
+#define CLK_INFRA_AO_UART2             23
+#define CLK_INFRA_AO_GCE_26M           24
+#define CLK_INFRA_AO_CQ_DMA_FPC                25
+#define CLK_INFRA_AO_BTIF              26
+#define CLK_INFRA_AO_SPI0              27
+#define CLK_INFRA_AO_MSDC0             28
+#define CLK_INFRA_AO_MSDCFDE           29
+#define CLK_INFRA_AO_MSDC1             30
+#define CLK_INFRA_AO_DVFSRC            31
+#define CLK_INFRA_AO_GCPU              32
+#define CLK_INFRA_AO_TRNG              33
+#define CLK_INFRA_AO_AUXADC            34
+#define CLK_INFRA_AO_CPUM              35
+#define CLK_INFRA_AO_CCIF1_AP          36
+#define CLK_INFRA_AO_CCIF1_MD          37
+#define CLK_INFRA_AO_AUXADC_MD         38
+#define CLK_INFRA_AO_AP_DMA            39
+#define CLK_INFRA_AO_XIU               40
+#define CLK_INFRA_AO_DEVICE_APC                41
+#define CLK_INFRA_AO_CCIF_AP           42
+#define CLK_INFRA_AO_DEBUGTOP          43
+#define CLK_INFRA_AO_AUDIO             44
+#define CLK_INFRA_AO_CCIF_MD           45
+#define CLK_INFRA_AO_DXCC_SEC_CORE     46
+#define CLK_INFRA_AO_DXCC_AO           47
+#define CLK_INFRA_AO_IMP_IIC           48
+#define CLK_INFRA_AO_DRAMC_F26M                49
+#define CLK_INFRA_AO_RG_PWM_FBCLK6     50
+#define CLK_INFRA_AO_SSUSB_TOP_HCLK    51
+#define CLK_INFRA_AO_DISP_PWM          52
+#define CLK_INFRA_AO_CLDMA_BCLK                53
+#define CLK_INFRA_AO_AUDIO_26M_BCLK    54
+#define CLK_INFRA_AO_SSUSB_TOP_P1_HCLK 55
+#define CLK_INFRA_AO_SPI1              56
+#define CLK_INFRA_AO_I2C4              57
+#define CLK_INFRA_AO_MODEM_TEMP_SHARE  58
+#define CLK_INFRA_AO_SPI2              59
+#define CLK_INFRA_AO_SPI3              60
+#define CLK_INFRA_AO_SSUSB_TOP_REF     61
+#define CLK_INFRA_AO_SSUSB_TOP_XHCI    62
+#define CLK_INFRA_AO_SSUSB_TOP_P1_REF  63
+#define CLK_INFRA_AO_SSUSB_TOP_P1_XHCI 64
+#define CLK_INFRA_AO_SSPM              65
+#define CLK_INFRA_AO_SSUSB_TOP_P1_SYS  66
+#define CLK_INFRA_AO_I2C5              67
+#define CLK_INFRA_AO_I2C5_ARBITER      68
+#define CLK_INFRA_AO_I2C5_IMM          69
+#define CLK_INFRA_AO_I2C1_ARBITER      70
+#define CLK_INFRA_AO_I2C1_IMM          71
+#define CLK_INFRA_AO_I2C2_ARBITER      72
+#define CLK_INFRA_AO_I2C2_IMM          73
+#define CLK_INFRA_AO_SPI4              74
+#define CLK_INFRA_AO_SPI5              75
+#define CLK_INFRA_AO_CQ_DMA            76
+#define CLK_INFRA_AO_BIST2FPC          77
+#define CLK_INFRA_AO_MSDC0_SELF                78
+#define CLK_INFRA_AO_SPINOR            79
+#define CLK_INFRA_AO_SSPM_26M_SELF     80
+#define CLK_INFRA_AO_SSPM_32K_SELF     81
+#define CLK_INFRA_AO_I2C6              82
+#define CLK_INFRA_AO_AP_MSDC0          83
+#define CLK_INFRA_AO_MD_MSDC0          84
+#define CLK_INFRA_AO_MSDC0_SRC         85
+#define CLK_INFRA_AO_MSDC1_SRC         86
+#define CLK_INFRA_AO_SEJ_F13M          87
+#define CLK_INFRA_AO_AES_TOP0_BCLK     88
+#define CLK_INFRA_AO_MCU_PM_BCLK       89
+#define CLK_INFRA_AO_CCIF2_AP          90
+#define CLK_INFRA_AO_CCIF2_MD          91
+#define CLK_INFRA_AO_CCIF3_AP          92
+#define CLK_INFRA_AO_CCIF3_MD          93
+#define CLK_INFRA_AO_FADSP_26M         94
+#define CLK_INFRA_AO_FADSP_32K         95
+#define CLK_INFRA_AO_CCIF4_AP          96
+#define CLK_INFRA_AO_CCIF4_MD          97
+#define CLK_INFRA_AO_FADSP             98
+#define CLK_INFRA_AO_FLASHIF_133M      99
+#define CLK_INFRA_AO_FLASHIF_66M       100
+#define CLK_INFRA_AO_NR_CLK            101
+
+/* APMIXEDSYS */
+
+#define CLK_APMIXED_ARMPLL_LL          0
+#define CLK_APMIXED_ARMPLL_BL          1
+#define CLK_APMIXED_CCIPLL             2
+#define CLK_APMIXED_MAINPLL            3
+#define CLK_APMIXED_UNIV2PLL           4
+#define CLK_APMIXED_MSDCPLL            5
+#define CLK_APMIXED_MMPLL              6
+#define CLK_APMIXED_NNAPLL             7
+#define CLK_APMIXED_NNA2PLL            8
+#define CLK_APMIXED_ADSPPLL            9
+#define CLK_APMIXED_MFGPLL             10
+#define CLK_APMIXED_TVDPLL             11
+#define CLK_APMIXED_APLL1              12
+#define CLK_APMIXED_APLL2              13
+#define CLK_APMIXED_NR_CLK             14
+
+/* IMP_IIC_WRAP */
+
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C0 0
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C1 1
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C2 2
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C3 3
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C4 4
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C5 5
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C6 6
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C7 7
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C8 8
+#define CLK_IMP_IIC_WRAP_AP_CLOCK_I2C9 9
+#define CLK_IMP_IIC_WRAP_NR_CLK                10
+
+/* MFGCFG */
+
+#define CLK_MFG_BG3D                   0
+#define CLK_MFG_NR_CLK                 1
+
+/* MMSYS */
+
+#define CLK_MM_DISP_MUTEX0             0
+#define CLK_MM_APB_MM_BUS              1
+#define CLK_MM_DISP_OVL0               2
+#define CLK_MM_DISP_RDMA0              3
+#define CLK_MM_DISP_OVL0_2L            4
+#define CLK_MM_DISP_WDMA0              5
+#define CLK_MM_DISP_RSZ0               6
+#define CLK_MM_DISP_AAL0               7
+#define CLK_MM_DISP_CCORR0             8
+#define CLK_MM_DISP_COLOR0             9
+#define CLK_MM_SMI_INFRA               10
+#define CLK_MM_DISP_DSC_WRAP0          11
+#define CLK_MM_DISP_GAMMA0             12
+#define CLK_MM_DISP_POSTMASK0          13
+#define CLK_MM_DISP_DITHER0            14
+#define CLK_MM_SMI_COMMON              15
+#define CLK_MM_DSI0                    16
+#define CLK_MM_DISP_FAKE_ENG0          17
+#define CLK_MM_DISP_FAKE_ENG1          18
+#define CLK_MM_SMI_GALS                        19
+#define CLK_MM_SMI_IOMMU               20
+#define CLK_MM_DISP_RDMA1              21
+#define CLK_MM_DISP_DPI                        22
+#define CLK_MM_DSI0_DSI_CK_DOMAIN      23
+#define CLK_MM_DISP_26M                        24
+#define CLK_MM_NR_CLK                  25
+
+/* WPESYS */
+
+#define CLK_WPE_CK_EN                  0
+#define CLK_WPE_SMI_LARB8_CK_EN                1
+#define CLK_WPE_SYS_EVENT_TX_CK_EN     2
+#define CLK_WPE_SMI_LARB8_PCLK_EN      3
+#define CLK_WPE_NR_CLK                 4
+
+/* IMGSYS1 */
+
+#define CLK_IMG1_LARB9_IMG1            0
+#define CLK_IMG1_LARB10_IMG1           1
+#define CLK_IMG1_DIP                   2
+#define CLK_IMG1_GALS_IMG1             3
+#define CLK_IMG1_NR_CLK                        4
+
+/* IMGSYS2 */
+
+#define CLK_IMG2_LARB9_IMG2            0
+#define CLK_IMG2_LARB10_IMG2           1
+#define CLK_IMG2_MFB                   2
+#define CLK_IMG2_WPE                   3
+#define CLK_IMG2_MSS                   4
+#define CLK_IMG2_GALS_IMG2             5
+#define CLK_IMG2_NR_CLK                        6
+
+/* VDECSYS */
+
+#define CLK_VDEC_LARB1_CKEN            0
+#define CLK_VDEC_LAT_CKEN              1
+#define CLK_VDEC_LAT_ACTIVE            2
+#define CLK_VDEC_LAT_CKEN_ENG          3
+#define CLK_VDEC_MINI_MDP_CKEN_CFG_RG  4
+#define CLK_VDEC_CKEN                  5
+#define CLK_VDEC_ACTIVE                        6
+#define CLK_VDEC_CKEN_ENG              7
+#define CLK_VDEC_NR_CLK                        8
+
+/* VENCSYS */
+
+#define CLK_VENC_CKE0_LARB             0
+#define CLK_VENC_CKE1_VENC             1
+#define CLK_VENC_CKE2_JPGENC           2
+#define CLK_VENC_CKE5_GALS             3
+#define CLK_VENC_NR_CLK                        4
+
+/* CAMSYS */
+
+#define CLK_CAM_LARB13                 0
+#define CLK_CAM_DFP_VAD                        1
+#define CLK_CAM_LARB14                 2
+#define CLK_CAM                                3
+#define CLK_CAMTG                      4
+#define CLK_CAM_SENINF                 5
+#define CLK_CAMSV1                     6
+#define CLK_CAMSV2                     7
+#define CLK_CAMSV3                     8
+#define CLK_CAM_CCU0                   9
+#define CLK_CAM_CCU1                   10
+#define CLK_CAM_MRAW0                  11
+#define CLK_CAM_FAKE_ENG               12
+#define CLK_CAM_CCU_GALS               13
+#define CLK_CAM2MM_GALS                        14
+#define CLK_CAM_NR_CLK                 15
+
+/* CAMSYS_RAWA */
+
+#define CLK_CAM_RAWA_LARBX_RAWA                0
+#define CLK_CAM_RAWA                   1
+#define CLK_CAM_RAWA_CAMTG_RAWA                2
+#define CLK_CAM_RAWA_NR_CLK            3
+
+/* CAMSYS_RAWB */
+
+#define CLK_CAM_RAWB_LARBX_RAWB                0
+#define CLK_CAM_RAWB                   1
+#define CLK_CAM_RAWB_CAMTG_RAWB                2
+#define CLK_CAM_RAWB_NR_CLK            3
+
+/* MDPSYS */
+
+#define CLK_MDP_RDMA0                  0
+#define CLK_MDP_TDSHP0                 1
+#define CLK_MDP_IMG_DL_ASYNC0          2
+#define CLK_MDP_IMG_DL_ASYNC1          3
+#define CLK_MDP_DISP_RDMA              4
+#define CLK_MDP_HMS                    5
+#define CLK_MDP_SMI0                   6
+#define CLK_MDP_APB_BUS                        7
+#define CLK_MDP_WROT0                  8
+#define CLK_MDP_RSZ0                   9
+#define CLK_MDP_HDR0                   10
+#define CLK_MDP_MUTEX0                 11
+#define CLK_MDP_WROT1                  12
+#define CLK_MDP_RSZ1                   13
+#define CLK_MDP_FAKE_ENG0              14
+#define CLK_MDP_AAL0                   15
+#define CLK_MDP_DISP_WDMA              16
+#define CLK_MDP_COLOR                  17
+#define CLK_MDP_IMG_DL_ASYNC2          18
+#define CLK_MDP_IMG_DL_RELAY0_ASYNC0   19
+#define CLK_MDP_IMG_DL_RELAY1_ASYNC1   20
+#define CLK_MDP_IMG_DL_RELAY2_ASYNC2   21
+#define CLK_MDP_NR_CLK                 22
+
+/* IPESYS */
+
+#define CLK_IPE_LARB19                 0
+#define CLK_IPE_LARB20                 1
+#define CLK_IPE_SMI_SUBCOM             2
+#define CLK_IPE_FD                     3
+#define CLK_IPE_FE                     4
+#define CLK_IPE_RSC                    5
+#define CLK_IPE_DPE                    6
+#define CLK_IPE_GALS_IPE               7
+#define CLK_IPE_NR_CLK                 8
+
+#endif /* _DT_BINDINGS_CLK_MT8186_H */
diff --git a/include/dt-bindings/clock/r8a779g0-cpg-mssr.h b/include/dt-bindings/clock/r8a779g0-cpg-mssr.h
new file mode 100644 (file)
index 0000000..754c54a
--- /dev/null
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R8A779G0_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R8A779G0_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* r8a779g0 CPG Core Clocks */
+
+#define R8A779G0_CLK_ZX                        0
+#define R8A779G0_CLK_ZS                        1
+#define R8A779G0_CLK_ZT                        2
+#define R8A779G0_CLK_ZTR               3
+#define R8A779G0_CLK_S0D2              4
+#define R8A779G0_CLK_S0D3              5
+#define R8A779G0_CLK_S0D4              6
+#define R8A779G0_CLK_S0D1_VIO          7
+#define R8A779G0_CLK_S0D2_VIO          8
+#define R8A779G0_CLK_S0D4_VIO          9
+#define R8A779G0_CLK_S0D8_VIO          10
+#define R8A779G0_CLK_S0D1_VC           11
+#define R8A779G0_CLK_S0D2_VC           12
+#define R8A779G0_CLK_S0D4_VC           13
+#define R8A779G0_CLK_S0D2_MM           14
+#define R8A779G0_CLK_S0D4_MM           15
+#define R8A779G0_CLK_S0D2_U3DG         16
+#define R8A779G0_CLK_S0D4_U3DG         17
+#define R8A779G0_CLK_S0D2_RT           18
+#define R8A779G0_CLK_S0D3_RT           19
+#define R8A779G0_CLK_S0D4_RT           20
+#define R8A779G0_CLK_S0D6_RT           21
+#define R8A779G0_CLK_S0D24_RT          22
+#define R8A779G0_CLK_S0D2_PER          23
+#define R8A779G0_CLK_S0D3_PER          24
+#define R8A779G0_CLK_S0D4_PER          25
+#define R8A779G0_CLK_S0D6_PER          26
+#define R8A779G0_CLK_S0D12_PER         27
+#define R8A779G0_CLK_S0D24_PER         28
+#define R8A779G0_CLK_S0D1_HSC          29
+#define R8A779G0_CLK_S0D2_HSC          30
+#define R8A779G0_CLK_S0D4_HSC          31
+#define R8A779G0_CLK_S0D2_CC           32
+#define R8A779G0_CLK_SVD1_IR           33
+#define R8A779G0_CLK_SVD2_IR           34
+#define R8A779G0_CLK_SVD1_VIP          35
+#define R8A779G0_CLK_SVD2_VIP          36
+#define R8A779G0_CLK_CL                        37
+#define R8A779G0_CLK_CL16M             38
+#define R8A779G0_CLK_CL16M_MM          39
+#define R8A779G0_CLK_CL16M_RT          40
+#define R8A779G0_CLK_CL16M_PER         41
+#define R8A779G0_CLK_CL16M_HSC         42
+#define R8A779G0_CLK_Z0                        43
+#define R8A779G0_CLK_ZB3               44
+#define R8A779G0_CLK_ZB3D2             45
+#define R8A779G0_CLK_ZB3D4             46
+#define R8A779G0_CLK_ZG                        47
+#define R8A779G0_CLK_SD0H              48
+#define R8A779G0_CLK_SD0               49
+#define R8A779G0_CLK_RPC               50
+#define R8A779G0_CLK_RPCD2             51
+#define R8A779G0_CLK_MSO               52
+#define R8A779G0_CLK_CANFD             53
+#define R8A779G0_CLK_CSI               54
+#define R8A779G0_CLK_FRAY              55
+#define R8A779G0_CLK_IPC               56
+#define R8A779G0_CLK_SASYNCRT          57
+#define R8A779G0_CLK_SASYNCPERD1       58
+#define R8A779G0_CLK_SASYNCPERD2       59
+#define R8A779G0_CLK_SASYNCPERD4       60
+#define R8A779G0_CLK_VIOBUS            61
+#define R8A779G0_CLK_VIOBUSD2          62
+#define R8A779G0_CLK_VCBUS             63
+#define R8A779G0_CLK_VCBUSD2           64
+#define R8A779G0_CLK_DSIEXT            65
+#define R8A779G0_CLK_DSIREF            66
+#define R8A779G0_CLK_ADGH              67
+#define R8A779G0_CLK_OSC               68
+#define R8A779G0_CLK_ZR0               69
+#define R8A779G0_CLK_ZR1               70
+#define R8A779G0_CLK_ZR2               71
+#define R8A779G0_CLK_IMPA              72
+#define R8A779G0_CLK_IMPAD4            73
+#define R8A779G0_CLK_CPEX              74
+#define R8A779G0_CLK_CBFUSA            75
+#define R8A779G0_CLK_R                 76
+
+#endif /* __DT_BINDINGS_CLOCK_R8A779G0_CPG_MSSR_H__ */
diff --git a/include/dt-bindings/clock/r9a07g043-cpg.h b/include/dt-bindings/clock/r9a07g043-cpg.h
new file mode 100644 (file)
index 0000000..27e2327
--- /dev/null
@@ -0,0 +1,184 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+ *
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R9A07G043_CPG_H__
+#define __DT_BINDINGS_CLOCK_R9A07G043_CPG_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* R9A07G043 CPG Core Clocks */
+#define R9A07G043_CLK_I                        0
+#define R9A07G043_CLK_I2               1
+#define R9A07G043_CLK_S0               2
+#define R9A07G043_CLK_SPI0             3
+#define R9A07G043_CLK_SPI1             4
+#define R9A07G043_CLK_SD0              5
+#define R9A07G043_CLK_SD1              6
+#define R9A07G043_CLK_M0               7
+#define R9A07G043_CLK_M2               8
+#define R9A07G043_CLK_M3               9
+#define R9A07G043_CLK_HP               10
+#define R9A07G043_CLK_TSU              11
+#define R9A07G043_CLK_ZT               12
+#define R9A07G043_CLK_P0               13
+#define R9A07G043_CLK_P1               14
+#define R9A07G043_CLK_P2               15
+#define R9A07G043_CLK_AT               16
+#define R9A07G043_OSCCLK               17
+#define R9A07G043_CLK_P0_DIV2          18
+
+/* R9A07G043 Module Clocks */
+#define R9A07G043_CA55_SCLK            0       /* RZ/G2UL Only */
+#define R9A07G043_CA55_PCLK            1       /* RZ/G2UL Only */
+#define R9A07G043_CA55_ATCLK           2       /* RZ/G2UL Only */
+#define R9A07G043_CA55_GICCLK          3       /* RZ/G2UL Only */
+#define R9A07G043_CA55_PERICLK         4       /* RZ/G2UL Only */
+#define R9A07G043_CA55_ACLK            5       /* RZ/G2UL Only */
+#define R9A07G043_CA55_TSCLK           6       /* RZ/G2UL Only */
+#define R9A07G043_GIC600_GICCLK                7       /* RZ/G2UL Only */
+#define R9A07G043_IA55_CLK             8       /* RZ/G2UL Only */
+#define R9A07G043_IA55_PCLK            9       /* RZ/G2UL Only */
+#define R9A07G043_MHU_PCLK             10      /* RZ/G2UL Only */
+#define R9A07G043_SYC_CNT_CLK          11
+#define R9A07G043_DMAC_ACLK            12
+#define R9A07G043_DMAC_PCLK            13
+#define R9A07G043_OSTM0_PCLK           14
+#define R9A07G043_OSTM1_PCLK           15
+#define R9A07G043_OSTM2_PCLK           16
+#define R9A07G043_MTU_X_MCK_MTU3       17
+#define R9A07G043_POE3_CLKM_POE                18
+#define R9A07G043_WDT0_PCLK            19
+#define R9A07G043_WDT0_CLK             20
+#define R9A07G043_WDT2_PCLK            21      /* RZ/G2UL Only */
+#define R9A07G043_WDT2_CLK             22      /* RZ/G2UL Only */
+#define R9A07G043_SPI_CLK2             23
+#define R9A07G043_SPI_CLK              24
+#define R9A07G043_SDHI0_IMCLK          25
+#define R9A07G043_SDHI0_IMCLK2         26
+#define R9A07G043_SDHI0_CLK_HS         27
+#define R9A07G043_SDHI0_ACLK           28
+#define R9A07G043_SDHI1_IMCLK          29
+#define R9A07G043_SDHI1_IMCLK2         30
+#define R9A07G043_SDHI1_CLK_HS         31
+#define R9A07G043_SDHI1_ACLK           32
+#define R9A07G043_ISU_ACLK             33      /* RZ/G2UL Only */
+#define R9A07G043_ISU_PCLK             34      /* RZ/G2UL Only */
+#define R9A07G043_CRU_SYSCLK           35      /* RZ/G2UL Only */
+#define R9A07G043_CRU_VCLK             36      /* RZ/G2UL Only */
+#define R9A07G043_CRU_PCLK             37      /* RZ/G2UL Only */
+#define R9A07G043_CRU_ACLK             38      /* RZ/G2UL Only */
+#define R9A07G043_LCDC_CLK_A           39      /* RZ/G2UL Only */
+#define R9A07G043_LCDC_CLK_P           40      /* RZ/G2UL Only */
+#define R9A07G043_LCDC_CLK_D           41      /* RZ/G2UL Only */
+#define R9A07G043_SSI0_PCLK2           42
+#define R9A07G043_SSI0_PCLK_SFR                43
+#define R9A07G043_SSI1_PCLK2           44
+#define R9A07G043_SSI1_PCLK_SFR                45
+#define R9A07G043_SSI2_PCLK2           46
+#define R9A07G043_SSI2_PCLK_SFR                47
+#define R9A07G043_SSI3_PCLK2           48
+#define R9A07G043_SSI3_PCLK_SFR                49
+#define R9A07G043_SRC_CLKP             50      /* RZ/G2UL Only */
+#define R9A07G043_USB_U2H0_HCLK                51
+#define R9A07G043_USB_U2H1_HCLK                52
+#define R9A07G043_USB_U2P_EXR_CPUCLK   53
+#define R9A07G043_USB_PCLK             54
+#define R9A07G043_ETH0_CLK_AXI         55
+#define R9A07G043_ETH0_CLK_CHI         56
+#define R9A07G043_ETH1_CLK_AXI         57
+#define R9A07G043_ETH1_CLK_CHI         58
+#define R9A07G043_I2C0_PCLK            59
+#define R9A07G043_I2C1_PCLK            60
+#define R9A07G043_I2C2_PCLK            61
+#define R9A07G043_I2C3_PCLK            62
+#define R9A07G043_SCIF0_CLK_PCK                63
+#define R9A07G043_SCIF1_CLK_PCK                64
+#define R9A07G043_SCIF2_CLK_PCK                65
+#define R9A07G043_SCIF3_CLK_PCK                66
+#define R9A07G043_SCIF4_CLK_PCK                67
+#define R9A07G043_SCI0_CLKP            68
+#define R9A07G043_SCI1_CLKP            69
+#define R9A07G043_IRDA_CLKP            70
+#define R9A07G043_RSPI0_CLKB           71
+#define R9A07G043_RSPI1_CLKB           72
+#define R9A07G043_RSPI2_CLKB           73
+#define R9A07G043_CANFD_PCLK           74
+#define R9A07G043_GPIO_HCLK            75
+#define R9A07G043_ADC_ADCLK            76
+#define R9A07G043_ADC_PCLK             77
+#define R9A07G043_TSU_PCLK             78
+
+/* R9A07G043 Resets */
+#define R9A07G043_CA55_RST_1_0         0       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_1_1         1       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_3_0         2       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_3_1         3       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_4           4       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_5           5       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_6           6       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_7           7       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_8           8       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_9           9       /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_10          10      /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_11          11      /* RZ/G2UL Only */
+#define R9A07G043_CA55_RST_12          12      /* RZ/G2UL Only */
+#define R9A07G043_GIC600_GICRESET_N    13      /* RZ/G2UL Only */
+#define R9A07G043_GIC600_DBG_GICRESET_N        14      /* RZ/G2UL Only */
+#define R9A07G043_IA55_RESETN          15      /* RZ/G2UL Only */
+#define R9A07G043_MHU_RESETN           16      /* RZ/G2UL Only */
+#define R9A07G043_DMAC_ARESETN         17
+#define R9A07G043_DMAC_RST_ASYNC       18
+#define R9A07G043_SYC_RESETN           19
+#define R9A07G043_OSTM0_PRESETZ                20
+#define R9A07G043_OSTM1_PRESETZ                21
+#define R9A07G043_OSTM2_PRESETZ                22
+#define R9A07G043_MTU_X_PRESET_MTU3    23
+#define R9A07G043_POE3_RST_M_REG       24
+#define R9A07G043_WDT0_PRESETN         25
+#define R9A07G043_WDT2_PRESETN         26      /* RZ/G2UL Only */
+#define R9A07G043_SPI_RST              27
+#define R9A07G043_SDHI0_IXRST          28
+#define R9A07G043_SDHI1_IXRST          29
+#define R9A07G043_ISU_ARESETN          30      /* RZ/G2UL Only */
+#define R9A07G043_ISU_PRESETN          31      /* RZ/G2UL Only */
+#define R9A07G043_CRU_CMN_RSTB         32      /* RZ/G2UL Only */
+#define R9A07G043_CRU_PRESETN          33      /* RZ/G2UL Only */
+#define R9A07G043_CRU_ARESETN          34      /* RZ/G2UL Only */
+#define R9A07G043_LCDC_RESET_N         35      /* RZ/G2UL Only */
+#define R9A07G043_SSI0_RST_M2_REG      36
+#define R9A07G043_SSI1_RST_M2_REG      37
+#define R9A07G043_SSI2_RST_M2_REG      38
+#define R9A07G043_SSI3_RST_M2_REG      39
+#define R9A07G043_SRC_RST              40      /* RZ/G2UL Only */
+#define R9A07G043_USB_U2H0_HRESETN     41
+#define R9A07G043_USB_U2H1_HRESETN     42
+#define R9A07G043_USB_U2P_EXL_SYSRST   43
+#define R9A07G043_USB_PRESETN          44
+#define R9A07G043_ETH0_RST_HW_N                45
+#define R9A07G043_ETH1_RST_HW_N                46
+#define R9A07G043_I2C0_MRST            47
+#define R9A07G043_I2C1_MRST            48
+#define R9A07G043_I2C2_MRST            49
+#define R9A07G043_I2C3_MRST            50
+#define R9A07G043_SCIF0_RST_SYSTEM_N   51
+#define R9A07G043_SCIF1_RST_SYSTEM_N   52
+#define R9A07G043_SCIF2_RST_SYSTEM_N   53
+#define R9A07G043_SCIF3_RST_SYSTEM_N   54
+#define R9A07G043_SCIF4_RST_SYSTEM_N   55
+#define R9A07G043_SCI0_RST             56
+#define R9A07G043_SCI1_RST             57
+#define R9A07G043_IRDA_RST             58
+#define R9A07G043_RSPI0_RST            59
+#define R9A07G043_RSPI1_RST            60
+#define R9A07G043_RSPI2_RST            61
+#define R9A07G043_CANFD_RSTP_N         62
+#define R9A07G043_CANFD_RSTC_N         63
+#define R9A07G043_GPIO_RSTN            64
+#define R9A07G043_GPIO_PORT_RESETN     65
+#define R9A07G043_GPIO_SPARE_RESETN    66
+#define R9A07G043_ADC_PRESETN          67
+#define R9A07G043_ADC_ADRST_N          68
+#define R9A07G043_TSU_PRESETN          69
+
+#endif /* __DT_BINDINGS_CLOCK_R9A07G043_CPG_H__ */
diff --git a/include/dt-bindings/clock/r9a09g011-cpg.h b/include/dt-bindings/clock/r9a09g011-cpg.h
new file mode 100644 (file)
index 0000000..41dd585
--- /dev/null
@@ -0,0 +1,352 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+ *
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R9A09G011_CPG_H__
+#define __DT_BINDINGS_CLOCK_R9A09G011_CPG_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* Module Clocks */
+#define R9A09G011_SYS_CLK              0
+#define R9A09G011_PFC_PCLK             1
+#define R9A09G011_PMC_CORE_CLOCK       2
+#define R9A09G011_GIC_CLK              3
+#define R9A09G011_RAMA_ACLK            4
+#define R9A09G011_ROMA_ACLK            5
+#define R9A09G011_SEC_ACLK             6
+#define R9A09G011_SEC_PCLK             7
+#define R9A09G011_SEC_TCLK             8
+#define R9A09G011_DMAA_ACLK            9
+#define R9A09G011_TSU0_PCLK            10
+#define R9A09G011_TSU1_PCLK            11
+
+#define R9A09G011_CST_TRACECLK         12
+#define R9A09G011_CST_SB_CLK           13
+#define R9A09G011_CST_AHB_CLK          14
+#define R9A09G011_CST_ATB_SB_CLK       15
+#define R9A09G011_CST_TS_SB_CLK                16
+
+#define R9A09G011_SDI0_ACLK            17
+#define R9A09G011_SDI0_IMCLK           18
+#define R9A09G011_SDI0_IMCLK2          19
+#define R9A09G011_SDI0_CLK_HS          20
+#define R9A09G011_SDI1_ACLK            21
+#define R9A09G011_SDI1_IMCLK           22
+#define R9A09G011_SDI1_IMCLK2          23
+#define R9A09G011_SDI1_CLK_HS          24
+#define R9A09G011_EMM_ACLK             25
+#define R9A09G011_EMM_IMCLK            26
+#define R9A09G011_EMM_IMCLK2           27
+#define R9A09G011_EMM_CLK_HS           28
+#define R9A09G011_NFI_ACLK             29
+#define R9A09G011_NFI_NF_CLK           30
+
+#define R9A09G011_PCI_ACLK             31
+#define R9A09G011_PCI_CLK_PMU          32
+#define R9A09G011_PCI_APB_CLK          33
+#define R9A09G011_USB_ACLK_H           34
+#define R9A09G011_USB_ACLK_P           35
+#define R9A09G011_USB_PCLK             36
+#define R9A09G011_ETH0_CLK_AXI         37
+#define R9A09G011_ETH0_CLK_CHI         38
+#define R9A09G011_ETH0_GPTP_EXT                39
+
+#define R9A09G011_SDT_CLK              40
+#define R9A09G011_SDT_CLKAPB           41
+#define R9A09G011_SDT_CLK48            42
+#define R9A09G011_GRP_CLK              43
+#define R9A09G011_CIF_P0_CLK           44
+#define R9A09G011_CIF_P1_CLK           45
+#define R9A09G011_CIF_APB_CLK          46
+#define R9A09G011_DCI_CLKAXI           47
+#define R9A09G011_DCI_CLKAPB           48
+#define R9A09G011_DCI_CLKDCI2          49
+
+#define R9A09G011_HMI_PCLK             50
+#define R9A09G011_LCI_PCLK             51
+#define R9A09G011_LCI_ACLK             52
+#define R9A09G011_LCI_VCLK             53
+#define R9A09G011_LCI_LPCLK            54
+
+#define R9A09G011_AUI_CLK              55
+#define R9A09G011_AUI_CLKAXI           56
+#define R9A09G011_AUI_CLKAPB           57
+#define R9A09G011_AUMCLK               58
+#define R9A09G011_GMCLK0               59
+#define R9A09G011_GMCLK1               60
+#define R9A09G011_MTR_CLK0             61
+#define R9A09G011_MTR_CLK1             62
+#define R9A09G011_MTR_CLKAPB           63
+#define R9A09G011_GFT_CLK              64
+#define R9A09G011_GFT_CLKAPB           65
+#define R9A09G011_GFT_MCLK             66
+
+#define R9A09G011_ATGA_CLK             67
+#define R9A09G011_ATGA_CLKAPB          68
+#define R9A09G011_ATGB_CLK             69
+#define R9A09G011_ATGB_CLKAPB          70
+#define R9A09G011_SYC_CNT_CLK          71
+
+#define R9A09G011_CPERI_GRPA_PCLK      72
+#define R9A09G011_TIM0_CLK             73
+#define R9A09G011_TIM1_CLK             74
+#define R9A09G011_TIM2_CLK             75
+#define R9A09G011_TIM3_CLK             76
+#define R9A09G011_TIM4_CLK             77
+#define R9A09G011_TIM5_CLK             78
+#define R9A09G011_TIM6_CLK             79
+#define R9A09G011_TIM7_CLK             80
+#define R9A09G011_IIC_PCLK0            81
+
+#define R9A09G011_CPERI_GRPB_PCLK      82
+#define R9A09G011_TIM8_CLK             83
+#define R9A09G011_TIM9_CLK             84
+#define R9A09G011_TIM10_CLK            85
+#define R9A09G011_TIM11_CLK            86
+#define R9A09G011_TIM12_CLK            87
+#define R9A09G011_TIM13_CLK            88
+#define R9A09G011_TIM14_CLK            89
+#define R9A09G011_TIM15_CLK            90
+#define R9A09G011_IIC_PCLK1            91
+
+#define R9A09G011_CPERI_GRPC_PCLK      92
+#define R9A09G011_TIM16_CLK            93
+#define R9A09G011_TIM17_CLK            94
+#define R9A09G011_TIM18_CLK            95
+#define R9A09G011_TIM19_CLK            96
+#define R9A09G011_TIM20_CLK            97
+#define R9A09G011_TIM21_CLK            98
+#define R9A09G011_TIM22_CLK            99
+#define R9A09G011_TIM23_CLK            100
+#define R9A09G011_WDT0_PCLK            101
+#define R9A09G011_WDT0_CLK             102
+#define R9A09G011_WDT1_PCLK            103
+#define R9A09G011_WDT1_CLK             104
+
+#define R9A09G011_CPERI_GRPD_PCLK      105
+#define R9A09G011_TIM24_CLK            106
+#define R9A09G011_TIM25_CLK            107
+#define R9A09G011_TIM26_CLK            108
+#define R9A09G011_TIM27_CLK            109
+#define R9A09G011_TIM28_CLK            110
+#define R9A09G011_TIM29_CLK            111
+#define R9A09G011_TIM30_CLK            112
+#define R9A09G011_TIM31_CLK            113
+
+#define R9A09G011_CPERI_GRPE_PCLK      114
+#define R9A09G011_PWM0_CLK             115
+#define R9A09G011_PWM1_CLK             116
+#define R9A09G011_PWM2_CLK             117
+#define R9A09G011_PWM3_CLK             118
+#define R9A09G011_PWM4_CLK             119
+#define R9A09G011_PWM5_CLK             120
+#define R9A09G011_PWM6_CLK             121
+#define R9A09G011_PWM7_CLK             122
+
+#define R9A09G011_CPERI_GRPF_PCLK      123
+#define R9A09G011_PWM8_CLK             124
+#define R9A09G011_PWM9_CLK             125
+#define R9A09G011_PWM10_CLK            126
+#define R9A09G011_PWM11_CLK            127
+#define R9A09G011_PWM12_CLK            128
+#define R9A09G011_PWM13_CLK            129
+#define R9A09G011_PWM14_CLK            130
+#define R9A09G011_PWM15_CLK            131
+
+#define R9A09G011_CPERI_GRPG_PCLK      132
+#define R9A09G011_CPERI_GRPH_PCLK      133
+#define R9A09G011_URT_PCLK             134
+#define R9A09G011_URT0_CLK             135
+#define R9A09G011_URT1_CLK             136
+#define R9A09G011_CSI0_CLK             137
+#define R9A09G011_CSI1_CLK             138
+#define R9A09G011_CSI2_CLK             139
+#define R9A09G011_CSI3_CLK             140
+#define R9A09G011_CSI4_CLK             141
+#define R9A09G011_CSI5_CLK             142
+
+#define R9A09G011_ICB_ACLK1            143
+#define R9A09G011_ICB_GIC_CLK          144
+#define R9A09G011_ICB_MPCLK1           145
+#define R9A09G011_ICB_SPCLK1           146
+#define R9A09G011_ICB_CLK48            147
+#define R9A09G011_ICB_CLK48_2          148
+#define R9A09G011_ICB_CLK48_3          149
+#define R9A09G011_ICB_CLK48_4L         150
+#define R9A09G011_ICB_CLK48_4R         151
+#define R9A09G011_ICB_CLK48_5          152
+#define R9A09G011_ICB_CST_ATB_SB_CLK   153
+#define R9A09G011_ICB_CST_CS_CLK       154
+#define R9A09G011_ICB_CLK100_1         155
+#define R9A09G011_ICB_ETH0_CLK_AXI     156
+#define R9A09G011_ICB_DCI_CLKAXI       157
+#define R9A09G011_ICB_SYC_CNT_CLK      158
+
+#define R9A09G011_ICB_DRPA_ACLK                159
+#define R9A09G011_ICB_RFX_ACLK         160
+#define R9A09G011_ICB_RFX_PCLK5                161
+#define R9A09G011_ICB_MMC_ACLK         162
+
+#define R9A09G011_ICB_MPCLK3           163
+#define R9A09G011_ICB_CIMA_CLK         164
+#define R9A09G011_ICB_CIMB_CLK         165
+#define R9A09G011_ICB_BIMA_CLK         166
+#define R9A09G011_ICB_FCD_CLKAXI       167
+#define R9A09G011_ICB_VD_ACLK4         168
+#define R9A09G011_ICB_MPCLK4           169
+#define R9A09G011_ICB_VCD_PCLK4                170
+
+#define R9A09G011_CA53_CLK             171
+#define R9A09G011_CA53_ACLK            172
+#define R9A09G011_CA53_APCLK_DBG       173
+#define R9A09G011_CST_APB_CA53_CLK     174
+#define R9A09G011_CA53_ATCLK           175
+#define R9A09G011_CST_CS_CLK           176
+#define R9A09G011_CA53_TSCLK           177
+#define R9A09G011_CST_TS_CLK           178
+#define R9A09G011_CA53_APCLK_REG       179
+
+#define R9A09G011_DRPA_ACLK            180
+#define R9A09G011_DRPA_DCLK            181
+#define R9A09G011_DRPA_INITCLK         182
+
+#define R9A09G011_RAMB0_ACLK           183
+#define R9A09G011_RAMB1_ACLK           184
+#define R9A09G011_RAMB2_ACLK           185
+#define R9A09G011_RAMB3_ACLK           186
+
+#define R9A09G011_CIMA_CLKAPB          187
+#define R9A09G011_CIMA_CLK             188
+#define R9A09G011_CIMB_CLK             189
+#define R9A09G011_FAFA_CLK             190
+#define R9A09G011_STG_CLKAXI           191
+#define R9A09G011_STG_CLK0             192
+
+#define R9A09G011_BIMA_CLKAPB          193
+#define R9A09G011_BIMA_CLK             194
+#define R9A09G011_FAFB_CLK             195
+#define R9A09G011_FCD_CLK              196
+#define R9A09G011_FCD_CLKAXI           197
+
+#define R9A09G011_RIM_CLK              198
+#define R9A09G011_VCD_ACLK             199
+#define R9A09G011_VCD_PCLK             200
+#define R9A09G011_JPG0_CLK             201
+#define R9A09G011_JPG0_ACLK            202
+
+#define R9A09G011_MMC_CORE_DDRC_CLK    203
+#define R9A09G011_MMC_ACLK             204
+#define R9A09G011_MMC_PCLK             205
+#define R9A09G011_DDI_APBCLK           206
+
+/* Resets */
+#define R9A09G011_SYS_RST_N            0
+#define R9A09G011_PFC_PRESETN          1
+#define R9A09G011_RAMA_ARESETN         2
+#define R9A09G011_ROM_ARESETN          3
+#define R9A09G011_DMAA_ARESETN         4
+#define R9A09G011_SEC_ARESETN          5
+#define R9A09G011_SEC_PRESETN          6
+#define R9A09G011_SEC_RSTB             7
+#define R9A09G011_TSU0_RESETN          8
+#define R9A09G011_TSU1_RESETN          9
+#define R9A09G011_PMC_RESET_N          10
+
+#define R9A09G011_CST_NTRST            11
+#define R9A09G011_CST_NPOTRST          12
+#define R9A09G011_CST_NTRST2           13
+#define R9A09G011_CST_CS_RESETN                14
+#define R9A09G011_CST_TS_RESETN                15
+#define R9A09G011_CST_TRESETN          16
+#define R9A09G011_CST_SB_RESETN                17
+#define R9A09G011_CST_AHB_RESETN       18
+#define R9A09G011_CST_TS_SB_RESETN     19
+#define R9A09G011_CST_APB_CA53_RESETN  20
+#define R9A09G011_CST_ATB_SB_RESETN    21
+
+#define R9A09G011_SDI0_IXRST           22
+#define R9A09G011_SDI1_IXRST           23
+#define R9A09G011_EMM_IXRST            24
+#define R9A09G011_NFI_MARESETN         25
+#define R9A09G011_NFI_REG_RST_N                26
+#define R9A09G011_USB_PRESET_N         27
+#define R9A09G011_USB_DRD_RESET                28
+#define R9A09G011_USB_ARESETN_P                29
+#define R9A09G011_USB_ARESETN_H                30
+#define R9A09G011_ETH0_RST_HW_N                31
+#define R9A09G011_PCI_ARESETN          32
+
+#define R9A09G011_SDT_RSTSYSAX         33
+#define R9A09G011_GRP_RESETN           34
+#define R9A09G011_CIF_RST_N            35
+#define R9A09G011_DCU_RSTSYSAX         36
+#define R9A09G011_HMI_RST_N            37
+#define R9A09G011_HMI_PRESETN          38
+#define R9A09G011_LCI_PRESETN          39
+#define R9A09G011_LCI_ARESETN          40
+
+#define R9A09G011_AUI_RSTSYSAX         41
+#define R9A09G011_MTR_RSTSYSAX         42
+#define R9A09G011_GFT_RSTSYSAX         43
+#define R9A09G011_ATGA_RSTSYSAX                44
+#define R9A09G011_ATGB_RSTSYSAX                45
+#define R9A09G011_SYC_RST_N            46
+
+#define R9A09G011_TIM_GPA_PRESETN      47
+#define R9A09G011_TIM_GPB_PRESETN      48
+#define R9A09G011_TIM_GPC_PRESETN      49
+#define R9A09G011_TIM_GPD_PRESETN      50
+#define R9A09G011_PWM_GPE_PRESETN      51
+#define R9A09G011_PWM_GPF_PRESETN      52
+#define R9A09G011_CSI_GPG_PRESETN      53
+#define R9A09G011_CSI_GPH_PRESETN      54
+#define R9A09G011_IIC_GPA_PRESETN      55
+#define R9A09G011_IIC_GPB_PRESETN      56
+#define R9A09G011_URT_PRESETN          57
+#define R9A09G011_WDT0_PRESETN         58
+#define R9A09G011_WDT1_PRESETN         59
+
+#define R9A09G011_ICB_PD_AWO_RST_N     60
+#define R9A09G011_ICB_PD_MMC_RST_N     61
+#define R9A09G011_ICB_PD_VD0_RST_N     62
+#define R9A09G011_ICB_PD_VD1_RST_N     63
+#define R9A09G011_ICB_PD_RFX_RST_N     64
+
+#define R9A09G011_CA53_NCPUPORESET0    65
+#define R9A09G011_CA53_NCPUPORESET1    66
+#define R9A09G011_CA53_NCORERESET0     67
+#define R9A09G011_CA53_NCORERESET1     68
+#define R9A09G011_CA53_NPRESETDBG      69
+#define R9A09G011_CA53_L2RESET         70
+#define R9A09G011_CA53_NMISCRESET_HM   71
+#define R9A09G011_CA53_NMISCRESET_SM   72
+#define R9A09G011_CA53_NARESET         73
+
+#define R9A09G011_DRPA_ARESETN         74
+
+#define R9A09G011_RAMB0_ARESETN                75
+#define R9A09G011_RAMB1_ARESETN                76
+#define R9A09G011_RAMB2_ARESETN                77
+#define R9A09G011_RAMB3_ARESETN                78
+
+#define R9A09G011_CIMA_RSTSYSAX                79
+#define R9A09G011_CIMB_RSTSYSAX                80
+#define R9A09G011_FAFA_RSTSYSAX                81
+#define R9A09G011_STG_RSTSYSAX         82
+
+#define R9A09G011_BIMA_RSTSYSAX                83
+#define R9A09G011_FAFB_RSTSYSAX                84
+#define R9A09G011_FCD_RSTSYSAX         85
+#define R9A09G011_RIM_RSTSYSAX         86
+#define R9A09G011_VCD_RESETN           87
+#define R9A09G011_JPG_XRESET           88
+
+#define R9A09G011_MMC_CORE_DDRC_RSTN   89
+#define R9A09G011_MMC_ARESETN_N                90
+#define R9A09G011_MMC_PRESETN          91
+#define R9A09G011_DDI_PWROK            92
+#define R9A09G011_DDI_RESET            93
+#define R9A09G011_DDI_RESETN_APB       94
+
+#endif /* __DT_BINDINGS_CLOCK_R9A09G011_CPG_H__ */
diff --git a/include/dt-bindings/clock/samsung,exynosautov9.h b/include/dt-bindings/clock/samsung,exynosautov9.h
new file mode 100644 (file)
index 0000000..ea9f91b
--- /dev/null
@@ -0,0 +1,299 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Author: Chanho Park <chanho61.park@samsung.com>
+ *
+ * Device Tree binding constants for Exynos Auto V9 clock controller.
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_EXYNOSAUTOV9_H
+#define _DT_BINDINGS_CLOCK_EXYNOSAUTOV9_H
+
+/* CMU_TOP */
+#define FOUT_SHARED0_PLL               1
+#define FOUT_SHARED1_PLL               2
+#define FOUT_SHARED2_PLL               3
+#define FOUT_SHARED3_PLL               4
+#define FOUT_SHARED4_PLL               5
+
+/* MUX in CMU_TOP */
+#define MOUT_SHARED0_PLL               6
+#define MOUT_SHARED1_PLL               7
+#define MOUT_SHARED2_PLL               8
+#define MOUT_SHARED3_PLL               9
+#define MOUT_SHARED4_PLL               10
+#define MOUT_CLKCMU_CMU_BOOST          11
+#define MOUT_CLKCMU_CMU_CMUREF         12
+#define MOUT_CLKCMU_ACC_BUS            13
+#define MOUT_CLKCMU_APM_BUS            14
+#define MOUT_CLKCMU_AUD_CPU            15
+#define MOUT_CLKCMU_AUD_BUS            16
+#define MOUT_CLKCMU_BUSC_BUS           17
+#define MOUT_CLKCMU_BUSMC_BUS          19
+#define MOUT_CLKCMU_CORE_BUS           20
+#define MOUT_CLKCMU_CPUCL0_SWITCH      21
+#define MOUT_CLKCMU_CPUCL0_CLUSTER     22
+#define MOUT_CLKCMU_CPUCL1_SWITCH      24
+#define MOUT_CLKCMU_CPUCL1_CLUSTER     25
+#define MOUT_CLKCMU_DPTX_BUS           26
+#define MOUT_CLKCMU_DPTX_DPGTC         27
+#define MOUT_CLKCMU_DPUM_BUS           28
+#define MOUT_CLKCMU_DPUS0_BUS          29
+#define MOUT_CLKCMU_DPUS1_BUS          30
+#define MOUT_CLKCMU_FSYS0_BUS          31
+#define MOUT_CLKCMU_FSYS0_PCIE         32
+#define MOUT_CLKCMU_FSYS1_BUS          33
+#define MOUT_CLKCMU_FSYS1_USBDRD       34
+#define MOUT_CLKCMU_FSYS1_MMC_CARD     35
+#define MOUT_CLKCMU_FSYS2_BUS          36
+#define MOUT_CLKCMU_FSYS2_UFS_EMBD     37
+#define MOUT_CLKCMU_FSYS2_ETHERNET     38
+#define MOUT_CLKCMU_G2D_G2D            39
+#define MOUT_CLKCMU_G2D_MSCL           40
+#define MOUT_CLKCMU_G3D00_SWITCH       41
+#define MOUT_CLKCMU_G3D01_SWITCH       42
+#define MOUT_CLKCMU_G3D1_SWITCH                43
+#define MOUT_CLKCMU_ISPB_BUS           44
+#define MOUT_CLKCMU_MFC_MFC            45
+#define MOUT_CLKCMU_MFC_WFD            46
+#define MOUT_CLKCMU_MIF_SWITCH         47
+#define MOUT_CLKCMU_MIF_BUSP           48
+#define MOUT_CLKCMU_NPU_BUS            49
+#define MOUT_CLKCMU_PERIC0_BUS         50
+#define MOUT_CLKCMU_PERIC0_IP          51
+#define MOUT_CLKCMU_PERIC1_BUS         52
+#define MOUT_CLKCMU_PERIC1_IP          53
+#define MOUT_CLKCMU_PERIS_BUS          54
+
+/* DIV in CMU_TOP */
+#define DOUT_SHARED0_DIV3              101
+#define DOUT_SHARED0_DIV2              102
+#define DOUT_SHARED1_DIV3              103
+#define DOUT_SHARED1_DIV2              104
+#define DOUT_SHARED1_DIV4              105
+#define DOUT_SHARED2_DIV3              106
+#define DOUT_SHARED2_DIV2              107
+#define DOUT_SHARED2_DIV4              108
+#define DOUT_SHARED4_DIV2              109
+#define DOUT_SHARED4_DIV4              110
+#define DOUT_CLKCMU_CMU_BOOST          111
+#define DOUT_CLKCMU_ACC_BUS            112
+#define DOUT_CLKCMU_APM_BUS            113
+#define DOUT_CLKCMU_AUD_CPU            114
+#define DOUT_CLKCMU_AUD_BUS            115
+#define DOUT_CLKCMU_BUSC_BUS           116
+#define DOUT_CLKCMU_BUSMC_BUS          118
+#define DOUT_CLKCMU_CORE_BUS           119
+#define DOUT_CLKCMU_CPUCL0_SWITCH      120
+#define DOUT_CLKCMU_CPUCL0_CLUSTER     121
+#define DOUT_CLKCMU_CPUCL1_SWITCH      123
+#define DOUT_CLKCMU_CPUCL1_CLUSTER     124
+#define DOUT_CLKCMU_DPTX_BUS           125
+#define DOUT_CLKCMU_DPTX_DPGTC         126
+#define DOUT_CLKCMU_DPUM_BUS           127
+#define DOUT_CLKCMU_DPUS0_BUS          128
+#define DOUT_CLKCMU_DPUS1_BUS          129
+#define DOUT_CLKCMU_FSYS0_BUS          130
+#define DOUT_CLKCMU_FSYS0_PCIE         131
+#define DOUT_CLKCMU_FSYS1_BUS          132
+#define DOUT_CLKCMU_FSYS1_USBDRD       133
+#define DOUT_CLKCMU_FSYS2_BUS          134
+#define DOUT_CLKCMU_FSYS2_UFS_EMBD     135
+#define DOUT_CLKCMU_FSYS2_ETHERNET     136
+#define DOUT_CLKCMU_G2D_G2D            137
+#define DOUT_CLKCMU_G2D_MSCL           138
+#define DOUT_CLKCMU_G3D00_SWITCH       139
+#define DOUT_CLKCMU_G3D01_SWITCH       140
+#define DOUT_CLKCMU_G3D1_SWITCH                141
+#define DOUT_CLKCMU_ISPB_BUS           142
+#define DOUT_CLKCMU_MFC_MFC            143
+#define DOUT_CLKCMU_MFC_WFD            144
+#define DOUT_CLKCMU_MIF_SWITCH         145
+#define DOUT_CLKCMU_MIF_BUSP           146
+#define DOUT_CLKCMU_NPU_BUS            147
+#define DOUT_CLKCMU_PERIC0_BUS         148
+#define DOUT_CLKCMU_PERIC0_IP          149
+#define DOUT_CLKCMU_PERIC1_BUS         150
+#define DOUT_CLKCMU_PERIC1_IP          151
+#define DOUT_CLKCMU_PERIS_BUS          152
+
+/* GAT in CMU_TOP */
+#define GOUT_CLKCMU_CMU_BOOST          201
+#define GOUT_CLKCMU_CPUCL0_BOOST       202
+#define GOUT_CLKCMU_CPUCL1_BOOST       203
+#define GOUT_CLKCMU_CORE_BOOST         204
+#define GOUT_CLKCMU_BUSC_BOOST         205
+#define GOUT_CLKCMU_BUSMC_BOOST                206
+#define GOUT_CLKCMU_MIF_BOOST          207
+#define GOUT_CLKCMU_ACC_BUS            208
+#define GOUT_CLKCMU_APM_BUS            209
+#define GOUT_CLKCMU_AUD_CPU            210
+#define GOUT_CLKCMU_AUD_BUS            211
+#define GOUT_CLKCMU_BUSC_BUS           212
+#define GOUT_CLKCMU_BUSMC_BUS          214
+#define GOUT_CLKCMU_CORE_BUS           215
+#define GOUT_CLKCMU_CPUCL0_SWITCH      216
+#define GOUT_CLKCMU_CPUCL0_CLUSTER     217
+#define GOUT_CLKCMU_CPUCL1_SWITCH      219
+#define GOUT_CLKCMU_CPUCL1_CLUSTER     220
+#define GOUT_CLKCMU_DPTX_BUS           221
+#define GOUT_CLKCMU_DPTX_DPGTC         222
+#define GOUT_CLKCMU_DPUM_BUS           223
+#define GOUT_CLKCMU_DPUS0_BUS          224
+#define GOUT_CLKCMU_DPUS1_BUS          225
+#define GOUT_CLKCMU_FSYS0_BUS          226
+#define GOUT_CLKCMU_FSYS0_PCIE         227
+#define GOUT_CLKCMU_FSYS1_BUS          228
+#define GOUT_CLKCMU_FSYS1_USBDRD       229
+#define GOUT_CLKCMU_FSYS1_MMC_CARD     230
+#define GOUT_CLKCMU_FSYS2_BUS          231
+#define GOUT_CLKCMU_FSYS2_UFS_EMBD     232
+#define GOUT_CLKCMU_FSYS2_ETHERNET     233
+#define GOUT_CLKCMU_G2D_G2D            234
+#define GOUT_CLKCMU_G2D_MSCL           235
+#define GOUT_CLKCMU_G3D00_SWITCH       236
+#define GOUT_CLKCMU_G3D01_SWITCH       237
+#define GOUT_CLKCMU_G3D1_SWITCH                238
+#define GOUT_CLKCMU_ISPB_BUS           239
+#define GOUT_CLKCMU_MFC_MFC            240
+#define GOUT_CLKCMU_MFC_WFD            241
+#define GOUT_CLKCMU_MIF_SWITCH         242
+#define GOUT_CLKCMU_MIF_BUSP           243
+#define GOUT_CLKCMU_NPU_BUS            244
+#define GOUT_CLKCMU_PERIC0_BUS         245
+#define GOUT_CLKCMU_PERIC0_IP          246
+#define GOUT_CLKCMU_PERIC1_BUS         247
+#define GOUT_CLKCMU_PERIC1_IP          248
+#define GOUT_CLKCMU_PERIS_BUS          249
+
+#define TOP_NR_CLK                     250
+
+/* CMU_BUSMC */
+#define CLK_MOUT_BUSMC_BUS_USER                1
+#define CLK_DOUT_BUSMC_BUSP            2
+#define CLK_GOUT_BUSMC_PDMA0_PCLK      3
+#define CLK_GOUT_BUSMC_SPDMA_PCLK      4
+
+#define BUSMC_NR_CLK                   5
+
+/* CMU_CORE */
+#define CLK_MOUT_CORE_BUS_USER         1
+#define CLK_DOUT_CORE_BUSP             2
+#define CLK_GOUT_CORE_CCI_CLK          3
+#define CLK_GOUT_CORE_CCI_PCLK         4
+#define CLK_GOUT_CORE_CMU_CORE_PCLK    5
+
+#define CORE_NR_CLK                    6
+
+/* CMU_FSYS2 */
+#define CLK_MOUT_FSYS2_BUS_USER                1
+#define CLK_MOUT_FSYS2_UFS_EMBD_USER   2
+#define CLK_MOUT_FSYS2_ETHERNET_USER   3
+#define CLK_GOUT_FSYS2_UFS_EMBD0_ACLK  4
+#define CLK_GOUT_FSYS2_UFS_EMBD0_UNIPRO        5
+#define CLK_GOUT_FSYS2_UFS_EMBD1_ACLK  6
+#define CLK_GOUT_FSYS2_UFS_EMBD1_UNIPRO        7
+
+#define FSYS2_NR_CLK                   8
+
+/* CMU_PERIC0 */
+#define CLK_MOUT_PERIC0_BUS_USER       1
+#define CLK_MOUT_PERIC0_IP_USER                2
+#define CLK_MOUT_PERIC0_USI00_USI      3
+#define CLK_MOUT_PERIC0_USI01_USI      4
+#define CLK_MOUT_PERIC0_USI02_USI      5
+#define CLK_MOUT_PERIC0_USI03_USI      6
+#define CLK_MOUT_PERIC0_USI04_USI      7
+#define CLK_MOUT_PERIC0_USI05_USI      8
+#define CLK_MOUT_PERIC0_USI_I2C                9
+
+#define CLK_DOUT_PERIC0_USI00_USI      10
+#define CLK_DOUT_PERIC0_USI01_USI      11
+#define CLK_DOUT_PERIC0_USI02_USI      12
+#define CLK_DOUT_PERIC0_USI03_USI      13
+#define CLK_DOUT_PERIC0_USI04_USI      14
+#define CLK_DOUT_PERIC0_USI05_USI      15
+#define CLK_DOUT_PERIC0_USI_I2C                16
+
+#define CLK_GOUT_PERIC0_IPCLK_0                20
+#define CLK_GOUT_PERIC0_IPCLK_1                21
+#define CLK_GOUT_PERIC0_IPCLK_2                22
+#define CLK_GOUT_PERIC0_IPCLK_3                23
+#define CLK_GOUT_PERIC0_IPCLK_4                24
+#define CLK_GOUT_PERIC0_IPCLK_5                25
+#define CLK_GOUT_PERIC0_IPCLK_6                26
+#define CLK_GOUT_PERIC0_IPCLK_7                27
+#define CLK_GOUT_PERIC0_IPCLK_8                28
+#define CLK_GOUT_PERIC0_IPCLK_9                29
+#define CLK_GOUT_PERIC0_IPCLK_10       30
+#define CLK_GOUT_PERIC0_IPCLK_11       30
+#define CLK_GOUT_PERIC0_PCLK_0         31
+#define CLK_GOUT_PERIC0_PCLK_1         32
+#define CLK_GOUT_PERIC0_PCLK_2         33
+#define CLK_GOUT_PERIC0_PCLK_3         34
+#define CLK_GOUT_PERIC0_PCLK_4         35
+#define CLK_GOUT_PERIC0_PCLK_5         36
+#define CLK_GOUT_PERIC0_PCLK_6         37
+#define CLK_GOUT_PERIC0_PCLK_7         38
+#define CLK_GOUT_PERIC0_PCLK_8         39
+#define CLK_GOUT_PERIC0_PCLK_9         40
+#define CLK_GOUT_PERIC0_PCLK_10                41
+#define CLK_GOUT_PERIC0_PCLK_11                42
+
+#define PERIC0_NR_CLK                  43
+
+/* CMU_PERIC1 */
+#define CLK_MOUT_PERIC1_BUS_USER       1
+#define CLK_MOUT_PERIC1_IP_USER                2
+#define CLK_MOUT_PERIC1_USI06_USI      3
+#define CLK_MOUT_PERIC1_USI07_USI      4
+#define CLK_MOUT_PERIC1_USI08_USI      5
+#define CLK_MOUT_PERIC1_USI09_USI      6
+#define CLK_MOUT_PERIC1_USI10_USI      7
+#define CLK_MOUT_PERIC1_USI11_USI      8
+#define CLK_MOUT_PERIC1_USI_I2C                9
+
+#define CLK_DOUT_PERIC1_USI06_USI      10
+#define CLK_DOUT_PERIC1_USI07_USI      11
+#define CLK_DOUT_PERIC1_USI08_USI      12
+#define CLK_DOUT_PERIC1_USI09_USI      13
+#define CLK_DOUT_PERIC1_USI10_USI      14
+#define CLK_DOUT_PERIC1_USI11_USI      15
+#define CLK_DOUT_PERIC1_USI_I2C                16
+
+#define CLK_GOUT_PERIC1_IPCLK_0                20
+#define CLK_GOUT_PERIC1_IPCLK_1                21
+#define CLK_GOUT_PERIC1_IPCLK_2                22
+#define CLK_GOUT_PERIC1_IPCLK_3                23
+#define CLK_GOUT_PERIC1_IPCLK_4                24
+#define CLK_GOUT_PERIC1_IPCLK_5                25
+#define CLK_GOUT_PERIC1_IPCLK_6                26
+#define CLK_GOUT_PERIC1_IPCLK_7                27
+#define CLK_GOUT_PERIC1_IPCLK_8                28
+#define CLK_GOUT_PERIC1_IPCLK_9                29
+#define CLK_GOUT_PERIC1_IPCLK_10       30
+#define CLK_GOUT_PERIC1_IPCLK_11       30
+#define CLK_GOUT_PERIC1_PCLK_0         31
+#define CLK_GOUT_PERIC1_PCLK_1         32
+#define CLK_GOUT_PERIC1_PCLK_2         33
+#define CLK_GOUT_PERIC1_PCLK_3         34
+#define CLK_GOUT_PERIC1_PCLK_4         35
+#define CLK_GOUT_PERIC1_PCLK_5         36
+#define CLK_GOUT_PERIC1_PCLK_6         37
+#define CLK_GOUT_PERIC1_PCLK_7         38
+#define CLK_GOUT_PERIC1_PCLK_8         39
+#define CLK_GOUT_PERIC1_PCLK_9         40
+#define CLK_GOUT_PERIC1_PCLK_10                41
+#define CLK_GOUT_PERIC1_PCLK_11                42
+
+#define PERIC1_NR_CLK                  43
+
+/* CMU_PERIS */
+#define CLK_MOUT_PERIS_BUS_USER                1
+#define CLK_GOUT_SYSREG_PERIS_PCLK     2
+#define CLK_GOUT_WDT_CLUSTER0          3
+#define CLK_GOUT_WDT_CLUSTER1          4
+
+#define PERIS_NR_CLK                   5
+
+#endif /* _DT_BINDINGS_CLOCK_EXYNOSAUTOV9_H */
diff --git a/include/dt-bindings/clock/ste-db8500-clkout.h b/include/dt-bindings/clock/ste-db8500-clkout.h
new file mode 100644 (file)
index 0000000..ca07cb2
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __STE_CLK_DB8500_CLKOUT_H__
+#define __STE_CLK_DB8500_CLKOUT_H__
+
+#define DB8500_CLKOUT_1                        0
+#define DB8500_CLKOUT_2                        1
+
+#define DB8500_CLKOUT_SRC_CLK38M       0
+#define DB8500_CLKOUT_SRC_ACLK         1
+#define DB8500_CLKOUT_SRC_SYSCLK       2
+#define DB8500_CLKOUT_SRC_LCDCLK       3
+#define DB8500_CLKOUT_SRC_SDMMCCLK     4
+#define DB8500_CLKOUT_SRC_TVCLK                5
+#define DB8500_CLKOUT_SRC_TIMCLK       6
+#define DB8500_CLKOUT_SRC_CLK009       7
+
+#endif
diff --git a/include/dt-bindings/clock/stm32mp13-clks.h b/include/dt-bindings/clock/stm32mp13-clks.h
new file mode 100644 (file)
index 0000000..02befd2
--- /dev/null
@@ -0,0 +1,229 @@
+/* SPDX-License-Identifier: GPL-2.0+ or BSD-3-Clause */
+/*
+ * Copyright (C) STMicroelectronics 2020 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@st.com> for STMicroelectronics.
+ */
+
+#ifndef _DT_BINDINGS_STM32MP13_CLKS_H_
+#define _DT_BINDINGS_STM32MP13_CLKS_H_
+
+/* OSCILLATOR clocks */
+#define CK_HSE         0
+#define CK_CSI         1
+#define CK_LSI         2
+#define CK_LSE         3
+#define CK_HSI         4
+#define CK_HSE_DIV2    5
+
+/* PLL */
+#define PLL1           6
+#define PLL2           7
+#define PLL3           8
+#define PLL4           9
+
+/* ODF */
+#define PLL1_P         10
+#define PLL1_Q         11
+#define PLL1_R         12
+#define PLL2_P         13
+#define PLL2_Q         14
+#define PLL2_R         15
+#define PLL3_P         16
+#define PLL3_Q         17
+#define PLL3_R         18
+#define PLL4_P         19
+#define PLL4_Q         20
+#define PLL4_R         21
+
+#define PCLK1          22
+#define PCLK2          23
+#define PCLK3          24
+#define PCLK4          25
+#define PCLK5          26
+#define PCLK6          27
+
+/* SYSTEM CLOCK */
+#define CK_PER         28
+#define CK_MPU         29
+#define CK_AXI         30
+#define CK_MLAHB       31
+
+/* BASE TIMER */
+#define CK_TIMG1       32
+#define CK_TIMG2       33
+#define CK_TIMG3       34
+
+/* AUX */
+#define RTC            35
+
+/* TRACE & DEBUG clocks */
+#define CK_DBG         36
+#define CK_TRACE       37
+
+/* MCO clocks */
+#define CK_MCO1                38
+#define CK_MCO2                39
+
+/*  IP clocks */
+#define SYSCFG         40
+#define VREF           41
+#define DTS            42
+#define PMBCTRL                43
+#define HDP            44
+#define IWDG2          45
+#define STGENRO                46
+#define USART1         47
+#define RTCAPB         48
+#define TZC            49
+#define TZPC           50
+#define IWDG1          51
+#define BSEC           52
+#define DMA1           53
+#define DMA2           54
+#define DMAMUX1                55
+#define DMAMUX2                56
+#define GPIOA          57
+#define GPIOB          58
+#define GPIOC          59
+#define GPIOD          60
+#define GPIOE          61
+#define GPIOF          62
+#define GPIOG          63
+#define GPIOH          64
+#define GPIOI          65
+#define CRYP1          66
+#define HASH1          67
+#define BKPSRAM                68
+#define MDMA           69
+#define CRC1           70
+#define USBH           71
+#define DMA3           72
+#define TSC            73
+#define PKA            74
+#define AXIMC          75
+#define MCE            76
+#define ETH1TX         77
+#define ETH2TX         78
+#define ETH1RX         79
+#define ETH2RX         80
+#define ETH1MAC                81
+#define ETH2MAC                82
+#define ETH1STP                83
+#define ETH2STP                84
+
+/* IP clocks with parents */
+#define SDMMC1_K       85
+#define SDMMC2_K       86
+#define ADC1_K         87
+#define ADC2_K         88
+#define FMC_K          89
+#define QSPI_K         90
+#define RNG1_K         91
+#define USBPHY_K       92
+#define STGEN_K                93
+#define SPDIF_K                94
+#define SPI1_K         95
+#define SPI2_K         96
+#define SPI3_K         97
+#define SPI4_K         98
+#define SPI5_K         99
+#define I2C1_K         100
+#define I2C2_K         101
+#define I2C3_K         102
+#define I2C4_K         103
+#define I2C5_K         104
+#define TIM2_K         105
+#define TIM3_K         106
+#define TIM4_K         107
+#define TIM5_K         108
+#define TIM6_K         109
+#define TIM7_K         110
+#define TIM12_K                111
+#define TIM13_K                112
+#define TIM14_K                113
+#define TIM1_K         114
+#define TIM8_K         115
+#define TIM15_K                116
+#define TIM16_K                117
+#define TIM17_K                118
+#define LPTIM1_K       119
+#define LPTIM2_K       120
+#define LPTIM3_K       121
+#define LPTIM4_K       122
+#define LPTIM5_K       123
+#define USART1_K       124
+#define USART2_K       125
+#define USART3_K       126
+#define UART4_K                127
+#define UART5_K                128
+#define USART6_K       129
+#define UART7_K                130
+#define UART8_K                131
+#define DFSDM_K                132
+#define FDCAN_K                133
+#define SAI1_K         134
+#define SAI2_K         135
+#define ADFSDM_K       136
+#define USBO_K         137
+#define LTDC_PX                138
+#define ETH1CK_K       139
+#define ETH1PTP_K      140
+#define ETH2CK_K       141
+#define ETH2PTP_K      142
+#define DCMIPP_K       143
+#define SAES_K         144
+#define DTS_K          145
+
+/* DDR */
+#define DDRC1          146
+#define DDRC1LP                147
+#define DDRC2          148
+#define DDRC2LP                149
+#define DDRPHYC                150
+#define DDRPHYCLP      151
+#define DDRCAPB                152
+#define DDRCAPBLP      153
+#define AXIDCG         154
+#define DDRPHYCAPB     155
+#define DDRPHYCAPBLP   156
+#define DDRPERFM       157
+
+#define ADC1           158
+#define ADC2           159
+#define SAI1           160
+#define SAI2           161
+
+#define STM32MP1_LAST_CLK 162
+
+/* SCMI clock identifiers */
+#define CK_SCMI_HSE            0
+#define CK_SCMI_HSI            1
+#define CK_SCMI_CSI            2
+#define CK_SCMI_LSE            3
+#define CK_SCMI_LSI            4
+#define CK_SCMI_HSE_DIV2       5
+#define CK_SCMI_PLL2_Q         6
+#define CK_SCMI_PLL2_R         7
+#define CK_SCMI_PLL3_P         8
+#define CK_SCMI_PLL3_Q         9
+#define CK_SCMI_PLL3_R         10
+#define CK_SCMI_PLL4_P         11
+#define CK_SCMI_PLL4_Q         12
+#define CK_SCMI_PLL4_R         13
+#define CK_SCMI_MPU            14
+#define CK_SCMI_AXI            15
+#define CK_SCMI_MLAHB          16
+#define CK_SCMI_CKPER          17
+#define CK_SCMI_PCLK1          18
+#define CK_SCMI_PCLK2          19
+#define CK_SCMI_PCLK3          20
+#define CK_SCMI_PCLK4          21
+#define CK_SCMI_PCLK5          22
+#define CK_SCMI_PCLK6          23
+#define CK_SCMI_CKTIMG1                24
+#define CK_SCMI_CKTIMG2                25
+#define CK_SCMI_CKTIMG3                26
+#define CK_SCMI_RTC            27
+#define CK_SCMI_RTCAPB         28
+
+#endif /* _DT_BINDINGS_STM32MP13_CLKS_H_ */
index 890368d..a96087a 100644 (file)
@@ -22,5 +22,6 @@
 #define CLK_W1                 12
 
 #define CLK_R_APB2_RSB         13
+#define CLK_R_APB1_RTC         14
 
 #endif /* _DT_BINDINGS_CLK_SUN50I_H6_R_CCU_H_ */
index 4fc08b0..1191aca 100644 (file)
 #define CLK_BUS_TVE0           125
 #define CLK_HDCP               126
 #define CLK_BUS_HDCP           127
+#define CLK_PLL_SYSTEM_32K     128
 
 #endif /* _DT_BINDINGS_CLK_SUN50I_H616_H_ */
diff --git a/include/dt-bindings/power/r8a779g0-sysc.h b/include/dt-bindings/power/r8a779g0-sysc.h
new file mode 100644 (file)
index 0000000..7daa70f
--- /dev/null
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (C) 2022 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_POWER_R8A779G0_SYSC_H__
+#define __DT_BINDINGS_POWER_R8A779G0_SYSC_H__
+
+/*
+ * These power domain indices match the Power Domain Register Numbers (PDR)
+ */
+
+#define R8A779G0_PD_A1E0D0C0           0
+#define R8A779G0_PD_A1E0D0C1           1
+#define R8A779G0_PD_A1E0D1C0           2
+#define R8A779G0_PD_A1E0D1C1           3
+#define R8A779G0_PD_A2E0D0             16
+#define R8A779G0_PD_A2E0D1             17
+#define R8A779G0_PD_A3E0               20
+#define R8A779G0_PD_A33DGA             24
+#define R8A779G0_PD_A23DGB             25
+#define R8A779G0_PD_A1DSP0             33
+#define R8A779G0_PD_A2IMP01            34
+#define R8A779G0_PD_A2PSC              35
+#define R8A779G0_PD_A2CV0              36
+#define R8A779G0_PD_A2CV1              37
+#define R8A779G0_PD_A1CNN0             41
+#define R8A779G0_PD_A2CN0              42
+#define R8A779G0_PD_A3IR               43
+#define R8A779G0_PD_A1DSP1             45
+#define R8A779G0_PD_A2IMP23            46
+#define R8A779G0_PD_A2DMA              47
+#define R8A779G0_PD_A2CV2              48
+#define R8A779G0_PD_A2CV3              49
+#define R8A779G0_PD_A1DSP2             53
+#define R8A779G0_PD_A1DSP3             54
+#define R8A779G0_PD_A3VIP0             56
+#define R8A779G0_PD_A3VIP1             57
+#define R8A779G0_PD_A3VIP2             58
+#define R8A779G0_PD_A3ISP0             60
+#define R8A779G0_PD_A3ISP1             61
+
+/* Always-on power area */
+#define R8A779G0_PD_ALWAYS_ON          64
+
+#endif /* __DT_BINDINGS_POWER_R8A779G0_SYSC_H__*/
diff --git a/include/dt-bindings/reset/stm32mp13-resets.h b/include/dt-bindings/reset/stm32mp13-resets.h
new file mode 100644 (file)
index 0000000..934864e
--- /dev/null
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
+/*
+ * Copyright (C) STMicroelectronics 2018 - All Rights Reserved
+ * Author: Gabriel Fernandez <gabriel.fernandez@st.com> for STMicroelectronics.
+ */
+
+#ifndef _DT_BINDINGS_STM32MP13_RESET_H_
+#define _DT_BINDINGS_STM32MP13_RESET_H_
+
+#define TIM2_R         13568
+#define TIM3_R         13569
+#define TIM4_R         13570
+#define TIM5_R         13571
+#define TIM6_R         13572
+#define TIM7_R         13573
+#define LPTIM1_R       13577
+#define SPI2_R         13579
+#define SPI3_R         13580
+#define USART3_R       13583
+#define UART4_R                13584
+#define UART5_R                13585
+#define UART7_R                13586
+#define UART8_R                13587
+#define I2C1_R         13589
+#define I2C2_R         13590
+#define SPDIF_R                13594
+#define TIM1_R         13632
+#define TIM8_R         13633
+#define SPI1_R         13640
+#define USART6_R       13645
+#define SAI1_R         13648
+#define SAI2_R         13649
+#define DFSDM_R                13652
+#define FDCAN_R                13656
+#define LPTIM2_R       13696
+#define LPTIM3_R       13697
+#define LPTIM4_R       13698
+#define LPTIM5_R       13699
+#define SYSCFG_R       13707
+#define VREF_R         13709
+#define DTS_R          13712
+#define PMBCTRL_R      13713
+#define LTDC_R         13760
+#define DCMIPP_R       13761
+#define DDRPERFM_R     13768
+#define USBPHY_R       13776
+#define STGEN_R                13844
+#define USART1_R       13888
+#define USART2_R       13889
+#define SPI4_R         13890
+#define SPI5_R         13891
+#define I2C3_R         13892
+#define I2C4_R         13893
+#define I2C5_R         13894
+#define TIM12_R                13895
+#define TIM13_R                13896
+#define TIM14_R                13897
+#define TIM15_R                13898
+#define TIM16_R                13899
+#define TIM17_R                13900
+#define DMA1_R         13952
+#define DMA2_R         13953
+#define DMAMUX1_R      13954
+#define DMA3_R         13955
+#define DMAMUX2_R      13956
+#define ADC1_R         13957
+#define ADC2_R         13958
+#define USBO_R         13960
+#define GPIOA_R                14080
+#define GPIOB_R                14081
+#define GPIOC_R                14082
+#define GPIOD_R                14083
+#define GPIOE_R                14084
+#define GPIOF_R                14085
+#define GPIOG_R                14086
+#define GPIOH_R                14087
+#define GPIOI_R                14088
+#define TSC_R          14095
+#define PKA_R          14146
+#define SAES_R         14147
+#define CRYP1_R                14148
+#define HASH1_R                14149
+#define RNG1_R         14150
+#define AXIMC_R                14160
+#define MDMA_R         14208
+#define MCE_R          14209
+#define ETH1MAC_R      14218
+#define FMC_R          14220
+#define QSPI_R         14222
+#define SDMMC1_R       14224
+#define SDMMC2_R       14225
+#define CRC1_R         14228
+#define USBH_R         14232
+#define ETH2MAC_R      14238
+
+/* SCMI reset domain identifiers */
+#define RST_SCMI_LTDC          0
+#define RST_SCMI_MDMA          1
+
+#endif /* _DT_BINDINGS_STM32MP13_RESET_H_ */