linux/include/uapi/sound/asoc.h
<<
>>
Prefs
   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
 634