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

47 files changed:
Documentation/devicetree/bindings/clock/clock-bindings.txt
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
arch/mips/generic/board-ingenic.c
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/ingenic/cgu.c
drivers/clk/ingenic/cgu.h
drivers/clk/ingenic/jz4725b-cgu.c
drivers/clk/ingenic/jz4740-cgu.c
drivers/clk/ingenic/jz4760-cgu.c
drivers/clk/ingenic/jz4770-cgu.c
drivers/clk/ingenic/jz4780-cgu.c
drivers/clk/ingenic/tcu.c
drivers/clk/ingenic/x1000-cgu.c
drivers/clk/ingenic/x1830-cgu.c
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]
include/dt-bindings/clock/samsung,exynosautov9.h [new file with mode: 0644]
include/dt-bindings/clock/stm32mp13-clks.h [new file with mode: 0644]
include/dt-bindings/reset/stm32mp13-resets.h [new file with mode: 0644]

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
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 3f44f14..c422bbc 100644 (file)
@@ -131,36 +131,10 @@ static const struct platform_suspend_ops ingenic_pm_ops __maybe_unused = {
 
 static int __init ingenic_pm_init(void)
 {
-       struct device_node *cpu_node;
-       struct clk *cpu0_clk;
-       int ret;
-
        if (boot_cpu_type() == CPU_XBURST) {
                if (IS_ENABLED(CONFIG_PM_SLEEP))
                        suspend_set_ops(&ingenic_pm_ops);
                _machine_halt = ingenic_halt;
-
-               /*
-                * Unconditionally enable the clock for the first CPU.
-                * This makes sure that the PLL that feeds the CPU won't be
-                * stopped while the kernel is running.
-                */
-               cpu_node = of_get_cpu_node(0, NULL);
-               if (!cpu_node) {
-                       pr_err("Unable to get CPU node\n");
-               } else {
-                       cpu0_clk = of_clk_get(cpu_node, 0);
-                       if (IS_ERR(cpu0_clk)) {
-                               pr_err("Unable to get CPU0 clock\n");
-                               return PTR_ERR(cpu0_clk);
-                       }
-
-                       ret = clk_prepare_enable(cpu0_clk);
-                       if (ret) {
-                               pr_err("Unable to enable CPU0 clock\n");
-                               return ret;
-                       }
-               }
        }
 
        return 0;
index 3148d14..48f8f42 100644 (file)
@@ -377,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 594d8b3..a6c2a7b 100644 (file)
@@ -116,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 af31633..861c50d 100644 (file)
@@ -660,7 +660,7 @@ static int ingenic_register_clock(struct ingenic_cgu *cgu, unsigned idx)
        ingenic_clk->idx = idx;
 
        clk_init.name = clk_info->name;
-       clk_init.flags = 0;
+       clk_init.flags = clk_info->flags;
        clk_init.parent_names = parent_names;
 
        caps = clk_info->type;
index bfc2b9c..147b7df 100644 (file)
@@ -136,6 +136,7 @@ struct ingenic_cgu_custom_info {
  * struct ingenic_cgu_clk_info - information about a clock
  * @name: name of the clock
  * @type: a bitmask formed from CGU_CLK_* values
+ * @flags: common clock flags to set on this clock
  * @parents: an array of the indices of potential parents of this clock
  *           within the clock_info array of the CGU, or -1 in entries
  *           which correspond to no valid parent
@@ -161,6 +162,8 @@ struct ingenic_cgu_clk_info {
                CGU_CLK_CUSTOM          = BIT(7),
        } type;
 
+       unsigned long flags;
+
        int parents[4];
 
        union {
index 15d6179..590e9c8 100644 (file)
@@ -87,6 +87,11 @@ static const struct ingenic_cgu_clk_info jz4725b_cgu_clocks[] = {
 
        [JZ4725B_CLK_CCLK] = {
                "cclk", CGU_CLK_DIV,
+               /*
+                * Disabling the CPU clock or any parent clocks will hang the
+                * system; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
                        CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
@@ -114,6 +119,11 @@ static const struct ingenic_cgu_clk_info jz4725b_cgu_clocks[] = {
 
        [JZ4725B_CLK_MCLK] = {
                "mclk", CGU_CLK_DIV,
+               /*
+                * Disabling MCLK or its parents will render DRAM
+                * inaccessible; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
                        CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
index 43ffb62..3e0a305 100644 (file)
@@ -102,6 +102,11 @@ static const struct ingenic_cgu_clk_info jz4740_cgu_clocks[] = {
 
        [JZ4740_CLK_CCLK] = {
                "cclk", CGU_CLK_DIV,
+               /*
+                * Disabling the CPU clock or any parent clocks will hang the
+                * system; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
                        CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
@@ -129,6 +134,11 @@ static const struct ingenic_cgu_clk_info jz4740_cgu_clocks[] = {
 
        [JZ4740_CLK_MCLK] = {
                "mclk", CGU_CLK_DIV,
+               /*
+                * Disabling MCLK or its parents will render DRAM
+                * inaccessible; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
                        CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
index 8fdd383..ecd395a 100644 (file)
@@ -143,6 +143,11 @@ static const struct ingenic_cgu_clk_info jz4760_cgu_clocks[] = {
 
        [JZ4760_CLK_CCLK] = {
                "cclk", CGU_CLK_DIV,
+               /*
+                * Disabling the CPU clock or any parent clocks will hang the
+                * system; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4760_CLK_PLL0, },
                .div = {
                        CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
@@ -175,6 +180,11 @@ static const struct ingenic_cgu_clk_info jz4760_cgu_clocks[] = {
        },
        [JZ4760_CLK_MCLK] = {
                "mclk", CGU_CLK_DIV,
+               /*
+                * Disabling MCLK or its parents will render DRAM
+                * inaccessible; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4760_CLK_PLL0, },
                .div = {
                        CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
index 7ef9125..6ae1740 100644 (file)
@@ -149,6 +149,11 @@ static const struct ingenic_cgu_clk_info jz4770_cgu_clocks[] = {
 
        [JZ4770_CLK_CCLK] = {
                "cclk", CGU_CLK_DIV,
+               /*
+                * Disabling the CPU clock or any parent clocks will hang the
+                * system; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
                        CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
index e357c22..b1dadc0 100644 (file)
@@ -341,12 +341,22 @@ static const struct ingenic_cgu_clk_info jz4780_cgu_clocks[] = {
 
        [JZ4780_CLK_CPU] = {
                "cpu", CGU_CLK_DIV,
+               /*
+                * Disabling the CPU clock or any parent clocks will hang the
+                * system; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4780_CLK_CPUMUX, -1, -1, -1 },
                .div = { CGU_REG_CLOCKCONTROL, 0, 1, 4, 22, -1, -1 },
        },
 
        [JZ4780_CLK_L2CACHE] = {
                "l2cache", CGU_CLK_DIV,
+               /*
+                * The L2 cache clock is critical if caches are enabled and
+                * disabling it or any parent clocks will hang the system.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { JZ4780_CLK_CPUMUX, -1, -1, -1 },
                .div = { CGU_REG_CLOCKCONTROL, 4, 1, 4, -1, -1, -1 },
        },
@@ -380,6 +390,11 @@ static const struct ingenic_cgu_clk_info jz4780_cgu_clocks[] = {
 
        [JZ4780_CLK_DDR] = {
                "ddr", CGU_CLK_MUX | CGU_CLK_DIV,
+               /*
+                * Disabling DDR clock or its parents will render DRAM
+                * inaccessible; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { -1, JZ4780_CLK_SCLKA, JZ4780_CLK_MPLL, -1 },
                .mux = { CGU_REG_DDRCDR, 30, 2 },
                .div = { CGU_REG_DDRCDR, 0, 1, 4, 29, 28, 27 },
index 77acfbe..201bf6e 100644 (file)
@@ -31,6 +31,7 @@ struct ingenic_soc_info {
        unsigned int num_channels;
        bool has_ost;
        bool has_tcu_clk;
+       bool allow_missing_tcu_clk;
 };
 
 struct ingenic_tcu_clk_info {
@@ -320,7 +321,8 @@ static const struct ingenic_soc_info jz4770_soc_info = {
 static const struct ingenic_soc_info x1000_soc_info = {
        .num_channels = 8,
        .has_ost = false, /* X1000 has OST, but it not belong TCU */
-       .has_tcu_clk = false,
+       .has_tcu_clk = true,
+       .allow_missing_tcu_clk = true,
 };
 
 static const struct of_device_id __maybe_unused ingenic_tcu_of_match[] __initconst = {
@@ -355,14 +357,27 @@ static int __init ingenic_tcu_probe(struct device_node *np)
                tcu->clk = of_clk_get_by_name(np, "tcu");
                if (IS_ERR(tcu->clk)) {
                        ret = PTR_ERR(tcu->clk);
-                       pr_crit("Cannot get TCU clock\n");
-                       goto err_free_tcu;
-               }
 
-               ret = clk_prepare_enable(tcu->clk);
-               if (ret) {
-                       pr_crit("Unable to enable TCU clock\n");
-                       goto err_put_clk;
+                       /*
+                        * Old device trees for some SoCs did not include the
+                        * TCU clock because this driver (incorrectly) didn't
+                        * use it. In this case we complain loudly and attempt
+                        * to continue without the clock, which might work if
+                        * booting with workarounds like "clk_ignore_unused".
+                        */
+                       if (tcu->soc_info->allow_missing_tcu_clk && ret == -EINVAL) {
+                               pr_warn("TCU clock missing from device tree, please update your device tree\n");
+                               tcu->clk = NULL;
+                       } else {
+                               pr_crit("Cannot get TCU clock from device tree\n");
+                               goto err_free_tcu;
+                       }
+               } else {
+                       ret = clk_prepare_enable(tcu->clk);
+                       if (ret) {
+                               pr_crit("Unable to enable TCU clock\n");
+                               goto err_put_clk;
+                       }
                }
        }
 
@@ -432,10 +447,10 @@ err_unregister_timer_clocks:
                        clk_hw_unregister(tcu->clocks->hws[i]);
        kfree(tcu->clocks);
 err_clk_disable:
-       if (tcu->soc_info->has_tcu_clk)
+       if (tcu->clk)
                clk_disable_unprepare(tcu->clk);
 err_put_clk:
-       if (tcu->soc_info->has_tcu_clk)
+       if (tcu->clk)
                clk_put(tcu->clk);
 err_free_tcu:
        kfree(tcu);
index 3c4d5a7..b2ce3fb 100644 (file)
@@ -251,6 +251,11 @@ static const struct ingenic_cgu_clk_info x1000_cgu_clocks[] = {
 
        [X1000_CLK_CPU] = {
                "cpu", CGU_CLK_DIV | CGU_CLK_GATE,
+               /*
+                * Disabling the CPU clock or any parent clocks will hang the
+                * system; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { X1000_CLK_CPUMUX, -1, -1, -1 },
                .div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 },
                .gate = { CGU_REG_CLKGR, 30 },
@@ -258,6 +263,11 @@ static const struct ingenic_cgu_clk_info x1000_cgu_clocks[] = {
 
        [X1000_CLK_L2CACHE] = {
                "l2cache", CGU_CLK_DIV,
+               /*
+                * The L2 cache clock is critical if caches are enabled and
+                * disabling it or any parent clocks will hang the system.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { X1000_CLK_CPUMUX, -1, -1, -1 },
                .div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 },
        },
@@ -290,6 +300,11 @@ static const struct ingenic_cgu_clk_info x1000_cgu_clocks[] = {
 
        [X1000_CLK_DDR] = {
                "ddr", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
+               /*
+                * Disabling DDR clock or its parents will render DRAM
+                * inaccessible; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { -1, X1000_CLK_SCLKA, X1000_CLK_MPLL, -1 },
                .mux = { CGU_REG_DDRCDR, 30, 2 },
                .div = { CGU_REG_DDRCDR, 0, 1, 4, 29, 28, 27 },
index e01ec2d..0fd46e5 100644 (file)
@@ -225,6 +225,7 @@ static const struct ingenic_cgu_clk_info x1830_cgu_clocks[] = {
 
        [X1830_CLK_CPU] = {
                "cpu", CGU_CLK_DIV | CGU_CLK_GATE,
+               .flags = CLK_IS_CRITICAL,
                .parents = { X1830_CLK_CPUMUX, -1, -1, -1 },
                .div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 },
                .gate = { CGU_REG_CLKGR1, 15 },
@@ -232,6 +233,11 @@ static const struct ingenic_cgu_clk_info x1830_cgu_clocks[] = {
 
        [X1830_CLK_L2CACHE] = {
                "l2cache", CGU_CLK_DIV,
+               /*
+                * The L2 cache clock is critical if caches are enabled and
+                * disabling it or any parent clocks will hang the system.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { X1830_CLK_CPUMUX, -1, -1, -1 },
                .div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 },
        },
@@ -264,6 +270,11 @@ static const struct ingenic_cgu_clk_info x1830_cgu_clocks[] = {
 
        [X1830_CLK_DDR] = {
                "ddr", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
+               /*
+                * Disabling DDR clock or its parents will render DRAM
+                * inaccessible; mark it critical.
+                */
+               .flags = CLK_IS_CRITICAL,
                .parents = { -1, X1830_CLK_SCLKA, X1830_CLK_MPLL, -1 },
                .mux = { CGU_REG_DDRCDR, 30, 2 },
                .div = { CGU_REG_DDRCDR, 0, 1, 4, 29, 28, 27 },
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 */
+
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/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_ */
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_ */