# SPDX-License-Identifier: GPL-2.0
%YAML 1.2
---
$id: http://devicetree.org/schemas/media/i2c/ovti,ov5640.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: OmniVision OV5640 Image Sensor

maintainers:
  - Steve Longerbeam <slongerbeam@gmail.com>

allOf:
  - $ref: /schemas/media/video-interface-devices.yaml#

properties:
  compatible:
    const: ovti,ov5640

  reg:
    maxItems: 1

  clocks:
    description: XCLK Input Clock

  clock-names:
    const: xclk

  AVDD-supply:
    description: Analog voltage supply, 2.8 volts

  DVDD-supply:
    description: Digital core voltage supply, 1.5 volts

  DOVDD-supply:
    description: Digital I/O voltage supply, 1.8 volts

  powerdown-gpios:
    maxItems: 1
    description: >
      Reference to the GPIO connected to the powerdown pin, if any.

  reset-gpios:
    maxItems: 1
    description: >
      Reference to the GPIO connected to the reset pin, if any.

  rotation:
    enum:
      - 0
      - 180

  port:
    description: Digital Output Port
    $ref: /schemas/graph.yaml#/$defs/port-base
    additionalProperties: false

    properties:
      endpoint:
        $ref: /schemas/media/video-interfaces.yaml#
        unevaluatedProperties: false

        properties:
          clock-lanes:
            const: 0

          data-lanes:
            minItems: 1
            maxItems: 2
            items:
              enum: [1, 2]

          bus-width:
            enum: [8, 10]

          data-shift:
            enum: [0, 2]

required:
  - compatible
  - reg
  - clocks
  - clock-names
  - AVDD-supply
  - DVDD-supply
  - DOVDD-supply
  - port

additionalProperties: false

examples:
  - |
      #include <dt-bindings/clock/imx6qdl-clock.h>
      #include <dt-bindings/gpio/gpio.h>

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

          camera@3c {
              compatible = "ovti,ov5640";
              pinctrl-names = "default";
              pinctrl-0 = <&pinctrl_ov5640>;
              reg = <0x3c>;
              clocks = <&clks IMX6QDL_CLK_CKO>;
              clock-names = "xclk";
              DOVDD-supply = <&vgen4_reg>; /* 1.8v */
              AVDD-supply = <&vgen3_reg>;  /* 2.8v */
              DVDD-supply = <&vgen2_reg>;  /* 1.5v */
              powerdown-gpios = <&gpio1 19 GPIO_ACTIVE_HIGH>;
              reset-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;
              rotation = <180>;

              port {
                  /* MIPI CSI-2 bus endpoint */
                  ov5640_to_mipi_csi2: endpoint {
                      remote-endpoint = <&mipi_csi2_from_ov5640>;
                      clock-lanes = <0>;
                      data-lanes = <1 2>;
                  };
              };
          };
      };

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

          camera@3c {
              compatible = "ovti,ov5640";
              pinctrl-names = "default";
              pinctrl-0 = <&pinctrl_ov5640>;
              reg = <0x3c>;
              clocks = <&clk_ext_camera>;
              clock-names = "xclk";
              DOVDD-supply = <&vgen4_reg>; /* 1.8v */
              AVDD-supply = <&vgen3_reg>;  /* 2.8v */
              DVDD-supply = <&vgen2_reg>;  /* 1.5v */

              port {
                  /* Parallel bus endpoint */
                  ov5640_to_parallel: endpoint {
                      remote-endpoint = <&parallel_from_ov5640>;
                      bus-width = <8>;
                      data-shift = <2>; /* lines 9:2 are used */
                      hsync-active = <0>;
                      vsync-active = <0>;
                      pclk-sample = <1>;
                  };
              };
          };
      };

...