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

title: Samsung Exynos Multi Format Codec (MFC)

maintainers:
  - Marek Szyprowski <m.szyprowski@samsung.com>
  - Aakarsh Jain <aakarsh.jain@samsung.com>

description:
  Multi Format Codec (MFC) is the IP present in Samsung SoCs which
  supports high resolution decoding and encoding functionalities.

properties:
  compatible:
    oneOf:
      - enum:
          - samsung,exynos5433-mfc        # Exynos5433
          - samsung,mfc-v5                # Exynos4
          - samsung,mfc-v6                # Exynos5
          - samsung,mfc-v7                # Exynos5420
          - samsung,mfc-v8                # Exynos5800
          - samsung,mfc-v10               # Exynos7880
          - tesla,fsd-mfc                 # Tesla FSD
      - items:
          - enum:
              - samsung,exynos3250-mfc    # Exynos3250
          - const: samsung,mfc-v7         # Fall back for Exynos3250

  reg:
    maxItems: 1

  clocks:
    minItems: 1
    maxItems: 3

  clock-names:
    minItems: 1
    maxItems: 3

  interrupts:
    maxItems: 1

  iommus:
    minItems: 1
    maxItems: 2

  iommu-names:
    minItems: 1
    items:
      - const: left
      - const: right

  power-domains:
    maxItems: 1

  memory-region:
    minItems: 1
    maxItems: 2

required:
  - compatible
  - reg
  - clocks
  - clock-names
  - interrupts

additionalProperties: false

allOf:
  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,exynos3250-mfc
    then:
      properties:
        clocks:
          maxItems: 2
        clock-names:
          items:
            - const: mfc
            - const: sclk_mfc
        iommus:
          maxItems: 1
        iommu-names: false

  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,exynos5433-mfc
    then:
      properties:
        clocks:
          maxItems: 3
        clock-names:
          items:
            - const: pclk
            - const: aclk
            - const: aclk_xiu
        iommus:
          minItems: 2
        iommu-names:
          minItems: 2

  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,mfc-v5
    then:
      properties:
        clocks:
          maxItems: 2
        clock-names:
          items:
            - const: mfc
            - const: sclk_mfc
        iommus:
          minItems: 2
        iommu-names:
          minItems: 2

  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,mfc-v6
              - samsung,mfc-v8
    then:
      properties:
        clocks:
          maxItems: 1
        clock-names:
          items:
            - const: mfc
        iommus:
          minItems: 2
        iommu-names:
          minItems: 2

  - if:
      properties:
        compatible:
          contains:
            enum:
              - samsung,mfc-v7
    then:
      properties:
        clocks:
          minItems: 1
          maxItems: 2

  - if:
      properties:
        compatible:
          contains:
            enum:
              - tesla,fsd-mfc
    then:
      properties:
        clocks:
          maxItems: 1
        clock-names:
          items:
            - const: mfc
        iommus:
          maxItems: 2
        iommus-names: false

examples:
  - |
    #include <dt-bindings/clock/exynos4.h>
    #include <dt-bindings/clock/exynos-audss-clk.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    codec@13400000 {
        compatible = "samsung,mfc-v5";
        reg = <0x13400000 0x10000>;
        interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
        power-domains = <&pd_mfc>;
        clocks = <&clock CLK_MFC>, <&clock CLK_SCLK_MFC>;
        clock-names = "mfc", "sclk_mfc";
        iommus = <&sysmmu_mfc_l>, <&sysmmu_mfc_r>;
        iommu-names = "left", "right";
    };
