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	/*
23	 * @ : used at links
24	 *
25	 * [Normal]
26	 *	cpu0 <-@-----------------> codec0
27	 *
28	 * [Multi-CPU/Codec]
29	 *		+-+		+-+
30	 *	cpu1 <--| |<-@--------->| |-> codec1
31	 *	cpu2 <--| |		| |-> codec2
32	 *		+-+		+-+
33	 *
34	 * [DPCM]
35	 *	FE		BE
36	 *		  ****
37	 *	cpu3 <-@--*  *--@-> codec3
38	 *	cpu4 <-@--*  *
39	 *		  ****
40	 *
41	 * [DPCM-Multi]
42	 *
43	 * --NOTE--
44	 * Multi-FE is not supported by ASoC.
45	 *
46	 *	FE		BE
47	 *		  ****	    +-+
48	 *	cpu5 <-@--*  *--@-> | | -> codec4
49	 *	cpu6 <-@--*  *	    | | -> codec5
50	 *		  ****	    +-+
51	 *
52	 * [Codec2Codec]
53	 *			   +-@-> codec6
54	 *			   |
55	 *			   +---> codec7
56	 *
57	 * [Codec2Codec-Multi]
58	 *
59	 * --NOTE--
60	 * Multi connect N:M is not supported by ASoC.
61	 *
62	 *				+-+
63	 *			   +-@->| |-> codec8
64	 *			   |	| |-> codec9
65	 *			   |	+-+
66	 *			   |	+-+
67	 *			   +--->| |-> codec10
68	 *				| |-> codec11
69	 *				+-+
70	 */
71	audio-graph-card2-custom-sample {
72		/*
73		 * You can use audio-graph-card2 directly by using
74		 *
75		 * compatible = "audio-graph-card2";
76		 */
77		compatible = "audio-graph-card2-custom-sample";
78
79			/* for [DPCM]		   */
80			/* BE			FE */
81		routing = "TC DAI3 Playback",	"DAI3 Playback",
82			  "TC DAI3 Playback",	"DAI4 Playback",
83			  "DAI3 Capture",	"TC DAI3 Capture",
84			  "DAI4 Capture",	"TC DAI3 Capture",
85			/* for [DPCM-Multi]	   */
86			/* BE			FE */
87			  "TC DAI4 Playback",	"DAI5 Playback",
88			  "TC DAI5 Playback",	"DAI5 Playback",
89			  "TC DAI4 Playback",	"DAI6 Playback",
90			  "TC DAI5 Playback",	"DAI6 Playback",
91			  "DAI5 Capture",	"TC DAI4 Capture",
92			  "DAI5 Capture",	"TC DAI5 Capture",
93			  "DAI6 Capture",	"TC DAI4 Capture",
94			  "DAI6 Capture",	"TC DAI5 Capture",
95			/* for [Codec2Codec] */
96			  "TC OUT",		"TC DAI7 Playback",
97			  "TC DAI6 Capture",	"TC IN",
98			/* for [Codec2Codec-Multi] */
99			  "TC OUT",		"TC DAI10 Playback",
100			  "TC DAI8 Capture",	"TC IN",
101			  "TC OUT",		"TC DAI11 Playback",
102			  "TC DAI9 Capture",	"TC IN";
103
104		links = <&cpu0			/* normal: cpu side only */
105			 &mcpu0			/* multi:  cpu side only */
106			 &fe00 &fe01 &be0	/* dpcm:   both FE / BE  */
107			 &fe10 &fe11 &be1	/* dpcm-m: both FE / BE  */
108			 &c2c			/* c2c:    cpu side only */
109			 &c2c_m			/* c2c:    cpu side only */
110		>;
111
112		multi {
113			ports@0 {
114			mcpu0:	port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
115				port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>;    }; };
116				port@2 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>;    }; };
117			};
118			ports@1 {
119				port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>;  }; };
120				port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
121				port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
122			};
123			ports@2 {
124				port@0 { mbe_ep:  endpoint { remote-endpoint = <&be10_ep>;  }; };
125				port@1 { mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; }; };
126				port@2 { mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; }; };
127			};
128			ports@3 {
129				port@0 { mc2c0_ep:  endpoint { remote-endpoint = <&c2cmf_ep>;  }; };
130				port@1 { mc2c00_ep: endpoint { remote-endpoint = <&codec8_ep>; }; };
131				port@2 { mc2c01_ep: endpoint { remote-endpoint = <&codec9_ep>; }; };
132			};
133			ports@4 {
134				port@0 { mc2c1_ep:  endpoint { remote-endpoint = <&c2cmb_ep>;  }; };
135				port@1 { mc2c10_ep: endpoint { remote-endpoint = <&codec10_ep>; }; };
136				port@2 { mc2c11_ep: endpoint { remote-endpoint = <&codec11_ep>; }; };
137			};
138		};
139
140		dpcm {
141			/* FE */
142			ports@0 {
143			fe00:	port@0 { fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
144			fe01:	port@1 { fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
145			fe10:	port@2 { fe10_ep: endpoint { remote-endpoint = <&cpu5_ep>; }; };
146			fe11:	port@3 { fe11_ep: endpoint { remote-endpoint = <&cpu6_ep>; }; };
147			};
148			/* BE */
149			ports@1 {
150			be0:	port@0 { be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
151			be1:	port@1 { be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
152			};
153		};
154
155		codec2codec {
156			ports@0 {
157				rate = <48000>;
158			c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
159				port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
160			};
161			ports@1 {
162				rate = <48000>;
163			c2c_m:	port@0 { c2cmf_ep: endpoint { remote-endpoint = <&mc2c0_ep>; }; };
164				port@1 { c2cmb_ep: endpoint { remote-endpoint = <&mc2c1_ep>; }; };
165			};
166		};
167	};
168
169	test_cpu {
170		/*
171		 * update compatible to indicate more detail behaviour
172		 * if you want. see test-compatible for more detail.
173		 *
174		 * ex)
175		 *	- compatible = "test-cpu";
176		 *	+ compatible = "test-cpu-verbose";
177		 */
178		compatible = "test-cpu";
179		ports {
180			bitclock-master;
181			frame-master;
182			cpu0: port@0 { cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
183			      port@1 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
184			      port@2 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
185			      port@3 { cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
186			      port@4 { cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
187			      port@5 { cpu5_ep: endpoint { remote-endpoint = <&fe10_ep>; }; };
188			      port@6 { cpu6_ep: endpoint { remote-endpoint = <&fe11_ep>; }; };
189		};
190	};
191
192	test_codec {
193		/*
194		 * update compatible to indicate more detail behaviour
195		 * if you want. see test-compatible for more detail.
196		 *
197		 * ex)
198		 *	- compatible = "test-codec";
199		 *	+ compatible = "test-codec-verbose";
200		 */
201		compatible = "test-codec";
202		ports {
203			/*
204			 * prefix can be added to *component*,
205			 * see audio-graph-card2::routing
206			 */
207			prefix = "TC";
208
209			port@0  { codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
210			port@1  { codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
211			port@2  { codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
212			port@3  { codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; }; };
213			port@4  { codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
214			port@5  { codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
215			port@6  { bitclock-master;
216				  frame-master;
217				  codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
218			port@7  { codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
219			port@8  { bitclock-master;
220				  frame-master;
221				  codec8_ep:  endpoint { remote-endpoint = <&mc2c00_ep>; }; };
222			port@9  { codec9_ep:  endpoint { remote-endpoint = <&mc2c01_ep>; }; };
223			port@10 { codec10_ep: endpoint { remote-endpoint = <&mc2c10_ep>; }; };
224			port@11 { codec11_ep: endpoint { remote-endpoint = <&mc2c11_ep>; }; };
225		};
226	};
227};
228