// SPDX-License-Identifier: GPL-2.0
/*
 * audio-graph-card2-custom-sample.dtsi
 *
 * Copyright (C) 2020 Renesas Electronics Corp.
 * Copyright (C) 2020 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
 *
 * This sample indicates how to use audio-graph-card2 and its
 * custom driver. "audio-graph-card2-custom-sample" is the custome driver
 * which is using audio-graph-card2.
 *
 * You can easily use this sample by adding below line on your DT file,
 * and add new CONFIG to your .config.
 *
 *	#include "../../../../../sound/soc/generic/audio-graph-card2-custom-sample.dtsi"
 *
 *	CONFIG_SND_AUDIO_GRAPH_CARD2
 *	CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE
 *	CONFIG_SND_TEST_COMPONENT
 */
/ {
	/*
	 * @ : used at links
	 *
	 * [Normal]
	 *	cpu0 <-@-----------------> codec0
	 *
	 * [Multi-CPU/Codec]
	 *		+-+		+-+
	 *	cpu1 <--| |<-@--------->| |-> codec1
	 *	cpu2 <--| |		| |-> codec2
	 *		+-+		+-+
	 *
	 * [DPCM]
	 *	FE		BE
	 *		  ****
	 *	cpu3 <-@--*  *--@-> codec3
	 *	cpu4 <-@--*  *
	 *		  ****
	 *
	 * [DPCM-Multi]
	 *
	 * --NOTE--
	 * Multi-FE is not supported by ASoC.
	 *
	 *	FE		BE
	 *		  ****	    +-+
	 *	cpu5 <-@--*  *--@-> | | -> codec4
	 *	cpu6 <-@--*  *	    | | -> codec5
	 *		  ****	    +-+
	 *
	 * [Codec2Codec]
	 *			   +-@-> codec6
	 *			   |
	 *			   +---> codec7
	 *
	 * [Codec2Codec-Multi]
	 *
	 * --NOTE--
	 * Multi connect N:M is not supported by ASoC.
	 *
	 *				+-+
	 *			   +-@->| |-> codec8
	 *			   |	| |-> codec9
	 *			   |	+-+
	 *			   |	+-+
	 *			   +--->| |-> codec10
	 *				| |-> codec11
	 *				+-+
	 */
	audio-graph-card2-custom-sample {
		/*
		 * You can use audio-graph-card2 directly by using
		 *
		 * compatible = "audio-graph-card2";
		 */
		compatible = "audio-graph-card2-custom-sample";

			/* for [DPCM]		   */
			/* BE			FE */
		routing = "TC DAI3 Playback",	"DAI3 Playback",
			  "TC DAI3 Playback",	"DAI4 Playback",
			  "DAI3 Capture",	"TC DAI3 Capture",
			  "DAI4 Capture",	"TC DAI3 Capture",
			/* for [DPCM-Multi]	   */
			/* BE			FE */
			  "TC DAI4 Playback",	"DAI5 Playback",
			  "TC DAI5 Playback",	"DAI5 Playback",
			  "TC DAI4 Playback",	"DAI6 Playback",
			  "TC DAI5 Playback",	"DAI6 Playback",
			  "DAI5 Capture",	"TC DAI4 Capture",
			  "DAI5 Capture",	"TC DAI5 Capture",
			  "DAI6 Capture",	"TC DAI4 Capture",
			  "DAI6 Capture",	"TC DAI5 Capture",
			/* for [Codec2Codec] */
			  "TC OUT",		"TC DAI7 Playback",
			  "TC DAI6 Capture",	"TC IN",
			/* for [Codec2Codec-Multi] */
			  "TC OUT",		"TC DAI10 Playback",
			  "TC DAI8 Capture",	"TC IN",
			  "TC OUT",		"TC DAI11 Playback",
			  "TC DAI9 Capture",	"TC IN";

		links = <&cpu0			/* normal: cpu side only */
			 &mcpu0			/* multi:  cpu side only */
			 &fe00 &fe01 &be0	/* dpcm:   both FE / BE  */
			 &fe10 &fe11 &be1	/* dpcm-m: both FE / BE  */
			 &c2c			/* c2c:    cpu side only */
			 &c2c_m			/* c2c:    cpu side only */
		>;

		multi {
			ports@0 {
			mcpu0:	port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
				port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>;    }; };
				port@2 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>;    }; };
			};
			ports@1 {
				port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>;  }; };
				port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
				port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
			};
			ports@2 {
				port@0 { mbe_ep:  endpoint { remote-endpoint = <&be10_ep>;  }; };
				port@1 { mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; }; };
				port@2 { mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; }; };
			};
			ports@3 {
				port@0 { mc2c0_ep:  endpoint { remote-endpoint = <&c2cmf_ep>;  }; };
				port@1 { mc2c00_ep: endpoint { remote-endpoint = <&codec8_ep>; }; };
				port@2 { mc2c01_ep: endpoint { remote-endpoint = <&codec9_ep>; }; };
			};
			ports@4 {
				port@0 { mc2c1_ep:  endpoint { remote-endpoint = <&c2cmb_ep>;  }; };
				port@1 { mc2c10_ep: endpoint { remote-endpoint = <&codec10_ep>; }; };
				port@2 { mc2c11_ep: endpoint { remote-endpoint = <&codec11_ep>; }; };
			};
		};

		dpcm {
			/* FE */
			ports@0 {
			fe00:	port@0 { fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
			fe01:	port@1 { fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
			fe10:	port@2 { fe10_ep: endpoint { remote-endpoint = <&cpu5_ep>; }; };
			fe11:	port@3 { fe11_ep: endpoint { remote-endpoint = <&cpu6_ep>; }; };
			};
			/* BE */
			ports@1 {
			be0:	port@0 { be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
			be1:	port@1 { be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
			};
		};

		codec2codec {
			ports@0 {
				rate = <48000>;
			c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
				port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
			};
			ports@1 {
				rate = <48000>;
			c2c_m:	port@0 { c2cmf_ep: endpoint { remote-endpoint = <&mc2c0_ep>; }; };
				port@1 { c2cmb_ep: endpoint { remote-endpoint = <&mc2c1_ep>; }; };
			};
		};
	};

	test_cpu {
		/*
		 * update compatible to indicate more detail behaviour
		 * if you want. see test-compatible for more detail.
		 *
		 * ex)
		 *	- compatible = "test-cpu";
		 *	+ compatible = "test-cpu-verbose";
		 */
		compatible = "test-cpu";
		ports {
			bitclock-master;
			frame-master;
			cpu0: port@0 { cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
			      port@1 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
			      port@2 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
			      port@3 { cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
			      port@4 { cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
			      port@5 { cpu5_ep: endpoint { remote-endpoint = <&fe10_ep>; }; };
			      port@6 { cpu6_ep: endpoint { remote-endpoint = <&fe11_ep>; }; };
		};
	};

	test_codec {
		/*
		 * update compatible to indicate more detail behaviour
		 * if you want. see test-compatible for more detail.
		 *
		 * ex)
		 *	- compatible = "test-codec";
		 *	+ compatible = "test-codec-verbose";
		 */
		compatible = "test-codec";
		ports {
			/*
			 * prefix can be added to *component*,
			 * see audio-graph-card2::routing
			 */
			prefix = "TC";

			port@0  { codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
			port@1  { codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
			port@2  { codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
			port@3  { codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; }; };
			port@4  { codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
			port@5  { codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
			port@6  { bitclock-master;
				  frame-master;
				  codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
			port@7  { codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
			port@8  { bitclock-master;
				  frame-master;
				  codec8_ep:  endpoint { remote-endpoint = <&mc2c00_ep>; }; };
			port@9  { codec9_ep:  endpoint { remote-endpoint = <&mc2c01_ep>; }; };
			port@10 { codec10_ep: endpoint { remote-endpoint = <&mc2c10_ep>; }; };
			port@11 { codec11_ep: endpoint { remote-endpoint = <&mc2c11_ep>; }; };
		};
	};
};
