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