Texas Instruments OMAP Display Subsystem
========================================

Generic Description
-------------------

This document is a generic description of the OMAP Display Subsystem bindings.
Binding details for each OMAP SoC version are described in respective binding
documentation.

The OMAP Display Subsystem (DSS) hardware consists of DSS Core, DISPC module and
a number of encoder modules. All DSS versions contain DSS Core and DISPC, but
the encoder modules vary.

The DSS Core is the parent of the other DSS modules, and manages clock routing,
integration to the SoC, etc.

DISPC is the display controller, which reads pixels from the memory and outputs
a RGB pixel stream to encoders.

The encoder modules encode the received RGB pixel stream to a video output like
HDMI, MIPI DPI, etc.

Video Ports
-----------

The DSS Core and the encoders have video port outputs. The structure of the
video ports is described in Documentation/devicetree/bindings/video/video-
ports.txt, and the properties for the ports and endpoints for each encoder are
described in the SoC's DSS binding documentation.

The video ports are used to describe the connections to external hardware, like
panels or external encoders.

Aliases
-------

The board dts file may define aliases for displays to assign "displayX" style
name for each display. If no aliases are defined, a semi-random number is used
for the display.

Example
-------

A shortened example of the DSS description for OMAP4, with non-relevant parts
removed, defined in omap4.dtsi:

dss: dss@58000000 {
	compatible = "ti,omap4-dss";
	reg = <0x58000000 0x80>;
	status = "disabled";
	ti,hwmods = "dss_core";
	clocks = <&dss_dss_clk>;
	clock-names = "fck";
	#address-cells = <1>;
	#size-cells = <1>;
	ranges;

	dispc@58001000 {
		compatible = "ti,omap4-dispc";
		reg = <0x58001000 0x1000>;
		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
		ti,hwmods = "dss_dispc";
		clocks = <&dss_dss_clk>;
		clock-names = "fck";
	};

	hdmi: encoder@58006000 {
		compatible = "ti,omap4-hdmi";
		reg = <0x58006000 0x200>,
		      <0x58006200 0x100>,
		      <0x58006300 0x100>,
		      <0x58006400 0x1000>;
		reg-names = "wp", "pll", "phy", "core";
		interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
		status = "disabled";
		ti,hwmods = "dss_hdmi";
		clocks = <&dss_48mhz_clk>, <&dss_sys_clk>;
		clock-names = "fck", "sys_clk";
	};
};

A shortened example of the board description for OMAP4 Panda board, defined in
omap4-panda.dts.

The Panda board has a DVI and a HDMI connector, and the board contains a TFP410
chip (MIPI DPI to DVI encoder) and a TPD12S015 chip (HDMI ESD protection & level
shifter). The video pipelines for the connectors are formed as follows:

DSS Core --(MIPI DPI)--> TFP410 --(DVI)--> DVI Connector
OMAP HDMI --(HDMI)--> TPD12S015 --(HDMI)--> HDMI Connector

/ {
	aliases {
		display0 = &dvi0;
		display1 = &hdmi0;
	};

	tfp410: encoder@0 {
		compatible = "ti,tfp410";
		gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;	/* 0, power-down */

		pinctrl-names = "default";
		pinctrl-0 = <&tfp410_pins>;

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

			port@0 {
				reg = <0>;

				tfp410_in: endpoint@0 {
					remote-endpoint = <&dpi_out>;
				};
			};

			port@1 {
				reg = <1>;

				tfp410_out: endpoint@0 {
					remote-endpoint = <&dvi_connector_in>;
				};
			};
		};
	};

	dvi0: connector@0 {
		compatible = "dvi-connector";
		label = "dvi";

		i2c-bus = <&i2c3>;

		port {
			dvi_connector_in: endpoint {
				remote-endpoint = <&tfp410_out>;
			};
		};
	};

	tpd12s015: encoder@1 {
		compatible = "ti,tpd12s015";

		pinctrl-names = "default";
		pinctrl-0 = <&tpd12s015_pins>;

		gpios = <&gpio2 28 GPIO_ACTIVE_HIGH>,	/* 60, CT CP HPD */
			<&gpio2 9 GPIO_ACTIVE_HIGH>,	/* 41, LS OE */
			<&gpio2 31 GPIO_ACTIVE_HIGH>;	/* 63, HPD */

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

			port@0 {
				reg = <0>;

				tpd12s015_in: endpoint@0 {
					remote-endpoint = <&hdmi_out>;
				};
			};

			port@1 {
				reg = <1>;

				tpd12s015_out: endpoint@0 {
					remote-endpoint = <&hdmi_connector_in>;
				};
			};
		};
	};

	hdmi0: connector@1 {
		compatible = "hdmi-connector";
		label = "hdmi";

		port {
			hdmi_connector_in: endpoint {
				remote-endpoint = <&tpd12s015_out>;
			};
		};
	};
};

&dss {
	status = "ok";

	pinctrl-names = "default";
	pinctrl-0 = <&dss_dpi_pins>;

	port {
		dpi_out: endpoint {
			remote-endpoint = <&tfp410_in>;
			data-lines = <24>;
		};
	};
};

&hdmi {
	status = "ok";
	vdda-supply = <&vdac>;

	pinctrl-names = "default";
	pinctrl-0 = <&dss_hdmi_pins>;

	port {
		hdmi_out: endpoint {
			remote-endpoint = <&tpd12s015_in>;
		};
	};
};
