1 // SPDX-License-Identifier: GPL-2.0
3 * audio-graph-card2-custom-sample.dtsi
5 * Copyright (C) 2020 Renesas Electronics Corp.
6 * Copyright (C) 2020 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
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.
12 * You can easily use this sample by adding below line on your DT file,
13 * and add new CONFIG to your .config.
15 * #include "../../../../../sound/soc/generic/audio-graph-card2-custom-sample.dtsi"
17 * CONFIG_SND_AUDIO_GRAPH_CARD2
18 * CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE
19 * CONFIG_SND_TEST_COMPONENT
22 * You can indicate more detail each device behavior as debug if you modify
23 * "compatible" on each test-component. see below
26 * - compatible = "test-cpu";
27 * + compatible = "test-cpu-verbose";
32 * - compatible = "test-codec";
33 * + compatible = "test-codec-verbose";
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.
42 * snd_soc_runtime_get_dai_fmt()
43 * linux/sound/soc/generic/test-component.c :: test_dai_formats
50 * cpu0 <-@-----------------> codec0
57 * cpu7 <-@------->| |-> codec12
63 * cpu1 <--| |<-@--------->| |-> codec1
64 * cpu2 <--| | | |-> codec2
72 * cpu8 <--| |<----------->| |-> codec14
73 * cpu9 <--| |<---+------->| |-> codec15
74 * +-+ \------>| |-> codec16
82 * cpu10 <-| |<----------->| |-> codec17
83 * cpu11 <-| |<-----+----->| |-> codec18
84 * cpu12 <-| |<----/ +-+
89 * CPU3/CPU4 are converting rate to 44100
93 * cpu3 <-@--* *--@-> codec3
94 * cpu4 <-@--* * (44.1kHz)
100 * Multi-FE is not supported by ASoC.
104 * cpu5 <-@--* *--@-> | | -> codec4
105 * cpu6 <-@--* * | | -> codec5
113 * [Codec2Codec-Multi]
116 * Multi connect N:M is not supported by ASoC.
127 audio-graph-card2-custom-sample {
129 * You can use audio-graph-card2 directly by using
131 * compatible = "audio-graph-card2";
133 compatible = "audio-graph-card2-custom-sample";
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] */
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";
162 * [Normal]: cpu side only
169 * cpu7/codec12/codec13
174 * [Multi-CPU/Codec-0]: cpu side only
175 * cpu1/cpu2/codec1/codec2
180 * [Multi-CPU/Codec-1]: cpu side only
181 * cpu8/cpu9/codec14/codec15/codec16
183 * Because it will reach to the maximum of sound minor number,
185 * If you want to try it, please disable some other one instead.
190 * [Multi-CPU/Codec-2]: cpu side only
191 * cpu10/cpu11/cpu12/codec17/codec18
193 * Because it will reach to the maximum of sound minor number,
195 * If you want to try it, please disable some other one instead.
200 * [DPCM]: both FE / BE
206 * [DPCM-Multi]: both FE / BE
207 * cpu5/cpu6/codec4/codec5
212 * [Codec2Codec]: cpu side only
218 * [Codec2Codec-Multi]: cpu side only
219 * codec8/codec9/codec10/codec11
225 #address-cells = <1>;
232 * cpu1 <--|A X|<-@------->|x a|-> codec1
233 * cpu2 <--|B | | b|-> codec2
238 #address-cells = <1>;
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 */
249 * cpu1 <--|A X|<-@------->|x a|-> codec1
250 * cpu2 <--|B | | b|-> codec2
255 #address-cells = <1>;
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 */
267 * cpu5 <-@--* *-----@--->|x a|-> codec4
268 * cpu6 <-@--* * | b|-> codec5
273 #address-cells = <1>;
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 */
281 * [Codec2Codec-Multi]::CPU
284 * +-@->|X A|-> codec8
288 * +--->|x a|-> codec10
294 #address-cells = <1>;
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 */
302 * [Codec2Codec-Multi]::Codec
305 * +-@->|X A|-> codec8
309 * +--->|x a|-> codec10
315 #address-cells = <1>;
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 */
326 * cpu7 <-@------->|X A|-> codec12
332 #address-cells = <1>;
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 */
343 * | X|<-@------->|x |
345 * cpu8 <--|A 1|<--------->|3 a|-> codec14
346 * cpu9 <--|B 2|<---+----->|4 b|-> codec15
347 * +---+ \---->|5 c|-> codec16
352 #address-cells = <1>;
354 mcpu1: port@0 { reg = <0>; mcpu10_ep: endpoint { remote-endpoint = <&mcodec10_ep>; };}; /* (X) to pair */
356 #address-cells = <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 */
363 #address-cells = <1>;
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 */
376 * | X|<-@------->|x |
378 * cpu8 <--|A 1|<--------->|3 a|-> codec14
379 * cpu9 <--|B 2|<---+----->|4 b|-> codec15
380 * +---+ \---->|5 c|-> codec16
385 #address-cells = <1>;
387 port@0 { reg = <0>; mcodec10_ep: endpoint { remote-endpoint = <&mcpu10_ep>; };}; /* (x) to pair */
389 #address-cells = <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 */
396 #address-cells = <1>;
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 */
403 #address-cells = <1>;
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 */
415 * | X|<-@------->|x |
417 * cpu10 <-|A 1|<--------->|4 a|-> codec17
418 * cpu11 <-|B 2|<-----+--->|5 b|-> codec18
419 * cpu12 <-|C 3|<----/ +---+
424 #address-cells = <1>;
426 mcpu2: port@0 { reg = <0>; mcpu20_ep: endpoint { remote-endpoint = <&mcodec20_ep>; };}; /* (X) to pair */
428 #address-cells = <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 */
435 #address-cells = <1>;
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 */
442 #address-cells = <1>;
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 */
454 * | X|<-@------->|x |
456 * cpu10 <-|A 1|<--------->|4 a|-> codec17
457 * cpu11 <-|B 2|<-----+--->|5 b|-> codec18
458 * cpu12 <-|C 3|<----/ +---+
463 #address-cells = <1>;
465 port@0 { reg = <0>; mcodec20_ep: endpoint { remote-endpoint = <&mcpu20_ep>; };}; /* (x) to pair */
467 #address-cells = <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 */
474 #address-cells = <1>;
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 */
485 #address-cells = <1>;
491 #address-cells = <1>;
498 * cpu3 <-@(fe00)--* *--(be0)@--> codec3
499 * cpu4 <-@(fe01)--* * (44.1kHz)
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>; }; };
510 * cpu5 <-@(fe10)--* *---(be1)@-->| |-> codec4
511 * cpu6 <-@(fe11)--* * | |-> codec5
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>; }; };
521 #address-cells = <1>;
528 * cpu3 <-@(fe00)--* *--(be0)@--> codec3
529 * cpu4 <-@(fe01)--* * (44.1kHz)
532 be0: port@0 { reg = <0>; be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
539 * cpu5 <-@(fe10)--* *---(be1)@-->| |-> codec4
540 * cpu6 <-@(fe11)--* * | |-> codec5
543 be1: port@1 { reg = <1>; be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
548 #address-cells = <1>;
560 #address-cells = <1>;
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>; }; };
569 * [Codec2Codec-Multi]
572 * +-@(c2c_m)-->| |-> codec8
576 * +----------->| |-> codec10
583 #address-cells = <1>;
586 /* use original settings */
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>; }; };
596 * update compatible to indicate more detail behaviour
597 * if you want. see test-compatible for more detail.
600 * - compatible = "test-cpu";
601 * + compatible = "test-cpu-verbose";
603 compatible = "test-cpu";
605 #address-cells = <1>;
611 cpu0: port@0 { reg = <0>; cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
614 port@1 { reg = <1>; cpu1_ep: endpoint { remote-endpoint = <&mcpu01_ep>; }; };
615 port@2 { reg = <2>; cpu2_ep: endpoint { remote-endpoint = <&mcpu02_ep>; }; };
618 port@3 { reg = <3>; cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
619 port@4 { reg = <4>; cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
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>; }; };
626 sm0: port@7 { reg = <7>; cpu7_ep: endpoint { remote-endpoint = <&smcodec0_ep>; }; };
629 port@8 { reg = <8>; cpu8_ep: endpoint { remote-endpoint = <&mcpu11_ep>; }; };
630 port@9 { reg = <9>; cpu9_ep: endpoint { remote-endpoint = <&mcpu12_ep>; }; };
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>; }; };
640 * update compatible to indicate more detail behaviour
641 * if you want. see test-compatible for more detail.
644 * - compatible = "test-codec";
645 * + compatible = "test-codec-verbose";
647 compatible = "test-codec";
649 #address-cells = <1>;
653 * prefix can be added to *component*,
654 * see audio-graph-card2::routing
659 port@0 { reg = <0>; codec0_ep: endpoint { remote-endpoint = <&cpu0_ep>; }; };
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>; }; };
667 convert-rate = <44100>;
668 reg = <3>; codec3_ep: endpoint { remote-endpoint = <&be00_ep>; };
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>; }; };
676 port@6 { bitclock-master;
678 reg = <6>; codec6_ep: endpoint { remote-endpoint = <&c2cf_ep>; }; };
679 port@7 { reg = <7>; codec7_ep: endpoint { remote-endpoint = <&c2cb_ep>; }; };
681 /* [Codec2Codec-Multi] */
682 port@8 { bitclock-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>; }; };
690 port@c { reg = <12>; codec12_ep: endpoint { remote-endpoint = <&smcodec1_ep>; }; };
691 port@d { reg = <13>; codec13_ep: endpoint { remote-endpoint = <&smcodec2_ep>; }; };
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>; }; };