Linux Audio

Check our new training course

Loading...
v5.4
  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 master
174 */
175#define SND_SOC_TPLG_BCLK_CM         0 /* codec is bclk master */
176#define SND_SOC_TPLG_BCLK_CS         1 /* codec is bclk slave */
177
178/* DAI topology FSYNC parameter
179 * For the backwards capability, by default codec is fsync master
180 */
181#define SND_SOC_TPLG_FSYNC_CM         0 /* codec is fsync master */
182#define SND_SOC_TPLG_FSYNC_CS         1 /* codec is fsync slave */
183
184/*
185 * Block Header.
186 * This header precedes all object and object arrays below.
187 */
188struct snd_soc_tplg_hdr {
189	__le32 magic;		/* magic number */
190	__le32 abi;		/* ABI version */
191	__le32 version;		/* optional vendor specific version details */
192	__le32 type;		/* SND_SOC_TPLG_TYPE_ */
193	__le32 size;		/* size of this structure */
194	__le32 vendor_type;	/* optional vendor specific type info */
195	__le32 payload_size;	/* data bytes, excluding this header */
196	__le32 index;		/* identifier for block */
197	__le32 count;		/* number of elements in block */
198} __attribute__((packed));
199
200/* vendor tuple for uuid */
201struct snd_soc_tplg_vendor_uuid_elem {
202	__le32 token;
203	char uuid[16];
204} __attribute__((packed));
205
206/* vendor tuple for a bool/byte/short/word value */
207struct snd_soc_tplg_vendor_value_elem {
208	__le32 token;
209	__le32 value;
210} __attribute__((packed));
211
212/* vendor tuple for string */
213struct snd_soc_tplg_vendor_string_elem {
214	__le32 token;
215	char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
216} __attribute__((packed));
217
218struct snd_soc_tplg_vendor_array {
219	__le32 size;	/* size in bytes of the array, including all elements */
220	__le32 type;	/* SND_SOC_TPLG_TUPLE_TYPE_ */
221	__le32 num_elems;	/* number of elements in array */
222	union {
223		struct snd_soc_tplg_vendor_uuid_elem uuid[0];
224		struct snd_soc_tplg_vendor_value_elem value[0];
225		struct snd_soc_tplg_vendor_string_elem string[0];
226	};
227} __attribute__((packed));
228
229/*
230 * Private data.
231 * All topology objects may have private data that can be used by the driver or
232 * firmware. Core will ignore this data.
233 */
234struct snd_soc_tplg_private {
235	__le32 size;	/* in bytes of private data */
236	union {
237		char data[0];
238		struct snd_soc_tplg_vendor_array array[0];
239	};
240} __attribute__((packed));
241
242/*
243 * Kcontrol TLV data.
244 */
245struct snd_soc_tplg_tlv_dbscale {
246	__le32 min;
247	__le32 step;
248	__le32 mute;
249} __attribute__((packed));
250
251struct snd_soc_tplg_ctl_tlv {
252	__le32 size;	/* in bytes of this structure */
253	__le32 type;	/* SNDRV_CTL_TLVT_*, type of TLV */
254	union {
255		__le32 data[SND_SOC_TPLG_TLV_SIZE];
256		struct snd_soc_tplg_tlv_dbscale scale;
257	};
258} __attribute__((packed));
259
260/*
261 * Kcontrol channel data
262 */
263struct snd_soc_tplg_channel {
264	__le32 size;	/* in bytes of this structure */
265	__le32 reg;
266	__le32 shift;
267	__le32 id;	/* ID maps to Left, Right, LFE etc */
268} __attribute__((packed));
269
270/*
271 * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
272 * Kcontrol ops need get/put/info.
273 * Bytes ext ops need get/put.
274 */
275struct snd_soc_tplg_io_ops {
276	__le32 get;
277	__le32 put;
278	__le32 info;
279} __attribute__((packed));
280
281/*
282 * kcontrol header
283 */
284struct snd_soc_tplg_ctl_hdr {
285	__le32 size;	/* in bytes of this structure */
286	__le32 type;
287	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
288	__le32 access;
289	struct snd_soc_tplg_io_ops ops;
290	struct snd_soc_tplg_ctl_tlv tlv;
291} __attribute__((packed));
292
293/*
294 * Stream Capabilities
295 */
296struct snd_soc_tplg_stream_caps {
297	__le32 size;		/* in bytes of this structure */
298	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
299	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
300	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
301	__le32 rate_min;	/* min rate */
302	__le32 rate_max;	/* max rate */
303	__le32 channels_min;	/* min channels */
304	__le32 channels_max;	/* max channels */
305	__le32 periods_min;	/* min number of periods */
306	__le32 periods_max;	/* max number of periods */
307	__le32 period_size_min;	/* min period size bytes */
308	__le32 period_size_max;	/* max period size bytes */
309	__le32 buffer_size_min;	/* min buffer size bytes */
310	__le32 buffer_size_max;	/* max buffer size bytes */
311	__le32 sig_bits;        /* number of bits of content */
312} __attribute__((packed));
313
314/*
315 * FE or BE Stream configuration supported by SW/FW
316 */
317struct snd_soc_tplg_stream {
318	__le32 size;		/* in bytes of this structure */
319	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */
320	__le64 format;		/* SNDRV_PCM_FMTBIT_* */
321	__le32 rate;		/* SNDRV_PCM_RATE_* */
322	__le32 period_bytes;	/* size of period in bytes */
323	__le32 buffer_bytes;	/* size of buffer in bytes */
324	__le32 channels;	/* channels */
325} __attribute__((packed));
326
327
328/*
329 * Describes a physical link's runtime supported hardware config,
330 * i.e. hardware audio formats.
331 */
332struct snd_soc_tplg_hw_config {
333	__le32 size;            /* in bytes of this structure */
334	__le32 id;		/* unique ID - - used to match */
335	__le32 fmt;		/* SND_SOC_DAI_FORMAT_ format value */
336	__u8 clock_gated;	/* SND_SOC_TPLG_DAI_CLK_GATE_ value */
337	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
338	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
339	__u8 bclk_master;	/* SND_SOC_TPLG_BCLK_ value */
340	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
341	__u8 mclk_direction;    /* SND_SOC_TPLG_MCLK_ value */
342	__le16 reserved;	/* for 32bit alignment */
343	__le32 mclk_rate;	/* MCLK or SYSCLK freqency in Hz */
344	__le32 bclk_rate;	/* BCLK freqency in Hz */
345	__le32 fsync_rate;	/* frame clock in Hz */
346	__le32 tdm_slots;	/* number of TDM slots in use */
347	__le32 tdm_slot_width;	/* width in bits for each slot */
348	__le32 tx_slots;	/* bit mask for active Tx slots */
349	__le32 rx_slots;	/* bit mask for active Rx slots */
350	__le32 tx_channels;	/* number of Tx channels */
351	__le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
352	__le32 rx_channels;	/* number of Rx channels */
353	__le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
354} __attribute__((packed));
355
356/*
357 * Manifest. List totals for each payload type. Not used in parsing, but will
358 * be passed to the component driver before any other objects in order for any
359 * global component resource allocations.
360 *
361 * File block representation for manifest :-
362 * +-----------------------------------+----+
363 * | struct snd_soc_tplg_hdr           |  1 |
364 * +-----------------------------------+----+
365 * | struct snd_soc_tplg_manifest      |  1 |
366 * +-----------------------------------+----+
367 */
368struct snd_soc_tplg_manifest {
369	__le32 size;		/* in bytes of this structure */
370	__le32 control_elems;	/* number of control elements */
371	__le32 widget_elems;	/* number of widget elements */
372	__le32 graph_elems;	/* number of graph elements */
373	__le32 pcm_elems;	/* number of PCM elements */
374	__le32 dai_link_elems;	/* number of DAI link elements */
375	__le32 dai_elems;	/* number of physical DAI elements */
376	__le32 reserved[20];	/* reserved for new ABI element types */
377	struct snd_soc_tplg_private priv;
378} __attribute__((packed));
379
380/*
381 * Mixer kcontrol.
382 *
383 * File block representation for mixer kcontrol :-
384 * +-----------------------------------+----+
385 * | struct snd_soc_tplg_hdr           |  1 |
386 * +-----------------------------------+----+
387 * | struct snd_soc_tplg_mixer_control |  N |
388 * +-----------------------------------+----+
389 */
390struct snd_soc_tplg_mixer_control {
391	struct snd_soc_tplg_ctl_hdr hdr;
392	__le32 size;	/* in bytes of this structure */
393	__le32 min;
394	__le32 max;
395	__le32 platform_max;
396	__le32 invert;
397	__le32 num_channels;
398	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
399	struct snd_soc_tplg_private priv;
400} __attribute__((packed));
401
402/*
403 * Enumerated kcontrol
404 *
405 * File block representation for enum kcontrol :-
406 * +-----------------------------------+----+
407 * | struct snd_soc_tplg_hdr           |  1 |
408 * +-----------------------------------+----+
409 * | struct snd_soc_tplg_enum_control  |  N |
410 * +-----------------------------------+----+
411 */
412struct snd_soc_tplg_enum_control {
413	struct snd_soc_tplg_ctl_hdr hdr;
414	__le32 size;	/* in bytes of this structure */
415	__le32 num_channels;
416	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
417	__le32 items;
418	__le32 mask;
419	__le32 count;
420	char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
421	__le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
422	struct snd_soc_tplg_private priv;
423} __attribute__((packed));
424
425/*
426 * Bytes kcontrol
427 *
428 * File block representation for bytes kcontrol :-
429 * +-----------------------------------+----+
430 * | struct snd_soc_tplg_hdr           |  1 |
431 * +-----------------------------------+----+
432 * | struct snd_soc_tplg_bytes_control |  N |
433 * +-----------------------------------+----+
434 */
435struct snd_soc_tplg_bytes_control {
436	struct snd_soc_tplg_ctl_hdr hdr;
437	__le32 size;	/* in bytes of this structure */
438	__le32 max;
439	__le32 mask;
440	__le32 base;
441	__le32 num_regs;
442	struct snd_soc_tplg_io_ops ext_ops;
443	struct snd_soc_tplg_private priv;
444} __attribute__((packed));
445
446/*
447 * DAPM Graph Element
448 *
449 * File block representation for DAPM graph elements :-
450 * +-------------------------------------+----+
451 * | struct snd_soc_tplg_hdr             |  1 |
452 * +-------------------------------------+----+
453 * | struct snd_soc_tplg_dapm_graph_elem |  N |
454 * +-------------------------------------+----+
455 */
456struct snd_soc_tplg_dapm_graph_elem {
457	char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
458	char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
459	char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
460} __attribute__((packed));
461
462/*
463 * DAPM Widget.
464 *
465 * File block representation for DAPM widget :-
466 * +-------------------------------------+-----+
467 * | struct snd_soc_tplg_hdr             |  1  |
468 * +-------------------------------------+-----+
469 * | struct snd_soc_tplg_dapm_widget     |  N  |
470 * +-------------------------------------+-----+
471 * |   struct snd_soc_tplg_enum_control  | 0|1 |
472 * |   struct snd_soc_tplg_mixer_control | 0|N |
473 * +-------------------------------------+-----+
474 *
475 * Optional enum or mixer control can be appended to the end of each widget
476 * in the block.
477 */
478struct snd_soc_tplg_dapm_widget {
479	__le32 size;		/* in bytes of this structure */
480	__le32 id;		/* SND_SOC_DAPM_CTL */
481	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
482	char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
483
484	__le32 reg;		/* negative reg = no direct dapm */
485	__le32 shift;		/* bits to shift */
486	__le32 mask;		/* non-shifted mask */
487	__le32 subseq;		/* sort within widget type */
488	__le32 invert;		/* invert the power bit */
489	__le32 ignore_suspend;	/* kept enabled over suspend */
490	__le16 event_flags;
491	__le16 event_type;
492	__le32 num_kcontrols;
493	struct snd_soc_tplg_private priv;
494	/*
495	 * kcontrols that relate to this widget
496	 * follow here after widget private data
497	 */
498} __attribute__((packed));
499
500
501/*
502 * Describes SW/FW specific features of PCM (FE DAI & DAI link).
503 *
504 * File block representation for PCM :-
505 * +-----------------------------------+-----+
506 * | struct snd_soc_tplg_hdr           |  1  |
507 * +-----------------------------------+-----+
508 * | struct snd_soc_tplg_pcm           |  N  |
509 * +-----------------------------------+-----+
510 */
511struct snd_soc_tplg_pcm {
512	__le32 size;		/* in bytes of this structure */
513	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
514	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
515	__le32 pcm_id;		/* unique ID - used to match with DAI link */
516	__le32 dai_id;		/* unique ID - used to match */
517	__le32 playback;	/* supports playback mode */
518	__le32 capture;		/* supports capture mode */
519	__le32 compress;	/* 1 = compressed; 0 = PCM */
520	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
521	__le32 num_streams;	/* number of streams */
522	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
523	__le32 flag_mask;       /* bitmask of flags to configure */
524	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
525	struct snd_soc_tplg_private priv;
526} __attribute__((packed));
527
528
529/*
530 * Describes the physical link runtime supported configs or params
531 *
532 * File block representation for physical link config :-
533 * +-----------------------------------+-----+
534 * | struct snd_soc_tplg_hdr           |  1  |
535 * +-----------------------------------+-----+
536 * | struct snd_soc_tplg_link_config   |  N  |
537 * +-----------------------------------+-----+
538 */
539struct snd_soc_tplg_link_config {
540	__le32 size;            /* in bytes of this structure */
541	__le32 id;              /* unique ID - used to match */
542	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
543	char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
544	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
545	__le32 num_streams;     /* number of streams */
546	struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
547	__le32 num_hw_configs;         /* number of hw configs */
548	__le32 default_hw_config_id;   /* default hw config ID for init */
549	__le32 flag_mask;       /* bitmask of flags to configure */
550	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
551	struct snd_soc_tplg_private priv;
552} __attribute__((packed));
553
554/*
555 * Describes SW/FW specific features of physical DAI.
556 * It can be used to configure backend DAIs for DPCM.
557 *
558 * File block representation for physical DAI :-
559 * +-----------------------------------+-----+
560 * | struct snd_soc_tplg_hdr           |  1  |
561 * +-----------------------------------+-----+
562 * | struct snd_soc_tplg_dai           |  N  |
563 * +-----------------------------------+-----+
564 */
565struct snd_soc_tplg_dai {
566	__le32 size;            /* in bytes of this structure */
567	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
568	__le32 dai_id;          /* unique ID - used to match */
569	__le32 playback;        /* supports playback mode */
570	__le32 capture;         /* supports capture mode */
571	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
572	__le32 flag_mask;       /* bitmask of flags to configure */
573	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
574	struct snd_soc_tplg_private priv;
575} __attribute__((packed));
576
577/*
578 * Old version of ABI structs, supported for backward compatibility.
579 */
580
581/* Manifest v4 */
582struct snd_soc_tplg_manifest_v4 {
583	__le32 size;		/* in bytes of this structure */
584	__le32 control_elems;	/* number of control elements */
585	__le32 widget_elems;	/* number of widget elements */
586	__le32 graph_elems;	/* number of graph elements */
587	__le32 pcm_elems;	/* number of PCM elements */
588	__le32 dai_link_elems;	/* number of DAI link elements */
589	struct snd_soc_tplg_private priv;
590} __packed;
591
592/* Stream Capabilities v4 */
593struct snd_soc_tplg_stream_caps_v4 {
594	__le32 size;		/* in bytes of this structure */
595	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
596	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
597	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
598	__le32 rate_min;	/* min rate */
599	__le32 rate_max;	/* max rate */
600	__le32 channels_min;	/* min channels */
601	__le32 channels_max;	/* max channels */
602	__le32 periods_min;	/* min number of periods */
603	__le32 periods_max;	/* max number of periods */
604	__le32 period_size_min;	/* min period size bytes */
605	__le32 period_size_max;	/* max period size bytes */
606	__le32 buffer_size_min;	/* min buffer size bytes */
607	__le32 buffer_size_max;	/* max buffer size bytes */
608} __packed;
609
610/* PCM v4 */
611struct snd_soc_tplg_pcm_v4 {
612	__le32 size;		/* in bytes of this structure */
613	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
614	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
615	__le32 pcm_id;		/* unique ID - used to match with DAI link */
616	__le32 dai_id;		/* unique ID - used to match */
617	__le32 playback;	/* supports playback mode */
618	__le32 capture;		/* supports capture mode */
619	__le32 compress;	/* 1 = compressed; 0 = PCM */
620	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
621	__le32 num_streams;	/* number of streams */
622	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
623} __packed;
624
625/* Physical link config v4 */
626struct snd_soc_tplg_link_config_v4 {
627	__le32 size;            /* in bytes of this structure */
628	__le32 id;              /* unique ID - used to match */
629	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
630	__le32 num_streams;     /* number of streams */
631} __packed;
632
633#endif
v5.9
  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 master
174 */
175#define SND_SOC_TPLG_BCLK_CM         0 /* codec is bclk master */
176#define SND_SOC_TPLG_BCLK_CS         1 /* codec is bclk slave */
177
178/* DAI topology FSYNC parameter
179 * For the backwards capability, by default codec is fsync master
180 */
181#define SND_SOC_TPLG_FSYNC_CM         0 /* codec is fsync master */
182#define SND_SOC_TPLG_FSYNC_CS         1 /* codec is fsync slave */
183
184/*
185 * Block Header.
186 * This header precedes all object and object arrays below.
187 */
188struct snd_soc_tplg_hdr {
189	__le32 magic;		/* magic number */
190	__le32 abi;		/* ABI version */
191	__le32 version;		/* optional vendor specific version details */
192	__le32 type;		/* SND_SOC_TPLG_TYPE_ */
193	__le32 size;		/* size of this structure */
194	__le32 vendor_type;	/* optional vendor specific type info */
195	__le32 payload_size;	/* data bytes, excluding this header */
196	__le32 index;		/* identifier for block */
197	__le32 count;		/* number of elements in block */
198} __attribute__((packed));
199
200/* vendor tuple for uuid */
201struct snd_soc_tplg_vendor_uuid_elem {
202	__le32 token;
203	char uuid[16];
204} __attribute__((packed));
205
206/* vendor tuple for a bool/byte/short/word value */
207struct snd_soc_tplg_vendor_value_elem {
208	__le32 token;
209	__le32 value;
210} __attribute__((packed));
211
212/* vendor tuple for string */
213struct snd_soc_tplg_vendor_string_elem {
214	__le32 token;
215	char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
216} __attribute__((packed));
217
218struct snd_soc_tplg_vendor_array {
219	__le32 size;	/* size in bytes of the array, including all elements */
220	__le32 type;	/* SND_SOC_TPLG_TUPLE_TYPE_ */
221	__le32 num_elems;	/* number of elements in array */
222	union {
223		struct snd_soc_tplg_vendor_uuid_elem uuid[0];
224		struct snd_soc_tplg_vendor_value_elem value[0];
225		struct snd_soc_tplg_vendor_string_elem string[0];
226	};
227} __attribute__((packed));
228
229/*
230 * Private data.
231 * All topology objects may have private data that can be used by the driver or
232 * firmware. Core will ignore this data.
233 */
234struct snd_soc_tplg_private {
235	__le32 size;	/* in bytes of private data */
236	union {
237		char data[0];
238		struct snd_soc_tplg_vendor_array array[0];
239	};
240} __attribute__((packed));
241
242/*
243 * Kcontrol TLV data.
244 */
245struct snd_soc_tplg_tlv_dbscale {
246	__le32 min;
247	__le32 step;
248	__le32 mute;
249} __attribute__((packed));
250
251struct snd_soc_tplg_ctl_tlv {
252	__le32 size;	/* in bytes of this structure */
253	__le32 type;	/* SNDRV_CTL_TLVT_*, type of TLV */
254	union {
255		__le32 data[SND_SOC_TPLG_TLV_SIZE];
256		struct snd_soc_tplg_tlv_dbscale scale;
257	};
258} __attribute__((packed));
259
260/*
261 * Kcontrol channel data
262 */
263struct snd_soc_tplg_channel {
264	__le32 size;	/* in bytes of this structure */
265	__le32 reg;
266	__le32 shift;
267	__le32 id;	/* ID maps to Left, Right, LFE etc */
268} __attribute__((packed));
269
270/*
271 * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
272 * Kcontrol ops need get/put/info.
273 * Bytes ext ops need get/put.
274 */
275struct snd_soc_tplg_io_ops {
276	__le32 get;
277	__le32 put;
278	__le32 info;
279} __attribute__((packed));
280
281/*
282 * kcontrol header
283 */
284struct snd_soc_tplg_ctl_hdr {
285	__le32 size;	/* in bytes of this structure */
286	__le32 type;
287	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
288	__le32 access;
289	struct snd_soc_tplg_io_ops ops;
290	struct snd_soc_tplg_ctl_tlv tlv;
291} __attribute__((packed));
292
293/*
294 * Stream Capabilities
295 */
296struct snd_soc_tplg_stream_caps {
297	__le32 size;		/* in bytes of this structure */
298	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
299	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
300	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
301	__le32 rate_min;	/* min rate */
302	__le32 rate_max;	/* max rate */
303	__le32 channels_min;	/* min channels */
304	__le32 channels_max;	/* max channels */
305	__le32 periods_min;	/* min number of periods */
306	__le32 periods_max;	/* max number of periods */
307	__le32 period_size_min;	/* min period size bytes */
308	__le32 period_size_max;	/* max period size bytes */
309	__le32 buffer_size_min;	/* min buffer size bytes */
310	__le32 buffer_size_max;	/* max buffer size bytes */
311	__le32 sig_bits;        /* number of bits of content */
312} __attribute__((packed));
313
314/*
315 * FE or BE Stream configuration supported by SW/FW
316 */
317struct snd_soc_tplg_stream {
318	__le32 size;		/* in bytes of this structure */
319	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */
320	__le64 format;		/* SNDRV_PCM_FMTBIT_* */
321	__le32 rate;		/* SNDRV_PCM_RATE_* */
322	__le32 period_bytes;	/* size of period in bytes */
323	__le32 buffer_bytes;	/* size of buffer in bytes */
324	__le32 channels;	/* channels */
325} __attribute__((packed));
326
327
328/*
329 * Describes a physical link's runtime supported hardware config,
330 * i.e. hardware audio formats.
331 */
332struct snd_soc_tplg_hw_config {
333	__le32 size;            /* in bytes of this structure */
334	__le32 id;		/* unique ID - - used to match */
335	__le32 fmt;		/* SND_SOC_DAI_FORMAT_ format value */
336	__u8 clock_gated;	/* SND_SOC_TPLG_DAI_CLK_GATE_ value */
337	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
338	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
339	__u8 bclk_master;	/* SND_SOC_TPLG_BCLK_ value */
340	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
341	__u8 mclk_direction;    /* SND_SOC_TPLG_MCLK_ value */
342	__le16 reserved;	/* for 32bit alignment */
343	__le32 mclk_rate;	/* MCLK or SYSCLK freqency in Hz */
344	__le32 bclk_rate;	/* BCLK freqency in Hz */
345	__le32 fsync_rate;	/* frame clock in Hz */
346	__le32 tdm_slots;	/* number of TDM slots in use */
347	__le32 tdm_slot_width;	/* width in bits for each slot */
348	__le32 tx_slots;	/* bit mask for active Tx slots */
349	__le32 rx_slots;	/* bit mask for active Rx slots */
350	__le32 tx_channels;	/* number of Tx channels */
351	__le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
352	__le32 rx_channels;	/* number of Rx channels */
353	__le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
354} __attribute__((packed));
355
356/*
357 * Manifest. List totals for each payload type. Not used in parsing, but will
358 * be passed to the component driver before any other objects in order for any
359 * global component resource allocations.
360 *
361 * File block representation for manifest :-
362 * +-----------------------------------+----+
363 * | struct snd_soc_tplg_hdr           |  1 |
364 * +-----------------------------------+----+
365 * | struct snd_soc_tplg_manifest      |  1 |
366 * +-----------------------------------+----+
367 */
368struct snd_soc_tplg_manifest {
369	__le32 size;		/* in bytes of this structure */
370	__le32 control_elems;	/* number of control elements */
371	__le32 widget_elems;	/* number of widget elements */
372	__le32 graph_elems;	/* number of graph elements */
373	__le32 pcm_elems;	/* number of PCM elements */
374	__le32 dai_link_elems;	/* number of DAI link elements */
375	__le32 dai_elems;	/* number of physical DAI elements */
376	__le32 reserved[20];	/* reserved for new ABI element types */
377	struct snd_soc_tplg_private priv;
378} __attribute__((packed));
379
380/*
381 * Mixer kcontrol.
382 *
383 * File block representation for mixer kcontrol :-
384 * +-----------------------------------+----+
385 * | struct snd_soc_tplg_hdr           |  1 |
386 * +-----------------------------------+----+
387 * | struct snd_soc_tplg_mixer_control |  N |
388 * +-----------------------------------+----+
389 */
390struct snd_soc_tplg_mixer_control {
391	struct snd_soc_tplg_ctl_hdr hdr;
392	__le32 size;	/* in bytes of this structure */
393	__le32 min;
394	__le32 max;
395	__le32 platform_max;
396	__le32 invert;
397	__le32 num_channels;
398	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
399	struct snd_soc_tplg_private priv;
400} __attribute__((packed));
401
402/*
403 * Enumerated kcontrol
404 *
405 * File block representation for enum kcontrol :-
406 * +-----------------------------------+----+
407 * | struct snd_soc_tplg_hdr           |  1 |
408 * +-----------------------------------+----+
409 * | struct snd_soc_tplg_enum_control  |  N |
410 * +-----------------------------------+----+
411 */
412struct snd_soc_tplg_enum_control {
413	struct snd_soc_tplg_ctl_hdr hdr;
414	__le32 size;	/* in bytes of this structure */
415	__le32 num_channels;
416	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
417	__le32 items;
418	__le32 mask;
419	__le32 count;
420	char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
421	__le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
422	struct snd_soc_tplg_private priv;
423} __attribute__((packed));
424
425/*
426 * Bytes kcontrol
427 *
428 * File block representation for bytes kcontrol :-
429 * +-----------------------------------+----+
430 * | struct snd_soc_tplg_hdr           |  1 |
431 * +-----------------------------------+----+
432 * | struct snd_soc_tplg_bytes_control |  N |
433 * +-----------------------------------+----+
434 */
435struct snd_soc_tplg_bytes_control {
436	struct snd_soc_tplg_ctl_hdr hdr;
437	__le32 size;	/* in bytes of this structure */
438	__le32 max;
439	__le32 mask;
440	__le32 base;
441	__le32 num_regs;
442	struct snd_soc_tplg_io_ops ext_ops;
443	struct snd_soc_tplg_private priv;
444} __attribute__((packed));
445
446/*
447 * DAPM Graph Element
448 *
449 * File block representation for DAPM graph elements :-
450 * +-------------------------------------+----+
451 * | struct snd_soc_tplg_hdr             |  1 |
452 * +-------------------------------------+----+
453 * | struct snd_soc_tplg_dapm_graph_elem |  N |
454 * +-------------------------------------+----+
455 */
456struct snd_soc_tplg_dapm_graph_elem {
457	char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
458	char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
459	char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
460} __attribute__((packed));
461
462/*
463 * DAPM Widget.
464 *
465 * File block representation for DAPM widget :-
466 * +-------------------------------------+-----+
467 * | struct snd_soc_tplg_hdr             |  1  |
468 * +-------------------------------------+-----+
469 * | struct snd_soc_tplg_dapm_widget     |  N  |
470 * +-------------------------------------+-----+
471 * |   struct snd_soc_tplg_enum_control  | 0|1 |
472 * |   struct snd_soc_tplg_mixer_control | 0|N |
473 * +-------------------------------------+-----+
474 *
475 * Optional enum or mixer control can be appended to the end of each widget
476 * in the block.
477 */
478struct snd_soc_tplg_dapm_widget {
479	__le32 size;		/* in bytes of this structure */
480	__le32 id;		/* SND_SOC_DAPM_CTL */
481	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
482	char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
483
484	__le32 reg;		/* negative reg = no direct dapm */
485	__le32 shift;		/* bits to shift */
486	__le32 mask;		/* non-shifted mask */
487	__le32 subseq;		/* sort within widget type */
488	__le32 invert;		/* invert the power bit */
489	__le32 ignore_suspend;	/* kept enabled over suspend */
490	__le16 event_flags;
491	__le16 event_type;
492	__le32 num_kcontrols;
493	struct snd_soc_tplg_private priv;
494	/*
495	 * kcontrols that relate to this widget
496	 * follow here after widget private data
497	 */
498} __attribute__((packed));
499
500
501/*
502 * Describes SW/FW specific features of PCM (FE DAI & DAI link).
503 *
504 * File block representation for PCM :-
505 * +-----------------------------------+-----+
506 * | struct snd_soc_tplg_hdr           |  1  |
507 * +-----------------------------------+-----+
508 * | struct snd_soc_tplg_pcm           |  N  |
509 * +-----------------------------------+-----+
510 */
511struct snd_soc_tplg_pcm {
512	__le32 size;		/* in bytes of this structure */
513	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
514	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
515	__le32 pcm_id;		/* unique ID - used to match with DAI link */
516	__le32 dai_id;		/* unique ID - used to match */
517	__le32 playback;	/* supports playback mode */
518	__le32 capture;		/* supports capture mode */
519	__le32 compress;	/* 1 = compressed; 0 = PCM */
520	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
521	__le32 num_streams;	/* number of streams */
522	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
523	__le32 flag_mask;       /* bitmask of flags to configure */
524	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
525	struct snd_soc_tplg_private priv;
526} __attribute__((packed));
527
528
529/*
530 * Describes the physical link runtime supported configs or params
531 *
532 * File block representation for physical link config :-
533 * +-----------------------------------+-----+
534 * | struct snd_soc_tplg_hdr           |  1  |
535 * +-----------------------------------+-----+
536 * | struct snd_soc_tplg_link_config   |  N  |
537 * +-----------------------------------+-----+
538 */
539struct snd_soc_tplg_link_config {
540	__le32 size;            /* in bytes of this structure */
541	__le32 id;              /* unique ID - used to match */
542	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
543	char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
544	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
545	__le32 num_streams;     /* number of streams */
546	struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
547	__le32 num_hw_configs;         /* number of hw configs */
548	__le32 default_hw_config_id;   /* default hw config ID for init */
549	__le32 flag_mask;       /* bitmask of flags to configure */
550	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
551	struct snd_soc_tplg_private priv;
552} __attribute__((packed));
553
554/*
555 * Describes SW/FW specific features of physical DAI.
556 * It can be used to configure backend DAIs for DPCM.
557 *
558 * File block representation for physical DAI :-
559 * +-----------------------------------+-----+
560 * | struct snd_soc_tplg_hdr           |  1  |
561 * +-----------------------------------+-----+
562 * | struct snd_soc_tplg_dai           |  N  |
563 * +-----------------------------------+-----+
564 */
565struct snd_soc_tplg_dai {
566	__le32 size;            /* in bytes of this structure */
567	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
568	__le32 dai_id;          /* unique ID - used to match */
569	__le32 playback;        /* supports playback mode */
570	__le32 capture;         /* supports capture mode */
571	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
572	__le32 flag_mask;       /* bitmask of flags to configure */
573	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
574	struct snd_soc_tplg_private priv;
575} __attribute__((packed));
576
577/*
578 * Old version of ABI structs, supported for backward compatibility.
579 */
580
581/* Manifest v4 */
582struct snd_soc_tplg_manifest_v4 {
583	__le32 size;		/* in bytes of this structure */
584	__le32 control_elems;	/* number of control elements */
585	__le32 widget_elems;	/* number of widget elements */
586	__le32 graph_elems;	/* number of graph elements */
587	__le32 pcm_elems;	/* number of PCM elements */
588	__le32 dai_link_elems;	/* number of DAI link elements */
589	struct snd_soc_tplg_private priv;
590} __packed;
591
592/* Stream Capabilities v4 */
593struct snd_soc_tplg_stream_caps_v4 {
594	__le32 size;		/* in bytes of this structure */
595	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
596	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
597	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
598	__le32 rate_min;	/* min rate */
599	__le32 rate_max;	/* max rate */
600	__le32 channels_min;	/* min channels */
601	__le32 channels_max;	/* max channels */
602	__le32 periods_min;	/* min number of periods */
603	__le32 periods_max;	/* max number of periods */
604	__le32 period_size_min;	/* min period size bytes */
605	__le32 period_size_max;	/* max period size bytes */
606	__le32 buffer_size_min;	/* min buffer size bytes */
607	__le32 buffer_size_max;	/* max buffer size bytes */
608} __packed;
609
610/* PCM v4 */
611struct snd_soc_tplg_pcm_v4 {
612	__le32 size;		/* in bytes of this structure */
613	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
614	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
615	__le32 pcm_id;		/* unique ID - used to match with DAI link */
616	__le32 dai_id;		/* unique ID - used to match */
617	__le32 playback;	/* supports playback mode */
618	__le32 capture;		/* supports capture mode */
619	__le32 compress;	/* 1 = compressed; 0 = PCM */
620	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
621	__le32 num_streams;	/* number of streams */
622	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
623} __packed;
624
625/* Physical link config v4 */
626struct snd_soc_tplg_link_config_v4 {
627	__le32 size;            /* in bytes of this structure */
628	__le32 id;              /* unique ID - used to match */
629	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
630	__le32 num_streams;     /* number of streams */
631} __packed;
632
633#endif