1*4882a593SmuzhiyunAudio Graph Card: 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunAudio Graph Card specifies audio DAI connections of SoC <-> codec. 4*4882a593SmuzhiyunIt is based on common bindings for device graphs. 5*4882a593Smuzhiyunsee ${LINUX}/Documentation/devicetree/bindings/graph.txt 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunBasically, Audio Graph Card property is same as Simple Card. 8*4882a593Smuzhiyunsee ${LINUX}/Documentation/devicetree/bindings/sound/simple-card.yaml 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunBelow are same as Simple-Card. 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun- label 13*4882a593Smuzhiyun- widgets 14*4882a593Smuzhiyun- routing 15*4882a593Smuzhiyun- dai-format 16*4882a593Smuzhiyun- frame-master 17*4882a593Smuzhiyun- bitclock-master 18*4882a593Smuzhiyun- bitclock-inversion 19*4882a593Smuzhiyun- frame-inversion 20*4882a593Smuzhiyun- mclk-fs 21*4882a593Smuzhiyun- hp-det-gpio 22*4882a593Smuzhiyun- mic-det-gpio 23*4882a593Smuzhiyun- dai-tdm-slot-num 24*4882a593Smuzhiyun- dai-tdm-slot-width 25*4882a593Smuzhiyun- clocks / system-clock-frequency 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunRequired properties: 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun- compatible : "audio-graph-card"; 30*4882a593Smuzhiyun- dais : list of CPU DAI port{s} 31*4882a593Smuzhiyun 32*4882a593SmuzhiyunOptional properties: 33*4882a593Smuzhiyun- pa-gpios: GPIO used to control external amplifier. 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun----------------------- 36*4882a593SmuzhiyunExample: Single DAI case 37*4882a593Smuzhiyun----------------------- 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun sound_card { 40*4882a593Smuzhiyun compatible = "audio-graph-card"; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun dais = <&cpu_port>; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun dai-controller { 46*4882a593Smuzhiyun ... 47*4882a593Smuzhiyun cpu_port: port { 48*4882a593Smuzhiyun cpu_endpoint: endpoint { 49*4882a593Smuzhiyun remote-endpoint = <&codec_endpoint>; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun dai-format = "left_j"; 52*4882a593Smuzhiyun ... 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun audio-codec { 58*4882a593Smuzhiyun ... 59*4882a593Smuzhiyun port { 60*4882a593Smuzhiyun codec_endpoint: endpoint { 61*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint>; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun----------------------- 67*4882a593SmuzhiyunExample: Multi DAI case 68*4882a593Smuzhiyun----------------------- 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun sound-card { 71*4882a593Smuzhiyun compatible = "audio-graph-card"; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun label = "sound-card"; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun dais = <&cpu_port0 76*4882a593Smuzhiyun &cpu_port1 77*4882a593Smuzhiyun &cpu_port2>; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun audio-codec@0 { 81*4882a593Smuzhiyun ... 82*4882a593Smuzhiyun port { 83*4882a593Smuzhiyun codec0_endpoint: endpoint { 84*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint0>; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun audio-codec@1 { 90*4882a593Smuzhiyun ... 91*4882a593Smuzhiyun port { 92*4882a593Smuzhiyun codec1_endpoint: endpoint { 93*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint1>; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun audio-codec@2 { 99*4882a593Smuzhiyun ... 100*4882a593Smuzhiyun port { 101*4882a593Smuzhiyun codec2_endpoint: endpoint { 102*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint2>; 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun dai-controller { 108*4882a593Smuzhiyun ... 109*4882a593Smuzhiyun ports { 110*4882a593Smuzhiyun cpu_port0: port@0 { 111*4882a593Smuzhiyun cpu_endpoint0: endpoint { 112*4882a593Smuzhiyun remote-endpoint = <&codec0_endpoint>; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun dai-format = "left_j"; 115*4882a593Smuzhiyun ... 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun cpu_port1: port@1 { 119*4882a593Smuzhiyun cpu_endpoint1: endpoint { 120*4882a593Smuzhiyun remote-endpoint = <&codec1_endpoint>; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun dai-format = "i2s"; 123*4882a593Smuzhiyun ... 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun cpu_port2: port@2 { 127*4882a593Smuzhiyun cpu_endpoint2: endpoint { 128*4882a593Smuzhiyun remote-endpoint = <&codec2_endpoint>; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun dai-format = "i2s"; 131*4882a593Smuzhiyun ... 132*4882a593Smuzhiyun }; 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun----------------------- 139*4882a593SmuzhiyunExample: Sampling Rate Conversion 140*4882a593Smuzhiyun----------------------- 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun sound_card { 143*4882a593Smuzhiyun compatible = "audio-graph-card"; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun label = "sound-card"; 146*4882a593Smuzhiyun prefix = "codec"; 147*4882a593Smuzhiyun routing = "codec Playback", "DAI0 Playback", 148*4882a593Smuzhiyun "DAI0 Capture", "codec Capture"; 149*4882a593Smuzhiyun convert-rate = <48000>; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun dais = <&cpu_port>; 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun audio-codec { 155*4882a593Smuzhiyun ... 156*4882a593Smuzhiyun port { 157*4882a593Smuzhiyun codec_endpoint: endpoint { 158*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint>; 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun }; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun dai-controller { 164*4882a593Smuzhiyun ... 165*4882a593Smuzhiyun cpu_port: port { 166*4882a593Smuzhiyun cpu_endpoint: endpoint { 167*4882a593Smuzhiyun remote-endpoint = <&codec_endpoint>; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun dai-format = "left_j"; 170*4882a593Smuzhiyun ... 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun }; 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun----------------------- 176*4882a593SmuzhiyunExample: 2 CPU 1 Codec (Mixing) 177*4882a593Smuzhiyun----------------------- 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun sound_card { 180*4882a593Smuzhiyun compatible = "audio-graph-card"; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun label = "sound-card"; 183*4882a593Smuzhiyun routing = "codec Playback", "DAI0 Playback", 184*4882a593Smuzhiyun "codec Playback", "DAI1 Playback", 185*4882a593Smuzhiyun "DAI0 Capture", "codec Capture"; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun dais = <&cpu_port>; 188*4882a593Smuzhiyun }; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun audio-codec { 191*4882a593Smuzhiyun ... 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun audio-graph-card,prefix = "codec"; 194*4882a593Smuzhiyun audio-graph-card,convert-rate = <48000>; 195*4882a593Smuzhiyun port { 196*4882a593Smuzhiyun reg = <0>; 197*4882a593Smuzhiyun codec_endpoint0: endpoint@0 { 198*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint0>; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun codec_endpoint1: endpoint@1 { 201*4882a593Smuzhiyun remote-endpoint = <&cpu_endpoint1>; 202*4882a593Smuzhiyun }; 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun }; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun dai-controller { 207*4882a593Smuzhiyun ... 208*4882a593Smuzhiyun cpu_port: port { 209*4882a593Smuzhiyun cpu_endpoint0: endpoint@0 { 210*4882a593Smuzhiyun remote-endpoint = <&codec_endpoint0>; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun dai-format = "left_j"; 213*4882a593Smuzhiyun ... 214*4882a593Smuzhiyun }; 215*4882a593Smuzhiyun cpu_endpoint1: endpoint@1 { 216*4882a593Smuzhiyun remote-endpoint = <&codec_endpoint1>; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun dai-format = "left_j"; 219*4882a593Smuzhiyun ... 220*4882a593Smuzhiyun }; 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun----------------------- 225*4882a593SmuzhiyunExample: Multi DAI with DPCM 226*4882a593Smuzhiyun----------------------- 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun CPU0 ------ ak4613 229*4882a593Smuzhiyun CPU1 ------ HDMI 230*4882a593Smuzhiyun CPU2 ------ PCM3168A-p /* DPCM 1ch/2ch */ 231*4882a593Smuzhiyun CPU3 --/ /* DPCM 3ch/4ch */ 232*4882a593Smuzhiyun CPU4 --/ /* DPCM 5ch/6ch */ 233*4882a593Smuzhiyun CPU5 --/ /* DPCM 7ch/8ch */ 234*4882a593Smuzhiyun CPU6 ------ PCM3168A-c 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun sound_card: sound { 237*4882a593Smuzhiyun compatible = "audio-graph-card"; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun label = "sound-card"; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun routing = "pcm3168a Playback", "DAI2 Playback", 242*4882a593Smuzhiyun "pcm3168a Playback", "DAI3 Playback", 243*4882a593Smuzhiyun "pcm3168a Playback", "DAI4 Playback", 244*4882a593Smuzhiyun "pcm3168a Playback", "DAI5 Playback"; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun dais = <&snd_port0 /* ak4613 */ 247*4882a593Smuzhiyun &snd_port1 /* HDMI0 */ 248*4882a593Smuzhiyun &snd_port2 /* pcm3168a playback */ 249*4882a593Smuzhiyun &snd_port3 /* pcm3168a capture */ 250*4882a593Smuzhiyun >; 251*4882a593Smuzhiyun }; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun ak4613: codec@10 { 254*4882a593Smuzhiyun ... 255*4882a593Smuzhiyun port { 256*4882a593Smuzhiyun ak4613_endpoint: endpoint { 257*4882a593Smuzhiyun remote-endpoint = <&rsnd_endpoint0>; 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun }; 260*4882a593Smuzhiyun }; 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun pcm3168a: audio-codec@44 { 263*4882a593Smuzhiyun ... 264*4882a593Smuzhiyun audio-graph-card,prefix = "pcm3168a"; 265*4882a593Smuzhiyun audio-graph-card,convert-channels = <8>; /* TDM Split */ 266*4882a593Smuzhiyun ports { 267*4882a593Smuzhiyun port@0 { 268*4882a593Smuzhiyun reg = <0>; 269*4882a593Smuzhiyun pcm3168a_endpoint_p1: endpoint@1 { 270*4882a593Smuzhiyun remote-endpoint = <&rsnd_endpoint2>; 271*4882a593Smuzhiyun ... 272*4882a593Smuzhiyun }; 273*4882a593Smuzhiyun pcm3168a_endpoint_p2: endpoint@2 { 274*4882a593Smuzhiyun remote-endpoint = <&rsnd_endpoint3>; 275*4882a593Smuzhiyun ... 276*4882a593Smuzhiyun }; 277*4882a593Smuzhiyun pcm3168a_endpoint_p3: endpoint@3 { 278*4882a593Smuzhiyun remote-endpoint = <&rsnd_endpoint4>; 279*4882a593Smuzhiyun ... 280*4882a593Smuzhiyun }; 281*4882a593Smuzhiyun pcm3168a_endpoint_p4: endpoint@4 { 282*4882a593Smuzhiyun remote-endpoint = <&rsnd_endpoint5>; 283*4882a593Smuzhiyun ... 284*4882a593Smuzhiyun }; 285*4882a593Smuzhiyun }; 286*4882a593Smuzhiyun port@1 { 287*4882a593Smuzhiyun reg = <1>; 288*4882a593Smuzhiyun pcm3168a_endpoint_c: endpoint { 289*4882a593Smuzhiyun remote-endpoint = <&rsnd_endpoint6>; 290*4882a593Smuzhiyun ... 291*4882a593Smuzhiyun }; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun }; 294*4882a593Smuzhiyun }; 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun &sound { 297*4882a593Smuzhiyun ports { 298*4882a593Smuzhiyun snd_port0: port@0 { 299*4882a593Smuzhiyun rsnd_endpoint0: endpoint { 300*4882a593Smuzhiyun remote-endpoint = <&ak4613_endpoint>; 301*4882a593Smuzhiyun ... 302*4882a593Smuzhiyun }; 303*4882a593Smuzhiyun }; 304*4882a593Smuzhiyun snd_port1: port@1 { 305*4882a593Smuzhiyun rsnd_endpoint1: endpoint { 306*4882a593Smuzhiyun remote-endpoint = <&dw_hdmi0_snd_in>; 307*4882a593Smuzhiyun ... 308*4882a593Smuzhiyun }; 309*4882a593Smuzhiyun }; 310*4882a593Smuzhiyun snd_port2: port@2 { 311*4882a593Smuzhiyun #address-cells = <1>; 312*4882a593Smuzhiyun #size-cells = <0>; 313*4882a593Smuzhiyun rsnd_endpoint2: endpoint@2 { 314*4882a593Smuzhiyun remote-endpoint = <&pcm3168a_endpoint_p1>; 315*4882a593Smuzhiyun ... 316*4882a593Smuzhiyun }; 317*4882a593Smuzhiyun rsnd_endpoint3: endpoint@3 { 318*4882a593Smuzhiyun remote-endpoint = <&pcm3168a_endpoint_p2>; 319*4882a593Smuzhiyun ... 320*4882a593Smuzhiyun }; 321*4882a593Smuzhiyun rsnd_endpoint4: endpoint@4 { 322*4882a593Smuzhiyun remote-endpoint = <&pcm3168a_endpoint_p3>; 323*4882a593Smuzhiyun ... 324*4882a593Smuzhiyun }; 325*4882a593Smuzhiyun rsnd_endpoint5: endpoint@5 { 326*4882a593Smuzhiyun remote-endpoint = <&pcm3168a_endpoint_p4>; 327*4882a593Smuzhiyun ... 328*4882a593Smuzhiyun }; 329*4882a593Smuzhiyun }; 330*4882a593Smuzhiyun snd_port3: port@6 { 331*4882a593Smuzhiyun rsnd_endpoint6: endpoint { 332*4882a593Smuzhiyun remote-endpoint = <&pcm3168a_endpoint_c>; 333*4882a593Smuzhiyun ... 334*4882a593Smuzhiyun }; 335*4882a593Smuzhiyun }; 336*4882a593Smuzhiyun }; 337*4882a593Smuzhiyun }; 338