1d5ac70f0Sopenharmony_ci/*
2d5ac70f0Sopenharmony_ci *
3d5ac70f0Sopenharmony_ci *  This library is free software; you can redistribute it and/or modify
4d5ac70f0Sopenharmony_ci *  it under the terms of the GNU Lesser General Public License as
5d5ac70f0Sopenharmony_ci *  published by the Free Software Foundation; either version 2.1 of
6d5ac70f0Sopenharmony_ci *  the License, or (at your option) any later version.
7d5ac70f0Sopenharmony_ci *
8d5ac70f0Sopenharmony_ci *  This program is distributed in the hope that it will be useful,
9d5ac70f0Sopenharmony_ci *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10d5ac70f0Sopenharmony_ci *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11d5ac70f0Sopenharmony_ci *  GNU Lesser General Public License for more details.
12d5ac70f0Sopenharmony_ci *
13d5ac70f0Sopenharmony_ci *  You should have received a copy of the GNU Lesser General Public
14d5ac70f0Sopenharmony_ci *  License along with this library; if not, write to the Free Software
15d5ac70f0Sopenharmony_ci *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
16d5ac70f0Sopenharmony_ci *
17d5ac70f0Sopenharmony_ci *  Copyright (C) 2015 Intel Corporation
18d5ac70f0Sopenharmony_ci *
19d5ac70f0Sopenharmony_ci */
20d5ac70f0Sopenharmony_ci
21d5ac70f0Sopenharmony_ci#ifndef __ALSA_TOPOLOGY_H
22d5ac70f0Sopenharmony_ci#define __ALSA_TOPOLOGY_H
23d5ac70f0Sopenharmony_ci
24d5ac70f0Sopenharmony_ci#include <stdint.h>
25d5ac70f0Sopenharmony_ci
26d5ac70f0Sopenharmony_ci#ifdef __cplusplus
27d5ac70f0Sopenharmony_ciextern "C" {
28d5ac70f0Sopenharmony_ci#endif
29d5ac70f0Sopenharmony_ci
30d5ac70f0Sopenharmony_ci/**
31d5ac70f0Sopenharmony_ci * \defgroup topology Topology Interface
32d5ac70f0Sopenharmony_ci * \{
33d5ac70f0Sopenharmony_ci */
34d5ac70f0Sopenharmony_ci
35d5ac70f0Sopenharmony_ci/*! \page topology ALSA Topology Interface
36d5ac70f0Sopenharmony_ci *
37d5ac70f0Sopenharmony_ci * The topology interface allows developers to define DSP topologies in a text
38d5ac70f0Sopenharmony_ci * file format and to convert the text topology to a binary topology
39d5ac70f0Sopenharmony_ci * representation that can be understood by the kernel. The topology core
40d5ac70f0Sopenharmony_ci * currently recognises the following object types :-
41d5ac70f0Sopenharmony_ci *
42d5ac70f0Sopenharmony_ci *  * Controls (mixer, enumerated and byte) including TLV data.
43d5ac70f0Sopenharmony_ci *  * PCMs (Front End DAI & DAI link)
44d5ac70f0Sopenharmony_ci *  * DAPM widgets
45d5ac70f0Sopenharmony_ci *  * DAPM graph elements.
46d5ac70f0Sopenharmony_ci *  * Physical DAI & DAI links
47d5ac70f0Sopenharmony_ci *  * Private data for each object type.
48d5ac70f0Sopenharmony_ci *  * Manifest (containing count of each object type)
49d5ac70f0Sopenharmony_ci *
50d5ac70f0Sopenharmony_ci * <h3>Topology File Format</h3>
51d5ac70f0Sopenharmony_ci *
52d5ac70f0Sopenharmony_ci * The topology text format uses the standard ALSA configuration file format to
53d5ac70f0Sopenharmony_ci * describe each topology object type. This allows topology objects to include
54d5ac70f0Sopenharmony_ci * other topology objects as part of their definition. i.e. a TLV data object
55d5ac70f0Sopenharmony_ci * can be shared amongst many control objects that use the same TLV data.
56d5ac70f0Sopenharmony_ci *
57d5ac70f0Sopenharmony_ci *
58d5ac70f0Sopenharmony_ci * <h4>Controls</h4>
59d5ac70f0Sopenharmony_ci * Topology audio controls can belong to three different types :-
60d5ac70f0Sopenharmony_ci *   * Mixer control
61d5ac70f0Sopenharmony_ci *   * Enumerated control
62d5ac70f0Sopenharmony_ci *   * Byte control
63d5ac70f0Sopenharmony_ci *
64d5ac70f0Sopenharmony_ci * Each control type can contain TLV data, private data, operations and also
65d5ac70f0Sopenharmony_ci * belong to widget objects.<br>
66d5ac70f0Sopenharmony_ci *
67d5ac70f0Sopenharmony_ci * <h5>Control Operations</h5>
68d5ac70f0Sopenharmony_ci * Driver Kcontrol callback info(), get() and put() operations are mapped with
69d5ac70f0Sopenharmony_ci * the CTL ops section in topology configuration files. The ctl ops section can
70d5ac70f0Sopenharmony_ci * assign operations using the standard names (listed below) for the standard
71d5ac70f0Sopenharmony_ci * kcontrol types or use ID numbers (>256) to map to bespoke driver controls.<br>
72d5ac70f0Sopenharmony_ci *
73d5ac70f0Sopenharmony_ci * <pre>
74d5ac70f0Sopenharmony_ci *
75d5ac70f0Sopenharmony_ci *	ops."ctl" {
76d5ac70f0Sopenharmony_ci *		info "volsw"
77d5ac70f0Sopenharmony_ci *		get "257"
78d5ac70f0Sopenharmony_ci *		put "257"
79d5ac70f0Sopenharmony_ci *	}
80d5ac70f0Sopenharmony_ci *
81d5ac70f0Sopenharmony_ci * </pre>
82d5ac70f0Sopenharmony_ci *
83d5ac70f0Sopenharmony_ci * This mapping shows info() using the standard "volsw" info callback whilst
84d5ac70f0Sopenharmony_ci * the get() and put() are mapped to bespoke driver callbacks. <br>
85d5ac70f0Sopenharmony_ci *
86d5ac70f0Sopenharmony_ci * The Standard operations names for control get(), put() and info calls
87d5ac70f0Sopenharmony_ci * are :-
88d5ac70f0Sopenharmony_ci *  * volsw
89d5ac70f0Sopenharmony_ci *  * volsw_sx
90d5ac70f0Sopenharmony_ci *  * volsw_xr_sx
91d5ac70f0Sopenharmony_ci *  * enum
92d5ac70f0Sopenharmony_ci *  * bytes
93d5ac70f0Sopenharmony_ci *  * enum_value
94d5ac70f0Sopenharmony_ci *  * range
95d5ac70f0Sopenharmony_ci *  * strobe
96d5ac70f0Sopenharmony_ci *
97d5ac70f0Sopenharmony_ci* <h5>Control Access</h5>
98d5ac70f0Sopenharmony_ci * Controls access can be specified using the "access" section. If no "access"
99d5ac70f0Sopenharmony_ci * section is defined then default RW access flags are set for normal and TLV
100d5ac70f0Sopenharmony_ci * controls.
101d5ac70f0Sopenharmony_ci *
102d5ac70f0Sopenharmony_ci * <pre>
103d5ac70f0Sopenharmony_ci *	access [
104d5ac70f0Sopenharmony_ci *		read
105d5ac70f0Sopenharmony_ci *		write
106d5ac70f0Sopenharmony_ci *		tlv_command
107d5ac70f0Sopenharmony_ci *	]
108d5ac70f0Sopenharmony_ci * </pre>
109d5ac70f0Sopenharmony_ci *
110d5ac70f0Sopenharmony_ci * The standard access flags are as follows :-
111d5ac70f0Sopenharmony_ci *  * read
112d5ac70f0Sopenharmony_ci *  * write
113d5ac70f0Sopenharmony_ci *  * read_write
114d5ac70f0Sopenharmony_ci *  * volatile
115d5ac70f0Sopenharmony_ci *  * timestamp
116d5ac70f0Sopenharmony_ci *  * tlv_read
117d5ac70f0Sopenharmony_ci *  * tlv_write
118d5ac70f0Sopenharmony_ci *  * tlv_read_write
119d5ac70f0Sopenharmony_ci *  * tlv_command
120d5ac70f0Sopenharmony_ci *  * inactive
121d5ac70f0Sopenharmony_ci *  * lock
122d5ac70f0Sopenharmony_ci *  * owner
123d5ac70f0Sopenharmony_ci *  * tlv_callback
124d5ac70f0Sopenharmony_ci *  * user
125d5ac70f0Sopenharmony_ci *
126d5ac70f0Sopenharmony_ci * <h5>Control TLV Data</h5>
127d5ac70f0Sopenharmony_ci * Controls can also use TLV data to represent dB information. This can be done
128d5ac70f0Sopenharmony_ci * by defining a TLV section and using the TLV section within the control.
129d5ac70f0Sopenharmony_ci * The TLV data for DBScale types are defined as follows :-
130d5ac70f0Sopenharmony_ci *
131d5ac70f0Sopenharmony_ci * <pre>
132d5ac70f0Sopenharmony_ci *	scale {
133d5ac70f0Sopenharmony_ci *		min "-9000"
134d5ac70f0Sopenharmony_ci *		step "300"
135d5ac70f0Sopenharmony_ci *		mute "1"
136d5ac70f0Sopenharmony_ci *	}
137d5ac70f0Sopenharmony_ci * </pre>
138d5ac70f0Sopenharmony_ci *
139d5ac70f0Sopenharmony_ci * Where the meanings and values for min, step and mute are exactly the same
140d5ac70f0Sopenharmony_ci * as defined in driver code.
141d5ac70f0Sopenharmony_ci *
142d5ac70f0Sopenharmony_ci * <h5>Control Channel Mapping</h5>
143d5ac70f0Sopenharmony_ci * Controls can also specify which channels they are mapped with. This is useful
144d5ac70f0Sopenharmony_ci * for userspace as it allows applications to determine the correct control
145d5ac70f0Sopenharmony_ci * channel for Left and Right etc. Channel maps are defined as follows :-
146d5ac70f0Sopenharmony_ci *
147d5ac70f0Sopenharmony_ci * <pre>
148d5ac70f0Sopenharmony_ci *	channel."name" {
149d5ac70f0Sopenharmony_ci *		reg "0"
150d5ac70f0Sopenharmony_ci *		shift "0"
151d5ac70f0Sopenharmony_ci *	}
152d5ac70f0Sopenharmony_ci * </pre>
153d5ac70f0Sopenharmony_ci *
154d5ac70f0Sopenharmony_ci * The channel map reg is the register offset for the control, shift is the
155d5ac70f0Sopenharmony_ci * bit shift within the register for the channel and the section name is the
156d5ac70f0Sopenharmony_ci * channel name and can be one of the following :-
157d5ac70f0Sopenharmony_ci *
158d5ac70f0Sopenharmony_ci * <pre>
159d5ac70f0Sopenharmony_ci *  * mono		# mono stream
160d5ac70f0Sopenharmony_ci *  * fl 		# front left
161d5ac70f0Sopenharmony_ci *  * fr		# front right
162d5ac70f0Sopenharmony_ci *  * rl		# rear left
163d5ac70f0Sopenharmony_ci *  * rr		# rear right
164d5ac70f0Sopenharmony_ci *  * fc		# front center
165d5ac70f0Sopenharmony_ci *  * lfe		# LFE
166d5ac70f0Sopenharmony_ci *  * sl		# side left
167d5ac70f0Sopenharmony_ci *  * sr		# side right
168d5ac70f0Sopenharmony_ci *  * rc		# rear center
169d5ac70f0Sopenharmony_ci *  * flc		# front left center
170d5ac70f0Sopenharmony_ci *  * frc		# front right center
171d5ac70f0Sopenharmony_ci *  * rlc		# rear left center
172d5ac70f0Sopenharmony_ci *  * rrc		# rear right center
173d5ac70f0Sopenharmony_ci *  * flw		# front left wide
174d5ac70f0Sopenharmony_ci *  * frw		# front right wide
175d5ac70f0Sopenharmony_ci *  * flh		# front left high
176d5ac70f0Sopenharmony_ci *  * fch		# front center high
177d5ac70f0Sopenharmony_ci *  * frh		# front right high
178d5ac70f0Sopenharmony_ci *  * tc		# top center
179d5ac70f0Sopenharmony_ci *  * tfl		# top front left
180d5ac70f0Sopenharmony_ci *  * tfr		# top front right
181d5ac70f0Sopenharmony_ci *  * tfc		# top front center
182d5ac70f0Sopenharmony_ci *  * trl		# top rear left
183d5ac70f0Sopenharmony_ci *  * trr		# top rear right
184d5ac70f0Sopenharmony_ci *  * trc		# top rear center
185d5ac70f0Sopenharmony_ci *  * tflc		# top front left center
186d5ac70f0Sopenharmony_ci *  * tfrc		# top front right center
187d5ac70f0Sopenharmony_ci *  * tsl		# top side left
188d5ac70f0Sopenharmony_ci *  * tsr		# top side right
189d5ac70f0Sopenharmony_ci *  * llfe		# left LFE
190d5ac70f0Sopenharmony_ci *  * rlfe		# right LFE
191d5ac70f0Sopenharmony_ci *  * bc		# bottom center
192d5ac70f0Sopenharmony_ci *  * blc		# bottom left center
193d5ac70f0Sopenharmony_ci *  * brc		# bottom right center
194d5ac70f0Sopenharmony_ci * </pre>
195d5ac70f0Sopenharmony_ci *
196d5ac70f0Sopenharmony_ci *  <h5>Control Private Data</h5>
197d5ac70f0Sopenharmony_ci * Controls can also have private data. This can be done by defining a private
198d5ac70f0Sopenharmony_ci * data section and including the section within the control. The private data
199d5ac70f0Sopenharmony_ci * section is defined as follows :-
200d5ac70f0Sopenharmony_ci *
201d5ac70f0Sopenharmony_ci * <pre>
202d5ac70f0Sopenharmony_ci * SectionData."pdata for EQU1" {
203d5ac70f0Sopenharmony_ci *	file "/path/to/file"
204d5ac70f0Sopenharmony_ci *	bytes "0x12,0x34,0x56,0x78"
205d5ac70f0Sopenharmony_ci *	shorts "0x1122,0x3344,0x5566,0x7788"
206d5ac70f0Sopenharmony_ci *	words "0xaabbccdd,0x11223344,0x66aa77bb,0xefef1234"
207d5ac70f0Sopenharmony_ci *	tuples "section id of the vendor tuples"
208d5ac70f0Sopenharmony_ci * };
209d5ac70f0Sopenharmony_ci * </pre>
210d5ac70f0Sopenharmony_ci * The file, bytes, shorts, words and tuples keywords are all mutually
211d5ac70f0Sopenharmony_ci * exclusive as the private data should only be taken from one source.
212d5ac70f0Sopenharmony_ci * The private data can either be read from a separate file or defined in
213d5ac70f0Sopenharmony_ci * the topology file using the bytes, shorts, words or tuples keywords.
214d5ac70f0Sopenharmony_ci * The keyword tuples is to define vendor specific tuples. Please refer to
215d5ac70f0Sopenharmony_ci * section Vendor Tokens and Vendor tuples.
216d5ac70f0Sopenharmony_ci *
217d5ac70f0Sopenharmony_ci * It's easy to use a vendor tuples object to define a C structure instance.
218d5ac70f0Sopenharmony_ci * And a data section can include multiple vendor tuples objects:
219d5ac70f0Sopenharmony_ci *
220d5ac70f0Sopenharmony_ci * <pre>
221d5ac70f0Sopenharmony_ci * SectionData."data element name" {
222d5ac70f0Sopenharmony_ci *	index "1"	# Index number
223d5ac70f0Sopenharmony_ci *	tuples [
224d5ac70f0Sopenharmony_ci *		"id of the 1st vendor tuples section"
225d5ac70f0Sopenharmony_ci *		"id of the 2nd vendor tuples section"
226d5ac70f0Sopenharmony_ci *		...
227d5ac70f0Sopenharmony_ci *	]
228d5ac70f0Sopenharmony_ci * };
229d5ac70f0Sopenharmony_ci * </pre>
230d5ac70f0Sopenharmony_ci *
231d5ac70f0Sopenharmony_ci * <h5>How to define an element with private data</h5>
232d5ac70f0Sopenharmony_ci * An element can refer to a single data section or multiple data
233d5ac70f0Sopenharmony_ci * sections.
234d5ac70f0Sopenharmony_ci *
235d5ac70f0Sopenharmony_ci * <h6>To refer to a single data section:</h6>
236d5ac70f0Sopenharmony_ci * <pre>
237d5ac70f0Sopenharmony_ci * Sectionxxx."element name" {
238d5ac70f0Sopenharmony_ci *    ...
239d5ac70f0Sopenharmony_ci *	data "name of data section"		# optional private data
240d5ac70f0Sopenharmony_ci * }
241d5ac70f0Sopenharmony_ci * </pre>
242d5ac70f0Sopenharmony_ci *
243d5ac70f0Sopenharmony_ci * <h6>To refer to multiple data sections:</h6>
244d5ac70f0Sopenharmony_ci * <pre>
245d5ac70f0Sopenharmony_ci * Sectionxxx."element name" {
246d5ac70f0Sopenharmony_ci *	...
247d5ac70f0Sopenharmony_ci *	data [						# optional private data
248d5ac70f0Sopenharmony_ci *		"name of 1st data section"
249d5ac70f0Sopenharmony_ci *		"name of 2nd data section"
250d5ac70f0Sopenharmony_ci *		...
251d5ac70f0Sopenharmony_ci *	]
252d5ac70f0Sopenharmony_ci * }
253d5ac70f0Sopenharmony_ci * </pre>
254d5ac70f0Sopenharmony_ci * And data of these sections will be merged in the same order as they are
255d5ac70f0Sopenharmony_ci * in the list, as the element's private data for kernel.
256d5ac70f0Sopenharmony_ci *
257d5ac70f0Sopenharmony_ci *  <h6>Vendor Tokens</h6>
258d5ac70f0Sopenharmony_ci * A vendor token list is defined as a new section. Each token element is
259d5ac70f0Sopenharmony_ci * a pair of string ID and integer value. And both the ID and value are
260d5ac70f0Sopenharmony_ci * vendor-specific.
261d5ac70f0Sopenharmony_ci *
262d5ac70f0Sopenharmony_ci * <pre>
263d5ac70f0Sopenharmony_ci * SectionVendorTokens."id of the vendor tokens" {
264d5ac70f0Sopenharmony_ci *	comment "optional comments"
265d5ac70f0Sopenharmony_ci *	VENDOR_TOKEN_ID1 "1"
266d5ac70f0Sopenharmony_ci *	VENDOR_TOKEN_ID2 "2"
267d5ac70f0Sopenharmony_ci *	VENDOR_TOKEN_ID3 "3"
268d5ac70f0Sopenharmony_ci *	...
269d5ac70f0Sopenharmony_ci * }
270d5ac70f0Sopenharmony_ci * </pre>
271d5ac70f0Sopenharmony_ci *
272d5ac70f0Sopenharmony_ci *  <h6>Vendor Tuples</h6>
273d5ac70f0Sopenharmony_ci * Vendor tuples are defined as a new section. It contains a reference to
274d5ac70f0Sopenharmony_ci * a vendor token list and several tuple arrays.
275d5ac70f0Sopenharmony_ci * All arrays share a vendor token list, defined by the tokens keyword.
276d5ac70f0Sopenharmony_ci * Each tuple array is for a specific type, defined by the string following
277d5ac70f0Sopenharmony_ci * the tuples keyword. Supported types are: string, uuid, bool, byte,
278d5ac70f0Sopenharmony_ci * short and word.
279d5ac70f0Sopenharmony_ci *
280d5ac70f0Sopenharmony_ci * <pre>
281d5ac70f0Sopenharmony_ci * SectionVendorTuples."id of the vendor tuples" {
282d5ac70f0Sopenharmony_ci *	tokens "id of the vendor tokens"
283d5ac70f0Sopenharmony_ci *
284d5ac70f0Sopenharmony_ci *	tuples."string" {
285d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID1 "character string"
286d5ac70f0Sopenharmony_ci *		...
287d5ac70f0Sopenharmony_ci *	}
288d5ac70f0Sopenharmony_ci *
289d5ac70f0Sopenharmony_ci *	tuples."uuid" {			# 16 characters separated by commas
290d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID2 "0x01,0x02,...,0x0f"
291d5ac70f0Sopenharmony_ci *		...
292d5ac70f0Sopenharmony_ci *	}
293d5ac70f0Sopenharmony_ci *
294d5ac70f0Sopenharmony_ci *	tuples."bool" {
295d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID3 "true/false"
296d5ac70f0Sopenharmony_ci *		...
297d5ac70f0Sopenharmony_ci *	}
298d5ac70f0Sopenharmony_ci *
299d5ac70f0Sopenharmony_ci *	tuples."byte" {
300d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID4 "0x11"
301d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID5 "0x22"
302d5ac70f0Sopenharmony_ci *		...
303d5ac70f0Sopenharmony_ci *	}
304d5ac70f0Sopenharmony_ci *
305d5ac70f0Sopenharmony_ci *	tuples."short" {
306d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID6 "0x1122"
307d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID7 "0x3344"
308d5ac70f0Sopenharmony_ci *		...
309d5ac70f0Sopenharmony_ci *	}
310d5ac70f0Sopenharmony_ci *
311d5ac70f0Sopenharmony_ci *	tuples."word" {
312d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID8 "0x11223344"
313d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_ID9 "0x55667788"
314d5ac70f0Sopenharmony_ci *		...
315d5ac70f0Sopenharmony_ci *	}
316d5ac70f0Sopenharmony_ci * }
317d5ac70f0Sopenharmony_ci * </pre>
318d5ac70f0Sopenharmony_ci * To define multiple vendor tuples of same type, please append some
319d5ac70f0Sopenharmony_ci * characters after the type string ("string", "uuid", "bool", "byte", "short"
320d5ac70f0Sopenharmony_ci * or "word"), to avoid ID duplication in the SectionVendorTuples.<br>
321d5ac70f0Sopenharmony_ci * The parser will check the first few characters in ID to get the tuple type.
322d5ac70f0Sopenharmony_ci * Here is an example:
323d5ac70f0Sopenharmony_ci * <pre>
324d5ac70f0Sopenharmony_ci * SectionVendorTuples."id of the vendor tuples" {
325d5ac70f0Sopenharmony_ci *    ...
326d5ac70f0Sopenharmony_ci *	tuples."word.module0" {
327d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_PARAM_ID1 "0x00112233"
328d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_PARAM_ID2 "0x44556677"
329d5ac70f0Sopenharmony_ci *		...
330d5ac70f0Sopenharmony_ci *	}
331d5ac70f0Sopenharmony_ci *
332d5ac70f0Sopenharmony_ci *	tuples."word.module2" {
333d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_PARAM_ID1 "0x11223344"
334d5ac70f0Sopenharmony_ci *		VENDOR_TOKEN_PARAM_ID2 "0x55667788"
335d5ac70f0Sopenharmony_ci *		...
336d5ac70f0Sopenharmony_ci *	}
337d5ac70f0Sopenharmony_ci *	...
338d5ac70f0Sopenharmony_ci * }
339d5ac70f0Sopenharmony_ci *
340d5ac70f0Sopenharmony_ci * </pre>
341d5ac70f0Sopenharmony_ci *
342d5ac70f0Sopenharmony_ci * <h5>Mixer Controls</h5>
343d5ac70f0Sopenharmony_ci * A mixer control is defined as a new section that can include channel mapping,
344d5ac70f0Sopenharmony_ci * TLV data, callback operations and private data. The mixer section also
345d5ac70f0Sopenharmony_ci * includes a few other config options that are shown here :-
346d5ac70f0Sopenharmony_ci *
347d5ac70f0Sopenharmony_ci * <pre>
348d5ac70f0Sopenharmony_ci * SectionControlMixer."mixer name" {
349d5ac70f0Sopenharmony_ci *	comment "optional comments"
350d5ac70f0Sopenharmony_ci *
351d5ac70f0Sopenharmony_ci *	index "1"			# Index number
352d5ac70f0Sopenharmony_ci *
353d5ac70f0Sopenharmony_ci *	channel."name" {		# Channel maps
354d5ac70f0Sopenharmony_ci *	   ....
355d5ac70f0Sopenharmony_ci *	}
356d5ac70f0Sopenharmony_ci *
357d5ac70f0Sopenharmony_ci *	ops."ctl" {			# Ops callback functions
358d5ac70f0Sopenharmony_ci *	   ....
359d5ac70f0Sopenharmony_ci *	}
360d5ac70f0Sopenharmony_ci *
361d5ac70f0Sopenharmony_ci *	max "32"			# Max control value
362d5ac70f0Sopenharmony_ci *	invert "0"			# Whether control values are inverted
363d5ac70f0Sopenharmony_ci *
364d5ac70f0Sopenharmony_ci *	tlv "tld_data"			# optional TLV data
365d5ac70f0Sopenharmony_ci *
366d5ac70f0Sopenharmony_ci *	data "pdata for mixer1"		# optional private data
367d5ac70f0Sopenharmony_ci * }
368d5ac70f0Sopenharmony_ci * </pre>
369d5ac70f0Sopenharmony_ci *
370d5ac70f0Sopenharmony_ci * The section name is used to define the mixer name. The index number can be
371d5ac70f0Sopenharmony_ci * used to identify topology objects groups(index "0" is common, fit for all
372d5ac70f0Sopenharmony_ci * user cases).This allows driver operations on objects with index number N and
373d5ac70f0Sopenharmony_ci * can be used to add/remove pipelines of objects whilst other objects are
374d5ac70f0Sopenharmony_ci * unaffected.
375d5ac70f0Sopenharmony_ci *
376d5ac70f0Sopenharmony_ci * <h5>Byte Controls</h5>
377d5ac70f0Sopenharmony_ci * A byte control is defined as a new section that can include channel mapping,
378d5ac70f0Sopenharmony_ci * TLV data, callback operations and private data. The bytes section also
379d5ac70f0Sopenharmony_ci * includes a few other config options that are shown here :-
380d5ac70f0Sopenharmony_ci *
381d5ac70f0Sopenharmony_ci * <pre>
382d5ac70f0Sopenharmony_ci * SectionControlBytes."name" {
383d5ac70f0Sopenharmony_ci *	comment "optional comments"
384d5ac70f0Sopenharmony_ci *
385d5ac70f0Sopenharmony_ci *	index "1"			# Index number
386d5ac70f0Sopenharmony_ci *
387d5ac70f0Sopenharmony_ci *	channel."name" {		# Channel maps
388d5ac70f0Sopenharmony_ci *	   ....
389d5ac70f0Sopenharmony_ci *	}
390d5ac70f0Sopenharmony_ci *
391d5ac70f0Sopenharmony_ci *	ops."ctl" {			# Ops callback functions
392d5ac70f0Sopenharmony_ci *	   ....
393d5ac70f0Sopenharmony_ci *	}
394d5ac70f0Sopenharmony_ci *
395d5ac70f0Sopenharmony_ci *	base "0"			# Register base
396d5ac70f0Sopenharmony_ci *	num_regs "16"			# Number of registers
397d5ac70f0Sopenharmony_ci *	mask "0xff"			# Mask
398d5ac70f0Sopenharmony_ci *	max "255"			# Maximum value
399d5ac70f0Sopenharmony_ci *
400d5ac70f0Sopenharmony_ci *	tlv "tld_data"			# optional TLV data
401d5ac70f0Sopenharmony_ci *
402d5ac70f0Sopenharmony_ci *	data "pdata for mixer1"		# optional private data
403d5ac70f0Sopenharmony_ci * }
404d5ac70f0Sopenharmony_ci * </pre>
405d5ac70f0Sopenharmony_ci *
406d5ac70f0Sopenharmony_ci * <h5>Enumerated Controls</h5>
407d5ac70f0Sopenharmony_ci * A enumerated control is defined as a new section (like mixer and byte) that
408d5ac70f0Sopenharmony_ci * can include channel mapping, callback operations, private data and
409d5ac70f0Sopenharmony_ci * text strings to represent the enumerated control options.<br>
410d5ac70f0Sopenharmony_ci *
411d5ac70f0Sopenharmony_ci * The text strings for the enumerated controls are defined in a separate
412d5ac70f0Sopenharmony_ci * section as follows :-
413d5ac70f0Sopenharmony_ci *
414d5ac70f0Sopenharmony_ci * <pre>
415d5ac70f0Sopenharmony_ci * SectionText."name" {
416d5ac70f0Sopenharmony_ci *
417d5ac70f0Sopenharmony_ci *		Values [
418d5ac70f0Sopenharmony_ci *			"value1"
419d5ac70f0Sopenharmony_ci *			"value2"
420d5ac70f0Sopenharmony_ci *			"value3"
421d5ac70f0Sopenharmony_ci *		]
422d5ac70f0Sopenharmony_ci * }
423d5ac70f0Sopenharmony_ci * </pre>
424d5ac70f0Sopenharmony_ci *
425d5ac70f0Sopenharmony_ci * All the enumerated text values are listed in the values list.<br>
426d5ac70f0Sopenharmony_ci * The enumerated control is similar to the other controls and defined as
427d5ac70f0Sopenharmony_ci * follows :-
428d5ac70f0Sopenharmony_ci *
429d5ac70f0Sopenharmony_ci * <pre>
430d5ac70f0Sopenharmony_ci * SectionControlMixer."name" {
431d5ac70f0Sopenharmony_ci *	comment "optional comments"
432d5ac70f0Sopenharmony_ci *
433d5ac70f0Sopenharmony_ci *	index "1"			# Index number
434d5ac70f0Sopenharmony_ci *
435d5ac70f0Sopenharmony_ci *	texts "EQU1"			# Enumerated text items
436d5ac70f0Sopenharmony_ci *
437d5ac70f0Sopenharmony_ci *	channel."name" {		# Channel maps
438d5ac70f0Sopenharmony_ci *	   ....
439d5ac70f0Sopenharmony_ci *	}
440d5ac70f0Sopenharmony_ci *
441d5ac70f0Sopenharmony_ci *	ops."ctl" {			# Ops callback functions
442d5ac70f0Sopenharmony_ci *	   ....
443d5ac70f0Sopenharmony_ci *	}
444d5ac70f0Sopenharmony_ci *
445d5ac70f0Sopenharmony_ci *	data "pdata for mixer1"		# optional private data
446d5ac70f0Sopenharmony_ci * }
447d5ac70f0Sopenharmony_ci * </pre>
448d5ac70f0Sopenharmony_ci *
449d5ac70f0Sopenharmony_ci * <h4>DAPM Graph</h4>
450d5ac70f0Sopenharmony_ci * DAPM graphs can easily be defined using the topology file. The format is
451d5ac70f0Sopenharmony_ci * very similar to the DAPM graph kernel format. :-
452d5ac70f0Sopenharmony_ci *
453d5ac70f0Sopenharmony_ci * <pre>
454d5ac70f0Sopenharmony_ci * SectionGraph."dsp" {
455d5ac70f0Sopenharmony_ci *	index "1"			# Index number
456d5ac70f0Sopenharmony_ci *
457d5ac70f0Sopenharmony_ci *	lines [
458d5ac70f0Sopenharmony_ci *		"sink1, control, source1"
459d5ac70f0Sopenharmony_ci *		"sink2, , source2"
460d5ac70f0Sopenharmony_ci *	]
461d5ac70f0Sopenharmony_ci * }
462d5ac70f0Sopenharmony_ci * </pre>
463d5ac70f0Sopenharmony_ci *
464d5ac70f0Sopenharmony_ci * The lines in the graph are defined as a variable size list of sinks,
465d5ac70f0Sopenharmony_ci * controls and sources. The control name is optional as some graph lines have
466d5ac70f0Sopenharmony_ci * no associated controls. The section name can be used to differentiate the
467d5ac70f0Sopenharmony_ci * graph with other graphs, it's not used by the kernel atm.
468d5ac70f0Sopenharmony_ci *
469d5ac70f0Sopenharmony_ci * <h4>DAPM Widgets</h4>
470d5ac70f0Sopenharmony_ci * DAPM widgets are similar to controls in that they can include many other
471d5ac70f0Sopenharmony_ci * objects. Widgets can contain private data, mixer controls and enum controls.
472d5ac70f0Sopenharmony_ci *
473d5ac70f0Sopenharmony_ci * The following widget types are supported and match the driver types :-
474d5ac70f0Sopenharmony_ci *
475d5ac70f0Sopenharmony_ci *  * input
476d5ac70f0Sopenharmony_ci *  * output
477d5ac70f0Sopenharmony_ci *  * mux
478d5ac70f0Sopenharmony_ci *  * mixer
479d5ac70f0Sopenharmony_ci *  * pga
480d5ac70f0Sopenharmony_ci *  * out_drv
481d5ac70f0Sopenharmony_ci *  * adc
482d5ac70f0Sopenharmony_ci *  * dac
483d5ac70f0Sopenharmony_ci *  * switch
484d5ac70f0Sopenharmony_ci *  * pre
485d5ac70f0Sopenharmony_ci *  * post
486d5ac70f0Sopenharmony_ci *  * aif_in
487d5ac70f0Sopenharmony_ci *  * aif_out
488d5ac70f0Sopenharmony_ci *  * dai_in
489d5ac70f0Sopenharmony_ci *  * dai_out
490d5ac70f0Sopenharmony_ci *  * dai_link
491d5ac70f0Sopenharmony_ci *
492d5ac70f0Sopenharmony_ci * Widgets are defined as follows :-
493d5ac70f0Sopenharmony_ci *
494d5ac70f0Sopenharmony_ci * <pre>
495d5ac70f0Sopenharmony_ci * SectionWidget."name" {
496d5ac70f0Sopenharmony_ci *
497d5ac70f0Sopenharmony_ci *	index "1"			# Index number
498d5ac70f0Sopenharmony_ci *
499d5ac70f0Sopenharmony_ci *	type "aif_in"			# Widget type - detailed above
500d5ac70f0Sopenharmony_ci *	stream_name "name"		# Stream name
501d5ac70f0Sopenharmony_ci *
502d5ac70f0Sopenharmony_ci *	no_pm "true"			# No PM control bit.
503d5ac70f0Sopenharmony_ci *	reg "20"			# PM bit register offset
504d5ac70f0Sopenharmony_ci *	shift "0"			# PM bit register shift
505d5ac70f0Sopenharmony_ci *	invert "1"			# PM bit is inverted
506d5ac70f0Sopenharmony_ci *	subseq "8"			# subsequence number
507d5ac70f0Sopenharmony_ci *
508d5ac70f0Sopenharmony_ci *	event_type "1"			# DAPM widget event type
509d5ac70f0Sopenharmony_ci *	event_flags "1"			# DAPM widget event flags
510d5ac70f0Sopenharmony_ci *
511d5ac70f0Sopenharmony_ci *	mixer "name"			# Optional Mixer Control
512d5ac70f0Sopenharmony_ci *	enum "name"			# Optional Enum Control
513d5ac70f0Sopenharmony_ci *
514d5ac70f0Sopenharmony_ci *	data "name"			# optional private data
515d5ac70f0Sopenharmony_ci * }
516d5ac70f0Sopenharmony_ci * </pre>
517d5ac70f0Sopenharmony_ci *
518d5ac70f0Sopenharmony_ci * The section name is the widget name. The mixer and enum fields are mutually
519d5ac70f0Sopenharmony_ci * exclusive and used to include controls into the widget. The index and data
520d5ac70f0Sopenharmony_ci * fields are the same for widgets as they are for controls whilst the other
521d5ac70f0Sopenharmony_ci * fields map on very closely to the driver widget fields.
522d5ac70f0Sopenharmony_ci *
523d5ac70f0Sopenharmony_ci * <h5>Widget Private Data</h5>
524d5ac70f0Sopenharmony_ci * Widget can have private data. For the format of the private data, please
525d5ac70f0Sopenharmony_ci * refer to section Control Private Data.
526d5ac70f0Sopenharmony_ci *
527d5ac70f0Sopenharmony_ci * <h4>PCM Capabilities</h4>
528d5ac70f0Sopenharmony_ci * Topology can also define the PCM capabilities of front end or physical DAIs.
529d5ac70f0Sopenharmony_ci * Capabilities can be defined with the following section :-
530d5ac70f0Sopenharmony_ci *
531d5ac70f0Sopenharmony_ci * <pre>
532d5ac70f0Sopenharmony_ci * SectionPCMCapabilities."name" {
533d5ac70f0Sopenharmony_ci *
534d5ac70f0Sopenharmony_ci *	formats "S24_LE,S16_LE"		# Supported formats
535d5ac70f0Sopenharmony_ci *	rates "48000"			# Supported rates
536d5ac70f0Sopenharmony_ci *	rate_min "48000"		# Max supported sample rate
537d5ac70f0Sopenharmony_ci *	rate_max "48000"		# Min supported sample rate
538d5ac70f0Sopenharmony_ci *	channels_min "2"		# Min number of channels
539d5ac70f0Sopenharmony_ci *	channels_max "2"		# max number of channels
540d5ac70f0Sopenharmony_ci * }
541d5ac70f0Sopenharmony_ci * </pre>
542d5ac70f0Sopenharmony_ci * The supported formats use the same naming convention as the driver macros.
543d5ac70f0Sopenharmony_ci * The PCM capabilities name can be referred to and included by PCM and
544d5ac70f0Sopenharmony_ci * physical DAI sections.
545d5ac70f0Sopenharmony_ci *
546d5ac70f0Sopenharmony_ci * <h4>PCM Configurations</h4>
547d5ac70f0Sopenharmony_ci * PCM runtime configurations can be defined for playback and capture stream
548d5ac70f0Sopenharmony_ci * directions with the following section  :-
549d5ac70f0Sopenharmony_ci *
550d5ac70f0Sopenharmony_ci * <pre>
551d5ac70f0Sopenharmony_ci * SectionPCMConfig."name" {
552d5ac70f0Sopenharmony_ci *
553d5ac70f0Sopenharmony_ci *	config."playback" {		# playback config
554d5ac70f0Sopenharmony_ci *		format "S16_LE"		# playback format
555d5ac70f0Sopenharmony_ci *		rate "48000"		# playback sample rate
556d5ac70f0Sopenharmony_ci *		channels "2"		# playback channels
557d5ac70f0Sopenharmony_ci *		tdm_slot "0xf"		# playback TDM slot
558d5ac70f0Sopenharmony_ci *	}
559d5ac70f0Sopenharmony_ci *
560d5ac70f0Sopenharmony_ci *	config."capture" {		# capture config
561d5ac70f0Sopenharmony_ci *		format "S16_LE"		# capture format
562d5ac70f0Sopenharmony_ci *		rate "48000"		# capture sample rate
563d5ac70f0Sopenharmony_ci *		channels "2"		# capture channels
564d5ac70f0Sopenharmony_ci *		tdm_slot "0xf"		# capture TDM slot
565d5ac70f0Sopenharmony_ci *	}
566d5ac70f0Sopenharmony_ci * }
567d5ac70f0Sopenharmony_ci * </pre>
568d5ac70f0Sopenharmony_ci *
569d5ac70f0Sopenharmony_ci * The supported formats use the same naming convention as the driver macros.
570d5ac70f0Sopenharmony_ci * The PCM configuration name can be referred to and included by PCM and
571d5ac70f0Sopenharmony_ci * physical link sections.
572d5ac70f0Sopenharmony_ci *
573d5ac70f0Sopenharmony_ci * <h4>PCM (Front-end DAI & DAI link) </h4>
574d5ac70f0Sopenharmony_ci * PCM sections define the supported capabilities and configurations for
575d5ac70f0Sopenharmony_ci * supported playback and capture streams, names and flags for front end
576d5ac70f0Sopenharmony_ci * DAI & DAI links. Topology kernel driver will use a PCM object to create
577d5ac70f0Sopenharmony_ci * a pair of FE DAI & DAI links.
578d5ac70f0Sopenharmony_ci *
579d5ac70f0Sopenharmony_ci * <pre>
580d5ac70f0Sopenharmony_ci * SectionPCM."name" {
581d5ac70f0Sopenharmony_ci *
582d5ac70f0Sopenharmony_ci *	index "1"			# Index number
583d5ac70f0Sopenharmony_ci *
584d5ac70f0Sopenharmony_ci *	id "0"				# used for binding to the PCM
585d5ac70f0Sopenharmony_ci *
586d5ac70f0Sopenharmony_ci *	dai."name of front-end DAI" {
587d5ac70f0Sopenharmony_ci *		id "0"		# used for binding to the front-end DAI
588d5ac70f0Sopenharmony_ci *	}
589d5ac70f0Sopenharmony_ci *
590d5ac70f0Sopenharmony_ci *	pcm."playback" {
591d5ac70f0Sopenharmony_ci *		capabilities "capabilities1"	# capabilities for playback
592d5ac70f0Sopenharmony_ci *
593d5ac70f0Sopenharmony_ci *		configs [		# supported configs for playback
594d5ac70f0Sopenharmony_ci *			"config1"
595d5ac70f0Sopenharmony_ci *			"config2"
596d5ac70f0Sopenharmony_ci *		]
597d5ac70f0Sopenharmony_ci *	}
598d5ac70f0Sopenharmony_ci *
599d5ac70f0Sopenharmony_ci *	pcm."capture" {
600d5ac70f0Sopenharmony_ci *		capabilities "capabilities2"	# capabilities for capture
601d5ac70f0Sopenharmony_ci *
602d5ac70f0Sopenharmony_ci *		configs [		# supported configs for capture
603d5ac70f0Sopenharmony_ci *			"config1"
604d5ac70f0Sopenharmony_ci *			"config2"
605d5ac70f0Sopenharmony_ci *			"config3"
606d5ac70f0Sopenharmony_ci *		]
607d5ac70f0Sopenharmony_ci *	}
608d5ac70f0Sopenharmony_ci *
609d5ac70f0Sopenharmony_ci *	# Optional boolean flags
610d5ac70f0Sopenharmony_ci *	symmetric_rates			"true"
611d5ac70f0Sopenharmony_ci *	symmetric_channels		"true"
612d5ac70f0Sopenharmony_ci *	symmetric_sample_bits		"false"
613d5ac70f0Sopenharmony_ci *
614d5ac70f0Sopenharmony_ci *	data "name"			# optional private data
615d5ac70f0Sopenharmony_ci * }
616d5ac70f0Sopenharmony_ci * </pre>
617d5ac70f0Sopenharmony_ci *
618d5ac70f0Sopenharmony_ci * <h4>Physical DAI Link Configurations</h4>
619d5ac70f0Sopenharmony_ci * The runtime configurations of a physical DAI link can be defined by
620d5ac70f0Sopenharmony_ci * SectionLink. <br> Backend DAI links belong to physical links, and can
621d5ac70f0Sopenharmony_ci * be configured by either SectionLink or SectionBE, with same syntax.
622d5ac70f0Sopenharmony_ci * But SectionBE is deprecated atm since the internal processing is
623d5ac70f0Sopenharmony_ci * actually same.
624d5ac70f0Sopenharmony_ci *
625d5ac70f0Sopenharmony_ci * <pre>
626d5ac70f0Sopenharmony_ci * SectionLink."name" {
627d5ac70f0Sopenharmony_ci *
628d5ac70f0Sopenharmony_ci *	index "1"			# Index number
629d5ac70f0Sopenharmony_ci *
630d5ac70f0Sopenharmony_ci *	id "0"				# used for binding to the link
631d5ac70f0Sopenharmony_ci *
632d5ac70f0Sopenharmony_ci *	stream_name "name"		# used for binding to the link
633d5ac70f0Sopenharmony_ci *
634d5ac70f0Sopenharmony_ci *	hw_configs [	# runtime supported HW configurations, optional
635d5ac70f0Sopenharmony_ci *		"config1"
636d5ac70f0Sopenharmony_ci *		"config2"
637d5ac70f0Sopenharmony_ci *		...
638d5ac70f0Sopenharmony_ci *	]
639d5ac70f0Sopenharmony_ci *
640d5ac70f0Sopenharmony_ci *	default_hw_conf_id "1"		# default HW config ID for init
641d5ac70f0Sopenharmony_ci *
642d5ac70f0Sopenharmony_ci *	# Optional boolean flags
643d5ac70f0Sopenharmony_ci *	symmetric_rates			"true"
644d5ac70f0Sopenharmony_ci *	symmetric_channels		"false"
645d5ac70f0Sopenharmony_ci *	symmetric_sample_bits		"true"
646d5ac70f0Sopenharmony_ci *
647d5ac70f0Sopenharmony_ci *	data "name"			# optional private data
648d5ac70f0Sopenharmony_ci * }
649d5ac70f0Sopenharmony_ci * </pre>
650d5ac70f0Sopenharmony_ci *
651d5ac70f0Sopenharmony_ci * A physical link can refer to multiple runtime supported hardware
652d5ac70f0Sopenharmony_ci * configurations, which is defined by SectionHWConfig.
653d5ac70f0Sopenharmony_ci *
654d5ac70f0Sopenharmony_ci * <pre>
655d5ac70f0Sopenharmony_ci * SectionHWConfig."name" {
656d5ac70f0Sopenharmony_ci *
657d5ac70f0Sopenharmony_ci *	id "1"				# used for binding to the config
658d5ac70f0Sopenharmony_ci *	format "I2S"			# physical audio format.
659d5ac70f0Sopenharmony_ci *	bclk   "codec_provider"		# Codec provides the bit clock
660d5ac70f0Sopenharmony_ci *	fsync  "codec_consumer"		# Codec follows the fsync
661d5ac70f0Sopenharmony_ci * }
662d5ac70f0Sopenharmony_ci * </pre>
663d5ac70f0Sopenharmony_ci *
664d5ac70f0Sopenharmony_ci * <h4>Physical DAI</h4>
665d5ac70f0Sopenharmony_ci * A physical DAI (e.g. backend DAI for DPCM) is defined as a new section
666d5ac70f0Sopenharmony_ci * that can include a unique ID, playback and capture stream capabilities,
667d5ac70f0Sopenharmony_ci * optional flags, and private data. <br>
668d5ac70f0Sopenharmony_ci * Its PCM stream capablities are same as those for PCM objects,
669d5ac70f0Sopenharmony_ci * please refer to section 'PCM Capabilities'.
670d5ac70f0Sopenharmony_ci *
671d5ac70f0Sopenharmony_ci * <pre>
672d5ac70f0Sopenharmony_ci * SectionDAI."name" {
673d5ac70f0Sopenharmony_ci *
674d5ac70f0Sopenharmony_ci *	index "1"			# Index number
675d5ac70f0Sopenharmony_ci *
676d5ac70f0Sopenharmony_ci *	id "0"				# used for binding to the Backend DAI
677d5ac70f0Sopenharmony_ci *
678d5ac70f0Sopenharmony_ci *	pcm."playback" {
679d5ac70f0Sopenharmony_ci *		capabilities "capabilities1"	# capabilities for playback
680d5ac70f0Sopenharmony_ci *	}
681d5ac70f0Sopenharmony_ci *
682d5ac70f0Sopenharmony_ci *	pcm."capture" {
683d5ac70f0Sopenharmony_ci *		capabilities "capabilities2"	# capabilities for capture
684d5ac70f0Sopenharmony_ci *	}
685d5ac70f0Sopenharmony_ci *
686d5ac70f0Sopenharmony_ci *	symmetric_rates "true"			# optional flags
687d5ac70f0Sopenharmony_ci *	symmetric_channels "true"
688d5ac70f0Sopenharmony_ci *	symmetric_sample_bits "false"
689d5ac70f0Sopenharmony_ci *
690d5ac70f0Sopenharmony_ci *	data "name"			# optional private data
691d5ac70f0Sopenharmony_ci * }
692d5ac70f0Sopenharmony_ci * </pre>
693d5ac70f0Sopenharmony_ci *
694d5ac70f0Sopenharmony_ci * <h4>Manifest Private Data</h4>
695d5ac70f0Sopenharmony_ci * Manfiest may have private data. Users need to define a manifest section
696d5ac70f0Sopenharmony_ci * and add the references to 1 or multiple data sections. Please refer to
697d5ac70f0Sopenharmony_ci * section 'How to define an element with private data'. <br>
698d5ac70f0Sopenharmony_ci * And the text conf file can have at most 1 manifest section. <br><br>
699d5ac70f0Sopenharmony_ci *
700d5ac70f0Sopenharmony_ci * Manifest section is defined as follows :-
701d5ac70f0Sopenharmony_ci *
702d5ac70f0Sopenharmony_ci * <pre>
703d5ac70f0Sopenharmony_ci * SectionManifest"name" {
704d5ac70f0Sopenharmony_ci *
705d5ac70f0Sopenharmony_ci *	data "name"			# optional private data
706d5ac70f0Sopenharmony_ci * }
707d5ac70f0Sopenharmony_ci * </pre>
708d5ac70f0Sopenharmony_ci *
709d5ac70f0Sopenharmony_ci * <h4>Include other files</h4>
710d5ac70f0Sopenharmony_ci * Users may include other files in a text conf file via alsaconf syntax
711d5ac70f0Sopenharmony_ci * <path/to/configuration-file>. This allows users to define common info
712d5ac70f0Sopenharmony_ci * in separate files (e.g. vendor tokens, tuples) and share them for
713d5ac70f0Sopenharmony_ci * different platforms, thus save the total size of config files. <br>
714d5ac70f0Sopenharmony_ci * Users can also specifiy additional configuraiton directories relative
715d5ac70f0Sopenharmony_ci * to "/usr/share/alsa/" to search the included files,  via alsaconf syntax
716d5ac70f0Sopenharmony_ci * <searchfdir:/relative-path/to/usr/share/alsa>. <br><br>
717d5ac70f0Sopenharmony_ci *
718d5ac70f0Sopenharmony_ci * For example, file A and file B are two text conf files for platform X,
719d5ac70f0Sopenharmony_ci * they will be installed to /usr/share/alsa/topology/platformx. If we
720d5ac70f0Sopenharmony_ci * need file A to include file B, in file A we can add: <br>
721d5ac70f0Sopenharmony_ci *
722d5ac70f0Sopenharmony_ci * <searchdir:topology/platformx> <br>
723d5ac70f0Sopenharmony_ci * <name-of-file-B> <br><br>
724d5ac70f0Sopenharmony_ci *
725d5ac70f0Sopenharmony_ci * ALSA conf will search and open an included file in the following order
726d5ac70f0Sopenharmony_ci * of priority:
727d5ac70f0Sopenharmony_ci *  1. directly open the file by its name;
728d5ac70f0Sopenharmony_ci *  2. search for the file name in "/usr/share/alsa";
729d5ac70f0Sopenharmony_ci *  3. search for the file name in user specified subdirectories under
730d5ac70f0Sopenharmony_ci *     "/usr/share/alsa".
731d5ac70f0Sopenharmony_ci *
732d5ac70f0Sopenharmony_ci * The order of the included files need not to be same as their
733d5ac70f0Sopenharmony_ci * dependencies, since the topology library will load them all before
734d5ac70f0Sopenharmony_ci * parsing their dependencies. <br>
735d5ac70f0Sopenharmony_ci *
736d5ac70f0Sopenharmony_ci * The configuration directories defined by a file will only be used to search
737d5ac70f0Sopenharmony_ci * the files included by this file.
738d5ac70f0Sopenharmony_ci */
739d5ac70f0Sopenharmony_ci
740d5ac70f0Sopenharmony_ci/** Maximum number of channels supported in one control */
741d5ac70f0Sopenharmony_ci#define SND_TPLG_MAX_CHAN		8
742d5ac70f0Sopenharmony_ci
743d5ac70f0Sopenharmony_ci/** Topology context */
744d5ac70f0Sopenharmony_citypedef struct snd_tplg snd_tplg_t;
745d5ac70f0Sopenharmony_ci
746d5ac70f0Sopenharmony_ci/** Topology object types */
747d5ac70f0Sopenharmony_cienum snd_tplg_type {
748d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_TLV = 0,		/*!< TLV Data */
749d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_MIXER,		/*!< Mixer control*/
750d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_ENUM,		/*!< Enumerated control */
751d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_TEXT,		/*!< Text data */
752d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_DATA,		/*!< Private data */
753d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_BYTES,		/*!< Byte control */
754d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_STREAM_CONFIG,	/*!< PCM Stream configuration */
755d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_STREAM_CAPS,	/*!< PCM Stream capabilities */
756d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_PCM,		/*!< PCM stream device */
757d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_DAPM_WIDGET,	/*!< DAPM widget */
758d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_DAPM_GRAPH,	/*!< DAPM graph elements */
759d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_BE,		/*!< BE DAI link */
760d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_CC,		/*!< Hostless codec <-> codec link */
761d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_MANIFEST,		/*!< Topology manifest */
762d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_TOKEN,		/*!< Vendor tokens */
763d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_TUPLE,		/*!< Vendor tuples */
764d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_LINK,		/*!< Physical DAI link */
765d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_HW_CONFIG,	/*!< Link HW config */
766d5ac70f0Sopenharmony_ci	SND_TPLG_TYPE_DAI,		/*!< Physical DAI */
767d5ac70f0Sopenharmony_ci};
768d5ac70f0Sopenharmony_ci
769d5ac70f0Sopenharmony_ci/** Fit for all user cases */
770d5ac70f0Sopenharmony_ci#define SND_TPLG_INDEX_ALL  0
771d5ac70f0Sopenharmony_ci
772d5ac70f0Sopenharmony_ci/** Flags for the snd_tplg_create */
773d5ac70f0Sopenharmony_ci#define SND_TPLG_CREATE_VERBOSE		(1<<0)	/*!< Verbose output */
774d5ac70f0Sopenharmony_ci#define SND_TPLG_CREATE_DAPM_NOSORT	(1<<1)	/*!< Do not sort DAPM objects by index */
775d5ac70f0Sopenharmony_ci
776d5ac70f0Sopenharmony_ci/**
777d5ac70f0Sopenharmony_ci * \brief Return the version of the topology library.
778d5ac70f0Sopenharmony_ci * \return A static string with the version number.
779d5ac70f0Sopenharmony_ci */
780d5ac70f0Sopenharmony_ciconst char *snd_tplg_version(void);
781d5ac70f0Sopenharmony_ci
782d5ac70f0Sopenharmony_ci/**
783d5ac70f0Sopenharmony_ci * \brief Create a new topology parser instance.
784d5ac70f0Sopenharmony_ci * \return New topology parser instance
785d5ac70f0Sopenharmony_ci */
786d5ac70f0Sopenharmony_cisnd_tplg_t *snd_tplg_new(void);
787d5ac70f0Sopenharmony_ci
788d5ac70f0Sopenharmony_ci/**
789d5ac70f0Sopenharmony_ci * \brief Create a new topology parser instance.
790d5ac70f0Sopenharmony_ci * \return New topology parser instance
791d5ac70f0Sopenharmony_ci */
792d5ac70f0Sopenharmony_cisnd_tplg_t *snd_tplg_create(int flags);
793d5ac70f0Sopenharmony_ci
794d5ac70f0Sopenharmony_ci/**
795d5ac70f0Sopenharmony_ci * \brief Free a topology parser instance.
796d5ac70f0Sopenharmony_ci * \param tplg Topology parser instance
797d5ac70f0Sopenharmony_ci */
798d5ac70f0Sopenharmony_civoid snd_tplg_free(snd_tplg_t *tplg);
799d5ac70f0Sopenharmony_ci
800d5ac70f0Sopenharmony_ci/**
801d5ac70f0Sopenharmony_ci * \brief Load topology from the text buffer.
802d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
803d5ac70f0Sopenharmony_ci * \param buf Text buffer.
804d5ac70f0Sopenharmony_ci * \param size Text buffer size in bytes.
805d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
806d5ac70f0Sopenharmony_ci */
807d5ac70f0Sopenharmony_ciint snd_tplg_load(snd_tplg_t *tplg, const char *buf, size_t size);
808d5ac70f0Sopenharmony_ci
809d5ac70f0Sopenharmony_ci/**
810d5ac70f0Sopenharmony_ci * \brief Parse and build topology text file into binary file.
811d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
812d5ac70f0Sopenharmony_ci * \param infile Topology text input file to be parsed
813d5ac70f0Sopenharmony_ci * \param outfile Binary topology output file.
814d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
815d5ac70f0Sopenharmony_ci */
816d5ac70f0Sopenharmony_ciint snd_tplg_build_file(snd_tplg_t *tplg, const char *infile,
817d5ac70f0Sopenharmony_ci			const char *outfile);
818d5ac70f0Sopenharmony_ci
819d5ac70f0Sopenharmony_ci/**
820d5ac70f0Sopenharmony_ci * \brief Enable verbose reporting of binary file output
821d5ac70f0Sopenharmony_ci * \param tplg Topology Instance
822d5ac70f0Sopenharmony_ci * \param verbose Enable verbose output level if non zero
823d5ac70f0Sopenharmony_ci */
824d5ac70f0Sopenharmony_civoid snd_tplg_verbose(snd_tplg_t *tplg, int verbose);
825d5ac70f0Sopenharmony_ci
826d5ac70f0Sopenharmony_ci/** \struct snd_tplg_tlv_template
827d5ac70f0Sopenharmony_ci * \brief Template type for all TLV objects.
828d5ac70f0Sopenharmony_ci */
829d5ac70f0Sopenharmony_cistruct snd_tplg_tlv_template {
830d5ac70f0Sopenharmony_ci	int type;	 /*!< TLV type SNDRV_CTL_TLVT_ */
831d5ac70f0Sopenharmony_ci};
832d5ac70f0Sopenharmony_ci
833d5ac70f0Sopenharmony_ci/** \struct snd_tplg_tlv_dbscale_template
834d5ac70f0Sopenharmony_ci * \brief Template type for TLV Scale objects.
835d5ac70f0Sopenharmony_ci */
836d5ac70f0Sopenharmony_cistruct snd_tplg_tlv_dbscale_template {
837d5ac70f0Sopenharmony_ci	struct snd_tplg_tlv_template hdr;	/*!< TLV type header */
838d5ac70f0Sopenharmony_ci	int min;			/*!< dB minimum value in 0.1dB */
839d5ac70f0Sopenharmony_ci	int step;			/*!< dB step size in 0.1dB */
840d5ac70f0Sopenharmony_ci	int mute;			/*!< is min dB value mute ? */
841d5ac70f0Sopenharmony_ci};
842d5ac70f0Sopenharmony_ci
843d5ac70f0Sopenharmony_ci/** \struct snd_tplg_channel_elem
844d5ac70f0Sopenharmony_ci * \brief Template type for single channel mapping.
845d5ac70f0Sopenharmony_ci */
846d5ac70f0Sopenharmony_cistruct snd_tplg_channel_elem {
847d5ac70f0Sopenharmony_ci	int size;	/*!< size in bytes of this structure */
848d5ac70f0Sopenharmony_ci	int reg;	/*!< channel control register */
849d5ac70f0Sopenharmony_ci	int shift;	/*!< channel shift for control bits */
850d5ac70f0Sopenharmony_ci	int id;		/*!< ID maps to Left, Right, LFE etc */
851d5ac70f0Sopenharmony_ci};
852d5ac70f0Sopenharmony_ci
853d5ac70f0Sopenharmony_ci/** \struct snd_tplg_channel_map_template
854d5ac70f0Sopenharmony_ci * \brief Template type for channel mapping.
855d5ac70f0Sopenharmony_ci */
856d5ac70f0Sopenharmony_cistruct snd_tplg_channel_map_template {
857d5ac70f0Sopenharmony_ci	int num_channels;	/*!< number of channel mappings */
858d5ac70f0Sopenharmony_ci	struct snd_tplg_channel_elem channel[SND_TPLG_MAX_CHAN];	/*!< mapping */
859d5ac70f0Sopenharmony_ci};
860d5ac70f0Sopenharmony_ci
861d5ac70f0Sopenharmony_ci/** \struct snd_tplg_pdata_template
862d5ac70f0Sopenharmony_ci * \brief Template type for private data objects.
863d5ac70f0Sopenharmony_ci */
864d5ac70f0Sopenharmony_cistruct snd_tplg_pdata_template {
865d5ac70f0Sopenharmony_ci	unsigned int length;	/*!< data length */
866d5ac70f0Sopenharmony_ci	const void *data;	/*!< data */
867d5ac70f0Sopenharmony_ci};
868d5ac70f0Sopenharmony_ci
869d5ac70f0Sopenharmony_ci/** \struct snd_tplg_io_ops_template
870d5ac70f0Sopenharmony_ci * \brief Template type for object operations mapping.
871d5ac70f0Sopenharmony_ci */
872d5ac70f0Sopenharmony_cistruct snd_tplg_io_ops_template {
873d5ac70f0Sopenharmony_ci	int get;	/*!< get callback ID */
874d5ac70f0Sopenharmony_ci	int put;	/*!< put callback ID */
875d5ac70f0Sopenharmony_ci	int info;	/*!< info callback ID */
876d5ac70f0Sopenharmony_ci};
877d5ac70f0Sopenharmony_ci
878d5ac70f0Sopenharmony_ci/** \struct snd_tplg_ctl_template
879d5ac70f0Sopenharmony_ci * \brief Template type for control objects.
880d5ac70f0Sopenharmony_ci */
881d5ac70f0Sopenharmony_cistruct snd_tplg_ctl_template {
882d5ac70f0Sopenharmony_ci	int type;		/*!< Control type */
883d5ac70f0Sopenharmony_ci	const char *name;	/*!< Control name */
884d5ac70f0Sopenharmony_ci	int access;		/*!< Control access */
885d5ac70f0Sopenharmony_ci	struct snd_tplg_io_ops_template ops;	/*!< operations */
886d5ac70f0Sopenharmony_ci	union {
887d5ac70f0Sopenharmony_ci		struct snd_tplg_tlv_template *tlv; /*!< non NULL means we have TLV data */
888d5ac70f0Sopenharmony_ci		struct snd_tplg_tlv_dbscale_template *tlv_scale; /*!< scale TLV data */
889d5ac70f0Sopenharmony_ci	};
890d5ac70f0Sopenharmony_ci};
891d5ac70f0Sopenharmony_ci
892d5ac70f0Sopenharmony_ci/** \struct snd_tplg_mixer_template
893d5ac70f0Sopenharmony_ci * \brief Template type for mixer control objects.
894d5ac70f0Sopenharmony_ci */
895d5ac70f0Sopenharmony_cistruct snd_tplg_mixer_template {
896d5ac70f0Sopenharmony_ci	struct snd_tplg_ctl_template hdr;	/*!< control type header */
897d5ac70f0Sopenharmony_ci	struct snd_tplg_channel_map_template *map;	/*!< channel map */
898d5ac70f0Sopenharmony_ci	int min;	/*!< min value for mixer */
899d5ac70f0Sopenharmony_ci	int max;	/*!< max value for mixer */
900d5ac70f0Sopenharmony_ci	int platform_max;	/*!< max value for platform control */
901d5ac70f0Sopenharmony_ci	int invert;	/*!< whether controls bits are inverted */
902d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv;	/*!< control private data */
903d5ac70f0Sopenharmony_ci};
904d5ac70f0Sopenharmony_ci
905d5ac70f0Sopenharmony_ci/** \struct snd_tplg_enum_template
906d5ac70f0Sopenharmony_ci * \brief Template type for enumerated control objects.
907d5ac70f0Sopenharmony_ci */
908d5ac70f0Sopenharmony_cistruct snd_tplg_enum_template {
909d5ac70f0Sopenharmony_ci	struct snd_tplg_ctl_template hdr;	/*!< control type header */
910d5ac70f0Sopenharmony_ci	struct snd_tplg_channel_map_template *map;	/*!< channel map */
911d5ac70f0Sopenharmony_ci	int items;	/*!< number of enumerated items in control */
912d5ac70f0Sopenharmony_ci	int mask;	/*!< register mask size */
913d5ac70f0Sopenharmony_ci	const char **texts;	/*!< control text items */
914d5ac70f0Sopenharmony_ci	const int **values;	/*!< control value items */
915d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv;	/*!< control private data */
916d5ac70f0Sopenharmony_ci};
917d5ac70f0Sopenharmony_ci
918d5ac70f0Sopenharmony_ci/** \struct snd_tplg_bytes_template
919d5ac70f0Sopenharmony_ci * \brief Template type for TLV Scale objects.
920d5ac70f0Sopenharmony_ci */
921d5ac70f0Sopenharmony_cistruct snd_tplg_bytes_template {
922d5ac70f0Sopenharmony_ci	struct snd_tplg_ctl_template hdr;	/*!< control type header */
923d5ac70f0Sopenharmony_ci	int max;		/*!< max byte control value */
924d5ac70f0Sopenharmony_ci	int mask;		/*!< byte control mask */
925d5ac70f0Sopenharmony_ci	int base;		/*!< base register */
926d5ac70f0Sopenharmony_ci	int num_regs;		/*!< number of registers */
927d5ac70f0Sopenharmony_ci	struct snd_tplg_io_ops_template ext_ops;	/*!< ops mapping */
928d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv;	/*!< control private data */
929d5ac70f0Sopenharmony_ci};
930d5ac70f0Sopenharmony_ci
931d5ac70f0Sopenharmony_ci/** \struct snd_tplg_graph_elem
932d5ac70f0Sopenharmony_ci * \brief Template type for single DAPM graph element.
933d5ac70f0Sopenharmony_ci */
934d5ac70f0Sopenharmony_cistruct snd_tplg_graph_elem {
935d5ac70f0Sopenharmony_ci	const char *src;	/*!< source widget name */
936d5ac70f0Sopenharmony_ci	const char *ctl;	/*!< control name or NULL if no control */
937d5ac70f0Sopenharmony_ci	const char *sink;	/*!< sink widget name */
938d5ac70f0Sopenharmony_ci};
939d5ac70f0Sopenharmony_ci
940d5ac70f0Sopenharmony_ci/** \struct snd_tplg_graph_template
941d5ac70f0Sopenharmony_ci * \brief Template type for array of DAPM graph elements.
942d5ac70f0Sopenharmony_ci */
943d5ac70f0Sopenharmony_cistruct snd_tplg_graph_template {
944d5ac70f0Sopenharmony_ci	int count;		/*!< Number of graph elements */
945d5ac70f0Sopenharmony_ci	struct snd_tplg_graph_elem elem[0];	/*!< graph elements */
946d5ac70f0Sopenharmony_ci};
947d5ac70f0Sopenharmony_ci
948d5ac70f0Sopenharmony_ci/** \struct snd_tplg_widget_template
949d5ac70f0Sopenharmony_ci * \brief Template type for DAPM widget objects.
950d5ac70f0Sopenharmony_ci */
951d5ac70f0Sopenharmony_cistruct snd_tplg_widget_template {
952d5ac70f0Sopenharmony_ci	int id;			/*!< SND_SOC_DAPM_CTL */
953d5ac70f0Sopenharmony_ci	const char *name;	/*!< widget name */
954d5ac70f0Sopenharmony_ci	const char *sname;	/*!< stream name (certain widgets only) */
955d5ac70f0Sopenharmony_ci	int reg;		/*!< negative reg = no direct dapm */
956d5ac70f0Sopenharmony_ci	int shift;		/*!< bits to shift */
957d5ac70f0Sopenharmony_ci	int mask;		/*!< non-shifted mask */
958d5ac70f0Sopenharmony_ci	int subseq;		/*!< sort within widget type */
959d5ac70f0Sopenharmony_ci	unsigned int invert;		/*!< invert the power bit */
960d5ac70f0Sopenharmony_ci	unsigned int ignore_suspend;	/*!< kept enabled over suspend */
961d5ac70f0Sopenharmony_ci	unsigned short event_flags;	/*!< PM event sequence flags */
962d5ac70f0Sopenharmony_ci	unsigned short event_type;	/*!< PM event sequence type */
963d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv;	/*!< widget private data */
964d5ac70f0Sopenharmony_ci	int num_ctls;			/*!< Number of controls used by widget */
965d5ac70f0Sopenharmony_ci	struct snd_tplg_ctl_template *ctl[0];	/*!< array of widget controls */
966d5ac70f0Sopenharmony_ci};
967d5ac70f0Sopenharmony_ci
968d5ac70f0Sopenharmony_ci/** \struct snd_tplg_stream_template
969d5ac70f0Sopenharmony_ci * \brief Stream configurations.
970d5ac70f0Sopenharmony_ci */
971d5ac70f0Sopenharmony_cistruct snd_tplg_stream_template {
972d5ac70f0Sopenharmony_ci	const char *name;	/*!< name of the stream config */
973d5ac70f0Sopenharmony_ci	int format;		/*!< SNDRV_PCM_FMTBIT_* */
974d5ac70f0Sopenharmony_ci	int rate;		/*!< SNDRV_PCM_RATE_* */
975d5ac70f0Sopenharmony_ci	int period_bytes;	/*!< size of period in bytes */
976d5ac70f0Sopenharmony_ci	int buffer_bytes;	/*!< size of buffer in bytes. */
977d5ac70f0Sopenharmony_ci	int channels;		/*!< number of channels */
978d5ac70f0Sopenharmony_ci};
979d5ac70f0Sopenharmony_ci
980d5ac70f0Sopenharmony_ci/** \struct snd_tplg_stream_caps_template
981d5ac70f0Sopenharmony_ci * \brief Stream Capabilities.
982d5ac70f0Sopenharmony_ci */
983d5ac70f0Sopenharmony_cistruct snd_tplg_stream_caps_template {
984d5ac70f0Sopenharmony_ci	const char *name;	/*!< name of the stream caps */
985d5ac70f0Sopenharmony_ci	uint64_t formats;	/*!< supported formats SNDRV_PCM_FMTBIT_* */
986d5ac70f0Sopenharmony_ci	unsigned int rates;	/*!< supported rates SNDRV_PCM_RATE_* */
987d5ac70f0Sopenharmony_ci	unsigned int rate_min;	/*!< min rate */
988d5ac70f0Sopenharmony_ci	unsigned int rate_max;	/*!< max rate */
989d5ac70f0Sopenharmony_ci	unsigned int channels_min;	/*!< min channels */
990d5ac70f0Sopenharmony_ci	unsigned int channels_max;	/*!< max channels */
991d5ac70f0Sopenharmony_ci	unsigned int periods_min;	/*!< min number of periods */
992d5ac70f0Sopenharmony_ci	unsigned int periods_max;	/*!< max number of periods */
993d5ac70f0Sopenharmony_ci	unsigned int period_size_min;	/*!< min period size bytes */
994d5ac70f0Sopenharmony_ci	unsigned int period_size_max;	/*!< max period size bytes */
995d5ac70f0Sopenharmony_ci	unsigned int buffer_size_min;	/*!< min buffer size bytes */
996d5ac70f0Sopenharmony_ci	unsigned int buffer_size_max;	/*!< max buffer size bytes */
997d5ac70f0Sopenharmony_ci	unsigned int sig_bits;		/*!< number of bits of content */
998d5ac70f0Sopenharmony_ci};
999d5ac70f0Sopenharmony_ci
1000d5ac70f0Sopenharmony_ci/** \struct snd_tplg_pcm_template
1001d5ac70f0Sopenharmony_ci * \brief Template type for PCM (FE DAI & DAI links).
1002d5ac70f0Sopenharmony_ci */
1003d5ac70f0Sopenharmony_cistruct snd_tplg_pcm_template {
1004d5ac70f0Sopenharmony_ci	const char *pcm_name;	/*!< PCM stream name */
1005d5ac70f0Sopenharmony_ci	const char *dai_name;	/*!< DAI name */
1006d5ac70f0Sopenharmony_ci	unsigned int pcm_id;	/*!< unique ID - used to match */
1007d5ac70f0Sopenharmony_ci	unsigned int dai_id;	/*!< unique ID - used to match */
1008d5ac70f0Sopenharmony_ci	unsigned int playback;	/*!< supports playback mode */
1009d5ac70f0Sopenharmony_ci	unsigned int capture;	/*!< supports capture mode */
1010d5ac70f0Sopenharmony_ci	unsigned int compress;	/*!< 1 = compressed; 0 = PCM */
1011d5ac70f0Sopenharmony_ci	struct snd_tplg_stream_caps_template *caps[2]; /*!< playback & capture for DAI */
1012d5ac70f0Sopenharmony_ci	unsigned int flag_mask; /*!< bitmask of flags to configure */
1013d5ac70f0Sopenharmony_ci	unsigned int flags;     /*!< flag value SND_SOC_TPLG_LNK_FLGBIT_* */
1014d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv;	/*!< private data */
1015d5ac70f0Sopenharmony_ci	int num_streams;	/*!< number of supported configs */
1016d5ac70f0Sopenharmony_ci	struct snd_tplg_stream_template stream[0]; /*!< supported configs */
1017d5ac70f0Sopenharmony_ci};
1018d5ac70f0Sopenharmony_ci
1019d5ac70f0Sopenharmony_ci /** \struct snd_tplg_hw_config_template
1020d5ac70f0Sopenharmony_ci * \brief Template type to describe a physical link runtime supported
1021d5ac70f0Sopenharmony_ci * hardware config, i.e. hardware audio formats.
1022d5ac70f0Sopenharmony_ci */
1023d5ac70f0Sopenharmony_cistruct snd_tplg_hw_config_template {
1024d5ac70f0Sopenharmony_ci	int id;                         /*!< unique ID - - used to match */
1025d5ac70f0Sopenharmony_ci	unsigned int fmt;               /*!< SND_SOC_DAI_FORMAT_ format value */
1026d5ac70f0Sopenharmony_ci	unsigned char clock_gated;      /*!< SND_SOC_TPLG_DAI_CLK_GATE_ value */
1027d5ac70f0Sopenharmony_ci	unsigned char  invert_bclk;     /*!< 1 for inverted BCLK, 0 for normal */
1028d5ac70f0Sopenharmony_ci	unsigned char  invert_fsync;    /*!< 1 for inverted frame clock, 0 for normal */
1029d5ac70f0Sopenharmony_ci	unsigned char  bclk_provider;   /*!< SND_SOC_TPLG_BCLK_ value */
1030d5ac70f0Sopenharmony_ci	unsigned char  fsync_provider;  /*!< SND_SOC_TPLG_FSYNC_ value */
1031d5ac70f0Sopenharmony_ci	unsigned char  mclk_direction;  /*!< SND_SOC_TPLG_MCLK_ value */
1032d5ac70f0Sopenharmony_ci	unsigned short reserved;        /*!< for 32bit alignment */
1033d5ac70f0Sopenharmony_ci	unsigned int mclk_rate;	        /*!< MCLK or SYSCLK freqency in Hz */
1034d5ac70f0Sopenharmony_ci	unsigned int bclk_rate;	        /*!< BCLK freqency in Hz */
1035d5ac70f0Sopenharmony_ci	unsigned int fsync_rate;        /*!< frame clock in Hz */
1036d5ac70f0Sopenharmony_ci	unsigned int tdm_slots;         /*!< number of TDM slots in use */
1037d5ac70f0Sopenharmony_ci	unsigned int tdm_slot_width;    /*!< width in bits for each slot */
1038d5ac70f0Sopenharmony_ci	unsigned int tx_slots;          /*!< bit mask for active Tx slots */
1039d5ac70f0Sopenharmony_ci	unsigned int rx_slots;          /*!< bit mask for active Rx slots */
1040d5ac70f0Sopenharmony_ci	unsigned int tx_channels;       /*!< number of Tx channels */
1041d5ac70f0Sopenharmony_ci	unsigned int *tx_chanmap;       /*!< array of slot number */
1042d5ac70f0Sopenharmony_ci	unsigned int rx_channels;       /*!< number of Rx channels */
1043d5ac70f0Sopenharmony_ci	unsigned int *rx_chanmap;       /*!< array of slot number */
1044d5ac70f0Sopenharmony_ci};
1045d5ac70f0Sopenharmony_ci
1046d5ac70f0Sopenharmony_ci/** \struct snd_tplg_dai_template
1047d5ac70f0Sopenharmony_ci * \brief Template type for physical DAI.
1048d5ac70f0Sopenharmony_ci * It can be used to configure backend DAIs for DPCM.
1049d5ac70f0Sopenharmony_ci */
1050d5ac70f0Sopenharmony_cistruct snd_tplg_dai_template {
1051d5ac70f0Sopenharmony_ci	const char *dai_name;	/*!< DAI name */
1052d5ac70f0Sopenharmony_ci	unsigned int dai_id;	/*!< unique ID - used to match */
1053d5ac70f0Sopenharmony_ci	unsigned int playback;	/*!< supports playback mode */
1054d5ac70f0Sopenharmony_ci	unsigned int capture;	/*!< supports capture mode */
1055d5ac70f0Sopenharmony_ci	struct snd_tplg_stream_caps_template *caps[2]; /*!< playback & capture for DAI */
1056d5ac70f0Sopenharmony_ci	unsigned int flag_mask; /*!< bitmask of flags to configure */
1057d5ac70f0Sopenharmony_ci	unsigned int flags;	/*!< SND_SOC_TPLG_DAI_FLGBIT_* */
1058d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv;	/*!< private data */
1059d5ac70f0Sopenharmony_ci
1060d5ac70f0Sopenharmony_ci};
1061d5ac70f0Sopenharmony_ci
1062d5ac70f0Sopenharmony_ci/** \struct snd_tplg_link_template
1063d5ac70f0Sopenharmony_ci * \brief Template type for physical DAI Links.
1064d5ac70f0Sopenharmony_ci */
1065d5ac70f0Sopenharmony_cistruct snd_tplg_link_template {
1066d5ac70f0Sopenharmony_ci	const char *name;	/*!< link name, used to match */
1067d5ac70f0Sopenharmony_ci	int id;	/*!< unique ID - used to match with existing physical links */
1068d5ac70f0Sopenharmony_ci	const char *stream_name;        /*!< link stream name, used to match */
1069d5ac70f0Sopenharmony_ci
1070d5ac70f0Sopenharmony_ci	int num_streams;	/*!< number of configs */
1071d5ac70f0Sopenharmony_ci	struct snd_tplg_stream_template *stream;       /*!< supported configs */
1072d5ac70f0Sopenharmony_ci
1073d5ac70f0Sopenharmony_ci	struct snd_tplg_hw_config_template *hw_config; /*!< supported HW configs */
1074d5ac70f0Sopenharmony_ci	int num_hw_configs;		/*!< number of hw configs */
1075d5ac70f0Sopenharmony_ci	int default_hw_config_id;       /*!< default hw config ID for init */
1076d5ac70f0Sopenharmony_ci
1077d5ac70f0Sopenharmony_ci	unsigned int flag_mask;         /*!< bitmask of flags to configure */
1078d5ac70f0Sopenharmony_ci	unsigned int flags;             /*!< SND_SOC_TPLG_LNK_FLGBIT_* flag value */
1079d5ac70f0Sopenharmony_ci	struct snd_soc_tplg_private *priv; /*!< private data */
1080d5ac70f0Sopenharmony_ci};
1081d5ac70f0Sopenharmony_ci
1082d5ac70f0Sopenharmony_ci/** \struct snd_tplg_obj_template_t
1083d5ac70f0Sopenharmony_ci * \brief Generic Template Object
1084d5ac70f0Sopenharmony_ci */
1085d5ac70f0Sopenharmony_citypedef struct snd_tplg_obj_template {
1086d5ac70f0Sopenharmony_ci	enum snd_tplg_type type;	/*!< template object type */
1087d5ac70f0Sopenharmony_ci	int index;		/*!< group index for object */
1088d5ac70f0Sopenharmony_ci	int version;		/*!< optional vendor specific version details */
1089d5ac70f0Sopenharmony_ci	int vendor_type;	/*!< optional vendor specific type info */
1090d5ac70f0Sopenharmony_ci	union {
1091d5ac70f0Sopenharmony_ci		struct snd_tplg_widget_template *widget;	/*!< DAPM widget */
1092d5ac70f0Sopenharmony_ci		struct snd_tplg_mixer_template *mixer;		/*!< Mixer control */
1093d5ac70f0Sopenharmony_ci		struct snd_tplg_bytes_template *bytes_ctl;	/*!< Bytes control */
1094d5ac70f0Sopenharmony_ci		struct snd_tplg_enum_template *enum_ctl;	/*!< Enum control */
1095d5ac70f0Sopenharmony_ci		struct snd_tplg_graph_template *graph;		/*!< Graph elements */
1096d5ac70f0Sopenharmony_ci		struct snd_tplg_pcm_template *pcm;		/*!< PCM elements */
1097d5ac70f0Sopenharmony_ci		struct snd_tplg_link_template *link;		/*!< physical DAI Links */
1098d5ac70f0Sopenharmony_ci		struct snd_tplg_dai_template *dai;		/*!< Physical DAI */
1099d5ac70f0Sopenharmony_ci	};
1100d5ac70f0Sopenharmony_ci} snd_tplg_obj_template_t;
1101d5ac70f0Sopenharmony_ci
1102d5ac70f0Sopenharmony_ci/**
1103d5ac70f0Sopenharmony_ci * \brief Register topology template object.
1104d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1105d5ac70f0Sopenharmony_ci * \param t Template object.
1106d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1107d5ac70f0Sopenharmony_ci */
1108d5ac70f0Sopenharmony_ciint snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);
1109d5ac70f0Sopenharmony_ci
1110d5ac70f0Sopenharmony_ci/**
1111d5ac70f0Sopenharmony_ci * \brief Build all registered topology data into binary file.
1112d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1113d5ac70f0Sopenharmony_ci * \param outfile Binary topology output file.
1114d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1115d5ac70f0Sopenharmony_ci */
1116d5ac70f0Sopenharmony_ciint snd_tplg_build(snd_tplg_t *tplg, const char *outfile);
1117d5ac70f0Sopenharmony_ci
1118d5ac70f0Sopenharmony_ci/**
1119d5ac70f0Sopenharmony_ci * \brief Build all registered topology data into memory.
1120d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1121d5ac70f0Sopenharmony_ci * \param bin Binary topology output buffer (malloc).
1122d5ac70f0Sopenharmony_ci * \param size Binary topology output buffer size in bytes.
1123d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1124d5ac70f0Sopenharmony_ci */
1125d5ac70f0Sopenharmony_ciint snd_tplg_build_bin(snd_tplg_t *tplg, void **bin, size_t *size);
1126d5ac70f0Sopenharmony_ci
1127d5ac70f0Sopenharmony_ci/**
1128d5ac70f0Sopenharmony_ci * \brief Attach private data to topology manifest.
1129d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1130d5ac70f0Sopenharmony_ci * \param data Private data.
1131d5ac70f0Sopenharmony_ci * \param len Length of data in bytes.
1132d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1133d5ac70f0Sopenharmony_ci */
1134d5ac70f0Sopenharmony_ciint snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len);
1135d5ac70f0Sopenharmony_ci
1136d5ac70f0Sopenharmony_ci/**
1137d5ac70f0Sopenharmony_ci * \brief Set an optional vendor specific version number.
1138d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1139d5ac70f0Sopenharmony_ci * \param version Vendor specific version number.
1140d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1141d5ac70f0Sopenharmony_ci */
1142d5ac70f0Sopenharmony_ciint snd_tplg_set_version(snd_tplg_t *tplg, unsigned int version);
1143d5ac70f0Sopenharmony_ci
1144d5ac70f0Sopenharmony_ci/*
1145d5ac70f0Sopenharmony_ci * Flags for the snd_tplg_save()
1146d5ac70f0Sopenharmony_ci */
1147d5ac70f0Sopenharmony_ci#define SND_TPLG_SAVE_SORT	(1<<0)	/*!< sort identifiers */
1148d5ac70f0Sopenharmony_ci#define SND_TPLG_SAVE_GROUPS	(1<<1)	/*!< create the structure by group index */
1149d5ac70f0Sopenharmony_ci#define SND_TPLG_SAVE_NOCHECK	(1<<16)	/*!< unchecked output for debugging */
1150d5ac70f0Sopenharmony_ci
1151d5ac70f0Sopenharmony_ci/**
1152d5ac70f0Sopenharmony_ci * \brief Save the topology to the text configuration string.
1153d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1154d5ac70f0Sopenharmony_ci * \param dst A pointer to string with result (malloc).
1155d5ac70f0Sopenharmony_ci * \param flags save mode
1156d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1157d5ac70f0Sopenharmony_ci *
1158d5ac70f0Sopenharmony_ci * Valid flags are
1159d5ac70f0Sopenharmony_ci *    - SND_TPLG_SAVE_SORT
1160d5ac70f0Sopenharmony_ci *    - SND_TPLG_SAVE_GROUPS
1161d5ac70f0Sopenharmony_ci *    - SND_TPLG_SAVE_NOCHECK
1162d5ac70f0Sopenharmony_ci */
1163d5ac70f0Sopenharmony_ciint snd_tplg_save(snd_tplg_t *tplg, char **dst, int flags);
1164d5ac70f0Sopenharmony_ci
1165d5ac70f0Sopenharmony_ci/**
1166d5ac70f0Sopenharmony_ci * \brief Decode the binary topology contents.
1167d5ac70f0Sopenharmony_ci * \param tplg Topology instance.
1168d5ac70f0Sopenharmony_ci * \param bin Binary topology input buffer.
1169d5ac70f0Sopenharmony_ci * \param size Binary topology input buffer size.
1170d5ac70f0Sopenharmony_ci * \param dflags - not used, must be set to 0.
1171d5ac70f0Sopenharmony_ci * \return Zero on success, otherwise a negative error code
1172d5ac70f0Sopenharmony_ci */
1173d5ac70f0Sopenharmony_ciint snd_tplg_decode(snd_tplg_t *tplg, void *bin, size_t size, int dflags);
1174d5ac70f0Sopenharmony_ci
1175d5ac70f0Sopenharmony_ci/** \} */
1176d5ac70f0Sopenharmony_ci
1177d5ac70f0Sopenharmony_ci#ifdef __cplusplus
1178d5ac70f0Sopenharmony_ci}
1179d5ac70f0Sopenharmony_ci#endif
1180d5ac70f0Sopenharmony_ci
1181d5ac70f0Sopenharmony_ci#endif /* __ALSA_TOPOLOGY_H */
1182