Audio Graph Card: Audio Graph Card specifies audio DAI connections of SoC <-> codec. It is based on common bindings for device graphs. see ${LINUX}/Documentation/devicetree/bindings/graph.txt Basically, Audio Graph Card property is same as Simple Card. see ${LINUX}/Documentation/devicetree/bindings/sound/simple-card.yaml Below are same as Simple-Card. - label - widgets - routing - dai-format - frame-master - bitclock-master - bitclock-inversion - frame-inversion - mclk-fs - hp-det-gpio - mic-det-gpio - dai-tdm-slot-num - dai-tdm-slot-width - clocks / system-clock-frequency Required properties: - compatible : "audio-graph-card"; - dais : list of CPU DAI port{s} Optional properties: - pa-gpios: GPIO used to control external amplifier. ----------------------- Example: Single DAI case ----------------------- sound_card { compatible = "audio-graph-card"; dais = <&cpu_port>; }; dai-controller { ... cpu_port: port { cpu_endpoint: endpoint { remote-endpoint = <&codec_endpoint>; dai-format = "left_j"; ... }; }; }; audio-codec { ... port { codec_endpoint: endpoint { remote-endpoint = <&cpu_endpoint>; }; }; }; ----------------------- Example: Multi DAI case ----------------------- sound-card { compatible = "audio-graph-card"; label = "sound-card"; dais = <&cpu_port0 &cpu_port1 &cpu_port2>; }; audio-codec@0 { ... port { codec0_endpoint: endpoint { remote-endpoint = <&cpu_endpoint0>; }; }; }; audio-codec@1 { ... port { codec1_endpoint: endpoint { remote-endpoint = <&cpu_endpoint1>; }; }; }; audio-codec@2 { ... port { codec2_endpoint: endpoint { remote-endpoint = <&cpu_endpoint2>; }; }; }; dai-controller { ... ports { cpu_port0: port@0 { cpu_endpoint0: endpoint { remote-endpoint = <&codec0_endpoint>; dai-format = "left_j"; ... }; }; cpu_port1: port@1 { cpu_endpoint1: endpoint { remote-endpoint = <&codec1_endpoint>; dai-format = "i2s"; ... }; }; cpu_port2: port@2 { cpu_endpoint2: endpoint { remote-endpoint = <&codec2_endpoint>; dai-format = "i2s"; ... }; }; }; }; ----------------------- Example: Sampling Rate Conversion ----------------------- sound_card { compatible = "audio-graph-card"; label = "sound-card"; prefix = "codec"; routing = "codec Playback", "DAI0 Playback", "DAI0 Capture", "codec Capture"; convert-rate = <48000>; dais = <&cpu_port>; }; audio-codec { ... port { codec_endpoint: endpoint { remote-endpoint = <&cpu_endpoint>; }; }; }; dai-controller { ... cpu_port: port { cpu_endpoint: endpoint { remote-endpoint = <&codec_endpoint>; dai-format = "left_j"; ... }; }; }; ----------------------- Example: 2 CPU 1 Codec (Mixing) ----------------------- sound_card { compatible = "audio-graph-card"; label = "sound-card"; routing = "codec Playback", "DAI0 Playback", "codec Playback", "DAI1 Playback", "DAI0 Capture", "codec Capture"; dais = <&cpu_port>; }; audio-codec { ... audio-graph-card,prefix = "codec"; audio-graph-card,convert-rate = <48000>; port { reg = <0>; codec_endpoint0: endpoint@0 { remote-endpoint = <&cpu_endpoint0>; }; codec_endpoint1: endpoint@1 { remote-endpoint = <&cpu_endpoint1>; }; }; }; dai-controller { ... cpu_port: port { cpu_endpoint0: endpoint@0 { remote-endpoint = <&codec_endpoint0>; dai-format = "left_j"; ... }; cpu_endpoint1: endpoint@1 { remote-endpoint = <&codec_endpoint1>; dai-format = "left_j"; ... }; }; }; ----------------------- Example: Multi DAI with DPCM ----------------------- CPU0 ------ ak4613 CPU1 ------ HDMI CPU2 ------ PCM3168A-p /* DPCM 1ch/2ch */ CPU3 --/ /* DPCM 3ch/4ch */ CPU4 --/ /* DPCM 5ch/6ch */ CPU5 --/ /* DPCM 7ch/8ch */ CPU6 ------ PCM3168A-c sound_card: sound { compatible = "audio-graph-card"; label = "sound-card"; routing = "pcm3168a Playback", "DAI2 Playback", "pcm3168a Playback", "DAI3 Playback", "pcm3168a Playback", "DAI4 Playback", "pcm3168a Playback", "DAI5 Playback"; dais = <&snd_port0 /* ak4613 */ &snd_port1 /* HDMI0 */ &snd_port2 /* pcm3168a playback */ &snd_port3 /* pcm3168a capture */ >; }; ak4613: codec@10 { ... port { ak4613_endpoint: endpoint { remote-endpoint = <&rsnd_endpoint0>; }; }; }; pcm3168a: audio-codec@44 { ... audio-graph-card,prefix = "pcm3168a"; audio-graph-card,convert-channels = <8>; /* TDM Split */ ports { port@0 { reg = <0>; pcm3168a_endpoint_p1: endpoint@1 { remote-endpoint = <&rsnd_endpoint2>; ... }; pcm3168a_endpoint_p2: endpoint@2 { remote-endpoint = <&rsnd_endpoint3>; ... }; pcm3168a_endpoint_p3: endpoint@3 { remote-endpoint = <&rsnd_endpoint4>; ... }; pcm3168a_endpoint_p4: endpoint@4 { remote-endpoint = <&rsnd_endpoint5>; ... }; }; port@1 { reg = <1>; pcm3168a_endpoint_c: endpoint { remote-endpoint = <&rsnd_endpoint6>; ... }; }; }; }; &sound { ports { snd_port0: port@0 { rsnd_endpoint0: endpoint { remote-endpoint = <&ak4613_endpoint>; ... }; }; snd_port1: port@1 { rsnd_endpoint1: endpoint { remote-endpoint = <&dw_hdmi0_snd_in>; ... }; }; snd_port2: port@2 { #address-cells = <1>; #size-cells = <0>; rsnd_endpoint2: endpoint@2 { remote-endpoint = <&pcm3168a_endpoint_p1>; ... }; rsnd_endpoint3: endpoint@3 { remote-endpoint = <&pcm3168a_endpoint_p2>; ... }; rsnd_endpoint4: endpoint@4 { remote-endpoint = <&pcm3168a_endpoint_p3>; ... }; rsnd_endpoint5: endpoint@5 { remote-endpoint = <&pcm3168a_endpoint_p4>; ... }; }; snd_port3: port@6 { rsnd_endpoint6: endpoint { remote-endpoint = <&pcm3168a_endpoint_c>; ... }; }; }; };