1Allwinner A10 Display Pipeline
2==============================
3
4The Allwinner A10 Display pipeline is composed of several components
5that are going to be documented below:
6
7For all connections between components up to the TCONs in the display
8pipeline, when there are multiple components of the same type at the
9same depth, the local endpoint ID must be the same as the remote
10component's index. For example, if the remote endpoint is Frontend 1,
11then the local endpoint ID must be 1.
12
13    Frontend 0  [0] ------- [0]  Backend 0  [0] ------- [0]  TCON 0
14		[1] --   -- [1]             [1] --   -- [1]
15		      \ /                         \ /
16		       X                           X
17		      / \                         / \
18		[0] --   -- [0]             [0] --   -- [0]
19    Frontend 1  [1] ------- [1]  Backend 1  [1] ------- [1]  TCON 1
20
21For a two pipeline system such as the one depicted above, the lines
22represent the connections between the components, while the numbers
23within the square brackets corresponds to the ID of the local endpoint.
24
25The same rule also applies to DE 2.0 mixer-TCON connections:
26
27    Mixer 0  [0] ----------- [0]  TCON 0
28	     [1] ----   ---- [1]
29		     \ /
30		      X
31		     / \
32	     [0] ----   ---- [0]
33    Mixer 1  [1] ----------- [1]  TCON 1
34
35HDMI Encoder
36------------
37
38The HDMI Encoder supports the HDMI video and audio outputs, and does
39CEC. It is one end of the pipeline.
40
41Required properties:
42  - compatible: value must be one of:
43    * allwinner,sun4i-a10-hdmi
44    * allwinner,sun5i-a10s-hdmi
45    * allwinner,sun6i-a31-hdmi
46  - reg: base address and size of memory-mapped region
47  - interrupts: interrupt associated to this IP
48  - clocks: phandles to the clocks feeding the HDMI encoder
49    * ahb: the HDMI interface clock
50    * mod: the HDMI module clock
51    * ddc: the HDMI ddc clock (A31 only)
52    * pll-0: the first video PLL
53    * pll-1: the second video PLL
54  - clock-names: the clock names mentioned above
55  - resets: phandle to the reset control for the HDMI encoder (A31 only)
56  - dmas: phandles to the DMA channels used by the HDMI encoder
57    * ddc-tx: The channel for DDC transmission
58    * ddc-rx: The channel for DDC reception
59    * audio-tx: The channel used for audio transmission
60  - dma-names: the channel names mentioned above
61
62  - ports: A ports node with endpoint definitions as defined in
63    Documentation/devicetree/bindings/media/video-interfaces.txt. The
64    first port should be the input endpoint. The second should be the
65    output, usually to an HDMI connector.
66
67DWC HDMI TX Encoder
68-------------------
69
70The HDMI transmitter is a Synopsys DesignWare HDMI 1.4 TX controller IP
71with Allwinner's own PHY IP. It supports audio and video outputs and CEC.
72
73These DT bindings follow the Synopsys DWC HDMI TX bindings defined in
74Documentation/devicetree/bindings/display/bridge/dw_hdmi.txt with the
75following device-specific properties.
76
77Required properties:
78
79  - compatible: value must be one of:
80    * "allwinner,sun8i-a83t-dw-hdmi"
81    * "allwinner,sun50i-a64-dw-hdmi", "allwinner,sun8i-a83t-dw-hdmi"
82    * "allwinner,sun50i-h6-dw-hdmi"
83  - reg: base address and size of memory-mapped region
84  - reg-io-width: See dw_hdmi.txt. Shall be 1.
85  - interrupts: HDMI interrupt number
86  - clocks: phandles to the clocks feeding the HDMI encoder
87    * iahb: the HDMI bus clock
88    * isfr: the HDMI register clock
89    * tmds: TMDS clock
90    * cec: HDMI CEC clock (H6 only)
91    * hdcp: HDCP clock (H6 only)
92    * hdcp-bus: HDCP bus clock (H6 only)
93  - clock-names: the clock names mentioned above
94  - resets:
95    * ctrl: HDMI controller reset
96    * hdcp: HDCP reset (H6 only)
97  - reset-names: reset names mentioned above
98  - phys: phandle to the DWC HDMI PHY
99  - phy-names: must be "phy"
100
101  - ports: A ports node with endpoint definitions as defined in
102    Documentation/devicetree/bindings/media/video-interfaces.txt. The
103    first port should be the input endpoint. The second should be the
104    output, usually to an HDMI connector.
105
106Optional properties:
107  - hvcc-supply: the VCC power supply of the controller
108
109DWC HDMI PHY
110------------
111
112Required properties:
113  - compatible: value must be one of:
114    * allwinner,sun8i-a83t-hdmi-phy
115    * allwinner,sun8i-h3-hdmi-phy
116    * allwinner,sun8i-r40-hdmi-phy
117    * allwinner,sun50i-a64-hdmi-phy
118    * allwinner,sun50i-h6-hdmi-phy
119  - reg: base address and size of memory-mapped region
120  - clocks: phandles to the clocks feeding the HDMI PHY
121    * bus: the HDMI PHY interface clock
122    * mod: the HDMI PHY module clock
123  - clock-names: the clock names mentioned above
124  - resets: phandle to the reset controller driving the PHY
125  - reset-names: must be "phy"
126
127H3, A64 and R40 HDMI PHY require additional clocks:
128  - pll-0: parent of phy clock
129  - pll-1: second possible phy clock parent (A64/R40 only)
130
131TV Encoder
132----------
133
134The TV Encoder supports the composite and VGA output. It is one end of
135the pipeline.
136
137Required properties:
138 - compatible: value should be "allwinner,sun4i-a10-tv-encoder".
139 - reg: base address and size of memory-mapped region
140 - clocks: the clocks driving the TV encoder
141 - resets: phandle to the reset controller driving the encoder
142
143- ports: A ports node with endpoint definitions as defined in
144  Documentation/devicetree/bindings/media/video-interfaces.txt. The
145  first port should be the input endpoint.
146
147TCON
148----
149
150The TCON acts as a timing controller for RGB, LVDS and TV interfaces.
151
152Required properties:
153 - compatible: value must be either:
154   * allwinner,sun4i-a10-tcon
155   * allwinner,sun5i-a13-tcon
156   * allwinner,sun6i-a31-tcon
157   * allwinner,sun6i-a31s-tcon
158   * allwinner,sun7i-a20-tcon
159   * allwinner,sun8i-a23-tcon
160   * allwinner,sun8i-a33-tcon
161   * allwinner,sun8i-a83t-tcon-lcd
162   * allwinner,sun8i-a83t-tcon-tv
163   * allwinner,sun8i-r40-tcon-tv
164   * allwinner,sun8i-v3s-tcon
165   * allwinner,sun9i-a80-tcon-lcd
166   * allwinner,sun9i-a80-tcon-tv
167   * "allwinner,sun50i-a64-tcon-lcd", "allwinner,sun8i-a83t-tcon-lcd"
168   * "allwinner,sun50i-a64-tcon-tv", "allwinner,sun8i-a83t-tcon-tv"
169   * allwinner,sun50i-h6-tcon-tv, allwinner,sun8i-r40-tcon-tv
170 - reg: base address and size of memory-mapped region
171 - interrupts: interrupt associated to this IP
172 - clocks: phandles to the clocks feeding the TCON.
173   - 'ahb': the interface clocks
174   - 'tcon-ch0': The clock driving the TCON channel 0, if supported
175 - resets: phandles to the reset controllers driving the encoder
176   - "lcd": the reset line for the TCON
177   - "edp": the reset line for the eDP block (A80 only)
178
179 - clock-names: the clock names mentioned above
180 - reset-names: the reset names mentioned above
181 - clock-output-names: Name of the pixel clock created, if TCON supports
182   channel 0.
183
184- ports: A ports node with endpoint definitions as defined in
185  Documentation/devicetree/bindings/media/video-interfaces.txt. The
186  first port should be the input endpoint, the second one the output
187
188  The output may have multiple endpoints. TCON can have 1 or 2 channels,
189  usually with the first channel being used for the panels interfaces
190  (RGB, LVDS, etc.), and the second being used for the outputs that
191  require another controller (TV Encoder, HDMI, etc.). The endpoints
192  will take an extra property, allwinner,tcon-channel, to specify the
193  channel the endpoint is associated to. If that property is not
194  present, the endpoint number will be used as the channel number.
195
196For TCONs with channel 0, there is one more clock required:
197   - 'tcon-ch0': The clock driving the TCON channel 0
198For TCONs with channel 1, there is one more clock required:
199   - 'tcon-ch1': The clock driving the TCON channel 1
200
201When TCON support LVDS (all TCONs except TV TCONs on A83T, R40 and those found
202in A13, H3, H5 and V3s SoCs), you need one more reset line:
203   - 'lvds': The reset line driving the LVDS logic
204
205And on the A23, A31, A31s and A33, you need one more clock line:
206   - 'lvds-alt': An alternative clock source, separate from the TCON channel 0
207                 clock, that can be used to drive the LVDS clock
208
209TCON TOP
210--------
211
212TCON TOPs main purpose is to configure whole display pipeline. It determines
213relationships between mixers and TCONs, selects source TCON for HDMI, muxes
214LCD and TV encoder GPIO output, selects TV encoder clock source and contains
215additional TV TCON and DSI gates.
216
217It allows display pipeline to be configured in very different ways:
218
219                                / LCD0/LVDS0
220                 / [0] TCON-LCD0
221                 |              \ MIPI DSI
222 mixer0          |
223        \        / [1] TCON-LCD1 - LCD1/LVDS1
224         TCON-TOP
225        /        \ [2] TCON-TV0 [0] - TVE0/RGB
226 mixer1          |                  \
227                 |                   TCON-TOP - HDMI
228                 |                  /
229                 \ [3] TCON-TV1 [1] - TVE1/RGB
230
231Note that both TCON TOP references same physical unit. Both mixers can be
232connected to any TCON. Not all TCON TOP variants support all features.
233
234Required properties:
235  - compatible: value must be one of:
236    * allwinner,sun8i-r40-tcon-top
237    * allwinner,sun50i-h6-tcon-top
238  - reg: base address and size of the memory-mapped region.
239  - clocks: phandle to the clocks feeding the TCON TOP
240    * bus: TCON TOP interface clock
241    * tcon-tv0: TCON TV0 clock
242    * tve0: TVE0 clock (R40 only)
243    * tcon-tv1: TCON TV1 clock (R40 only)
244    * tve1: TVE0 clock (R40 only)
245    * dsi: MIPI DSI clock (R40 only)
246  - clock-names: clock name mentioned above
247  - resets: phandle to the reset line driving the TCON TOP
248  - #clock-cells : must contain 1
249  - clock-output-names: Names of clocks created for TCON TV0 channel clock,
250    TCON TV1 channel clock (R40 only) and DSI channel clock (R40 only), in
251    that order.
252
253- ports: A ports node with endpoint definitions as defined in
254    Documentation/devicetree/bindings/media/video-interfaces.txt. 6 ports should
255    be defined:
256    * port 0 is input for mixer0 mux
257    * port 1 is output for mixer0 mux
258    * port 2 is input for mixer1 mux
259    * port 3 is output for mixer1 mux
260    * port 4 is input for HDMI mux
261    * port 5 is output for HDMI mux
262    All output endpoints for mixer muxes and input endpoints for HDMI mux should
263    have reg property with the id of the target TCON, as shown in above graph
264    (0-3 for mixer muxes and 0-1 for HDMI mux). All ports should have only one
265    endpoint connected to remote endpoint.
266
267DRC
268---
269
270The DRC (Dynamic Range Controller), found in the latest Allwinner SoCs
271(A31, A23, A33, A80), allows to dynamically adjust pixel
272brightness/contrast based on histogram measurements for LCD content
273adaptive backlight control.
274
275
276Required properties:
277  - compatible: value must be one of:
278    * allwinner,sun6i-a31-drc
279    * allwinner,sun6i-a31s-drc
280    * allwinner,sun8i-a23-drc
281    * allwinner,sun8i-a33-drc
282    * allwinner,sun9i-a80-drc
283  - reg: base address and size of the memory-mapped region.
284  - interrupts: interrupt associated to this IP
285  - clocks: phandles to the clocks feeding the DRC
286    * ahb: the DRC interface clock
287    * mod: the DRC module clock
288    * ram: the DRC DRAM clock
289  - clock-names: the clock names mentioned above
290  - resets: phandles to the reset line driving the DRC
291
292- ports: A ports node with endpoint definitions as defined in
293  Documentation/devicetree/bindings/media/video-interfaces.txt. The
294  first port should be the input endpoints, the second one the outputs
295
296Display Engine Backend
297----------------------
298
299The display engine backend exposes layers and sprites to the
300system.
301
302Required properties:
303  - compatible: value must be one of:
304    * allwinner,sun4i-a10-display-backend
305    * allwinner,sun5i-a13-display-backend
306    * allwinner,sun6i-a31-display-backend
307    * allwinner,sun7i-a20-display-backend
308    * allwinner,sun8i-a23-display-backend
309    * allwinner,sun8i-a33-display-backend
310    * allwinner,sun9i-a80-display-backend
311  - reg: base address and size of the memory-mapped region.
312  - interrupts: interrupt associated to this IP
313  - clocks: phandles to the clocks feeding the frontend and backend
314    * ahb: the backend interface clock
315    * mod: the backend module clock
316    * ram: the backend DRAM clock
317  - clock-names: the clock names mentioned above
318  - resets: phandles to the reset controllers driving the backend
319
320- ports: A ports node with endpoint definitions as defined in
321  Documentation/devicetree/bindings/media/video-interfaces.txt. The
322  first port should be the input endpoints, the second one the output
323
324On the A33, some additional properties are required:
325  - reg needs to have an additional region corresponding to the SAT
326  - reg-names need to be set, with "be" and "sat"
327  - clocks and clock-names need to have a phandle to the SAT bus
328    clocks, whose name will be "sat"
329  - resets and reset-names need to have a phandle to the SAT bus
330    resets, whose name will be "sat"
331
332DEU
333---
334
335The DEU (Detail Enhancement Unit), found in the Allwinner A80 SoC,
336can sharpen the display content in both luma and chroma channels.
337
338Required properties:
339  - compatible: value must be one of:
340    * allwinner,sun9i-a80-deu
341  - reg: base address and size of the memory-mapped region.
342  - interrupts: interrupt associated to this IP
343  - clocks: phandles to the clocks feeding the DEU
344    * ahb: the DEU interface clock
345    * mod: the DEU module clock
346    * ram: the DEU DRAM clock
347  - clock-names: the clock names mentioned above
348  - resets: phandles to the reset line driving the DEU
349
350- ports: A ports node with endpoint definitions as defined in
351  Documentation/devicetree/bindings/media/video-interfaces.txt. The
352  first port should be the input endpoints, the second one the outputs
353
354Display Engine Frontend
355-----------------------
356
357The display engine frontend does formats conversion, scaling,
358deinterlacing and color space conversion.
359
360Required properties:
361  - compatible: value must be one of:
362    * allwinner,sun4i-a10-display-frontend
363    * allwinner,sun5i-a13-display-frontend
364    * allwinner,sun6i-a31-display-frontend
365    * allwinner,sun7i-a20-display-frontend
366    * allwinner,sun8i-a23-display-frontend
367    * allwinner,sun8i-a33-display-frontend
368    * allwinner,sun9i-a80-display-frontend
369  - reg: base address and size of the memory-mapped region.
370  - interrupts: interrupt associated to this IP
371  - clocks: phandles to the clocks feeding the frontend and backend
372    * ahb: the backend interface clock
373    * mod: the backend module clock
374    * ram: the backend DRAM clock
375  - clock-names: the clock names mentioned above
376  - resets: phandles to the reset controllers driving the backend
377
378- ports: A ports node with endpoint definitions as defined in
379  Documentation/devicetree/bindings/media/video-interfaces.txt. The
380  first port should be the input endpoints, the second one the outputs
381
382Display Engine 2.0 Mixer
383------------------------
384
385The DE2 mixer have many functionalities, currently only layer blending is
386supported.
387
388Required properties:
389  - compatible: value must be one of:
390    * allwinner,sun8i-a83t-de2-mixer-0
391    * allwinner,sun8i-a83t-de2-mixer-1
392    * allwinner,sun8i-h3-de2-mixer-0
393    * allwinner,sun8i-r40-de2-mixer-0
394    * allwinner,sun8i-r40-de2-mixer-1
395    * allwinner,sun8i-v3s-de2-mixer
396    * allwinner,sun50i-a64-de2-mixer-0
397    * allwinner,sun50i-a64-de2-mixer-1
398    * allwinner,sun50i-h6-de3-mixer-0
399  - reg: base address and size of the memory-mapped region.
400  - clocks: phandles to the clocks feeding the mixer
401    * bus: the mixer interface clock
402    * mod: the mixer module clock
403  - clock-names: the clock names mentioned above
404  - resets: phandles to the reset controllers driving the mixer
405
406- ports: A ports node with endpoint definitions as defined in
407  Documentation/devicetree/bindings/media/video-interfaces.txt. The
408  first port should be the input endpoints, the second one the output
409
410
411Display Engine Pipeline
412-----------------------
413
414The display engine pipeline (and its entry point, since it can be
415either directly the backend or the frontend) is represented as an
416extra node.
417
418Required properties:
419  - compatible: value must be one of:
420    * allwinner,sun4i-a10-display-engine
421    * allwinner,sun5i-a10s-display-engine
422    * allwinner,sun5i-a13-display-engine
423    * allwinner,sun6i-a31-display-engine
424    * allwinner,sun6i-a31s-display-engine
425    * allwinner,sun7i-a20-display-engine
426    * allwinner,sun8i-a23-display-engine
427    * allwinner,sun8i-a33-display-engine
428    * allwinner,sun8i-a83t-display-engine
429    * allwinner,sun8i-h3-display-engine
430    * allwinner,sun8i-r40-display-engine
431    * allwinner,sun8i-v3s-display-engine
432    * allwinner,sun9i-a80-display-engine
433    * allwinner,sun50i-a64-display-engine
434    * allwinner,sun50i-h6-display-engine
435
436  - allwinner,pipelines: list of phandle to the display engine
437    frontends (DE 1.0) or mixers (DE 2.0/3.0) available.
438
439Example:
440
441panel: panel {
442	compatible = "olimex,lcd-olinuxino-43-ts";
443	#address-cells = <1>;
444	#size-cells = <0>;
445
446	port {
447		#address-cells = <1>;
448		#size-cells = <0>;
449
450		panel_input: endpoint {
451			remote-endpoint = <&tcon0_out_panel>;
452		};
453	};
454};
455
456connector {
457	compatible = "hdmi-connector";
458	type = "a";
459
460	port {
461		hdmi_con_in: endpoint {
462			remote-endpoint = <&hdmi_out_con>;
463		};
464	};
465};
466
467hdmi: hdmi@1c16000 {
468	compatible = "allwinner,sun5i-a10s-hdmi";
469	reg = <0x01c16000 0x1000>;
470	interrupts = <58>;
471	clocks = <&ccu CLK_AHB_HDMI>, <&ccu CLK_HDMI>,
472		 <&ccu CLK_PLL_VIDEO0_2X>,
473		 <&ccu CLK_PLL_VIDEO1_2X>;
474	clock-names = "ahb", "mod", "pll-0", "pll-1";
475	dmas = <&dma SUN4I_DMA_NORMAL 16>,
476	       <&dma SUN4I_DMA_NORMAL 16>,
477	       <&dma SUN4I_DMA_DEDICATED 24>;
478	dma-names = "ddc-tx", "ddc-rx", "audio-tx";
479
480	ports {
481		#address-cells = <1>;
482		#size-cells = <0>;
483
484		port@0 {
485			#address-cells = <1>;
486			#size-cells = <0>;
487			reg = <0>;
488
489			hdmi_in_tcon0: endpoint {
490				remote-endpoint = <&tcon0_out_hdmi>;
491			};
492		};
493
494		port@1 {
495			#address-cells = <1>;
496			#size-cells = <0>;
497			reg = <1>;
498
499			hdmi_out_con: endpoint {
500				remote-endpoint = <&hdmi_con_in>;
501			};
502		};
503	};
504};
505
506tve0: tv-encoder@1c0a000 {
507	compatible = "allwinner,sun4i-a10-tv-encoder";
508	reg = <0x01c0a000 0x1000>;
509	clocks = <&ahb_gates 34>;
510	resets = <&tcon_ch0_clk 0>;
511
512	port {
513		#address-cells = <1>;
514		#size-cells = <0>;
515
516		tve0_in_tcon0: endpoint@0 {
517			reg = <0>;
518			remote-endpoint = <&tcon0_out_tve0>;
519		};
520	};
521};
522
523tcon0: lcd-controller@1c0c000 {
524	compatible = "allwinner,sun5i-a13-tcon";
525	reg = <0x01c0c000 0x1000>;
526	interrupts = <44>;
527	resets = <&tcon_ch0_clk 1>;
528	reset-names = "lcd";
529	clocks = <&ahb_gates 36>,
530		 <&tcon_ch0_clk>,
531		 <&tcon_ch1_clk>;
532	clock-names = "ahb",
533		      "tcon-ch0",
534		      "tcon-ch1";
535	clock-output-names = "tcon-pixel-clock";
536
537	ports {
538		#address-cells = <1>;
539		#size-cells = <0>;
540
541		tcon0_in: port@0 {
542			#address-cells = <1>;
543			#size-cells = <0>;
544			reg = <0>;
545
546			tcon0_in_be0: endpoint@0 {
547				reg = <0>;
548				remote-endpoint = <&be0_out_tcon0>;
549			};
550		};
551
552		tcon0_out: port@1 {
553			#address-cells = <1>;
554			#size-cells = <0>;
555			reg = <1>;
556
557			tcon0_out_panel: endpoint@0 {
558				reg = <0>;
559				remote-endpoint = <&panel_input>;
560			};
561
562			tcon0_out_tve0: endpoint@1 {
563				reg = <1>;
564				remote-endpoint = <&tve0_in_tcon0>;
565			};
566		};
567	};
568};
569
570fe0: display-frontend@1e00000 {
571	compatible = "allwinner,sun5i-a13-display-frontend";
572	reg = <0x01e00000 0x20000>;
573	interrupts = <47>;
574	clocks = <&ahb_gates 46>, <&de_fe_clk>,
575		 <&dram_gates 25>;
576	clock-names = "ahb", "mod",
577		      "ram";
578	resets = <&de_fe_clk>;
579
580	ports {
581		#address-cells = <1>;
582		#size-cells = <0>;
583
584		fe0_out: port@1 {
585			#address-cells = <1>;
586			#size-cells = <0>;
587			reg = <1>;
588
589			fe0_out_be0: endpoint {
590				remote-endpoint = <&be0_in_fe0>;
591			};
592		};
593	};
594};
595
596be0: display-backend@1e60000 {
597	compatible = "allwinner,sun5i-a13-display-backend";
598	reg = <0x01e60000 0x10000>;
599	interrupts = <47>;
600	clocks = <&ahb_gates 44>, <&de_be_clk>,
601		 <&dram_gates 26>;
602	clock-names = "ahb", "mod",
603		      "ram";
604	resets = <&de_be_clk>;
605
606	ports {
607		#address-cells = <1>;
608		#size-cells = <0>;
609
610		be0_in: port@0 {
611			#address-cells = <1>;
612			#size-cells = <0>;
613			reg = <0>;
614
615			be0_in_fe0: endpoint@0 {
616				reg = <0>;
617				remote-endpoint = <&fe0_out_be0>;
618			};
619		};
620
621		be0_out: port@1 {
622			#address-cells = <1>;
623			#size-cells = <0>;
624			reg = <1>;
625
626			be0_out_tcon0: endpoint@0 {
627				reg = <0>;
628				remote-endpoint = <&tcon0_in_be0>;
629			};
630		};
631	};
632};
633
634display-engine {
635	compatible = "allwinner,sun5i-a13-display-engine";
636	allwinner,pipelines = <&fe0>;
637};
638