18c2ecf20Sopenharmony_ciAudio Graph Card: 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ciAudio Graph Card specifies audio DAI connections of SoC <-> codec. 48c2ecf20Sopenharmony_ciIt is based on common bindings for device graphs. 58c2ecf20Sopenharmony_cisee ${LINUX}/Documentation/devicetree/bindings/graph.txt 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ciBasically, Audio Graph Card property is same as Simple Card. 88c2ecf20Sopenharmony_cisee ${LINUX}/Documentation/devicetree/bindings/sound/simple-card.yaml 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ciBelow are same as Simple-Card. 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci- label 138c2ecf20Sopenharmony_ci- widgets 148c2ecf20Sopenharmony_ci- routing 158c2ecf20Sopenharmony_ci- dai-format 168c2ecf20Sopenharmony_ci- frame-master 178c2ecf20Sopenharmony_ci- bitclock-master 188c2ecf20Sopenharmony_ci- bitclock-inversion 198c2ecf20Sopenharmony_ci- frame-inversion 208c2ecf20Sopenharmony_ci- mclk-fs 218c2ecf20Sopenharmony_ci- hp-det-gpio 228c2ecf20Sopenharmony_ci- mic-det-gpio 238c2ecf20Sopenharmony_ci- dai-tdm-slot-num 248c2ecf20Sopenharmony_ci- dai-tdm-slot-width 258c2ecf20Sopenharmony_ci- clocks / system-clock-frequency 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ciRequired properties: 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci- compatible : "audio-graph-card"; 308c2ecf20Sopenharmony_ci- dais : list of CPU DAI port{s} 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ciOptional properties: 338c2ecf20Sopenharmony_ci- pa-gpios: GPIO used to control external amplifier. 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci----------------------- 368c2ecf20Sopenharmony_ciExample: Single DAI case 378c2ecf20Sopenharmony_ci----------------------- 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci sound_card { 408c2ecf20Sopenharmony_ci compatible = "audio-graph-card"; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci dais = <&cpu_port>; 438c2ecf20Sopenharmony_ci }; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci dai-controller { 468c2ecf20Sopenharmony_ci ... 478c2ecf20Sopenharmony_ci cpu_port: port { 488c2ecf20Sopenharmony_ci cpu_endpoint: endpoint { 498c2ecf20Sopenharmony_ci remote-endpoint = <&codec_endpoint>; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci dai-format = "left_j"; 528c2ecf20Sopenharmony_ci ... 538c2ecf20Sopenharmony_ci }; 548c2ecf20Sopenharmony_ci }; 558c2ecf20Sopenharmony_ci }; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci audio-codec { 588c2ecf20Sopenharmony_ci ... 598c2ecf20Sopenharmony_ci port { 608c2ecf20Sopenharmony_ci codec_endpoint: endpoint { 618c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint>; 628c2ecf20Sopenharmony_ci }; 638c2ecf20Sopenharmony_ci }; 648c2ecf20Sopenharmony_ci }; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci----------------------- 678c2ecf20Sopenharmony_ciExample: Multi DAI case 688c2ecf20Sopenharmony_ci----------------------- 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci sound-card { 718c2ecf20Sopenharmony_ci compatible = "audio-graph-card"; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci label = "sound-card"; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci dais = <&cpu_port0 768c2ecf20Sopenharmony_ci &cpu_port1 778c2ecf20Sopenharmony_ci &cpu_port2>; 788c2ecf20Sopenharmony_ci }; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci audio-codec@0 { 818c2ecf20Sopenharmony_ci ... 828c2ecf20Sopenharmony_ci port { 838c2ecf20Sopenharmony_ci codec0_endpoint: endpoint { 848c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint0>; 858c2ecf20Sopenharmony_ci }; 868c2ecf20Sopenharmony_ci }; 878c2ecf20Sopenharmony_ci }; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci audio-codec@1 { 908c2ecf20Sopenharmony_ci ... 918c2ecf20Sopenharmony_ci port { 928c2ecf20Sopenharmony_ci codec1_endpoint: endpoint { 938c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint1>; 948c2ecf20Sopenharmony_ci }; 958c2ecf20Sopenharmony_ci }; 968c2ecf20Sopenharmony_ci }; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci audio-codec@2 { 998c2ecf20Sopenharmony_ci ... 1008c2ecf20Sopenharmony_ci port { 1018c2ecf20Sopenharmony_ci codec2_endpoint: endpoint { 1028c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint2>; 1038c2ecf20Sopenharmony_ci }; 1048c2ecf20Sopenharmony_ci }; 1058c2ecf20Sopenharmony_ci }; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci dai-controller { 1088c2ecf20Sopenharmony_ci ... 1098c2ecf20Sopenharmony_ci ports { 1108c2ecf20Sopenharmony_ci cpu_port0: port@0 { 1118c2ecf20Sopenharmony_ci cpu_endpoint0: endpoint { 1128c2ecf20Sopenharmony_ci remote-endpoint = <&codec0_endpoint>; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci dai-format = "left_j"; 1158c2ecf20Sopenharmony_ci ... 1168c2ecf20Sopenharmony_ci }; 1178c2ecf20Sopenharmony_ci }; 1188c2ecf20Sopenharmony_ci cpu_port1: port@1 { 1198c2ecf20Sopenharmony_ci cpu_endpoint1: endpoint { 1208c2ecf20Sopenharmony_ci remote-endpoint = <&codec1_endpoint>; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci dai-format = "i2s"; 1238c2ecf20Sopenharmony_ci ... 1248c2ecf20Sopenharmony_ci }; 1258c2ecf20Sopenharmony_ci }; 1268c2ecf20Sopenharmony_ci cpu_port2: port@2 { 1278c2ecf20Sopenharmony_ci cpu_endpoint2: endpoint { 1288c2ecf20Sopenharmony_ci remote-endpoint = <&codec2_endpoint>; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci dai-format = "i2s"; 1318c2ecf20Sopenharmony_ci ... 1328c2ecf20Sopenharmony_ci }; 1338c2ecf20Sopenharmony_ci }; 1348c2ecf20Sopenharmony_ci }; 1358c2ecf20Sopenharmony_ci }; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci----------------------- 1398c2ecf20Sopenharmony_ciExample: Sampling Rate Conversion 1408c2ecf20Sopenharmony_ci----------------------- 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci sound_card { 1438c2ecf20Sopenharmony_ci compatible = "audio-graph-card"; 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci label = "sound-card"; 1468c2ecf20Sopenharmony_ci prefix = "codec"; 1478c2ecf20Sopenharmony_ci routing = "codec Playback", "DAI0 Playback", 1488c2ecf20Sopenharmony_ci "DAI0 Capture", "codec Capture"; 1498c2ecf20Sopenharmony_ci convert-rate = <48000>; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci dais = <&cpu_port>; 1528c2ecf20Sopenharmony_ci }; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci audio-codec { 1558c2ecf20Sopenharmony_ci ... 1568c2ecf20Sopenharmony_ci port { 1578c2ecf20Sopenharmony_ci codec_endpoint: endpoint { 1588c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint>; 1598c2ecf20Sopenharmony_ci }; 1608c2ecf20Sopenharmony_ci }; 1618c2ecf20Sopenharmony_ci }; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci dai-controller { 1648c2ecf20Sopenharmony_ci ... 1658c2ecf20Sopenharmony_ci cpu_port: port { 1668c2ecf20Sopenharmony_ci cpu_endpoint: endpoint { 1678c2ecf20Sopenharmony_ci remote-endpoint = <&codec_endpoint>; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci dai-format = "left_j"; 1708c2ecf20Sopenharmony_ci ... 1718c2ecf20Sopenharmony_ci }; 1728c2ecf20Sopenharmony_ci }; 1738c2ecf20Sopenharmony_ci }; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci----------------------- 1768c2ecf20Sopenharmony_ciExample: 2 CPU 1 Codec (Mixing) 1778c2ecf20Sopenharmony_ci----------------------- 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci sound_card { 1808c2ecf20Sopenharmony_ci compatible = "audio-graph-card"; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci label = "sound-card"; 1838c2ecf20Sopenharmony_ci routing = "codec Playback", "DAI0 Playback", 1848c2ecf20Sopenharmony_ci "codec Playback", "DAI1 Playback", 1858c2ecf20Sopenharmony_ci "DAI0 Capture", "codec Capture"; 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci dais = <&cpu_port>; 1888c2ecf20Sopenharmony_ci }; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci audio-codec { 1918c2ecf20Sopenharmony_ci ... 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci audio-graph-card,prefix = "codec"; 1948c2ecf20Sopenharmony_ci audio-graph-card,convert-rate = <48000>; 1958c2ecf20Sopenharmony_ci port { 1968c2ecf20Sopenharmony_ci reg = <0>; 1978c2ecf20Sopenharmony_ci codec_endpoint0: endpoint@0 { 1988c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint0>; 1998c2ecf20Sopenharmony_ci }; 2008c2ecf20Sopenharmony_ci codec_endpoint1: endpoint@1 { 2018c2ecf20Sopenharmony_ci remote-endpoint = <&cpu_endpoint1>; 2028c2ecf20Sopenharmony_ci }; 2038c2ecf20Sopenharmony_ci }; 2048c2ecf20Sopenharmony_ci }; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci dai-controller { 2078c2ecf20Sopenharmony_ci ... 2088c2ecf20Sopenharmony_ci cpu_port: port { 2098c2ecf20Sopenharmony_ci cpu_endpoint0: endpoint@0 { 2108c2ecf20Sopenharmony_ci remote-endpoint = <&codec_endpoint0>; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci dai-format = "left_j"; 2138c2ecf20Sopenharmony_ci ... 2148c2ecf20Sopenharmony_ci }; 2158c2ecf20Sopenharmony_ci cpu_endpoint1: endpoint@1 { 2168c2ecf20Sopenharmony_ci remote-endpoint = <&codec_endpoint1>; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci dai-format = "left_j"; 2198c2ecf20Sopenharmony_ci ... 2208c2ecf20Sopenharmony_ci }; 2218c2ecf20Sopenharmony_ci }; 2228c2ecf20Sopenharmony_ci }; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci----------------------- 2258c2ecf20Sopenharmony_ciExample: Multi DAI with DPCM 2268c2ecf20Sopenharmony_ci----------------------- 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci CPU0 ------ ak4613 2298c2ecf20Sopenharmony_ci CPU1 ------ HDMI 2308c2ecf20Sopenharmony_ci CPU2 ------ PCM3168A-p /* DPCM 1ch/2ch */ 2318c2ecf20Sopenharmony_ci CPU3 --/ /* DPCM 3ch/4ch */ 2328c2ecf20Sopenharmony_ci CPU4 --/ /* DPCM 5ch/6ch */ 2338c2ecf20Sopenharmony_ci CPU5 --/ /* DPCM 7ch/8ch */ 2348c2ecf20Sopenharmony_ci CPU6 ------ PCM3168A-c 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci sound_card: sound { 2378c2ecf20Sopenharmony_ci compatible = "audio-graph-card"; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci label = "sound-card"; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci routing = "pcm3168a Playback", "DAI2 Playback", 2428c2ecf20Sopenharmony_ci "pcm3168a Playback", "DAI3 Playback", 2438c2ecf20Sopenharmony_ci "pcm3168a Playback", "DAI4 Playback", 2448c2ecf20Sopenharmony_ci "pcm3168a Playback", "DAI5 Playback"; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci dais = <&snd_port0 /* ak4613 */ 2478c2ecf20Sopenharmony_ci &snd_port1 /* HDMI0 */ 2488c2ecf20Sopenharmony_ci &snd_port2 /* pcm3168a playback */ 2498c2ecf20Sopenharmony_ci &snd_port3 /* pcm3168a capture */ 2508c2ecf20Sopenharmony_ci >; 2518c2ecf20Sopenharmony_ci }; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci ak4613: codec@10 { 2548c2ecf20Sopenharmony_ci ... 2558c2ecf20Sopenharmony_ci port { 2568c2ecf20Sopenharmony_ci ak4613_endpoint: endpoint { 2578c2ecf20Sopenharmony_ci remote-endpoint = <&rsnd_endpoint0>; 2588c2ecf20Sopenharmony_ci }; 2598c2ecf20Sopenharmony_ci }; 2608c2ecf20Sopenharmony_ci }; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci pcm3168a: audio-codec@44 { 2638c2ecf20Sopenharmony_ci ... 2648c2ecf20Sopenharmony_ci audio-graph-card,prefix = "pcm3168a"; 2658c2ecf20Sopenharmony_ci audio-graph-card,convert-channels = <8>; /* TDM Split */ 2668c2ecf20Sopenharmony_ci ports { 2678c2ecf20Sopenharmony_ci port@0 { 2688c2ecf20Sopenharmony_ci reg = <0>; 2698c2ecf20Sopenharmony_ci pcm3168a_endpoint_p1: endpoint@1 { 2708c2ecf20Sopenharmony_ci remote-endpoint = <&rsnd_endpoint2>; 2718c2ecf20Sopenharmony_ci ... 2728c2ecf20Sopenharmony_ci }; 2738c2ecf20Sopenharmony_ci pcm3168a_endpoint_p2: endpoint@2 { 2748c2ecf20Sopenharmony_ci remote-endpoint = <&rsnd_endpoint3>; 2758c2ecf20Sopenharmony_ci ... 2768c2ecf20Sopenharmony_ci }; 2778c2ecf20Sopenharmony_ci pcm3168a_endpoint_p3: endpoint@3 { 2788c2ecf20Sopenharmony_ci remote-endpoint = <&rsnd_endpoint4>; 2798c2ecf20Sopenharmony_ci ... 2808c2ecf20Sopenharmony_ci }; 2818c2ecf20Sopenharmony_ci pcm3168a_endpoint_p4: endpoint@4 { 2828c2ecf20Sopenharmony_ci remote-endpoint = <&rsnd_endpoint5>; 2838c2ecf20Sopenharmony_ci ... 2848c2ecf20Sopenharmony_ci }; 2858c2ecf20Sopenharmony_ci }; 2868c2ecf20Sopenharmony_ci port@1 { 2878c2ecf20Sopenharmony_ci reg = <1>; 2888c2ecf20Sopenharmony_ci pcm3168a_endpoint_c: endpoint { 2898c2ecf20Sopenharmony_ci remote-endpoint = <&rsnd_endpoint6>; 2908c2ecf20Sopenharmony_ci ... 2918c2ecf20Sopenharmony_ci }; 2928c2ecf20Sopenharmony_ci }; 2938c2ecf20Sopenharmony_ci }; 2948c2ecf20Sopenharmony_ci }; 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci &sound { 2978c2ecf20Sopenharmony_ci ports { 2988c2ecf20Sopenharmony_ci snd_port0: port@0 { 2998c2ecf20Sopenharmony_ci rsnd_endpoint0: endpoint { 3008c2ecf20Sopenharmony_ci remote-endpoint = <&ak4613_endpoint>; 3018c2ecf20Sopenharmony_ci ... 3028c2ecf20Sopenharmony_ci }; 3038c2ecf20Sopenharmony_ci }; 3048c2ecf20Sopenharmony_ci snd_port1: port@1 { 3058c2ecf20Sopenharmony_ci rsnd_endpoint1: endpoint { 3068c2ecf20Sopenharmony_ci remote-endpoint = <&dw_hdmi0_snd_in>; 3078c2ecf20Sopenharmony_ci ... 3088c2ecf20Sopenharmony_ci }; 3098c2ecf20Sopenharmony_ci }; 3108c2ecf20Sopenharmony_ci snd_port2: port@2 { 3118c2ecf20Sopenharmony_ci #address-cells = <1>; 3128c2ecf20Sopenharmony_ci #size-cells = <0>; 3138c2ecf20Sopenharmony_ci rsnd_endpoint2: endpoint@2 { 3148c2ecf20Sopenharmony_ci remote-endpoint = <&pcm3168a_endpoint_p1>; 3158c2ecf20Sopenharmony_ci ... 3168c2ecf20Sopenharmony_ci }; 3178c2ecf20Sopenharmony_ci rsnd_endpoint3: endpoint@3 { 3188c2ecf20Sopenharmony_ci remote-endpoint = <&pcm3168a_endpoint_p2>; 3198c2ecf20Sopenharmony_ci ... 3208c2ecf20Sopenharmony_ci }; 3218c2ecf20Sopenharmony_ci rsnd_endpoint4: endpoint@4 { 3228c2ecf20Sopenharmony_ci remote-endpoint = <&pcm3168a_endpoint_p3>; 3238c2ecf20Sopenharmony_ci ... 3248c2ecf20Sopenharmony_ci }; 3258c2ecf20Sopenharmony_ci rsnd_endpoint5: endpoint@5 { 3268c2ecf20Sopenharmony_ci remote-endpoint = <&pcm3168a_endpoint_p4>; 3278c2ecf20Sopenharmony_ci ... 3288c2ecf20Sopenharmony_ci }; 3298c2ecf20Sopenharmony_ci }; 3308c2ecf20Sopenharmony_ci snd_port3: port@6 { 3318c2ecf20Sopenharmony_ci rsnd_endpoint6: endpoint { 3328c2ecf20Sopenharmony_ci remote-endpoint = <&pcm3168a_endpoint_c>; 3338c2ecf20Sopenharmony_ci ... 3348c2ecf20Sopenharmony_ci }; 3358c2ecf20Sopenharmony_ci }; 3368c2ecf20Sopenharmony_ci }; 3378c2ecf20Sopenharmony_ci }; 338