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

title: Texas Instruments DRA72x CAMERA ADAPTATION LAYER (CAL) Device Tree Bindings

maintainers:
  - Benoit Parrot <bparrot@ti.com>

description: |-
  The Camera Adaptation Layer (CAL) is a key component for image capture
  applications. The capture module provides the system interface and the
  processing capability to connect CSI2 image-sensor modules to the
  DRA72x device.

  CAL supports 2 camera port nodes on MIPI bus. Each CSI2 camera port nodes
  should contain a 'port' child node with child 'endpoint' node. Please
  refer to the bindings defined in
  Documentation/devicetree/bindings/media/video-interfaces.txt.

properties:
  compatible:
    enum:
      # for DRA72 controllers
      - ti,dra72-cal
      # for DRA72 controllers pre ES2.0
      - ti,dra72-pre-es2-cal
      # for DRA76 controllers
      - ti,dra76-cal
      # for AM654 controllers
      - ti,am654-cal

  reg:
    minItems: 2
    items:
      - description: The CAL main register region
      - description: The RX Core0 (DPHY0) register region
      - description: The RX Core1 (DPHY1) register region

  reg-names:
    minItems: 2
    items:
      - const: cal_top
      - const: cal_rx_core0
      - const: cal_rx_core1

  interrupts:
    maxItems: 1

  ti,camerrx-control:
    $ref: "/schemas/types.yaml#/definitions/phandle-array"
    description:
      phandle to the device control module and offset to the
      control_camerarx_core register

  clocks:
    maxItems: 1

  clock-names:
    const: fck

  power-domains:
    description:
      List of phandle and PM domain specifier as documented in
      Documentation/devicetree/bindings/power/power_domain.txt
    maxItems: 1

  # See ./video-interfaces.txt for details
  ports:
    type: object
    additionalProperties: false

    properties:
      "#address-cells":
        const: 1

      "#size-cells":
        const: 0

      port@0:
        type: object
        additionalProperties: false

        properties:
          reg:
            const: 0
            description: CSI2 Port #0

        patternProperties:
          endpoint:
            type: object
            additionalProperties: false

            properties:
              clock-lanes:
                maxItems: 1

              data-lanes:
                minItems: 1
                maxItems: 4

              remote-endpoint: true

        required:
          - reg

      port@1:
        type: object
        additionalProperties: false

        properties:
          reg:
            const: 1
            description: CSI2 Port #1

        patternProperties:
          endpoint:
            type: object
            additionalProperties: false

            properties:
              clock-lanes:
                maxItems: 1

              data-lanes:
                minItems: 1
                maxItems: 4

              remote-endpoint: true

        required:
          - reg

    required:
      - "#address-cells"
      - "#size-cells"
      - port@0

required:
  - compatible
  - reg
  - reg-names
  - interrupts
  - ti,camerrx-control

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    cal: cal@4845b000 {
        compatible = "ti,dra72-cal";
        reg = <0x4845B000 0x400>,
              <0x4845B800 0x40>,
              <0x4845B900 0x40>;
        reg-names = "cal_top",
                    "cal_rx_core0",
                    "cal_rx_core1";
        interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
        ti,camerrx-control = <&scm_conf 0xE94>;

        ports {
              #address-cells = <1>;
              #size-cells = <0>;

              csi2_0: port@0 {
                    reg = <0>;
                    csi2_phy0: endpoint {
                           remote-endpoint = <&csi2_cam0>;
                           clock-lanes = <0>;
                           data-lanes = <1 2>;
                    };
              };
        };
    };

    i2c {
        clock-frequency = <400000>;
        #address-cells = <1>;
        #size-cells = <0>;

        camera-sensor@3c {
               compatible = "ovti,ov5640";
               reg = <0x3c>;

               clocks = <&clk_ov5640_fixed>;
               clock-names = "xclk";

               port {
                    csi2_cam0: endpoint {
                            remote-endpoint = <&csi2_phy0>;
                            clock-lanes = <0>;
                            data-lanes = <1 2>;
                    };
               };
        };
    };

...
