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