xref: /linux/sound/soc/generic/audio-graph-card2-custom-sample.dtsi (revision fd7d598270724cc787982ea48bbe17ad383a8b7f)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * audio-graph-card2-custom-sample.dtsi
4 *
5 * Copyright (C) 2020 Renesas Electronics Corp.
6 * Copyright (C) 2020 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
7 *
8 * This sample indicates how to use audio-graph-card2 and its
9 * custom driver. "audio-graph-card2-custom-sample" is the custome driver
10 * which is using audio-graph-card2.
11 *
12 * You can easily use this sample by adding below line on your DT file,
13 * and add new CONFIG to your .config.
14 *
15 *	#include "../../../../../sound/soc/generic/audio-graph-card2-custom-sample.dtsi"
16 *
17 *	CONFIG_SND_AUDIO_GRAPH_CARD2
18 *	CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE
19 *	CONFIG_SND_TEST_COMPONENT
20 *
21 *
22 * You can indicate more detail each device behavior as debug if you modify
23 * "compatible" on each test-component. see below
24 *
25 *	test_cpu {
26 *	-	compatible = "test-cpu";
27 *	+	compatible = "test-cpu-verbose";
28 *		...
29 *	};
30 *
31 *	test_codec {
32 *	-	compatible = "test-codec";
33 *	+	compatible = "test-codec-verbose";
34 *		...
35 *	};
36 *
37 *
38 * Below sample doesn't use "format" property,
39 * because test-component driver (test-cpu/test-codec) is supporting
40 * snd_soc_dai_ops :: .auto_selectable_formats.
41 * see
42 *	snd_soc_runtime_get_dai_fmt()
43 *	linux/sound/soc/generic/test-component.c :: test_dai_formats
44 */
45/ {
46	/*
47	 * @ : used at links
48	 *
49	 * [Normal]
50	 *	cpu0 <-@-----------------> codec0
51	 *
52	 * [Semi-Multi]
53	 *
54	 * CPU:Codec = 1:N
55	 *
56	 *			+-+
57	 *	cpu7 <-@------->| |-> codec12
58	 *			| |-> codec13
59	 *			+-+
60	 *
61	 * [Multi-CPU/Codec]
62	 *		+-+		+-+
63	 *	cpu1 <--| |<-@--------->| |-> codec1
64	 *	cpu2 <--| |		| |-> codec2
65	 *		+-+		+-+
66	 *
67	 * [DPCM]
68	 *
69	 *	CPU3/CPU4 are converting rate to 44100
70	 *
71	 *	FE		BE
72	 *		  ****
73	 *	cpu3 <-@--*  *--@-> codec3
74	 *	cpu4 <-@--*  *  (44.1kHz)
75	 *		  ****
76	 *
77	 * [DPCM-Multi]
78	 *
79	 * --NOTE--
80	 * Multi-FE is not supported by ASoC.
81	 *
82	 *	FE		BE
83	 *		  ****	    +-+
84	 *	cpu5 <-@--*  *--@-> | | -> codec4
85	 *	cpu6 <-@--*  *	    | | -> codec5
86	 *		  ****	    +-+
87	 *
88	 * [Codec2Codec]
89	 *			   +-@-> codec6
90	 *			   |
91	 *			   +---> codec7
92	 *
93	 * [Codec2Codec-Multi]
94	 *
95	 * --NOTE--
96	 * Multi connect N:M is not supported by ASoC.
97	 *
98	 *				+-+
99	 *			   +-@->| |-> codec8
100	 *			   |	| |-> codec9
101	 *			   |	+-+
102	 *			   |	+-+
103	 *			   +--->| |-> codec10
104	 *				| |-> codec11
105	 *				+-+
106	 */
107	audio-graph-card2-custom-sample {
108		/*
109		 * You can use audio-graph-card2 directly by using
110		 *
111		 * compatible = "audio-graph-card2";
112		 */
113		compatible = "audio-graph-card2-custom-sample";
114
115			/* for [DPCM]		   */
116			/* BE			FE */
117		routing = "TC DAI3 Playback",	"DAI3 Playback",
118			  "TC DAI3 Playback",	"DAI4 Playback",
119			  "DAI3 Capture",	"TC DAI3 Capture",
120			  "DAI4 Capture",	"TC DAI3 Capture",
121			/* for [DPCM-Multi]	   */
122			/* BE			FE */
123			  "TC DAI4 Playback",	"DAI5 Playback",
124			  "TC DAI5 Playback",	"DAI5 Playback",
125			  "TC DAI4 Playback",	"DAI6 Playback",
126			  "TC DAI5 Playback",	"DAI6 Playback",
127			  "DAI5 Capture",	"TC DAI4 Capture",
128			  "DAI5 Capture",	"TC DAI5 Capture",
129			  "DAI6 Capture",	"TC DAI4 Capture",
130			  "DAI6 Capture",	"TC DAI5 Capture",
131			/* for [Codec2Codec] */
132			  "TC OUT",		"TC DAI7 Playback",
133			  "TC DAI6 Capture",	"TC IN",
134			/* for [Codec2Codec-Multi] */
135			  "TC OUT",		"TC DAI10 Playback",
136			  "TC DAI8 Capture",	"TC IN",
137			  "TC OUT",		"TC DAI11 Playback",
138			  "TC DAI9 Capture",	"TC IN";
139
140		links = <
141			/*
142			 * [Normal]: cpu side only
143			 * cpu0/codec0
144			 */
145			 &cpu0
146
147			/* [Semi-Multi] */
148			&sm0
149
150			/*
151			 * [Multi-CPU/Codec]: cpu side only
152			 * cpu1/cpu2/codec1/codec2
153			 */
154			 &mcpu0
155
156			/*
157			 * [DPCM]: both FE / BE
158			 * cpu3/cpu4/codec3
159			 */
160			 &fe00 &fe01 &be0
161
162			/*
163			 * [DPCM-Multi]: both FE / BE
164			 * cpu5/cpu6/codec4/codec5
165			 */
166			 &fe10 &fe11 &be1
167
168			/*
169			 * [Codec2Codec]: cpu side only
170			 * codec6/codec7
171			 */
172			 &c2c
173
174			/*
175			 * [Codec2Codec-Multi]: cpu side only
176			 * codec8/codec9/codec10/codec11
177			 */
178			 &c2c_m
179		>;
180
181		multi {
182			#address-cells = <1>;
183			#size-cells = <0>;
184
185			ports@0 {
186				reg = <0>;
187				#address-cells = <1>;
188				#size-cells = <0>;
189			/* [Multi-CPU] */
190			mcpu0:	port@0 { reg = <0>; mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
191				port@1 { reg = <1>; mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>;    }; };
192				port@2 { reg = <2>; mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>;    }; };
193			};
194
195			/* [Multi-Codec] */
196			ports@1 {
197				reg = <1>;
198				#address-cells = <1>;
199				#size-cells = <0>;
200				port@0 { reg = <0>; mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>;  }; };
201				port@1 { reg = <1>; mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
202				port@2 { reg = <2>; mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
203			};
204
205			/* [DPCM-Multi]::BE */
206			ports@2 {
207				reg = <2>;
208				#address-cells = <1>;
209				#size-cells = <0>;
210				port@0 { reg = <0>; mbe_ep:  endpoint { remote-endpoint = <&be10_ep>;  }; };
211				port@1 { reg = <1>; mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; }; };
212				port@2 { reg = <2>; mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; }; };
213			};
214
215			/* [Codec2Codec-Multi]::CPU */
216			ports@3 {
217				reg = <3>;
218				#address-cells = <1>;
219				#size-cells = <0>;
220				port@0 { reg = <0>; mc2c0_ep:  endpoint { remote-endpoint = <&c2cmf_ep>;  }; };
221				port@1 { reg = <1>; mc2c00_ep: endpoint { remote-endpoint = <&codec8_ep>; }; };
222				port@2 { reg = <2>; mc2c01_ep: endpoint { remote-endpoint = <&codec9_ep>; }; };
223			};
224
225			/* [Codec2Codec-Multi]::Codec */
226			ports@4 {
227				reg = <4>;
228				#address-cells = <1>;
229				#size-cells = <0>;
230				port@0 { reg = <0>; mc2c1_ep:  endpoint { remote-endpoint = <&c2cmb_ep>;  }; };
231				port@1 { reg = <1>; mc2c10_ep: endpoint { remote-endpoint = <&codec10_ep>; }; };
232				port@2 { reg = <2>; mc2c11_ep: endpoint { remote-endpoint = <&codec11_ep>; }; };
233			};
234
235			/* [Semi-Multi] */
236			ports@5 {
237				reg = <5>;
238				#address-cells = <1>;
239				#size-cells = <0>;
240				port@0 { reg = <0>; smcodec0_ep: endpoint { remote-endpoint = <&cpu7_ep>;    }; };
241				port@1 { reg = <1>; smcodec1_ep: endpoint { remote-endpoint = <&codec12_ep>; }; };
242				port@2 { reg = <2>; smcodec2_ep: endpoint { remote-endpoint = <&codec13_ep>; }; };
243			};
244		};
245
246		dpcm {
247			#address-cells = <1>;
248			#size-cells = <0>;
249
250			ports@0 {
251				reg = <0>;
252
253				#address-cells = <1>;
254				#size-cells = <0>;
255			/* [DPCM]::FE */
256			fe00:	port@0 { reg = <0>; fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
257			fe01:	port@1 { reg = <1>; fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
258
259			/* [DPCM-Multi]::FE */
260			fe10:	port@2 { reg = <2>; fe10_ep: endpoint { remote-endpoint = <&cpu5_ep>; }; };
261			fe11:	port@3 { reg = <3>; fe11_ep: endpoint { remote-endpoint = <&cpu6_ep>; }; };
262			};
263
264			ports@1 {
265				reg = <1>;
266
267				#address-cells = <1>;
268				#size-cells = <0>;
269			/* [DPCM]::BE */
270			be0:	port@0 { reg = <0>; be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
271
272			/* [DPCM-Multi]::BE */
273			be1:	port@1 { reg = <1>; be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
274			};
275		};
276
277		codec2codec {
278			#address-cells = <1>;
279			#size-cells = <0>;
280			/* [Codec2Codec] */
281			ports@0 {
282				reg = <0>;
283
284				#address-cells = <1>;
285				#size-cells = <0>;
286
287				/* use default settings */
288			c2c:	port@0 { reg = <0>; c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
289				port@1 { reg = <1>; c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
290			};
291
292			/* [Codec2Codec-Multi] */
293			ports@1 {
294				reg = <1>;
295
296				#address-cells = <1>;
297				#size-cells = <0>;
298
299				/* use original settings */
300				rate = <48000>;
301			c2c_m:	port@0 { reg = <0>; c2cmf_ep: endpoint { remote-endpoint = <&mc2c0_ep>; }; };
302				port@1 { reg = <1>; c2cmb_ep: endpoint { remote-endpoint = <&mc2c1_ep>; }; };
303			};
304		};
305	};
306
307	test_cpu {
308		/*
309		 * update compatible to indicate more detail behaviour
310		 * if you want. see test-compatible for more detail.
311		 *
312		 * ex)
313		 *	- compatible = "test-cpu";
314		 *	+ compatible = "test-cpu-verbose";
315		 */
316		compatible = "test-cpu";
317		ports {
318			#address-cells = <1>;
319			#size-cells = <0>;
320
321			bitclock-master;
322			frame-master;
323			/* [Normal] */
324			cpu0: port@0 { reg = <0>; cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
325
326			/* [Multi-CPU] */
327			      port@1 { reg = <1>; cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
328			      port@2 { reg = <2>; cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
329
330			/* [DPCM]::FE */
331			      port@3 { reg = <3>; cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
332			      port@4 { reg = <4>; cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
333
334			/* [DPCM-Multi]::FE */
335			      port@5 { reg = <5>; cpu5_ep: endpoint { remote-endpoint = <&fe10_ep>; }; };
336			      port@6 { reg = <6>; cpu6_ep: endpoint { remote-endpoint = <&fe11_ep>; }; };
337
338			/* [Semi-Multi] */
339			sm0:  port@7 { reg = <7>; cpu7_ep: endpoint { remote-endpoint = <&smcodec0_ep>; }; };
340		};
341	};
342
343	test_codec {
344		/*
345		 * update compatible to indicate more detail behaviour
346		 * if you want. see test-compatible for more detail.
347		 *
348		 * ex)
349		 *	- compatible = "test-codec";
350		 *	+ compatible = "test-codec-verbose";
351		 */
352		compatible = "test-codec";
353		ports {
354			#address-cells = <1>;
355			#size-cells = <0>;
356
357			/*
358			 * prefix can be added to *component*,
359			 * see audio-graph-card2::routing
360			 */
361			prefix = "TC";
362
363			/* [Normal] */
364			port@0  { reg = <0>; codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
365
366			/* [Multi-Codec] */
367			port@1  { reg = <1>; codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
368			port@2  { reg = <2>; codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
369
370			/* [DPCM]::BE */
371			port@3  {
372				convert-rate = <44100>;
373				reg = <3>; codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; };
374			};
375
376			/* [DPCM-Multi]::BE */
377			port@4  { reg = <4>; codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
378			port@5  { reg = <5>; codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
379
380			/* [Codec2Codec] */
381			port@6  { bitclock-master;
382				  frame-master;
383				  reg = <6>; codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
384			port@7  { reg = <7>; codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
385
386			/* [Codec2Codec-Multi] */
387			port@8  { bitclock-master;
388				  frame-master;
389				  reg = <8>;  codec8_ep:  endpoint { remote-endpoint = <&mc2c00_ep>; }; };
390			port@9  { reg = <9>;  codec9_ep:  endpoint { remote-endpoint = <&mc2c01_ep>; }; };
391			port@a  { reg = <10>; codec10_ep: endpoint { remote-endpoint = <&mc2c10_ep>; }; };
392			port@b  { reg = <11>; codec11_ep: endpoint { remote-endpoint = <&mc2c11_ep>; }; };
393
394			/* [Semi-Multi] */
395			port@c { reg = <12>; codec12_ep: endpoint { remote-endpoint = <&smcodec1_ep>; }; };
396			port@d { reg = <13>; codec13_ep: endpoint { remote-endpoint = <&smcodec2_ep>; }; };
397
398		};
399	};
400};
401