Linux Audio

Check our new training course

Loading...
v6.13.7
  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-0]
 62	 *		+-+		+-+
 63	 *	cpu1 <--| |<-@--------->| |-> codec1
 64	 *	cpu2 <--| |		| |-> codec2
 65	 *		+-+		+-+
 66	 *
 67	 * [Multi-CPU/Codec-1]
 68	 *
 69	 *		+-+		+-+
 70	 *		| |<-@--------->| |
 71	 *		| |		| |
 72	 *	cpu8 <--| |<----------->| |-> codec14
 73	 *	cpu9 <--| |<---+------->| |-> codec15
 74	 *		+-+	\------>| |-> codec16
 75	 *				+-+
 76	 *
 77	 * [Multi-CPU/Codec-2]
 78	 *
 79	 *		+-+		+-+
 80	 *		| |<-@--------->| |
 81	 *		| |		| |
 82	 *	cpu10 <-| |<----------->| |-> codec17
 83	 *	cpu11 <-| |<-----+----->| |-> codec18
 84	 *	cpu12 <-| |<----/	+-+
 85	 *		+-+
 86	 *
 87	 * [DPCM]
 88	 *
 89	 *	CPU3/CPU4 are converting rate to 44100
 90	 *
 91	 *	FE		BE
 92	 *		  ****
 93	 *	cpu3 <-@--*  *--@-> codec3
 94	 *	cpu4 <-@--*  *  (44.1kHz)
 95	 *		  ****
 96	 *
 97	 * [DPCM-Multi]
 98	 *
 99	 * --NOTE--
100	 * Multi-FE is not supported by ASoC.
101	 *
102	 *	FE		BE
103	 *		  ****	    +-+
104	 *	cpu5 <-@--*  *--@-> | | -> codec4
105	 *	cpu6 <-@--*  *	    | | -> codec5
106	 *		  ****	    +-+
107	 *
108	 * [Codec2Codec]
109	 *			   +-@-> codec6
110	 *			   |
111	 *			   +---> codec7
112	 *
113	 * [Codec2Codec-Multi]
114	 *
115	 * --NOTE--
116	 * Multi connect N:M is not supported by ASoC.
117	 *
118	 *				+-+
119	 *			   +-@->| |-> codec8
120	 *			   |	| |-> codec9
121	 *			   |	+-+
122	 *			   |	+-+
123	 *			   +--->| |-> codec10
124	 *				| |-> codec11
125	 *				+-+
126	 */
127	audio-graph-card2-custom-sample {
128		/*
129		 * You can use audio-graph-card2 directly by using
130		 *
131		 * compatible = "audio-graph-card2";
132		 */
133		compatible = "audio-graph-card2-custom-sample";
134
135			/* for [DPCM]		   */
136			/* BE			FE */
137		routing = "TC DAI3 Playback",	"DAI3 Playback",
138			  "TC DAI3 Playback",	"DAI4 Playback",
139			  "DAI3 Capture",	"TC DAI3 Capture",
140			  "DAI4 Capture",	"TC DAI3 Capture",
141			/* for [DPCM-Multi]	   */
142			/* BE			FE */
143			  "TC DAI4 Playback",	"DAI5 Playback",
144			  "TC DAI5 Playback",	"DAI5 Playback",
145			  "TC DAI4 Playback",	"DAI6 Playback",
146			  "TC DAI5 Playback",	"DAI6 Playback",
147			  "DAI5 Capture",	"TC DAI4 Capture",
148			  "DAI5 Capture",	"TC DAI5 Capture",
149			  "DAI6 Capture",	"TC DAI4 Capture",
150			  "DAI6 Capture",	"TC DAI5 Capture",
151			/* for [Codec2Codec] */
152			  "TC OUT",		"TC DAI7 Playback",
153			  "TC DAI6 Capture",	"TC IN",
154			/* for [Codec2Codec-Multi] */
155			  "TC OUT",		"TC DAI10 Playback",
156			  "TC DAI8 Capture",	"TC IN",
157			  "TC OUT",		"TC DAI11 Playback",
158			  "TC DAI9 Capture",	"TC IN";
159
160		links = <
161			/*
162			 * [Normal]: cpu side only
163			 * cpu0/codec0
164			 */
165			 &cpu0
166
167			/*
168			 * [Semi-Multi]
169			 * cpu7/codec12/codec13
170			 */
171			&sm0
172
173			/*
174			 * [Multi-CPU/Codec-0]: cpu side only
175			 * cpu1/cpu2/codec1/codec2
176			 */
177			 &mcpu0
178
179			/*
180			 * [Multi-CPU/Codec-1]: cpu side only
181			 * cpu8/cpu9/codec14/codec15/codec16
182			 *
183			 * Because it will reach to the maximum of sound minor number,
184			 * disable it so far.
185			 * If you want to try it, please disable some other one instead.
186			 */
187			//&mcpu1
188
189			/*
190			 * [Multi-CPU/Codec-2]: cpu side only
191			 * cpu10/cpu11/cpu12/codec17/codec18
192			 *
193			 * Because it will reach to the maximum of sound minor number,
194			 * disable it so far.
195			 * If you want to try it, please disable some other one instead.
196			 */
197			//&mcpu2
198
199			/*
200			 * [DPCM]: both FE / BE
201			 * cpu3/cpu4/codec3
202			 */
203			 &fe00 &fe01 &be0
204
205			/*
206			 * [DPCM-Multi]: both FE / BE
207			 * cpu5/cpu6/codec4/codec5
208			 */
209			 &fe10 &fe11 &be1
210
211			/*
212			 * [Codec2Codec]: cpu side only
213			 * codec6/codec7
214			 */
215			 &c2c
216
217			/*
218			 * [Codec2Codec-Multi]: cpu side only
219			 * codec8/codec9/codec10/codec11
220			 */
221			 &c2c_m
222		>;
223
224		multi {
225			#address-cells = <1>;
226			#size-cells = <0>;
227
228			/*
229			 * [Multi-CPU-0]
230			 *
231			 *		+---+		+---+
232			 *	cpu1 <--|A X|<-@------->|x a|-> codec1
233			 *	cpu2 <--|B  |		|  b|-> codec2
234			 *		+---+		+---+
235			 */
236			ports@0 {
237				reg = <0>;
238				#address-cells = <1>;
239				#size-cells = <0>;
240			mcpu0:	port@0 { reg = <0>; mcpu00_ep: endpoint { remote-endpoint = <&mcodec00_ep>; };};/* (X) to pair */
241				port@1 { reg = <1>; mcpu01_ep: endpoint { remote-endpoint = <&cpu1_ep>;     };};/* (A) Multi Element */
242				port@2 { reg = <2>; mcpu02_ep: endpoint { remote-endpoint = <&cpu2_ep>;     };};/* (B) Multi Element */
243			};
244
245			/*
246			 * [Multi-Codec-0]
247			 *
248			 *		+---+		+---+
249			 *	cpu1 <--|A X|<-@------->|x a|-> codec1
250			 *	cpu2 <--|B  |		|  b|-> codec2
251			 *		+---+		+---+
252			 */
253			ports@1 {
254				reg = <1>;
255				#address-cells = <1>;
256				#size-cells = <0>;
257				port@0 { reg = <0>; mcodec00_ep: endpoint { remote-endpoint = <&mcpu00_ep>; };};/* (x) to pair */
258				port@1 { reg = <1>; mcodec01_ep: endpoint { remote-endpoint = <&codec1_ep>; };};/* (a) Multi Element */
259				port@2 { reg = <2>; mcodec02_ep: endpoint { remote-endpoint = <&codec2_ep>; };};/* (b) Multi Element */
260			};
261
262			/*
263			 * [DPCM-Multi]::BE
264			 *
265			 *	FE			BE
266			 *		  ****		+---+
267			 *	cpu5 <-@--*  *-----@--->|x a|-> codec4
268			 *	cpu6 <-@--*  *		|  b|-> codec5
269			 *		  ****		+---+
270			 */
271			ports@2 {
272				reg = <2>;
273				#address-cells = <1>;
274				#size-cells = <0>;
275				port@0 { reg = <0>; mbe_ep:  endpoint { remote-endpoint = <&be10_ep>;   };};/* (x) to pair */
276				port@1 { reg = <1>; mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; };};/* (a) Multi Element */
277				port@2 { reg = <2>; mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; };};/* (b) Multi Element */
278			};
279
280			/*
281			 * [Codec2Codec-Multi]::CPU
282			 *
283			 *		+---+
284			 *	   +-@->|X A|-> codec8
285			 *	   |	|  B|-> codec9
286			 *	   |	+---+
287			 *	   |	+---+
288			 *	   +--->|x a|-> codec10
289			 *		|  b|-> codec11
290			 *		+---+
291			 */
292			ports@3 {
293				reg = <3>;
294				#address-cells = <1>;
295				#size-cells = <0>;
296				port@0 { reg = <0>; mc2c0_ep:  endpoint { remote-endpoint = <&c2cmf_ep>;  };};/* (X) to pair */
297				port@1 { reg = <1>; mc2c00_ep: endpoint { remote-endpoint = <&codec8_ep>; };};/* (A) Multi Element */
298				port@2 { reg = <2>; mc2c01_ep: endpoint { remote-endpoint = <&codec9_ep>; };};/* (B) Multi Element */
299			};
300
301			/*
302			 * [Codec2Codec-Multi]::Codec
303			 *
304			 *		+---+
305			 *	   +-@->|X A|-> codec8
306			 *	   |	|  B|-> codec9
307			 *	   |	+---+
308			 *	   |	+---+
309			 *	   +--->|x a|-> codec10
310			 *		|  b|-> codec11
311			 *		+---+
312			 */
313			ports@4 {
314				reg = <4>;
315				#address-cells = <1>;
316				#size-cells = <0>;
317				port@0 { reg = <0>; mc2c1_ep:  endpoint { remote-endpoint = <&c2cmb_ep>;   };};/* (x) to pair */
318				port@1 { reg = <1>; mc2c10_ep: endpoint { remote-endpoint = <&codec10_ep>; };};/* (a) Multi Element */
319				port@2 { reg = <2>; mc2c11_ep: endpoint { remote-endpoint = <&codec11_ep>; };};/* (b) Multi Element */
320			};
321
322			/*
323			 * [Semi-Multi]
324			 *
325			 *			+---+
326			 *	cpu7 <-@------->|X A|-> codec12
327			 *			|  B|-> codec13
328			 *			+---+
329			 */
330			ports@5 {
331				reg = <5>;
332				#address-cells = <1>;
333				#size-cells = <0>;
334				port@0 { reg = <0>; smcodec0_ep: endpoint { remote-endpoint = <&cpu7_ep>;    };};/* (X) to pair */
335				port@1 { reg = <1>; smcodec1_ep: endpoint { remote-endpoint = <&codec12_ep>; };};/* (A) Multi Element */
336				port@2 { reg = <2>; smcodec2_ep: endpoint { remote-endpoint = <&codec13_ep>; };};/* (B) Multi Element */
337			};
338
339			/*
340			 * [Multi-CPU-1]
341			 *
342			 *		+---+		+---+
343			 *		|  X|<-@------->|x  |
344			 *		|   |		|   |
345			 *	cpu8 <--|A 1|<--------->|3 a|-> codec14
346			 *	cpu9 <--|B 2|<---+----->|4 b|-> codec15
347			 *		+---+	  \---->|5 c|-> codec16
348			 *				+---+
349			 */
350			ports@6 {
351				reg = <6>;
352				#address-cells = <1>;
353				#size-cells = <0>;
354			mcpu1:	port@0 { reg = <0>; mcpu10_ep: endpoint { remote-endpoint = <&mcodec10_ep>; };};    /* (X) to pair */
355				port@1 {
356					#address-cells = <1>;
357					#size-cells = <0>;
358					reg = <1>;
359					mcpu11_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu8_ep>;       }; /* (A) Multi Element */
360					mcpu11_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec11_ep_0>; }; /* (1) connected Codec */
361				};
362				port@2 {
363					#address-cells = <1>;
364					#size-cells = <0>;
365					reg = <2>;
366					mcpu12_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu9_ep>;       }; /* (B) Multi Element */
367					mcpu12_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec12_ep_0>; }; /* (2) connected Codec */
368					mcpu12_ep_1: endpoint@2 { reg = <2>; remote-endpoint = <&mcodec13_ep_0>; }; /* (2) connected Codec */
369				};
370			};
371
372			/*
373			 * [Multi-Codec-1]
374			 *
375			 *		+---+		+---+
376			 *		|  X|<-@------->|x  |
377			 *		|   |		|   |
378			 *	cpu8 <--|A 1|<--------->|3 a|-> codec14
379			 *	cpu9 <--|B 2|<---+----->|4 b|-> codec15
380			 *		+---+	  \---->|5 c|-> codec16
381			 *				+---+
382			 */
383			ports@7 {
384				reg = <7>;
385				#address-cells = <1>;
386				#size-cells = <0>;
387				port@0 { reg = <0>; mcodec10_ep: endpoint { remote-endpoint = <&mcpu10_ep>;  };};   /* (x) to pair */
388				port@1 {
389					#address-cells = <1>;
390					#size-cells = <0>;
391					reg = <1>;
392					mcodec11_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&codec14_ep>;  }; /* (a) Multi Element */
393					mcodec11_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu11_ep_0>; }; /* (3) connected CPU */
394				};
395				port@2 {
396					#address-cells = <1>;
397					#size-cells = <0>;
398					reg = <2>;
399					mcodec12_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&codec15_ep>;  }; /* (b) Multi Element */
400					mcodec12_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu12_ep_0>; }; /* (4) connected CPU */
401				};
402				port@3 {
403					#address-cells = <1>;
404					#size-cells = <0>;
405					reg = <3>;
406					mcodec13_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&codec16_ep>;  }; /* (c) Multi Element */
407					mcodec13_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu12_ep_1>; }; /* (5) connected CPU */
408				};
409			};
410
411			/*
412			 * [Multi-CPU-2]
413			 *
414			 *		+---+		+---+
415			 *		|  X|<-@------->|x  |
416			 *		|   |		|   |
417			 *	cpu10 <-|A 1|<--------->|4 a|-> codec17
418			 *	cpu11 <-|B 2|<-----+--->|5 b|-> codec18
419			 *	cpu12 <-|C 3|<----/	+---+
420			 *		+---+
421			 */
422			ports@8 {
423				reg = <8>;
424				#address-cells = <1>;
425				#size-cells = <0>;
426			mcpu2:	port@0 { reg = <0>; mcpu20_ep: endpoint { remote-endpoint = <&mcodec20_ep>; };};    /* (X) to pair */
427				port@1 {
428					#address-cells = <1>;
429					#size-cells = <0>;
430					reg = <1>;
431					mcpu21_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu10_ep>;      }; /* (A) Multi Element */
432					mcpu21_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec21_ep_0>; }; /* (1) connected Codec */
433				};
434				port@2 {
435					#address-cells = <1>;
436					#size-cells = <0>;
437					reg = <2>;
438					mcpu22_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu11_ep>;      }; /* (B) Multi Element */
439					mcpu22_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec22_ep_0>; }; /* (2) connected Codec */
440				};
441				port@3 {
442					#address-cells = <1>;
443					#size-cells = <0>;
444					reg = <3>;
445					mcpu23_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu12_ep>;      }; /* (C) Multi Element */
446					mcpu23_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec22_ep_1>; }; /* (3) connected Codec */
447				};
448			};
449
450			/*
451			 * [Multi-Codec-2]
452			 *
453			 *		+---+		+---+
454			 *		|  X|<-@------->|x  |
455			 *		|   |		|   |
456			 *	cpu10 <-|A 1|<--------->|4 a|-> codec17
457			 *	cpu11 <-|B 2|<-----+--->|5 b|-> codec18
458			 *	cpu12 <-|C 3|<----/	+---+
459			 *		+---+
460			 */
461			ports@9 {
462				reg = <9>;
463				#address-cells = <1>;
464				#size-cells = <0>;
465				port@0 { reg = <0>; mcodec20_ep: endpoint { remote-endpoint = <&mcpu20_ep>;  };};   /* (x) to pair */
466				port@1 {
467					#address-cells = <1>;
468					#size-cells = <0>;
469					reg = <1>;
470					mcodec21_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&codec17_ep>;  }; /* (a) Multi Element */
471					mcodec21_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu21_ep_0>; }; /* (4) connected CPU */
472				};
473				port@2 {
474					#address-cells = <1>;
475					#size-cells = <0>;
476					reg = <2>;
477					mcodec22_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&codec18_ep>;  }; /* (b) Multi Element */
478					mcodec22_ep_0: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu22_ep_0>; }; /* (5) connected CPU */
479					mcodec22_ep_1: endpoint@2 { reg = <2>; remote-endpoint = <&mcpu23_ep_0>; }; /* (5) connected CPU */
480				};
481			};
482		};
483
484		dpcm {
485			#address-cells = <1>;
486			#size-cells = <0>;
487
488			ports@0 {
489				reg = <0>;
 
 
490
491				#address-cells = <1>;
492				#size-cells = <0>;
493				/*
494				 * [DPCM]::FE
495				 *
496				 *	FE				BE
497				 *			****
498				 *	cpu3 <-@(fe00)--*  *--(be0)@--> codec3
499				 *	cpu4 <-@(fe01)--*  *		(44.1kHz)
500				 *			****
501				 */
502			fe00:	port@0 { reg = <0>; fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
503			fe01:	port@1 { reg = <1>; fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
504
505				/*
506				 * [DPCM-Multi]::FE
507				 *
508				 *		FE			BE
509				 *			****		+-+
510				 *	cpu5 <-@(fe10)--*  *---(be1)@-->| |-> codec4
511				 *	cpu6 <-@(fe11)--*  *		| |-> codec5
512				 *			****		+-+
513				 */
514			fe10:	port@2 { reg = <2>; fe10_ep: endpoint { remote-endpoint = <&cpu5_ep>; }; };
515			fe11:	port@3 { reg = <3>; fe11_ep: endpoint { remote-endpoint = <&cpu6_ep>; }; };
516			};
517
518			ports@1 {
519				reg = <1>;
 
520
521				#address-cells = <1>;
522				#size-cells = <0>;
523				/*
524				 * [DPCM]::BE
525				 *
526				 *	FE				BE
527				 *			****
528				 *	cpu3 <-@(fe00)--*  *--(be0)@--> codec3
529				 *	cpu4 <-@(fe01)--*  *		(44.1kHz)
530				 *			****
531				 */
532			be0:	port@0 { reg = <0>; be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
533
534				/*
535				 * [DPCM-Multi]::BE
536				 *
537				 *		FE			BE
538				 *			****		+-+
539				 *	cpu5 <-@(fe10)--*  *---(be1)@-->| |-> codec4
540				 *	cpu6 <-@(fe11)--*  *		| |-> codec5
541				 *			****		+-+
542				 */
543			be1:	port@1 { reg = <1>; be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
544			};
545		};
546
547		codec2codec {
548			#address-cells = <1>;
549			#size-cells = <0>;
550			/*
551			 * [Codec2Codec]
552			 *
553			 *	+-@(c2c)-> codec6
554			 *	|
555			 *	+--------> codec7
556			 */
557			ports@0 {
558				reg = <0>;
559
560				#address-cells = <1>;
561				#size-cells = <0>;
562
563				/* use default settings */
564			c2c:	port@0 { reg = <0>; c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
565				port@1 { reg = <1>; c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
566			};
567
568			/*
569			 * [Codec2Codec-Multi]
570			 *
571			 *			+-+
572			 *	   +-@(c2c_m)-->| |-> codec8
573			 *	   |		| |-> codec9
574			 *	   |		+-+
575			 *	   |		+-+
576			 *	   +----------->| |-> codec10
577			 *			| |-> codec11
578			 *			+-+
579			 */
580			ports@1 {
581				reg = <1>;
582
583				#address-cells = <1>;
584				#size-cells = <0>;
585
586				/* use original settings */
587				rate = <48000>;
588			c2c_m:	port@0 { reg = <0>; c2cmf_ep: endpoint { remote-endpoint = <&mc2c0_ep>; }; };
589				port@1 { reg = <1>; c2cmb_ep: endpoint { remote-endpoint = <&mc2c1_ep>; }; };
590			};
591		};
592	};
593
594	test_cpu {
595		/*
596		 * update compatible to indicate more detail behaviour
597		 * if you want. see test-compatible for more detail.
598		 *
599		 * ex)
600		 *	- compatible = "test-cpu";
601		 *	+ compatible = "test-cpu-verbose";
602		 */
603		compatible = "test-cpu";
604		ports {
605			#address-cells = <1>;
606			#size-cells = <0>;
607
608			bitclock-master;
609			frame-master;
610			/* [Normal] */
611			cpu0: port@0 { reg = <0>; cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
612
613			/* [Multi-CPU-0] */
614			      port@1 { reg = <1>; cpu1_ep: endpoint { remote-endpoint = <&mcpu01_ep>; }; };
615			      port@2 { reg = <2>; cpu2_ep: endpoint { remote-endpoint = <&mcpu02_ep>; }; };
616
617			/* [DPCM]::FE */
618			      port@3 { reg = <3>; cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
619			      port@4 { reg = <4>; cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
620
621			/* [DPCM-Multi]::FE */
622			      port@5 { reg = <5>; cpu5_ep: endpoint { remote-endpoint = <&fe10_ep>; }; };
623			      port@6 { reg = <6>; cpu6_ep: endpoint { remote-endpoint = <&fe11_ep>; }; };
624
625			/* [Semi-Multi] */
626			sm0:  port@7 { reg = <7>; cpu7_ep: endpoint { remote-endpoint = <&smcodec0_ep>; }; };
627
628			/* [Multi-CPU-1] */
629			      port@8 { reg = <8>; cpu8_ep: endpoint { remote-endpoint = <&mcpu11_ep>;   }; };
630			      port@9 { reg = <9>; cpu9_ep: endpoint { remote-endpoint = <&mcpu12_ep>;   }; };
631			/* [Multi-CPU-2] */
632			      port@a { reg = <10>; cpu10_ep: endpoint { remote-endpoint = <&mcpu21_ep>; }; };
633			      port@b { reg = <11>; cpu11_ep: endpoint { remote-endpoint = <&mcpu22_ep>; }; };
634			      port@c { reg = <12>; cpu12_ep: endpoint { remote-endpoint = <&mcpu23_ep>; }; };
635		};
636	};
637
638	test_codec {
639		/*
640		 * update compatible to indicate more detail behaviour
641		 * if you want. see test-compatible for more detail.
642		 *
643		 * ex)
644		 *	- compatible = "test-codec";
645		 *	+ compatible = "test-codec-verbose";
646		 */
647		compatible = "test-codec";
648		ports {
649			#address-cells = <1>;
650			#size-cells = <0>;
651
652			/*
653			 * prefix can be added to *component*,
654			 * see audio-graph-card2::routing
655			 */
656			prefix = "TC";
657
658			/* [Normal] */
659			port@0  { reg = <0>; codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
660
661			/* [Multi-Codec-0] */
662			port@1  { reg = <1>; codec1_ep:  endpoint { remote-endpoint = <&mcodec01_ep>; }; };
663			port@2  { reg = <2>; codec2_ep:  endpoint { remote-endpoint = <&mcodec02_ep>; }; };
664
665			/* [DPCM]::BE */
666			port@3  {
667				convert-rate = <44100>;
668				reg = <3>; codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; };
669			};
670
671			/* [DPCM-Multi]::BE */
672			port@4  { reg = <4>; codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
673			port@5  { reg = <5>; codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
674
675			/* [Codec2Codec] */
676			port@6  { bitclock-master;
677				  frame-master;
678				  reg = <6>; codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
679			port@7  { reg = <7>; codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
680
681			/* [Codec2Codec-Multi] */
682			port@8  { bitclock-master;
683				  frame-master;
684				  reg = <8>;  codec8_ep:  endpoint { remote-endpoint = <&mc2c00_ep>; }; };
685			port@9  { reg = <9>;  codec9_ep:  endpoint { remote-endpoint = <&mc2c01_ep>; }; };
686			port@a  { reg = <10>; codec10_ep: endpoint { remote-endpoint = <&mc2c10_ep>; }; };
687			port@b  { reg = <11>; codec11_ep: endpoint { remote-endpoint = <&mc2c11_ep>; }; };
688
689			/* [Semi-Multi] */
690			port@c { reg = <12>; codec12_ep: endpoint { remote-endpoint = <&smcodec1_ep>; }; };
691			port@d { reg = <13>; codec13_ep: endpoint { remote-endpoint = <&smcodec2_ep>; }; };
692
693			/* [Multi-Codec-1] */
694			port@e  { reg = <14>; codec14_ep: endpoint { remote-endpoint = <&mcodec11_ep>; }; };
695			port@f  { reg = <15>; codec15_ep: endpoint { remote-endpoint = <&mcodec12_ep>; }; };
696			port@10 { reg = <16>; codec16_ep: endpoint { remote-endpoint = <&mcodec13_ep>; }; };
697			/* [Multi-Codec-2] */
698			port@11 { reg = <17>; codec17_ep: endpoint { remote-endpoint = <&mcodec21_ep>; }; };
699			port@12 { reg = <18>; codec18_ep: endpoint { remote-endpoint = <&mcodec22_ep>; }; };
700		};
701	};
702};
v6.2
  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/ {
 39	/*
 40	 * @ : used at links
 41	 *
 42	 * [Normal]
 43	 *	cpu0 <-@-----------------> codec0
 44	 *
 45	 * [Multi-CPU/Codec]
 
 
 
 
 
 
 
 
 
 46	 *		+-+		+-+
 47	 *	cpu1 <--| |<-@--------->| |-> codec1
 48	 *	cpu2 <--| |		| |-> codec2
 49	 *		+-+		+-+
 50	 *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 51	 * [DPCM]
 52	 *
 53	 *	CPU3/CPU4 are converting rate to 44100
 54	 *
 55	 *	FE		BE
 56	 *		  ****
 57	 *	cpu3 <-@--*  *--@-> codec3
 58	 *	cpu4 <-@--*  *  (44.1kHz)
 59	 *		  ****
 60	 *
 61	 * [DPCM-Multi]
 62	 *
 63	 * --NOTE--
 64	 * Multi-FE is not supported by ASoC.
 65	 *
 66	 *	FE		BE
 67	 *		  ****	    +-+
 68	 *	cpu5 <-@--*  *--@-> | | -> codec4
 69	 *	cpu6 <-@--*  *	    | | -> codec5
 70	 *		  ****	    +-+
 71	 *
 72	 * [Codec2Codec]
 73	 *			   +-@-> codec6
 74	 *			   |
 75	 *			   +---> codec7
 76	 *
 77	 * [Codec2Codec-Multi]
 78	 *
 79	 * --NOTE--
 80	 * Multi connect N:M is not supported by ASoC.
 81	 *
 82	 *				+-+
 83	 *			   +-@->| |-> codec8
 84	 *			   |	| |-> codec9
 85	 *			   |	+-+
 86	 *			   |	+-+
 87	 *			   +--->| |-> codec10
 88	 *				| |-> codec11
 89	 *				+-+
 90	 */
 91	audio-graph-card2-custom-sample {
 92		/*
 93		 * You can use audio-graph-card2 directly by using
 94		 *
 95		 * compatible = "audio-graph-card2";
 96		 */
 97		compatible = "audio-graph-card2-custom-sample";
 98
 99			/* for [DPCM]		   */
100			/* BE			FE */
101		routing = "TC DAI3 Playback",	"DAI3 Playback",
102			  "TC DAI3 Playback",	"DAI4 Playback",
103			  "DAI3 Capture",	"TC DAI3 Capture",
104			  "DAI4 Capture",	"TC DAI3 Capture",
105			/* for [DPCM-Multi]	   */
106			/* BE			FE */
107			  "TC DAI4 Playback",	"DAI5 Playback",
108			  "TC DAI5 Playback",	"DAI5 Playback",
109			  "TC DAI4 Playback",	"DAI6 Playback",
110			  "TC DAI5 Playback",	"DAI6 Playback",
111			  "DAI5 Capture",	"TC DAI4 Capture",
112			  "DAI5 Capture",	"TC DAI5 Capture",
113			  "DAI6 Capture",	"TC DAI4 Capture",
114			  "DAI6 Capture",	"TC DAI5 Capture",
115			/* for [Codec2Codec] */
116			  "TC OUT",		"TC DAI7 Playback",
117			  "TC DAI6 Capture",	"TC IN",
118			/* for [Codec2Codec-Multi] */
119			  "TC OUT",		"TC DAI10 Playback",
120			  "TC DAI8 Capture",	"TC IN",
121			  "TC OUT",		"TC DAI11 Playback",
122			  "TC DAI9 Capture",	"TC IN";
123
124		links = <
125			/*
126			 * [Normal]: cpu side only
127			 * cpu0/codec0
128			 */
129			 &cpu0
130
131			/*
132			 * [Multi-CPU/Codec]: cpu side only
 
 
 
 
 
 
133			 * cpu1/cpu2/codec1/codec2
134			 */
135			 &mcpu0
136
137			/*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138			 * [DPCM]: both FE / BE
139			 * cpu3/cpu4/codec3
140			 */
141			 &fe00 &fe01 &be0
142
143			/*
144			 * [DPCM-Multi]: both FE / BE
145			 * cpu5/cpu6/codec4/codec5
146			 */
147			 &fe10 &fe11 &be1
148
149			/*
150			 * [Codec2Codec]: cpu side only
151			 * codec6/codec7
152			 */
153			 &c2c
154
155			/*
156			 * [Codec2Codec-Multi]: cpu side only
157			 * codec8/codec9/codec10/codec11
158			 */
159			 &c2c_m
160		>;
161
162		multi {
 
 
 
 
 
 
 
 
 
 
 
163			ports@0 {
164			/* [Multi-CPU] */
165			mcpu0:	port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
166				port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>;    }; };
167				port@2 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>;    }; };
 
 
168			};
169
170			/* [Multi-Codec] */
 
 
 
 
 
 
 
171			ports@1 {
172				port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>;  }; };
173				port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
174				port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
 
 
 
175			};
176
177			/* [DPCM-Multi]::BE */
 
 
 
 
 
 
 
 
178			ports@2 {
179				port@0 { mbe_ep:  endpoint { remote-endpoint = <&be10_ep>;  }; };
180				port@1 { mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; }; };
181				port@2 { mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; }; };
 
 
 
182			};
183
184			/* [Codec2Codec-Multi]::CPU */
 
 
 
 
 
 
 
 
 
 
 
185			ports@3 {
186				port@0 { mc2c0_ep:  endpoint { remote-endpoint = <&c2cmf_ep>;  }; };
187				port@1 { mc2c00_ep: endpoint { remote-endpoint = <&codec8_ep>; }; };
188				port@2 { mc2c01_ep: endpoint { remote-endpoint = <&codec9_ep>; }; };
 
 
 
189			};
190
191			/* [Codec2Codec-Multi]::Codec */
 
 
 
 
 
 
 
 
 
 
 
192			ports@4 {
193				port@0 { mc2c1_ep:  endpoint { remote-endpoint = <&c2cmb_ep>;  }; };
194				port@1 { mc2c10_ep: endpoint { remote-endpoint = <&codec10_ep>; }; };
195				port@2 { mc2c11_ep: endpoint { remote-endpoint = <&codec11_ep>; }; };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196			};
197		};
198
199		dpcm {
 
 
 
200			ports@0 {
201			/* [DPCM]::FE */
202			fe00:	port@0 { fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
203			fe01:	port@1 { fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
204
205			/* [DPCM-Multi]::FE */
206			fe10:	port@2 { fe10_ep: endpoint { remote-endpoint = <&cpu5_ep>; }; };
207			fe11:	port@3 { fe11_ep: endpoint { remote-endpoint = <&cpu6_ep>; }; };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208			};
209
210			ports@1 {
211			/* [DPCM]::BE */
212			be0:	port@0 { be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
213
214			/* [DPCM-Multi]::BE */
215			be1:	port@1 { be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216			};
217		};
218
219		codec2codec {
220			/* [Codec2Codec] */
 
 
 
 
 
 
 
 
221			ports@0 {
 
 
 
 
 
222				/* use default settings */
223			c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
224				port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
225			};
226
227			/* [Codec2Codec-Multi] */
 
 
 
 
 
 
 
 
 
 
 
228			ports@1 {
 
 
 
 
 
229				/* use original settings */
230				rate = <48000>;
231			c2c_m:	port@0 { c2cmf_ep: endpoint { remote-endpoint = <&mc2c0_ep>; }; };
232				port@1 { c2cmb_ep: endpoint { remote-endpoint = <&mc2c1_ep>; }; };
233			};
234		};
235	};
236
237	test_cpu {
238		/*
239		 * update compatible to indicate more detail behaviour
240		 * if you want. see test-compatible for more detail.
241		 *
242		 * ex)
243		 *	- compatible = "test-cpu";
244		 *	+ compatible = "test-cpu-verbose";
245		 */
246		compatible = "test-cpu";
247		ports {
 
 
 
248			bitclock-master;
249			frame-master;
250			/* [Normal] */
251			cpu0: port@0 { cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
252
253			/* [Multi-CPU] */
254			      port@1 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
255			      port@2 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
256
257			/* [DPCM]::FE */
258			      port@3 { cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
259			      port@4 { cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
260
261			/* [DPCM-Multi]::FE */
262			      port@5 { cpu5_ep: endpoint { remote-endpoint = <&fe10_ep>; }; };
263			      port@6 { cpu6_ep: endpoint { remote-endpoint = <&fe11_ep>; }; };
 
 
 
 
 
 
 
 
 
 
 
264		};
265	};
266
267	test_codec {
268		/*
269		 * update compatible to indicate more detail behaviour
270		 * if you want. see test-compatible for more detail.
271		 *
272		 * ex)
273		 *	- compatible = "test-codec";
274		 *	+ compatible = "test-codec-verbose";
275		 */
276		compatible = "test-codec";
277		ports {
 
 
 
278			/*
279			 * prefix can be added to *component*,
280			 * see audio-graph-card2::routing
281			 */
282			prefix = "TC";
283
284			/* [Normal] */
285			port@0  { codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
286
287			/* [Multi-Codec] */
288			port@1  { codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
289			port@2  { codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
290
291			/* [DPCM]::BE */
292			port@3  {
293				convert-rate = <44100>;
294				codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; };
295			};
296
297			/* [DPCM-Multi]::BE */
298			port@4  { codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
299			port@5  { codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
300
301			/* [Codec2Codec] */
302			port@6  { bitclock-master;
303				  frame-master;
304				  codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
305			port@7  { codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
306
307			/* [Codec2Codec-Multi] */
308			port@8  { bitclock-master;
309				  frame-master;
310				  codec8_ep:  endpoint { remote-endpoint = <&mc2c00_ep>; }; };
311			port@9  { codec9_ep:  endpoint { remote-endpoint = <&mc2c01_ep>; }; };
312			port@10 { codec10_ep: endpoint { remote-endpoint = <&mc2c10_ep>; }; };
313			port@11 { codec11_ep: endpoint { remote-endpoint = <&mc2c11_ep>; }; };
 
 
 
 
 
 
 
 
 
 
 
 
314		};
315	};
316};