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

title: Samsung Exynos5433 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::
    - "oscclk" - PLL input clock from XXTI

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

properties:
  compatible:
    enum:
        # CMU_TOP which generates clocks for
        # IMEM/FSYS/G3D/GSCL/HEVC/MSCL/G2D/MFC/PERIC/PERIS domains and bus
        # clocks
      - samsung,exynos5433-cmu-top
        # CMU_CPIF which generates clocks for LLI (Low Latency Interface) IP
      - samsung,exynos5433-cmu-cpif
        # CMU_MIF which generates clocks for DRAM Memory Controller domain
      - samsung,exynos5433-cmu-mif
        # CMU_PERIC which generates clocks for
        # UART/I2C/SPI/I2S/PCM/SPDIF/PWM/SLIMBUS IPs
      - samsung,exynos5433-cmu-peric
        # CMU_PERIS which generates clocks for PMU/TMU/MCT/WDT/RTC/SECKEY/TZPC IPs
      - samsung,exynos5433-cmu-peris
        # CMU_FSYS which generates clocks for USB/UFS/SDMMC/TSI/PDMA IPs
      - samsung,exynos5433-cmu-fsys
      - samsung,exynos5433-cmu-g2d
        # CMU_DISP which generates clocks for Display (DECON/HDMI/DSIM/MIXER) IPs
      - samsung,exynos5433-cmu-disp
      - samsung,exynos5433-cmu-aud
      - samsung,exynos5433-cmu-bus0
      - samsung,exynos5433-cmu-bus1
      - samsung,exynos5433-cmu-bus2
      - samsung,exynos5433-cmu-g3d
      - samsung,exynos5433-cmu-gscl
      - samsung,exynos5433-cmu-apollo
        # CMU_ATLAS which generates clocks for Cortex-A57 Quad-core processor,
        # CoreSight and  L2 cache controller
      - samsung,exynos5433-cmu-atlas
        # CMU_MSCL which generates clocks for M2M (Memory to Memory) scaler and
        # JPEG IPs
      - samsung,exynos5433-cmu-mscl
      - samsung,exynos5433-cmu-mfc
      - samsung,exynos5433-cmu-hevc
        # CMU_ISP which generates clocks for FIMC-ISP/DRC/SCLC/DIS/3DNR IPs
      - samsung,exynos5433-cmu-isp
        # CMU_CAM0 which generates clocks for
        # MIPI_CSIS{0|1}/FIMC_LITE_{A|B|D}/FIMC_3AA{0|1} IPs
      - samsung,exynos5433-cmu-cam0
        # CMU_CAM1 which generates clocks for
        # Cortex-A5/MIPI_CSIS2/FIMC-LITE_C/FIMC-FD IPs
      - samsung,exynos5433-cmu-cam1
        # CMU_IMEM which generates clocks for SSS (Security SubSystem) and
        # SlimSSS IPs
      - samsung,exynos5433-cmu-imem

  clocks:
    minItems: 1
    maxItems: 10

  clock-names:
    minItems: 1
    maxItems: 10

  "#clock-cells":
    const: 1

  power-domains:
    maxItems: 1

  reg:
    maxItems: 1

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

allOf:
  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-top
    then:
      properties:
        clocks:
          minItems: 4
          maxItems: 4
        clock-names:
          items:
            - const: oscclk
            - const: sclk_mphy_pll
            - const: sclk_mfc_pll
            - const: sclk_bus_pll
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-cpif
    then:
      properties:
        clocks:
          minItems: 1
          maxItems: 1
        clock-names:
          items:
            - const: oscclk
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-mif
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: sclk_mphy_pll
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-fsys
    then:
      properties:
        clocks:
          minItems: 10
          maxItems: 10
        clock-names:
          items:
            - const: oscclk
            - const: sclk_ufs_mphy
            - const: aclk_fsys_200
            - const: sclk_pcie_100_fsys
            - const: sclk_ufsunipro_fsys
            - const: sclk_mmc2_fsys
            - const: sclk_mmc1_fsys
            - const: sclk_mmc0_fsys
            - const: sclk_usbhost30_fsys
            - const: sclk_usbdrd30_fsys
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-g2d
    then:
      properties:
        clocks:
          minItems: 3
          maxItems: 3
        clock-names:
          items:
            - const: oscclk
            - const: aclk_g2d_266
            - const: aclk_g2d_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-disp
    then:
      properties:
        clocks:
          minItems: 9
          maxItems: 9
        clock-names:
          items:
            - const: oscclk
            - const: sclk_dsim1_disp
            - const: sclk_dsim0_disp
            - const: sclk_dsd_disp
            - const: sclk_decon_tv_eclk_disp
            - const: sclk_decon_vclk_disp
            - const: sclk_decon_eclk_disp
            - const: sclk_decon_tv_vclk_disp
            - const: aclk_disp_333
      required:
        - clock-names
        - clocks

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

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-bus0
    then:
      properties:
        clocks:
          minItems: 1
          maxItems: 1
        clock-names:
          items:
            - const: aclk_bus0_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-bus1
    then:
      properties:
        clocks:
          minItems: 1
          maxItems: 1
        clock-names:
          items:
            - const: aclk_bus1_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-bus2
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: aclk_bus2_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-g3d
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: aclk_g3d_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-gscl
    then:
      properties:
        clocks:
          minItems: 3
          maxItems: 3
        clock-names:
          items:
            - const: oscclk
            - const: aclk_gscl_111
            - const: aclk_gscl_333
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-apollo
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: sclk_bus_pll_apollo
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-atlas
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: sclk_bus_pll_atlas
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-mscl
    then:
      properties:
        clocks:
          minItems: 3
          maxItems: 3
        clock-names:
          items:
            - const: oscclk
            - const: sclk_jpeg_mscl
            - const: aclk_mscl_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-mfc
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: aclk_mfc_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-hevc
    then:
      properties:
        clocks:
          minItems: 2
          maxItems: 2
        clock-names:
          items:
            - const: oscclk
            - const: aclk_hevc_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-isp
    then:
      properties:
        clocks:
          minItems: 3
          maxItems: 3
        clock-names:
          items:
            - const: oscclk
            - const: aclk_isp_dis_400
            - const: aclk_isp_400
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-cam0
    then:
      properties:
        clocks:
          minItems: 4
          maxItems: 4
        clock-names:
          items:
            - const: oscclk
            - const: aclk_cam0_333
            - const: aclk_cam0_400
            - const: aclk_cam0_552
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-cam1
    then:
      properties:
        clocks:
          minItems: 7
          maxItems: 7
        clock-names:
          items:
            - const: oscclk
            - const: sclk_isp_uart_cam1
            - const: sclk_isp_spi1_cam1
            - const: sclk_isp_spi0_cam1
            - const: aclk_cam1_333
            - const: aclk_cam1_400
            - const: aclk_cam1_552
      required:
        - clock-names
        - clocks

  - if:
      properties:
        compatible:
          contains:
            const: samsung,exynos5433-cmu-imem
    then:
      properties:
        clocks:
          minItems: 4
          maxItems: 4
        clock-names:
          items:
            - const: oscclk
            - const: aclk_imem_sssx_266
            - const: aclk_imem_266
            - const: aclk_imem_200
      required:
        - clock-names
        - clocks

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/exynos5433.h>
    xxti: clock {
        compatible = "fixed-clock";
        clock-output-names = "oscclk";
        #clock-cells = <0>;
        clock-frequency = <24000000>;
    };

    clock-controller@10030000 {
        compatible = "samsung,exynos5433-cmu-top";
        reg = <0x10030000 0x1000>;
        #clock-cells = <1>;

        clock-names = "oscclk",
                      "sclk_mphy_pll",
                      "sclk_mfc_pll",
                      "sclk_bus_pll";
        clocks = <&xxti>,
                 <&cmu_cpif CLK_SCLK_MPHY_PLL>,
                 <&cmu_mif CLK_SCLK_MFC_PLL>,
                 <&cmu_mif CLK_SCLK_BUS_PLL>;
    };