1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * uapi/sound/asoc.h -- ALSA SoC Firmware Controls and DAPM 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2012 Texas Instruments Inc. 6*4882a593Smuzhiyun * Copyright (C) 2015 Intel Corporation. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 9*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as 10*4882a593Smuzhiyun * published by the Free Software Foundation. 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Simple file API to load FW that includes mixers, coefficients, DAPM graphs, 13*4882a593Smuzhiyun * algorithms, equalisers, DAIs, widgets etc. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifndef __LINUX_UAPI_SND_ASOC_H 17*4882a593Smuzhiyun #define __LINUX_UAPI_SND_ASOC_H 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #include <linux/types.h> 20*4882a593Smuzhiyun #include <sound/asound.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* 23*4882a593Smuzhiyun * Maximum number of channels topology kcontrol can represent. 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun #define SND_SOC_TPLG_MAX_CHAN 8 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* 28*4882a593Smuzhiyun * Maximum number of PCM formats capability 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun #define SND_SOC_TPLG_MAX_FORMATS 16 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* 33*4882a593Smuzhiyun * Maximum number of PCM stream configs 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun #define SND_SOC_TPLG_STREAM_CONFIG_MAX 8 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* 38*4882a593Smuzhiyun * Maximum number of physical link's hardware configs 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun #define SND_SOC_TPLG_HW_CONFIG_MAX 8 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* individual kcontrol info types - can be mixed with other types */ 43*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_VOLSW 1 44*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_VOLSW_SX 2 45*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_VOLSW_XR_SX 3 46*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_ENUM 4 47*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_BYTES 5 48*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_ENUM_VALUE 6 49*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_RANGE 7 50*4882a593Smuzhiyun #define SND_SOC_TPLG_CTL_STROBE 8 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* individual widget kcontrol info types - can be mixed with other types */ 54*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_CTL_VOLSW 64 55*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE 65 56*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT 66 57*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE 67 58*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_CTL_PIN 68 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* DAPM widget types - add new items to the end */ 61*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_INPUT 0 62*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_OUTPUT 1 63*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_MUX 2 64*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_MIXER 3 65*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_PGA 4 66*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_OUT_DRV 5 67*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_ADC 6 68*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_DAC 7 69*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_SWITCH 8 70*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_PRE 9 71*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_POST 10 72*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_AIF_IN 11 73*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_AIF_OUT 12 74*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_DAI_IN 13 75*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_DAI_OUT 14 76*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_DAI_LINK 15 77*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_BUFFER 16 78*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_SCHEDULER 17 79*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_EFFECT 18 80*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_SIGGEN 19 81*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_SRC 20 82*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_ASRC 21 83*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_ENCODER 22 84*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_DECODER 23 85*4882a593Smuzhiyun #define SND_SOC_TPLG_DAPM_LAST SND_SOC_TPLG_DAPM_DECODER 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Header magic number and string sizes */ 88*4882a593Smuzhiyun #define SND_SOC_TPLG_MAGIC 0x41536F43 /* ASoC */ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* string sizes */ 91*4882a593Smuzhiyun #define SND_SOC_TPLG_NUM_TEXTS 16 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* ABI version */ 94*4882a593Smuzhiyun #define SND_SOC_TPLG_ABI_VERSION 0x5 /* current version */ 95*4882a593Smuzhiyun #define SND_SOC_TPLG_ABI_VERSION_MIN 0x4 /* oldest version supported */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* Max size of TLV data */ 98*4882a593Smuzhiyun #define SND_SOC_TPLG_TLV_SIZE 32 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* 101*4882a593Smuzhiyun * File and Block header data types. 102*4882a593Smuzhiyun * Add new generic and vendor types to end of list. 103*4882a593Smuzhiyun * Generic types are handled by the core whilst vendors types are passed 104*4882a593Smuzhiyun * to the component drivers for handling. 105*4882a593Smuzhiyun */ 106*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_MIXER 1 107*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_BYTES 2 108*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_ENUM 3 109*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_DAPM_GRAPH 4 110*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_DAPM_WIDGET 5 111*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_DAI_LINK 6 112*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_PCM 7 113*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_MANIFEST 8 114*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_CODEC_LINK 9 115*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_BACKEND_LINK 10 116*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_PDATA 11 117*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_DAI 12 118*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_DAI 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* vendor block IDs - please add new vendor types to end */ 121*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_VENDOR_FW 1000 122*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_VENDOR_CONFIG 1001 123*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPE_VENDOR_COEFF 1002 124*4882a593Smuzhiyun #define SND_SOC_TPLG_TYPEVENDOR_CODEC 1003 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define SND_SOC_TPLG_STREAM_PLAYBACK 0 127*4882a593Smuzhiyun #define SND_SOC_TPLG_STREAM_CAPTURE 1 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* vendor tuple types */ 130*4882a593Smuzhiyun #define SND_SOC_TPLG_TUPLE_TYPE_UUID 0 131*4882a593Smuzhiyun #define SND_SOC_TPLG_TUPLE_TYPE_STRING 1 132*4882a593Smuzhiyun #define SND_SOC_TPLG_TUPLE_TYPE_BOOL 2 133*4882a593Smuzhiyun #define SND_SOC_TPLG_TUPLE_TYPE_BYTE 3 134*4882a593Smuzhiyun #define SND_SOC_TPLG_TUPLE_TYPE_WORD 4 135*4882a593Smuzhiyun #define SND_SOC_TPLG_TUPLE_TYPE_SHORT 5 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* DAI flags */ 138*4882a593Smuzhiyun #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES (1 << 0) 139*4882a593Smuzhiyun #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1) 140*4882a593Smuzhiyun #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* DAI clock gating */ 143*4882a593Smuzhiyun #define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED 0 144*4882a593Smuzhiyun #define SND_SOC_TPLG_DAI_CLK_GATE_GATED 1 145*4882a593Smuzhiyun #define SND_SOC_TPLG_DAI_CLK_GATE_CONT 2 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /* DAI mclk_direction */ 148*4882a593Smuzhiyun #define SND_SOC_TPLG_MCLK_CO 0 /* for codec, mclk is output */ 149*4882a593Smuzhiyun #define SND_SOC_TPLG_MCLK_CI 1 /* for codec, mclk is input */ 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* DAI physical PCM data formats. 152*4882a593Smuzhiyun * Add new formats to the end of the list. 153*4882a593Smuzhiyun */ 154*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_I2S 1 /* I2S mode */ 155*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_RIGHT_J 2 /* Right Justified mode */ 156*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_LEFT_J 3 /* Left Justified mode */ 157*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_DSP_A 4 /* L data MSB after FRM LRC */ 158*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_DSP_B 5 /* L data MSB during FRM LRC */ 159*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_AC97 6 /* AC97 */ 160*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_PDM 7 /* Pulse density modulation */ 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun /* left and right justified also known as MSB and LSB respectively */ 163*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_MSB SND_SOC_DAI_FORMAT_LEFT_J 164*4882a593Smuzhiyun #define SND_SOC_DAI_FORMAT_LSB SND_SOC_DAI_FORMAT_RIGHT_J 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* DAI link flags */ 167*4882a593Smuzhiyun #define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0) 168*4882a593Smuzhiyun #define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1) 169*4882a593Smuzhiyun #define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2) 170*4882a593Smuzhiyun #define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* DAI topology BCLK parameter 173*4882a593Smuzhiyun * For the backwards capability, by default codec is bclk master 174*4882a593Smuzhiyun */ 175*4882a593Smuzhiyun #define SND_SOC_TPLG_BCLK_CM 0 /* codec is bclk master */ 176*4882a593Smuzhiyun #define SND_SOC_TPLG_BCLK_CS 1 /* codec is bclk slave */ 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* DAI topology FSYNC parameter 179*4882a593Smuzhiyun * For the backwards capability, by default codec is fsync master 180*4882a593Smuzhiyun */ 181*4882a593Smuzhiyun #define SND_SOC_TPLG_FSYNC_CM 0 /* codec is fsync master */ 182*4882a593Smuzhiyun #define SND_SOC_TPLG_FSYNC_CS 1 /* codec is fsync slave */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /* 185*4882a593Smuzhiyun * Block Header. 186*4882a593Smuzhiyun * This header precedes all object and object arrays below. 187*4882a593Smuzhiyun */ 188*4882a593Smuzhiyun struct snd_soc_tplg_hdr { 189*4882a593Smuzhiyun __le32 magic; /* magic number */ 190*4882a593Smuzhiyun __le32 abi; /* ABI version */ 191*4882a593Smuzhiyun __le32 version; /* optional vendor specific version details */ 192*4882a593Smuzhiyun __le32 type; /* SND_SOC_TPLG_TYPE_ */ 193*4882a593Smuzhiyun __le32 size; /* size of this structure */ 194*4882a593Smuzhiyun __le32 vendor_type; /* optional vendor specific type info */ 195*4882a593Smuzhiyun __le32 payload_size; /* data bytes, excluding this header */ 196*4882a593Smuzhiyun __le32 index; /* identifier for block */ 197*4882a593Smuzhiyun __le32 count; /* number of elements in block */ 198*4882a593Smuzhiyun } __attribute__((packed)); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* vendor tuple for uuid */ 201*4882a593Smuzhiyun struct snd_soc_tplg_vendor_uuid_elem { 202*4882a593Smuzhiyun __le32 token; 203*4882a593Smuzhiyun char uuid[16]; 204*4882a593Smuzhiyun } __attribute__((packed)); 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* vendor tuple for a bool/byte/short/word value */ 207*4882a593Smuzhiyun struct snd_soc_tplg_vendor_value_elem { 208*4882a593Smuzhiyun __le32 token; 209*4882a593Smuzhiyun __le32 value; 210*4882a593Smuzhiyun } __attribute__((packed)); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* vendor tuple for string */ 213*4882a593Smuzhiyun struct snd_soc_tplg_vendor_string_elem { 214*4882a593Smuzhiyun __le32 token; 215*4882a593Smuzhiyun char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 216*4882a593Smuzhiyun } __attribute__((packed)); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun struct snd_soc_tplg_vendor_array { 219*4882a593Smuzhiyun __le32 size; /* size in bytes of the array, including all elements */ 220*4882a593Smuzhiyun __le32 type; /* SND_SOC_TPLG_TUPLE_TYPE_ */ 221*4882a593Smuzhiyun __le32 num_elems; /* number of elements in array */ 222*4882a593Smuzhiyun union { 223*4882a593Smuzhiyun struct snd_soc_tplg_vendor_uuid_elem uuid[0]; 224*4882a593Smuzhiyun struct snd_soc_tplg_vendor_value_elem value[0]; 225*4882a593Smuzhiyun struct snd_soc_tplg_vendor_string_elem string[0]; 226*4882a593Smuzhiyun }; 227*4882a593Smuzhiyun } __attribute__((packed)); 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* 230*4882a593Smuzhiyun * Private data. 231*4882a593Smuzhiyun * All topology objects may have private data that can be used by the driver or 232*4882a593Smuzhiyun * firmware. Core will ignore this data. 233*4882a593Smuzhiyun */ 234*4882a593Smuzhiyun struct snd_soc_tplg_private { 235*4882a593Smuzhiyun __le32 size; /* in bytes of private data */ 236*4882a593Smuzhiyun union { 237*4882a593Smuzhiyun char data[0]; 238*4882a593Smuzhiyun struct snd_soc_tplg_vendor_array array[0]; 239*4882a593Smuzhiyun }; 240*4882a593Smuzhiyun } __attribute__((packed)); 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* 243*4882a593Smuzhiyun * Kcontrol TLV data. 244*4882a593Smuzhiyun */ 245*4882a593Smuzhiyun struct snd_soc_tplg_tlv_dbscale { 246*4882a593Smuzhiyun __le32 min; 247*4882a593Smuzhiyun __le32 step; 248*4882a593Smuzhiyun __le32 mute; 249*4882a593Smuzhiyun } __attribute__((packed)); 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun struct snd_soc_tplg_ctl_tlv { 252*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 253*4882a593Smuzhiyun __le32 type; /* SNDRV_CTL_TLVT_*, type of TLV */ 254*4882a593Smuzhiyun union { 255*4882a593Smuzhiyun __le32 data[SND_SOC_TPLG_TLV_SIZE]; 256*4882a593Smuzhiyun struct snd_soc_tplg_tlv_dbscale scale; 257*4882a593Smuzhiyun }; 258*4882a593Smuzhiyun } __attribute__((packed)); 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* 261*4882a593Smuzhiyun * Kcontrol channel data 262*4882a593Smuzhiyun */ 263*4882a593Smuzhiyun struct snd_soc_tplg_channel { 264*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 265*4882a593Smuzhiyun __le32 reg; 266*4882a593Smuzhiyun __le32 shift; 267*4882a593Smuzhiyun __le32 id; /* ID maps to Left, Right, LFE etc */ 268*4882a593Smuzhiyun } __attribute__((packed)); 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun /* 271*4882a593Smuzhiyun * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops 272*4882a593Smuzhiyun * Kcontrol ops need get/put/info. 273*4882a593Smuzhiyun * Bytes ext ops need get/put. 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun struct snd_soc_tplg_io_ops { 276*4882a593Smuzhiyun __le32 get; 277*4882a593Smuzhiyun __le32 put; 278*4882a593Smuzhiyun __le32 info; 279*4882a593Smuzhiyun } __attribute__((packed)); 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun /* 282*4882a593Smuzhiyun * kcontrol header 283*4882a593Smuzhiyun */ 284*4882a593Smuzhiyun struct snd_soc_tplg_ctl_hdr { 285*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 286*4882a593Smuzhiyun __le32 type; 287*4882a593Smuzhiyun char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 288*4882a593Smuzhiyun __le32 access; 289*4882a593Smuzhiyun struct snd_soc_tplg_io_ops ops; 290*4882a593Smuzhiyun struct snd_soc_tplg_ctl_tlv tlv; 291*4882a593Smuzhiyun } __attribute__((packed)); 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun /* 294*4882a593Smuzhiyun * Stream Capabilities 295*4882a593Smuzhiyun */ 296*4882a593Smuzhiyun struct snd_soc_tplg_stream_caps { 297*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 298*4882a593Smuzhiyun char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 299*4882a593Smuzhiyun __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */ 300*4882a593Smuzhiyun __le32 rates; /* supported rates SNDRV_PCM_RATE_* */ 301*4882a593Smuzhiyun __le32 rate_min; /* min rate */ 302*4882a593Smuzhiyun __le32 rate_max; /* max rate */ 303*4882a593Smuzhiyun __le32 channels_min; /* min channels */ 304*4882a593Smuzhiyun __le32 channels_max; /* max channels */ 305*4882a593Smuzhiyun __le32 periods_min; /* min number of periods */ 306*4882a593Smuzhiyun __le32 periods_max; /* max number of periods */ 307*4882a593Smuzhiyun __le32 period_size_min; /* min period size bytes */ 308*4882a593Smuzhiyun __le32 period_size_max; /* max period size bytes */ 309*4882a593Smuzhiyun __le32 buffer_size_min; /* min buffer size bytes */ 310*4882a593Smuzhiyun __le32 buffer_size_max; /* max buffer size bytes */ 311*4882a593Smuzhiyun __le32 sig_bits; /* number of bits of content */ 312*4882a593Smuzhiyun } __attribute__((packed)); 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* 315*4882a593Smuzhiyun * FE or BE Stream configuration supported by SW/FW 316*4882a593Smuzhiyun */ 317*4882a593Smuzhiyun struct snd_soc_tplg_stream { 318*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 319*4882a593Smuzhiyun char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */ 320*4882a593Smuzhiyun __le64 format; /* SNDRV_PCM_FMTBIT_* */ 321*4882a593Smuzhiyun __le32 rate; /* SNDRV_PCM_RATE_* */ 322*4882a593Smuzhiyun __le32 period_bytes; /* size of period in bytes */ 323*4882a593Smuzhiyun __le32 buffer_bytes; /* size of buffer in bytes */ 324*4882a593Smuzhiyun __le32 channels; /* channels */ 325*4882a593Smuzhiyun } __attribute__((packed)); 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun /* 329*4882a593Smuzhiyun * Describes a physical link's runtime supported hardware config, 330*4882a593Smuzhiyun * i.e. hardware audio formats. 331*4882a593Smuzhiyun */ 332*4882a593Smuzhiyun struct snd_soc_tplg_hw_config { 333*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 334*4882a593Smuzhiyun __le32 id; /* unique ID - - used to match */ 335*4882a593Smuzhiyun __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */ 336*4882a593Smuzhiyun __u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */ 337*4882a593Smuzhiyun __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */ 338*4882a593Smuzhiyun __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */ 339*4882a593Smuzhiyun __u8 bclk_master; /* SND_SOC_TPLG_BCLK_ value */ 340*4882a593Smuzhiyun __u8 fsync_master; /* SND_SOC_TPLG_FSYNC_ value */ 341*4882a593Smuzhiyun __u8 mclk_direction; /* SND_SOC_TPLG_MCLK_ value */ 342*4882a593Smuzhiyun __le16 reserved; /* for 32bit alignment */ 343*4882a593Smuzhiyun __le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */ 344*4882a593Smuzhiyun __le32 bclk_rate; /* BCLK freqency in Hz */ 345*4882a593Smuzhiyun __le32 fsync_rate; /* frame clock in Hz */ 346*4882a593Smuzhiyun __le32 tdm_slots; /* number of TDM slots in use */ 347*4882a593Smuzhiyun __le32 tdm_slot_width; /* width in bits for each slot */ 348*4882a593Smuzhiyun __le32 tx_slots; /* bit mask for active Tx slots */ 349*4882a593Smuzhiyun __le32 rx_slots; /* bit mask for active Rx slots */ 350*4882a593Smuzhiyun __le32 tx_channels; /* number of Tx channels */ 351*4882a593Smuzhiyun __le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */ 352*4882a593Smuzhiyun __le32 rx_channels; /* number of Rx channels */ 353*4882a593Smuzhiyun __le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */ 354*4882a593Smuzhiyun } __attribute__((packed)); 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun /* 357*4882a593Smuzhiyun * Manifest. List totals for each payload type. Not used in parsing, but will 358*4882a593Smuzhiyun * be passed to the component driver before any other objects in order for any 359*4882a593Smuzhiyun * global component resource allocations. 360*4882a593Smuzhiyun * 361*4882a593Smuzhiyun * File block representation for manifest :- 362*4882a593Smuzhiyun * +-----------------------------------+----+ 363*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 364*4882a593Smuzhiyun * +-----------------------------------+----+ 365*4882a593Smuzhiyun * | struct snd_soc_tplg_manifest | 1 | 366*4882a593Smuzhiyun * +-----------------------------------+----+ 367*4882a593Smuzhiyun */ 368*4882a593Smuzhiyun struct snd_soc_tplg_manifest { 369*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 370*4882a593Smuzhiyun __le32 control_elems; /* number of control elements */ 371*4882a593Smuzhiyun __le32 widget_elems; /* number of widget elements */ 372*4882a593Smuzhiyun __le32 graph_elems; /* number of graph elements */ 373*4882a593Smuzhiyun __le32 pcm_elems; /* number of PCM elements */ 374*4882a593Smuzhiyun __le32 dai_link_elems; /* number of DAI link elements */ 375*4882a593Smuzhiyun __le32 dai_elems; /* number of physical DAI elements */ 376*4882a593Smuzhiyun __le32 reserved[20]; /* reserved for new ABI element types */ 377*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 378*4882a593Smuzhiyun } __attribute__((packed)); 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun /* 381*4882a593Smuzhiyun * Mixer kcontrol. 382*4882a593Smuzhiyun * 383*4882a593Smuzhiyun * File block representation for mixer kcontrol :- 384*4882a593Smuzhiyun * +-----------------------------------+----+ 385*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 386*4882a593Smuzhiyun * +-----------------------------------+----+ 387*4882a593Smuzhiyun * | struct snd_soc_tplg_mixer_control | N | 388*4882a593Smuzhiyun * +-----------------------------------+----+ 389*4882a593Smuzhiyun */ 390*4882a593Smuzhiyun struct snd_soc_tplg_mixer_control { 391*4882a593Smuzhiyun struct snd_soc_tplg_ctl_hdr hdr; 392*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 393*4882a593Smuzhiyun __le32 min; 394*4882a593Smuzhiyun __le32 max; 395*4882a593Smuzhiyun __le32 platform_max; 396*4882a593Smuzhiyun __le32 invert; 397*4882a593Smuzhiyun __le32 num_channels; 398*4882a593Smuzhiyun struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN]; 399*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 400*4882a593Smuzhiyun } __attribute__((packed)); 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun /* 403*4882a593Smuzhiyun * Enumerated kcontrol 404*4882a593Smuzhiyun * 405*4882a593Smuzhiyun * File block representation for enum kcontrol :- 406*4882a593Smuzhiyun * +-----------------------------------+----+ 407*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 408*4882a593Smuzhiyun * +-----------------------------------+----+ 409*4882a593Smuzhiyun * | struct snd_soc_tplg_enum_control | N | 410*4882a593Smuzhiyun * +-----------------------------------+----+ 411*4882a593Smuzhiyun */ 412*4882a593Smuzhiyun struct snd_soc_tplg_enum_control { 413*4882a593Smuzhiyun struct snd_soc_tplg_ctl_hdr hdr; 414*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 415*4882a593Smuzhiyun __le32 num_channels; 416*4882a593Smuzhiyun struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN]; 417*4882a593Smuzhiyun __le32 items; 418*4882a593Smuzhiyun __le32 mask; 419*4882a593Smuzhiyun __le32 count; 420*4882a593Smuzhiyun char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 421*4882a593Smuzhiyun __le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4]; 422*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 423*4882a593Smuzhiyun } __attribute__((packed)); 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* 426*4882a593Smuzhiyun * Bytes kcontrol 427*4882a593Smuzhiyun * 428*4882a593Smuzhiyun * File block representation for bytes kcontrol :- 429*4882a593Smuzhiyun * +-----------------------------------+----+ 430*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 431*4882a593Smuzhiyun * +-----------------------------------+----+ 432*4882a593Smuzhiyun * | struct snd_soc_tplg_bytes_control | N | 433*4882a593Smuzhiyun * +-----------------------------------+----+ 434*4882a593Smuzhiyun */ 435*4882a593Smuzhiyun struct snd_soc_tplg_bytes_control { 436*4882a593Smuzhiyun struct snd_soc_tplg_ctl_hdr hdr; 437*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 438*4882a593Smuzhiyun __le32 max; 439*4882a593Smuzhiyun __le32 mask; 440*4882a593Smuzhiyun __le32 base; 441*4882a593Smuzhiyun __le32 num_regs; 442*4882a593Smuzhiyun struct snd_soc_tplg_io_ops ext_ops; 443*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 444*4882a593Smuzhiyun } __attribute__((packed)); 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun /* 447*4882a593Smuzhiyun * DAPM Graph Element 448*4882a593Smuzhiyun * 449*4882a593Smuzhiyun * File block representation for DAPM graph elements :- 450*4882a593Smuzhiyun * +-------------------------------------+----+ 451*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 452*4882a593Smuzhiyun * +-------------------------------------+----+ 453*4882a593Smuzhiyun * | struct snd_soc_tplg_dapm_graph_elem | N | 454*4882a593Smuzhiyun * +-------------------------------------+----+ 455*4882a593Smuzhiyun */ 456*4882a593Smuzhiyun struct snd_soc_tplg_dapm_graph_elem { 457*4882a593Smuzhiyun char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 458*4882a593Smuzhiyun char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 459*4882a593Smuzhiyun char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 460*4882a593Smuzhiyun } __attribute__((packed)); 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun /* 463*4882a593Smuzhiyun * DAPM Widget. 464*4882a593Smuzhiyun * 465*4882a593Smuzhiyun * File block representation for DAPM widget :- 466*4882a593Smuzhiyun * +-------------------------------------+-----+ 467*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 468*4882a593Smuzhiyun * +-------------------------------------+-----+ 469*4882a593Smuzhiyun * | struct snd_soc_tplg_dapm_widget | N | 470*4882a593Smuzhiyun * +-------------------------------------+-----+ 471*4882a593Smuzhiyun * | struct snd_soc_tplg_enum_control | 0|1 | 472*4882a593Smuzhiyun * | struct snd_soc_tplg_mixer_control | 0|N | 473*4882a593Smuzhiyun * +-------------------------------------+-----+ 474*4882a593Smuzhiyun * 475*4882a593Smuzhiyun * Optional enum or mixer control can be appended to the end of each widget 476*4882a593Smuzhiyun * in the block. 477*4882a593Smuzhiyun */ 478*4882a593Smuzhiyun struct snd_soc_tplg_dapm_widget { 479*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 480*4882a593Smuzhiyun __le32 id; /* SND_SOC_DAPM_CTL */ 481*4882a593Smuzhiyun char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 482*4882a593Smuzhiyun char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun __le32 reg; /* negative reg = no direct dapm */ 485*4882a593Smuzhiyun __le32 shift; /* bits to shift */ 486*4882a593Smuzhiyun __le32 mask; /* non-shifted mask */ 487*4882a593Smuzhiyun __le32 subseq; /* sort within widget type */ 488*4882a593Smuzhiyun __le32 invert; /* invert the power bit */ 489*4882a593Smuzhiyun __le32 ignore_suspend; /* kept enabled over suspend */ 490*4882a593Smuzhiyun __le16 event_flags; 491*4882a593Smuzhiyun __le16 event_type; 492*4882a593Smuzhiyun __le32 num_kcontrols; 493*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 494*4882a593Smuzhiyun /* 495*4882a593Smuzhiyun * kcontrols that relate to this widget 496*4882a593Smuzhiyun * follow here after widget private data 497*4882a593Smuzhiyun */ 498*4882a593Smuzhiyun } __attribute__((packed)); 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun /* 502*4882a593Smuzhiyun * Describes SW/FW specific features of PCM (FE DAI & DAI link). 503*4882a593Smuzhiyun * 504*4882a593Smuzhiyun * File block representation for PCM :- 505*4882a593Smuzhiyun * +-----------------------------------+-----+ 506*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 507*4882a593Smuzhiyun * +-----------------------------------+-----+ 508*4882a593Smuzhiyun * | struct snd_soc_tplg_pcm | N | 509*4882a593Smuzhiyun * +-----------------------------------+-----+ 510*4882a593Smuzhiyun */ 511*4882a593Smuzhiyun struct snd_soc_tplg_pcm { 512*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 513*4882a593Smuzhiyun char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 514*4882a593Smuzhiyun char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 515*4882a593Smuzhiyun __le32 pcm_id; /* unique ID - used to match with DAI link */ 516*4882a593Smuzhiyun __le32 dai_id; /* unique ID - used to match */ 517*4882a593Smuzhiyun __le32 playback; /* supports playback mode */ 518*4882a593Smuzhiyun __le32 capture; /* supports capture mode */ 519*4882a593Smuzhiyun __le32 compress; /* 1 = compressed; 0 = PCM */ 520*4882a593Smuzhiyun struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */ 521*4882a593Smuzhiyun __le32 num_streams; /* number of streams */ 522*4882a593Smuzhiyun struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */ 523*4882a593Smuzhiyun __le32 flag_mask; /* bitmask of flags to configure */ 524*4882a593Smuzhiyun __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */ 525*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 526*4882a593Smuzhiyun } __attribute__((packed)); 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun /* 530*4882a593Smuzhiyun * Describes the physical link runtime supported configs or params 531*4882a593Smuzhiyun * 532*4882a593Smuzhiyun * File block representation for physical link config :- 533*4882a593Smuzhiyun * +-----------------------------------+-----+ 534*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 535*4882a593Smuzhiyun * +-----------------------------------+-----+ 536*4882a593Smuzhiyun * | struct snd_soc_tplg_link_config | N | 537*4882a593Smuzhiyun * +-----------------------------------+-----+ 538*4882a593Smuzhiyun */ 539*4882a593Smuzhiyun struct snd_soc_tplg_link_config { 540*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 541*4882a593Smuzhiyun __le32 id; /* unique ID - used to match */ 542*4882a593Smuzhiyun char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */ 543*4882a593Smuzhiyun char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */ 544*4882a593Smuzhiyun struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */ 545*4882a593Smuzhiyun __le32 num_streams; /* number of streams */ 546*4882a593Smuzhiyun struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */ 547*4882a593Smuzhiyun __le32 num_hw_configs; /* number of hw configs */ 548*4882a593Smuzhiyun __le32 default_hw_config_id; /* default hw config ID for init */ 549*4882a593Smuzhiyun __le32 flag_mask; /* bitmask of flags to configure */ 550*4882a593Smuzhiyun __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */ 551*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 552*4882a593Smuzhiyun } __attribute__((packed)); 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun /* 555*4882a593Smuzhiyun * Describes SW/FW specific features of physical DAI. 556*4882a593Smuzhiyun * It can be used to configure backend DAIs for DPCM. 557*4882a593Smuzhiyun * 558*4882a593Smuzhiyun * File block representation for physical DAI :- 559*4882a593Smuzhiyun * +-----------------------------------+-----+ 560*4882a593Smuzhiyun * | struct snd_soc_tplg_hdr | 1 | 561*4882a593Smuzhiyun * +-----------------------------------+-----+ 562*4882a593Smuzhiyun * | struct snd_soc_tplg_dai | N | 563*4882a593Smuzhiyun * +-----------------------------------+-----+ 564*4882a593Smuzhiyun */ 565*4882a593Smuzhiyun struct snd_soc_tplg_dai { 566*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 567*4882a593Smuzhiyun char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */ 568*4882a593Smuzhiyun __le32 dai_id; /* unique ID - used to match */ 569*4882a593Smuzhiyun __le32 playback; /* supports playback mode */ 570*4882a593Smuzhiyun __le32 capture; /* supports capture mode */ 571*4882a593Smuzhiyun struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */ 572*4882a593Smuzhiyun __le32 flag_mask; /* bitmask of flags to configure */ 573*4882a593Smuzhiyun __le32 flags; /* SND_SOC_TPLG_DAI_FLGBIT_* */ 574*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 575*4882a593Smuzhiyun } __attribute__((packed)); 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun /* 578*4882a593Smuzhiyun * Old version of ABI structs, supported for backward compatibility. 579*4882a593Smuzhiyun */ 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun /* Manifest v4 */ 582*4882a593Smuzhiyun struct snd_soc_tplg_manifest_v4 { 583*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 584*4882a593Smuzhiyun __le32 control_elems; /* number of control elements */ 585*4882a593Smuzhiyun __le32 widget_elems; /* number of widget elements */ 586*4882a593Smuzhiyun __le32 graph_elems; /* number of graph elements */ 587*4882a593Smuzhiyun __le32 pcm_elems; /* number of PCM elements */ 588*4882a593Smuzhiyun __le32 dai_link_elems; /* number of DAI link elements */ 589*4882a593Smuzhiyun struct snd_soc_tplg_private priv; 590*4882a593Smuzhiyun } __packed; 591*4882a593Smuzhiyun 592*4882a593Smuzhiyun /* Stream Capabilities v4 */ 593*4882a593Smuzhiyun struct snd_soc_tplg_stream_caps_v4 { 594*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 595*4882a593Smuzhiyun char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 596*4882a593Smuzhiyun __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */ 597*4882a593Smuzhiyun __le32 rates; /* supported rates SNDRV_PCM_RATE_* */ 598*4882a593Smuzhiyun __le32 rate_min; /* min rate */ 599*4882a593Smuzhiyun __le32 rate_max; /* max rate */ 600*4882a593Smuzhiyun __le32 channels_min; /* min channels */ 601*4882a593Smuzhiyun __le32 channels_max; /* max channels */ 602*4882a593Smuzhiyun __le32 periods_min; /* min number of periods */ 603*4882a593Smuzhiyun __le32 periods_max; /* max number of periods */ 604*4882a593Smuzhiyun __le32 period_size_min; /* min period size bytes */ 605*4882a593Smuzhiyun __le32 period_size_max; /* max period size bytes */ 606*4882a593Smuzhiyun __le32 buffer_size_min; /* min buffer size bytes */ 607*4882a593Smuzhiyun __le32 buffer_size_max; /* max buffer size bytes */ 608*4882a593Smuzhiyun } __packed; 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun /* PCM v4 */ 611*4882a593Smuzhiyun struct snd_soc_tplg_pcm_v4 { 612*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 613*4882a593Smuzhiyun char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 614*4882a593Smuzhiyun char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 615*4882a593Smuzhiyun __le32 pcm_id; /* unique ID - used to match with DAI link */ 616*4882a593Smuzhiyun __le32 dai_id; /* unique ID - used to match */ 617*4882a593Smuzhiyun __le32 playback; /* supports playback mode */ 618*4882a593Smuzhiyun __le32 capture; /* supports capture mode */ 619*4882a593Smuzhiyun __le32 compress; /* 1 = compressed; 0 = PCM */ 620*4882a593Smuzhiyun struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */ 621*4882a593Smuzhiyun __le32 num_streams; /* number of streams */ 622*4882a593Smuzhiyun struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */ 623*4882a593Smuzhiyun } __packed; 624*4882a593Smuzhiyun 625*4882a593Smuzhiyun /* Physical link config v4 */ 626*4882a593Smuzhiyun struct snd_soc_tplg_link_config_v4 { 627*4882a593Smuzhiyun __le32 size; /* in bytes of this structure */ 628*4882a593Smuzhiyun __le32 id; /* unique ID - used to match */ 629*4882a593Smuzhiyun struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */ 630*4882a593Smuzhiyun __le32 num_streams; /* number of streams */ 631*4882a593Smuzhiyun } __packed; 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun #endif 634