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