xref: /OK3568_Linux_fs/kernel/Documentation/devicetree/bindings/sound/audio-graph-card.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunAudio Graph Card:
2*4882a593Smuzhiyun
3*4882a593SmuzhiyunAudio Graph Card specifies audio DAI connections of SoC <-> codec.
4*4882a593SmuzhiyunIt is based on common bindings for device graphs.
5*4882a593Smuzhiyunsee ${LINUX}/Documentation/devicetree/bindings/graph.txt
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunBasically, Audio Graph Card property is same as Simple Card.
8*4882a593Smuzhiyunsee ${LINUX}/Documentation/devicetree/bindings/sound/simple-card.yaml
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunBelow are same as Simple-Card.
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun- label
13*4882a593Smuzhiyun- widgets
14*4882a593Smuzhiyun- routing
15*4882a593Smuzhiyun- dai-format
16*4882a593Smuzhiyun- frame-master
17*4882a593Smuzhiyun- bitclock-master
18*4882a593Smuzhiyun- bitclock-inversion
19*4882a593Smuzhiyun- frame-inversion
20*4882a593Smuzhiyun- mclk-fs
21*4882a593Smuzhiyun- hp-det-gpio
22*4882a593Smuzhiyun- mic-det-gpio
23*4882a593Smuzhiyun- dai-tdm-slot-num
24*4882a593Smuzhiyun- dai-tdm-slot-width
25*4882a593Smuzhiyun- clocks / system-clock-frequency
26*4882a593Smuzhiyun
27*4882a593SmuzhiyunRequired properties:
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun- compatible				: "audio-graph-card";
30*4882a593Smuzhiyun- dais					: list of CPU DAI port{s}
31*4882a593Smuzhiyun
32*4882a593SmuzhiyunOptional properties:
33*4882a593Smuzhiyun- pa-gpios: GPIO used to control external amplifier.
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun-----------------------
36*4882a593SmuzhiyunExample: Single DAI case
37*4882a593Smuzhiyun-----------------------
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	sound_card {
40*4882a593Smuzhiyun		compatible = "audio-graph-card";
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun		dais = <&cpu_port>;
43*4882a593Smuzhiyun	};
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	dai-controller {
46*4882a593Smuzhiyun		...
47*4882a593Smuzhiyun		cpu_port: port {
48*4882a593Smuzhiyun			cpu_endpoint: endpoint {
49*4882a593Smuzhiyun				remote-endpoint = <&codec_endpoint>;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun				dai-format = "left_j";
52*4882a593Smuzhiyun				...
53*4882a593Smuzhiyun			};
54*4882a593Smuzhiyun		};
55*4882a593Smuzhiyun	};
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun	audio-codec {
58*4882a593Smuzhiyun		...
59*4882a593Smuzhiyun		port {
60*4882a593Smuzhiyun			codec_endpoint: endpoint {
61*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint>;
62*4882a593Smuzhiyun			};
63*4882a593Smuzhiyun		};
64*4882a593Smuzhiyun	};
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun-----------------------
67*4882a593SmuzhiyunExample: Multi DAI case
68*4882a593Smuzhiyun-----------------------
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	sound-card {
71*4882a593Smuzhiyun		compatible = "audio-graph-card";
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun		label = "sound-card";
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun		dais = <&cpu_port0
76*4882a593Smuzhiyun			&cpu_port1
77*4882a593Smuzhiyun			&cpu_port2>;
78*4882a593Smuzhiyun	};
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	audio-codec@0 {
81*4882a593Smuzhiyun		...
82*4882a593Smuzhiyun		port {
83*4882a593Smuzhiyun			codec0_endpoint: endpoint {
84*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint0>;
85*4882a593Smuzhiyun			};
86*4882a593Smuzhiyun		};
87*4882a593Smuzhiyun	};
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	audio-codec@1 {
90*4882a593Smuzhiyun		...
91*4882a593Smuzhiyun		port {
92*4882a593Smuzhiyun			codec1_endpoint: endpoint {
93*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint1>;
94*4882a593Smuzhiyun			};
95*4882a593Smuzhiyun		};
96*4882a593Smuzhiyun	};
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun	audio-codec@2 {
99*4882a593Smuzhiyun		...
100*4882a593Smuzhiyun		port {
101*4882a593Smuzhiyun			codec2_endpoint: endpoint {
102*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint2>;
103*4882a593Smuzhiyun			};
104*4882a593Smuzhiyun		};
105*4882a593Smuzhiyun	};
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	dai-controller {
108*4882a593Smuzhiyun		...
109*4882a593Smuzhiyun		ports {
110*4882a593Smuzhiyun			cpu_port0: port@0 {
111*4882a593Smuzhiyun				cpu_endpoint0: endpoint {
112*4882a593Smuzhiyun					remote-endpoint = <&codec0_endpoint>;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun					dai-format = "left_j";
115*4882a593Smuzhiyun					...
116*4882a593Smuzhiyun				};
117*4882a593Smuzhiyun			};
118*4882a593Smuzhiyun			cpu_port1: port@1 {
119*4882a593Smuzhiyun				cpu_endpoint1: endpoint {
120*4882a593Smuzhiyun					remote-endpoint = <&codec1_endpoint>;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun					dai-format = "i2s";
123*4882a593Smuzhiyun					...
124*4882a593Smuzhiyun				};
125*4882a593Smuzhiyun			};
126*4882a593Smuzhiyun			cpu_port2: port@2 {
127*4882a593Smuzhiyun				cpu_endpoint2: endpoint {
128*4882a593Smuzhiyun					remote-endpoint = <&codec2_endpoint>;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun					dai-format = "i2s";
131*4882a593Smuzhiyun					...
132*4882a593Smuzhiyun				};
133*4882a593Smuzhiyun			};
134*4882a593Smuzhiyun		};
135*4882a593Smuzhiyun	};
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun-----------------------
139*4882a593SmuzhiyunExample: Sampling Rate Conversion
140*4882a593Smuzhiyun-----------------------
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun	sound_card {
143*4882a593Smuzhiyun		compatible = "audio-graph-card";
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun		label = "sound-card";
146*4882a593Smuzhiyun		prefix = "codec";
147*4882a593Smuzhiyun		routing = "codec Playback", "DAI0 Playback",
148*4882a593Smuzhiyun			  "DAI0 Capture",   "codec Capture";
149*4882a593Smuzhiyun		convert-rate = <48000>;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun		dais = <&cpu_port>;
152*4882a593Smuzhiyun	};
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun	audio-codec {
155*4882a593Smuzhiyun		...
156*4882a593Smuzhiyun		port {
157*4882a593Smuzhiyun			codec_endpoint: endpoint {
158*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint>;
159*4882a593Smuzhiyun			};
160*4882a593Smuzhiyun		};
161*4882a593Smuzhiyun	};
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun	dai-controller {
164*4882a593Smuzhiyun		...
165*4882a593Smuzhiyun		cpu_port: port {
166*4882a593Smuzhiyun			cpu_endpoint: endpoint {
167*4882a593Smuzhiyun				remote-endpoint = <&codec_endpoint>;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun				dai-format = "left_j";
170*4882a593Smuzhiyun				...
171*4882a593Smuzhiyun			};
172*4882a593Smuzhiyun		};
173*4882a593Smuzhiyun	};
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun-----------------------
176*4882a593SmuzhiyunExample: 2 CPU 1 Codec (Mixing)
177*4882a593Smuzhiyun-----------------------
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	sound_card {
180*4882a593Smuzhiyun		compatible = "audio-graph-card";
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun		label = "sound-card";
183*4882a593Smuzhiyun		routing = "codec Playback", "DAI0 Playback",
184*4882a593Smuzhiyun			  "codec Playback", "DAI1 Playback",
185*4882a593Smuzhiyun			  "DAI0 Capture",   "codec Capture";
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun		dais = <&cpu_port>;
188*4882a593Smuzhiyun	};
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun	audio-codec {
191*4882a593Smuzhiyun		...
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun		audio-graph-card,prefix = "codec";
194*4882a593Smuzhiyun		audio-graph-card,convert-rate = <48000>;
195*4882a593Smuzhiyun		port {
196*4882a593Smuzhiyun			reg = <0>;
197*4882a593Smuzhiyun			codec_endpoint0: endpoint@0 {
198*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint0>;
199*4882a593Smuzhiyun			};
200*4882a593Smuzhiyun			codec_endpoint1: endpoint@1 {
201*4882a593Smuzhiyun				remote-endpoint = <&cpu_endpoint1>;
202*4882a593Smuzhiyun			};
203*4882a593Smuzhiyun		};
204*4882a593Smuzhiyun	};
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun	dai-controller {
207*4882a593Smuzhiyun		...
208*4882a593Smuzhiyun		cpu_port: port {
209*4882a593Smuzhiyun			cpu_endpoint0: endpoint@0 {
210*4882a593Smuzhiyun				remote-endpoint = <&codec_endpoint0>;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun				dai-format = "left_j";
213*4882a593Smuzhiyun				...
214*4882a593Smuzhiyun			};
215*4882a593Smuzhiyun			cpu_endpoint1: endpoint@1 {
216*4882a593Smuzhiyun				remote-endpoint = <&codec_endpoint1>;
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun				dai-format = "left_j";
219*4882a593Smuzhiyun				...
220*4882a593Smuzhiyun			};
221*4882a593Smuzhiyun		};
222*4882a593Smuzhiyun	};
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun-----------------------
225*4882a593SmuzhiyunExample: Multi DAI with DPCM
226*4882a593Smuzhiyun-----------------------
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun	CPU0 ------ ak4613
229*4882a593Smuzhiyun	CPU1 ------ HDMI
230*4882a593Smuzhiyun	CPU2 ------ PCM3168A-p	/* DPCM 1ch/2ch */
231*4882a593Smuzhiyun	CPU3 --/		/* DPCM 3ch/4ch */
232*4882a593Smuzhiyun	CPU4 --/		/* DPCM 5ch/6ch */
233*4882a593Smuzhiyun	CPU5 --/		/* DPCM 7ch/8ch */
234*4882a593Smuzhiyun	CPU6 ------ PCM3168A-c
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun	sound_card: sound {
237*4882a593Smuzhiyun		compatible = "audio-graph-card";
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun		label = "sound-card";
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun		routing =	"pcm3168a Playback", "DAI2 Playback",
242*4882a593Smuzhiyun				"pcm3168a Playback", "DAI3 Playback",
243*4882a593Smuzhiyun				"pcm3168a Playback", "DAI4 Playback",
244*4882a593Smuzhiyun				"pcm3168a Playback", "DAI5 Playback";
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun		dais = <&snd_port0	/* ak4613 */
247*4882a593Smuzhiyun			&snd_port1	/* HDMI0  */
248*4882a593Smuzhiyun			&snd_port2	/* pcm3168a playback */
249*4882a593Smuzhiyun			&snd_port3	/* pcm3168a capture  */
250*4882a593Smuzhiyun			>;
251*4882a593Smuzhiyun	};
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun	ak4613: codec@10 {
254*4882a593Smuzhiyun		...
255*4882a593Smuzhiyun		port {
256*4882a593Smuzhiyun			ak4613_endpoint: endpoint {
257*4882a593Smuzhiyun				remote-endpoint = <&rsnd_endpoint0>;
258*4882a593Smuzhiyun			};
259*4882a593Smuzhiyun		};
260*4882a593Smuzhiyun	};
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun	pcm3168a: audio-codec@44 {
263*4882a593Smuzhiyun		...
264*4882a593Smuzhiyun		audio-graph-card,prefix = "pcm3168a";
265*4882a593Smuzhiyun		audio-graph-card,convert-channels = <8>; /* TDM Split */
266*4882a593Smuzhiyun		ports {
267*4882a593Smuzhiyun			port@0 {
268*4882a593Smuzhiyun				reg = <0>;
269*4882a593Smuzhiyun				pcm3168a_endpoint_p1: endpoint@1 {
270*4882a593Smuzhiyun					remote-endpoint = <&rsnd_endpoint2>;
271*4882a593Smuzhiyun					...
272*4882a593Smuzhiyun				};
273*4882a593Smuzhiyun				pcm3168a_endpoint_p2: endpoint@2 {
274*4882a593Smuzhiyun					remote-endpoint = <&rsnd_endpoint3>;
275*4882a593Smuzhiyun					...
276*4882a593Smuzhiyun				};
277*4882a593Smuzhiyun				pcm3168a_endpoint_p3: endpoint@3 {
278*4882a593Smuzhiyun					remote-endpoint = <&rsnd_endpoint4>;
279*4882a593Smuzhiyun					...
280*4882a593Smuzhiyun				};
281*4882a593Smuzhiyun				pcm3168a_endpoint_p4: endpoint@4 {
282*4882a593Smuzhiyun					remote-endpoint = <&rsnd_endpoint5>;
283*4882a593Smuzhiyun					...
284*4882a593Smuzhiyun				};
285*4882a593Smuzhiyun			};
286*4882a593Smuzhiyun			port@1 {
287*4882a593Smuzhiyun				reg = <1>;
288*4882a593Smuzhiyun				pcm3168a_endpoint_c: endpoint {
289*4882a593Smuzhiyun					remote-endpoint = <&rsnd_endpoint6>;
290*4882a593Smuzhiyun					...
291*4882a593Smuzhiyun				};
292*4882a593Smuzhiyun			};
293*4882a593Smuzhiyun		};
294*4882a593Smuzhiyun	};
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun	&sound {
297*4882a593Smuzhiyun		ports {
298*4882a593Smuzhiyun			snd_port0: port@0 {
299*4882a593Smuzhiyun				rsnd_endpoint0: endpoint {
300*4882a593Smuzhiyun					remote-endpoint = <&ak4613_endpoint>;
301*4882a593Smuzhiyun					...
302*4882a593Smuzhiyun				};
303*4882a593Smuzhiyun			};
304*4882a593Smuzhiyun			snd_port1: port@1 {
305*4882a593Smuzhiyun				rsnd_endpoint1: endpoint {
306*4882a593Smuzhiyun					remote-endpoint = <&dw_hdmi0_snd_in>;
307*4882a593Smuzhiyun					...
308*4882a593Smuzhiyun				};
309*4882a593Smuzhiyun			};
310*4882a593Smuzhiyun			snd_port2: port@2 {
311*4882a593Smuzhiyun				#address-cells = <1>;
312*4882a593Smuzhiyun				#size-cells = <0>;
313*4882a593Smuzhiyun				rsnd_endpoint2: endpoint@2 {
314*4882a593Smuzhiyun					remote-endpoint = <&pcm3168a_endpoint_p1>;
315*4882a593Smuzhiyun					...
316*4882a593Smuzhiyun				};
317*4882a593Smuzhiyun				rsnd_endpoint3: endpoint@3 {
318*4882a593Smuzhiyun					remote-endpoint = <&pcm3168a_endpoint_p2>;
319*4882a593Smuzhiyun					...
320*4882a593Smuzhiyun				};
321*4882a593Smuzhiyun				rsnd_endpoint4: endpoint@4 {
322*4882a593Smuzhiyun					remote-endpoint = <&pcm3168a_endpoint_p3>;
323*4882a593Smuzhiyun					...
324*4882a593Smuzhiyun				};
325*4882a593Smuzhiyun				rsnd_endpoint5: endpoint@5 {
326*4882a593Smuzhiyun					remote-endpoint = <&pcm3168a_endpoint_p4>;
327*4882a593Smuzhiyun					...
328*4882a593Smuzhiyun				};
329*4882a593Smuzhiyun			};
330*4882a593Smuzhiyun			snd_port3: port@6 {
331*4882a593Smuzhiyun				rsnd_endpoint6: endpoint {
332*4882a593Smuzhiyun					remote-endpoint = <&pcm3168a_endpoint_c>;
333*4882a593Smuzhiyun					...
334*4882a593Smuzhiyun				};
335*4882a593Smuzhiyun			};
336*4882a593Smuzhiyun		};
337*4882a593Smuzhiyun	};
338