|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | /* | 
|  | * audio-graph-card2-custom-sample1.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-sample1.dtsi" | 
|  | * | 
|  | *	CONFIG_SND_AUDIO_GRAPH_CARD2 | 
|  | *	CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE | 
|  | *	CONFIG_SND_TEST_COMPONENT | 
|  | * | 
|  | * | 
|  | * You can indicate more detail each device behavior as debug if you modify | 
|  | * "compatible" on each test-component. see below | 
|  | * | 
|  | *	test_cpu { | 
|  | *	-	compatible = "test-cpu"; | 
|  | *	+	compatible = "test-cpu-verbose"; | 
|  | *		... | 
|  | *	}; | 
|  | * | 
|  | *	test_codec { | 
|  | *	-	compatible = "test-codec"; | 
|  | *	+	compatible = "test-codec-verbose"; | 
|  | *		... | 
|  | *	}; | 
|  | * | 
|  | * | 
|  | * Below sample doesn't use "format" property, | 
|  | * because test-component driver (test-cpu/test-codec) is supporting | 
|  | * snd_soc_dai_ops :: .auto_selectable_formats. | 
|  | * see | 
|  | *	snd_soc_runtime_get_dai_fmt() | 
|  | *	linux/sound/soc/generic/test-component.c :: test_dai_formats | 
|  | */ | 
|  | / { | 
|  | audio-graph-card2-custom-sample-1 { | 
|  | /* | 
|  | * You can use audio-graph-card2 directly by using | 
|  | * | 
|  | * compatible = "audio-graph-card2"; | 
|  | */ | 
|  | compatible = "audio-graph-card2-custom-sample"; | 
|  | label = "card2-custom-sample-1"; | 
|  |  | 
|  | /* | 
|  | * @ : used at links | 
|  | */ | 
|  | links = < | 
|  | /* | 
|  | * | 
|  | * [Normal] | 
|  | * | 
|  | *	     <cpu1_0> | 
|  | *	cpu1_0 <-@-----> codec1_0 | 
|  | */ | 
|  | &cpu1_0 /* CPU side only */ | 
|  |  | 
|  | /* | 
|  | * [Semi-Multi] | 
|  | * | 
|  | * CPU:Codec = 1:N | 
|  | * | 
|  | *		<sm>	+-+ | 
|  | *	cpu1_1 <--@---->| |-> codec1_1 | 
|  | *			| |-> codec1_2 | 
|  | *			+-+ | 
|  | */ | 
|  | &sm /* CPU side only */ | 
|  |  | 
|  | /* | 
|  | * [Multi-CPU/Codec-A] | 
|  | * | 
|  | *		 +-+ <mcpuA>	+-+ | 
|  | *	cpu1_2 <-| |<---@------>| |-> codec1_3 | 
|  | *	cpu1_3 <-| |		| |-> codec1_4 | 
|  | *		 +-+		+-+ | 
|  | */ | 
|  | &mcpuA /* CPU side only */ | 
|  |  | 
|  | /* | 
|  | * [Multi-CPU/Codec-B] | 
|  | * | 
|  | *		 +-+ <mcpuB>	+-+ | 
|  | *		 | |<---@------>| | | 
|  | *		 | |		| | | 
|  | *	cpu1_4 <-| |<---------->| |-> codec1_5 | 
|  | *	cpu1_5 <-| |<---+------>| |-> codec1_6 | 
|  | *		 +-+	 \----->| |-> codec1_7 | 
|  | *				+-+ | 
|  | */ | 
|  | &mcpuB /* CPU side only */ | 
|  |  | 
|  | /* | 
|  | * [Multi-CPU/Codec-C] | 
|  | * | 
|  | *		 +-+ <mcpuC>	+-+ | 
|  | *		 | |<---@------>| | | 
|  | *		 | |		| | | 
|  | *	cpu1_6 <-| |<---------->| |-> codec1_8 | 
|  | *	cpu1_7 <-| |<-----+---->| |-> codec1_9 | 
|  | *	cpu1_8 <-| |<----/	+-+ | 
|  | *		 +-+ | 
|  | */ | 
|  | &mcpuC /* CPU side only */ | 
|  | >; | 
|  |  | 
|  | multi { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  |  | 
|  | /* | 
|  | * [Semi-Multi] | 
|  | * | 
|  | *		<sm>	+---+ | 
|  | *	cpu1_1 <---@--->|X A|-> codec1_1 | 
|  | *			|  B|-> codec1_2 | 
|  | *			+---+ | 
|  | */ | 
|  | ports@0 { | 
|  | reg = <0>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | port@0 { reg = <0>; smcodec_ep:   endpoint { remote-endpoint = <&cpu1_1_ep>;   };};/* (X) to pair */ | 
|  | port@1 { reg = <1>; smcodec_A_ep: endpoint { remote-endpoint = <&codec1_1_ep>; };};/* (A) Multi Element */ | 
|  | port@2 { reg = <2>; smcodec_B_ep: endpoint { remote-endpoint = <&codec1_2_ep>; };};/* (B) Multi Element */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * [Multi-CPU-A] | 
|  | * | 
|  | *		 +---+ <mcpuA>	+---+ | 
|  | *	cpu1_2 <-|A X|<---@---->|x a|-> codec1_3 | 
|  | *	cpu1_3 <-|B  |		|  b|-> codec1_4 | 
|  | *		 +---+		+---+ | 
|  | */ | 
|  | ports@1 { | 
|  | reg = <1>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | mcpuA:	port@0 { reg = <0>; mcpu_A_ep:  endpoint { remote-endpoint = <&mcodec_A_ep>; };}; /* (X) to pair */ | 
|  | port@1 { reg = <1>; mcpu_AA_ep: endpoint { remote-endpoint = <&cpu1_2_ep>;   };}; /* (A) Multi Element */ | 
|  | port@2 { reg = <2>; mcpu_AB_ep: endpoint { remote-endpoint = <&cpu1_3_ep>;   };}; /* (B) Multi Element */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * [Multi-Codec-A] | 
|  | * | 
|  | *		 +---+ <mcpuA>	+---+ | 
|  | *	cpu1_2 <-|A X|<-@------>|x a|-> codec1_3 | 
|  | *	cpu1_3 <-|B  |		|  b|-> codec1_4 | 
|  | *		 +---+		+---+ | 
|  | */ | 
|  | ports@2 { | 
|  | reg = <2>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | port@0 { reg = <0>; mcodec_A_ep:  endpoint { remote-endpoint = <&mcpu_A_ep>;   };}; /* (x) to pair */ | 
|  | port@1 { reg = <1>; mcodec_Aa_ep: endpoint { remote-endpoint = <&codec1_3_ep>; };}; /* (a) Multi Element */ | 
|  | port@2 { reg = <2>; mcodec_Ab_ep: endpoint { remote-endpoint = <&codec1_4_ep>; };}; /* (b) Multi Element */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * [Multi-CPU-B] | 
|  | * | 
|  | *		 +---+ <mcpuB>	+---+ | 
|  | *		 |  X|<---@---->|x  | | 
|  | *		 |   |		|   | | 
|  | *	cpu1_4 <-|A 1|<-------->|3 a|-> codec1_5 | 
|  | *	cpu1_5 <-|B 2|<---+---->|4 b|-> codec1_6 | 
|  | *		 +---+	   \--->|5 c|-> codec1_7 | 
|  | *				+---+ | 
|  | */ | 
|  | ports@3 { | 
|  | reg = <3>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | mcpuB:	port@0 { | 
|  | reg = <0>; | 
|  | mcpu_BX_ep:     endpoint { remote-endpoint = <&mcodec_Bx_ep>; }; /* (X) to pair */ | 
|  | }; | 
|  | port@1 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <1>; | 
|  | mcpu_BA_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu1_4_ep>;    }; /* (A) Multi Element */ | 
|  | mcpu_B1_ep:   endpoint@1 { reg = <1>; remote-endpoint = <&mcodec_B3_ep>; }; /* (1) connected Codec */ | 
|  | }; | 
|  | port@2 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <2>; | 
|  | mcpu_BB_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&cpu1_5_ep>;    }; /* (B) Multi Element */ | 
|  | mcpu_B2_0_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec_B4_ep>; }; /* (2) connected Codec */ | 
|  | mcpu_B2_1_ep: endpoint@2 { reg = <2>; remote-endpoint = <&mcodec_B5_ep>; }; /* (2) connected Codec */ | 
|  | }; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * [Multi-Codec-B] | 
|  | * | 
|  | *		 +---+ <mcpuB>	+---+ | 
|  | *		 |  X|<-@------>|x  | | 
|  | *		 |   |		|   | | 
|  | *	cpu1_4 <-|A 1|<-------->|3 a|-> codec1_5 | 
|  | *	cpu1_5 <-|B 2|<---+---->|4 b|-> codec1_6 | 
|  | *		 +---+	   \--->|5 c|-> codec1_7 | 
|  | *				+---+ | 
|  | */ | 
|  | ports@4 { | 
|  | reg = <4>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | port@0 { | 
|  | reg = <0>; | 
|  | mcodec_Bx_ep:   endpoint { remote-endpoint = <&mcpu_BX_ep>;  }; /* (x) to pair */ | 
|  | }; | 
|  | port@1 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <1>; | 
|  | mcodec_Ba_ep: endpoint@0 { reg = <0>; remote-endpoint = <&codec1_5_ep>;}; /* (a) Multi Element */ | 
|  | mcodec_B3_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu_B1_ep>; }; /* (3) connected CPU */ | 
|  | }; | 
|  | port@2 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <2>; | 
|  | mcodec_Bb_ep: endpoint@0 { reg = <0>; remote-endpoint = <&codec1_6_ep>; }; /* (b) Multi Element */ | 
|  | mcodec_B4_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu_B2_0_ep>;}; /* (4) connected CPU */ | 
|  | }; | 
|  | port@3 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <3>; | 
|  | mcodec_Bc_ep: endpoint@0 { reg = <0>; remote-endpoint = <&codec1_7_ep>; }; /* (c) Multi Element */ | 
|  | mcodec_B5_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu_B2_1_ep>;}; /* (5) connected CPU */ | 
|  | }; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * [Multi-CPU-C] | 
|  | * | 
|  | *		 +---+ <mcpuC>	+---+ | 
|  | *		 |  X|<-@------>|x  | | 
|  | *		 |   |		|   | | 
|  | *	cpu1_6 <-|A 1|<-------->|4 a|-> codec1_8 | 
|  | *	cpu1_7 <-|B 2|<-----+-->|5 b|-> codec1_9 | 
|  | *	cpu1_8 <-|C 3|<----/	+---+ | 
|  | *		 +---+ | 
|  | */ | 
|  | ports@5 { | 
|  | reg = <5>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | mcpuC:	port@0 { | 
|  | reg = <0>; | 
|  | mcpu_CX_ep:   endpoint { remote-endpoint = <&mcodec_Cx_ep>; }; /* (X) to pair */ | 
|  | }; | 
|  | port@1 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <1>; | 
|  | mcpu_CA_ep: endpoint@0 { reg = <0>; remote-endpoint = <&cpu1_6_ep>;    }; /* (A) Multi Element */ | 
|  | mcpu_C1_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec_C4_ep>; }; /* (1) connected Codec */ | 
|  | }; | 
|  | port@2 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <2>; | 
|  | mcpu_CB_ep: endpoint@0 { reg = <0>; remote-endpoint = <&cpu1_7_ep>;      }; /* (B) Multi Element */ | 
|  | mcpu_C2_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec_C5_0_ep>; }; /* (2) connected Codec */ | 
|  | }; | 
|  | port@3 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <3>; | 
|  | mcpu_CC_ep: endpoint@0 { reg = <0>; remote-endpoint = <&cpu1_8_ep>;      }; /* (C) Multi Element */ | 
|  | mcpu_C3_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcodec_C5_1_ep>; }; /* (3) connected Codec */ | 
|  | }; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * [Multi-Codec-C] | 
|  | * | 
|  | *		 +---+ <mcpuC>	+---+ | 
|  | *		 |  X|<-@------>|x  | | 
|  | *		 |   |		|   | | 
|  | *	cpu1_6 <-|A 1|<-------->|4 a|-> codec1_8 | 
|  | *	cpu1_7 <-|B 2|<-----+-->|5 b|-> codec1_9 | 
|  | *	cpu1_8 <-|C 3|<----/	+---+ | 
|  | *		 +---+ | 
|  | */ | 
|  | ports@6 { | 
|  | reg = <6>; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | port@0 { | 
|  | reg = <0>; | 
|  | mcodec_Cx_ep: endpoint { remote-endpoint = <&mcpu_CX_ep>;  }; /* (x) to pair */ | 
|  | }; | 
|  | port@1 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <1>; | 
|  | mcodec_Ca_ep: endpoint@0 { reg = <0>; remote-endpoint = <&codec1_8_ep>;}; /* (a) Multi Element */ | 
|  | mcodec_C4_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu_C1_ep>; }; /* (4) connected CPU */ | 
|  | }; | 
|  | port@2 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | reg = <2>; | 
|  | mcodec_Cb_ep:   endpoint@0 { reg = <0>; remote-endpoint = <&codec1_9_ep>;}; /* (b) Multi Element */ | 
|  | mcodec_C5_0_ep: endpoint@1 { reg = <1>; remote-endpoint = <&mcpu_C2_ep>; }; /* (5) connected CPU */ | 
|  | mcodec_C5_1_ep: endpoint@2 { reg = <2>; remote-endpoint = <&mcpu_C3_ep>; }; /* (5) connected CPU */ | 
|  | }; | 
|  | }; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | test_cpu_1 { | 
|  | /* | 
|  | * 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 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  |  | 
|  | bitclock-master; | 
|  | frame-master; | 
|  |  | 
|  | /* [Normal] */ | 
|  | cpu1_0:	port@0 { reg = <0>; cpu1_0_ep: endpoint { remote-endpoint = <&codec1_0_ep>;}; }; | 
|  | /* [Semi-Multi] */ | 
|  | sm:	port@1 { reg = <1>; cpu1_1_ep: endpoint { remote-endpoint = <&smcodec_ep>; }; }; | 
|  | /* [Multi-CPU-A] */ | 
|  | port@2 { reg = <2>; cpu1_2_ep: endpoint { remote-endpoint = <&mcpu_AA_ep>; }; }; | 
|  | port@3 { reg = <3>; cpu1_3_ep: endpoint { remote-endpoint = <&mcpu_AB_ep>; }; }; | 
|  | /* [Multi-CPU-B] */ | 
|  | port@4 { reg = <4>; cpu1_4_ep: endpoint { remote-endpoint = <&mcpu_BA_ep>; }; }; | 
|  | port@5 { reg = <5>; cpu1_5_ep: endpoint { remote-endpoint = <&mcpu_BB_ep>; }; }; | 
|  | /* [Multi-CPU-C] */ | 
|  | port@6 { reg = <6>; cpu1_6_ep: endpoint { remote-endpoint = <&mcpu_CA_ep>; }; }; | 
|  | port@7 { reg = <7>; cpu1_7_ep: endpoint { remote-endpoint = <&mcpu_CB_ep>; }; }; | 
|  | port@8 { reg = <8>; cpu1_8_ep: endpoint { remote-endpoint = <&mcpu_CC_ep>; }; }; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | test_codec_1 { | 
|  | /* | 
|  | * 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 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  |  | 
|  | /* [Normal] */ | 
|  | port@0 { reg = <0>; codec1_0_ep: endpoint { remote-endpoint = <&cpu1_0_ep>;    }; }; | 
|  | /* [Semi-Multi] */ | 
|  | port@1 { reg = <1>; codec1_1_ep: endpoint { remote-endpoint = <&smcodec_A_ep>; }; }; | 
|  | port@2 { reg = <2>; codec1_2_ep: endpoint { remote-endpoint = <&smcodec_B_ep>; }; }; | 
|  | /* [Multi-Codec-0] */ | 
|  | port@3 { reg = <3>; codec1_3_ep: endpoint { remote-endpoint = <&mcodec_Aa_ep>; }; }; | 
|  | port@4 { reg = <4>; codec1_4_ep: endpoint { remote-endpoint = <&mcodec_Ab_ep>; }; }; | 
|  | /* [Multi-Codec-1] */ | 
|  | port@5 { reg = <5>; codec1_5_ep: endpoint { remote-endpoint = <&mcodec_Ba_ep>; }; }; | 
|  | port@6 { reg = <6>; codec1_6_ep: endpoint { remote-endpoint = <&mcodec_Bb_ep>; }; }; | 
|  | port@7 { reg = <7>; codec1_7_ep: endpoint { remote-endpoint = <&mcodec_Bc_ep>; }; }; | 
|  | /* [Multi-Codec-2] */ | 
|  | port@8 { reg = <8>; codec1_8_ep: endpoint { remote-endpoint = <&mcodec_Ca_ep>; }; }; | 
|  | port@9 { reg = <9>; codec1_9_ep: endpoint { remote-endpoint = <&mcodec_Cb_ep>; }; }; | 
|  | }; | 
|  | }; | 
|  | }; |