Commit c509d8b9 authored by Maxime Ripard's avatar Maxime Ripard Committed by Rob Herring
Browse files

dt-bindings: media: Convert OV5640 binding to a schema



The Omnivision OV5640 is supported by Linux thanks to its device tree
binding.

Now that we have the DT validation in place, let's convert the device
tree bindings for that driver over to a YAML schema.

Cc: linux-media@vger.kernel.org
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: Steve Longerbeam <slongerbeam@gmail.com>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20211015072830.8580-1-maxime@cerno.tech


Signed-off-by: default avatarRob Herring <robh@kernel.org>
parent 37f86649
Loading
Loading
Loading
Loading
+0 −92
Original line number Diff line number Diff line
* Omnivision OV5640 MIPI CSI-2 / parallel sensor

Required Properties:
- compatible: should be "ovti,ov5640"
- clocks: reference to the xclk input clock.
- clock-names: should be "xclk".
- DOVDD-supply: Digital I/O voltage supply, 1.8 volts
- AVDD-supply: Analog voltage supply, 2.8 volts
- DVDD-supply: Digital core voltage supply, 1.5 volts

Optional Properties:
- reset-gpios: reference to the GPIO connected to the reset pin, if any.
	       This is an active low signal to the OV5640.
- powerdown-gpios: reference to the GPIO connected to the powerdown pin,
		   if any. This is an active high signal to the OV5640.
- rotation: as defined in
	    Documentation/devicetree/bindings/media/video-interfaces.txt,
	    valid values are 0 (sensor mounted upright) and 180 (sensor
	    mounted upside down).

The device node must contain one 'port' child node for its digital output
video port, in accordance with the video interface bindings defined in
Documentation/devicetree/bindings/media/video-interfaces.txt.

OV5640 can be connected to a MIPI CSI-2 bus or a parallel bus endpoint.

Endpoint node required properties for CSI-2 connection are:
- remote-endpoint: a phandle to the bus receiver's endpoint node.
- clock-lanes: should be set to <0> (clock lane on hardware lane 0)
- data-lanes: should be set to <1> or <1 2> (one or two CSI-2 lanes supported)

Endpoint node required properties for parallel connection are:
- remote-endpoint: a phandle to the bus receiver's endpoint node.
- bus-width: shall be set to <8> for 8 bits parallel bus
	     or <10> for 10 bits parallel bus
- data-shift: shall be set to <2> for 8 bits parallel bus
	      (lines 9:2 are used) or <0> for 10 bits parallel bus
- hsync-active: active state of the HSYNC signal, 0/1 for LOW/HIGH respectively.
- vsync-active: active state of the VSYNC signal, 0/1 for LOW/HIGH respectively.
- pclk-sample: sample data on rising (1) or falling (0) edge of the pixel clock
	       signal.

Examples:

&i2c1 {
	ov5640: 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>;
			};
		};
	};
};

&i2c1 {
	ov5640: camera@3c {
		compatible = "ovti,ov5640";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_ov5640>;
		reg = <0x3c>;
		clocks = <&clk_ext_camera>;
		clock-names = "xclk";

		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>;
			};
		};
	};
};
+154 −0
Original line number Diff line number Diff line
# 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 Device Tree Bindings

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>;
                  };
              };
          };
      };

...