# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/samsung,exynos7-clock.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Samsung Exynos7 SoC clock controller

maintainers:
  - Chanwoo Choi <cw00.choi@samsung.com>
  - Krzysztof Kozlowski <krzk@kernel.org>
  - Sylwester Nawrocki <s.nawrocki@samsung.com>
  - Tomasz Figa <tomasz.figa@gmail.com>

description: |
  Expected external clocks, defined in DTS as fixed-rate clocks with a matching
  name::
    - "fin_pll" - PLL input clock from XXTI

  All available clocks are defined as preprocessor macros in
  include/dt-bindings/clock/exynos7-clk.h header.

properties:
  compatible:
    enum:
      - samsung,exynos7-clock-topc
      - samsung,exynos7-clock-top0
      - samsung,exynos7-clock-top1
      - samsung,exynos7-clock-ccore
      - samsung,exynos7-clock-peric0
      - samsung,exynos7-clock-peric1
      - samsung,exynos7-clock-peris
      - samsung,exynos7-clock-fsys0
      - samsung,exynos7-clock-fsys1
      - samsung,exynos7-clock-mscl
      - samsung,exynos7-clock-aud

  clocks:
    minItems: 1
    maxItems: 13

  clock-names:
    minItems: 1
    maxItems: 13

  "#clock-cells":
    const: 1

  reg:
    maxItems: 1

required:
  - compatible
  - "#clock-cells"
  - reg

allOf:
  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-top0
    then:
      properties:
        clocks:
          minItems: 6
          maxItems: 6
        clock-names:
          items:
            - const: fin_pll
            - const: dout_sclk_bus0_pll
            - const: dout_sclk_bus1_pll
            - const: dout_sclk_cc_pll
            - const: dout_sclk_mfc_pll
            - const: dout_sclk_aud_pll
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-top1
    then:
      properties:
        clocks:
          minItems: 5
          maxItems: 5
        clock-names:
          items:
            - const: fin_pll
            - const: dout_sclk_bus0_pll
            - const: dout_sclk_bus1_pll
            - const: dout_sclk_cc_pll
            - const: dout_sclk_mfc_pll
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-ccore
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: fin_pll
            - const: dout_aclk_ccore_133
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-peric0
    then:
      properties:
        clocks:
          minItems: 3
          maxItems: 3
        clock-names:
          items:
            - const: fin_pll
            - const: dout_aclk_peric0_66
            - const: sclk_uart0
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-peric1
    then:
      properties:
        clocks:
          minItems: 13
          maxItems: 13
        clock-names:
          items:
            - const: fin_pll
            - const: dout_aclk_peric1_66
            - const: sclk_uart1
            - const: sclk_uart2
            - const: sclk_uart3
            - const: sclk_spi0
            - const: sclk_spi1
            - const: sclk_spi2
            - const: sclk_spi3
            - const: sclk_spi4
            - const: sclk_i2s1
            - const: sclk_pcm1
            - const: sclk_spdif
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-peris
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: fin_pll
            - const: dout_aclk_peris_66
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-fsys0
    then:
      properties:
        clocks:
          minItems: 3
          maxItems: 3
        clock-names:
          items:
            - const: fin_pll
            - const: dout_aclk_fsys0_200
            - const: dout_sclk_mmc2
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-fsys1
    then:
      properties:
        clocks:
          minItems: 7
          maxItems: 7
        clock-names:
          items:
            - const: fin_pll
            - const: dout_aclk_fsys1_200
            - const: dout_sclk_mmc0
            - const: dout_sclk_mmc1
            - const: dout_sclk_ufsunipro20
            - const: dout_sclk_phy_fsys1
            - const: dout_sclk_phy_fsys1_26m
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos7-clock-aud
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: fin_pll
            - const: fout_aud_pll
      required:
        - clock-names
        - clocks

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/exynos7-clk.h>

    fin_pll: clock {
        compatible = "fixed-clock";
        clock-output-names = "fin_pll";
        #clock-cells = <0>;
        clock-frequency = <24000000>;
    };

    clock-controller@105e0000 {
        compatible = "samsung,exynos7-clock-top1";
        reg = <0x105e0000 0xb000>;
        #clock-cells = <1>;
        clocks = <&fin_pll>,
                 <&clock_topc DOUT_SCLK_BUS0_PLL>,
                 <&clock_topc DOUT_SCLK_BUS1_PLL>,
                 <&clock_topc DOUT_SCLK_CC_PLL>,
                 <&clock_topc DOUT_SCLK_MFC_PLL>;
        clock-names = "fin_pll",
                      "dout_sclk_bus0_pll",
                      "dout_sclk_bus1_pll",
                      "dout_sclk_cc_pll",
                      "dout_sclk_mfc_pll";
    };