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