338 lines
5.9 KiB
Plaintext
338 lines
5.9 KiB
Plaintext
|
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.txt
|
||
|
|
||
|
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>;
|
||
|
...
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|