summaryrefslogtreecommitdiffstats
path: root/meta/recipes-multimedia/alsa
diff options
context:
space:
mode:
authorTanu Kaskinen <tanuk@iki.fi>2020-01-06 11:18:02 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-01-10 21:18:22 +0000
commit6593b950bbdaef6d7036ee08a8bb047692edf3e5 (patch)
tree235b97439a3f41c379b244fff5fcd89cf2158632 /meta/recipes-multimedia/alsa
parentfd61f30c2a723e497edc33902998d7b464e1efaf (diff)
downloadpoky-6593b950bbdaef6d7036ee08a8bb047692edf3e5.tar.gz
alsa-lib: 1.1.9 -> 1.2.1.2
Changelogs: https://alsa-project.org/wiki/Changes_v1.1.9_v1.2.1 https://alsa-project.org/wiki/Changes_v1.2.1_v1.2.1.1 https://alsa-project.org/wiki/Changes_v1.2.1.1_v1.2.1.2 This upgrade brings support for the new "UCM2" configuration format. Another big change is that the UCM and topology configuration files were moved to separate repositories, so those are removed from alsa-lib and will need to be packaged separately. The topology API was moved from libasound to a separate libatopology library. This seems like a recipe for regressions for applications that used to use libasound for the topology stuff, but I don't think there are many applications in existence that use the topology API. I hope the upstream knows what they are doing. Patches added: 0001-configure.ac-remove-an-unnecessary-libtool-fix.patch This fixes a failure during configure. 0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch 0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch Backports. I don't know if these are regression fixes, but since the UCM code was heavily worked on in this upgrade, it seems likely that these patches fix regressions. 0003-namehint-correct-the-args-check.patch 0004-namehint-improve-the-previous-patch-check-the-return.patch Backports. A change in alsa-plugins caused a regression in the pulse plugin, but that was actually due to a bug in alsa-lib, which is fixed by these patches. 0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch Backport. Fixes a regression with some Intel hardware. 0001-Fix-alsa-sound-.h-for-external-programs.patch 0001-uapi-Move-typedefs-from-uapi-to-sound.patch Backports. These fix build failures in alsa-tools. I removed alsa-doc from PACKAGES, because no files were assigned to it. (From OE-Core rev: 966890009b4dd81abb72534192c688dbd1195d00) Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-multimedia/alsa')
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch7104
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch50
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch137
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch41
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch45
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch34
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch31
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib/0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch86
-rw-r--r--meta/recipes-multimedia/alsa/alsa-lib_1.2.1.2.bb (renamed from meta/recipes-multimedia/alsa/alsa-lib_1.1.9.bb)18
9 files changed, 7542 insertions, 4 deletions
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch b/meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch
new file mode 100644
index 0000000000..890650a772
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch
@@ -0,0 +1,7104 @@
1From ae564665ec261cf104de499b1cdda3564070fc65 Mon Sep 17 00:00:00 2001
2From: Takashi Iwai <tiwai@suse.de>
3Date: Fri, 20 Dec 2019 15:46:48 +0100
4Subject: [PATCH] Fix alsa/sound/*.h for external programs
5
6The recent update of sound/*.h to sync with the latest Linus uapi
7files broke the build of alsa-tools programs. These files used to be
8a modified version of Linux sound/* header files, so that they could
9be built without Linux headers. The special prefix like __user and
10other things were worked around there.
11
12We may do that again, but a better approach is to fix those things in
13Linux kernel uapi side, while we keep the minimal workaround in
14alsa-lib such as the __u16 and co type definitions.
15
16This patch is such an attempt, namely:
17- Keep the original $LINUX/uapi/sound/*.h in include/sound/uapi
18 directory
19- The "fixes" are applied to some uapi headers, so that they don't
20 contain Linux-specific prefix and use of opaque struct like
21 snd_ctl_elem_id
22- The uapi headers are included indirectly from include/sound/*.h
23- Some headers have inclusion of type_compat.h for the Linux variable
24 types and prefixes
25- type_compat.h tries to use <linux/types.h> when __linux__ is
26 defined, instead of the own conflicting definitions
27
28The last type might need a bit more adjustment depending on the
29compiler, but it can be fixed locally without disturbing else.
30
31Signed-off-by: Takashi Iwai <tiwai@suse.de>
32
33Upstream-Status: Backport
34
35Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
36
37---
38 configure.ac | 3 +-
39 include/sound/Makefile.am | 6 +-
40 include/sound/asequencer.h | 613 +----------------
41 include/sound/asoc.h | 634 +-----------------
42 include/sound/asound.h | 1039 +----------------------------
43 include/sound/asound_fm.h | 136 +---
44 include/sound/emu10k1.h | 383 +----------
45 include/sound/hdsp.h | 113 +---
46 include/sound/hdspm.h | 234 +------
47 include/sound/sb16_csp.h | 124 +---
48 include/sound/sscape_ioctl.h | 22 +-
49 include/sound/tlv.h | 118 +---
50 include/sound/type_compat.h | 13 +
51 include/sound/uapi/Makefile.am | 6 +
52 include/sound/uapi/asequencer.h | 612 +++++++++++++++++
53 include/sound/uapi/asoc.h | 633 ++++++++++++++++++
54 include/sound/uapi/asound.h | 1038 ++++++++++++++++++++++++++++
55 include/sound/uapi/asound_fm.h | 135 ++++
56 include/sound/uapi/emu10k1.h | 395 +++++++++++
57 include/sound/uapi/hdsp.h | 109 +++
58 include/sound/uapi/hdspm.h | 230 +++++++
59 include/sound/uapi/sb16_csp.h | 123 ++++
60 include/sound/uapi/sscape_ioctl.h | 21 +
61 include/sound/uapi/tlv.h | 117 ++++
62 src/topology/tplg_local.h | 3 +-
63 25 files changed, 3452 insertions(+), 3408 deletions(-)
64 create mode 100644 include/sound/uapi/Makefile.am
65 create mode 100644 include/sound/uapi/asequencer.h
66 create mode 100644 include/sound/uapi/asoc.h
67 create mode 100644 include/sound/uapi/asound.h
68 create mode 100644 include/sound/uapi/asound_fm.h
69 create mode 100644 include/sound/uapi/emu10k1.h
70 create mode 100644 include/sound/uapi/hdsp.h
71 create mode 100644 include/sound/uapi/hdspm.h
72 create mode 100644 include/sound/uapi/sb16_csp.h
73 create mode 100644 include/sound/uapi/sscape_ioctl.h
74 create mode 100644 include/sound/uapi/tlv.h
75
76diff --git a/configure.ac b/configure.ac
77index 119ef600..886f87bc 100644
78--- a/configure.ac
79+++ b/configure.ac
80@@ -707,7 +707,8 @@ if test ! -L "$srcdir"/include/alsa ; then
81 fi
82
83 AC_OUTPUT(Makefile doc/Makefile doc/pictures/Makefile doc/doxygen.cfg \
84- include/Makefile include/sound/Makefile src/Versions src/Makefile \
85+ include/Makefile include/sound/Makefile include/sound/uapi/Makefile \
86+ src/Versions src/Makefile \
87 src/control/Makefile src/mixer/Makefile \
88 src/pcm/Makefile src/pcm/scopes/Makefile \
89 src/rawmidi/Makefile src/timer/Makefile \
90diff --git a/include/sound/Makefile.am b/include/sound/Makefile.am
91index 99c42211..ccc7d273 100644
92--- a/include/sound/Makefile.am
93+++ b/include/sound/Makefile.am
94@@ -1,7 +1,9 @@
95+SUBDIRS = uapi
96+
97 alsasoundincludedir = ${includedir}/alsa/sound
98
99 alsasoundinclude_HEADERS = asound_fm.h hdsp.h hdspm.h sb16_csp.h \
100- sscape_ioctl.h emu10k1.h type_compat.h \
101- asoc.h tlv.h
102+ sscape_ioctl.h emu10k1.h asoc.h tlv.h \
103+ type_compat.h
104
105 noinst_HEADERS = asound.h asequencer.h
106diff --git a/include/sound/asequencer.h b/include/sound/asequencer.h
107index a75e14ed..e539a77e 100644
108--- a/include/sound/asequencer.h
109+++ b/include/sound/asequencer.h
110@@ -1,612 +1 @@
111-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
112-/*
113- * Main header file for the ALSA sequencer
114- * Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
115- * (c) 1998-1999 by Jaroslav Kysela <perex@perex.cz>
116- *
117- *
118- * This program is free software; you can redistribute it and/or modify
119- * it under the terms of the GNU General Public License as published by
120- * the Free Software Foundation; either version 2 of the License, or
121- * (at your option) any later version.
122- *
123- * This program is distributed in the hope that it will be useful,
124- * but WITHOUT ANY WARRANTY; without even the implied warranty of
125- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
126- * GNU General Public License for more details.
127- *
128- * You should have received a copy of the GNU General Public License
129- * along with this program; if not, write to the Free Software
130- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
131- *
132- */
133-#ifndef _UAPI__SOUND_ASEQUENCER_H
134-#define _UAPI__SOUND_ASEQUENCER_H
135-
136-#include <sound/asound.h>
137-
138-/** version of the sequencer */
139-#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 2)
140-
141-/**
142- * definition of sequencer event types
143- */
144-
145-/** system messages
146- * event data type = #snd_seq_result
147- */
148-#define SNDRV_SEQ_EVENT_SYSTEM 0
149-#define SNDRV_SEQ_EVENT_RESULT 1
150-
151-/** note messages (channel specific)
152- * event data type = #snd_seq_ev_note
153- */
154-#define SNDRV_SEQ_EVENT_NOTE 5
155-#define SNDRV_SEQ_EVENT_NOTEON 6
156-#define SNDRV_SEQ_EVENT_NOTEOFF 7
157-#define SNDRV_SEQ_EVENT_KEYPRESS 8
158-
159-/** control messages (channel specific)
160- * event data type = #snd_seq_ev_ctrl
161- */
162-#define SNDRV_SEQ_EVENT_CONTROLLER 10
163-#define SNDRV_SEQ_EVENT_PGMCHANGE 11
164-#define SNDRV_SEQ_EVENT_CHANPRESS 12
165-#define SNDRV_SEQ_EVENT_PITCHBEND 13 /**< from -8192 to 8191 */
166-#define SNDRV_SEQ_EVENT_CONTROL14 14 /**< 14 bit controller value */
167-#define SNDRV_SEQ_EVENT_NONREGPARAM 15 /**< 14 bit NRPN address + 14 bit unsigned value */
168-#define SNDRV_SEQ_EVENT_REGPARAM 16 /**< 14 bit RPN address + 14 bit unsigned value */
169-
170-/** synchronisation messages
171- * event data type = #snd_seq_ev_ctrl
172- */
173-#define SNDRV_SEQ_EVENT_SONGPOS 20 /* Song Position Pointer with LSB and MSB values */
174-#define SNDRV_SEQ_EVENT_SONGSEL 21 /* Song Select with song ID number */
175-#define SNDRV_SEQ_EVENT_QFRAME 22 /* midi time code quarter frame */
176-#define SNDRV_SEQ_EVENT_TIMESIGN 23 /* SMF Time Signature event */
177-#define SNDRV_SEQ_EVENT_KEYSIGN 24 /* SMF Key Signature event */
178-
179-/** timer messages
180- * event data type = snd_seq_ev_queue_control
181- */
182-#define SNDRV_SEQ_EVENT_START 30 /* midi Real Time Start message */
183-#define SNDRV_SEQ_EVENT_CONTINUE 31 /* midi Real Time Continue message */
184-#define SNDRV_SEQ_EVENT_STOP 32 /* midi Real Time Stop message */
185-#define SNDRV_SEQ_EVENT_SETPOS_TICK 33 /* set tick queue position */
186-#define SNDRV_SEQ_EVENT_SETPOS_TIME 34 /* set realtime queue position */
187-#define SNDRV_SEQ_EVENT_TEMPO 35 /* (SMF) Tempo event */
188-#define SNDRV_SEQ_EVENT_CLOCK 36 /* midi Real Time Clock message */
189-#define SNDRV_SEQ_EVENT_TICK 37 /* midi Real Time Tick message */
190-#define SNDRV_SEQ_EVENT_QUEUE_SKEW 38 /* skew queue tempo */
191-
192-/** others
193- * event data type = none
194- */
195-#define SNDRV_SEQ_EVENT_TUNE_REQUEST 40 /* tune request */
196-#define SNDRV_SEQ_EVENT_RESET 41 /* reset to power-on state */
197-#define SNDRV_SEQ_EVENT_SENSING 42 /* "active sensing" event */
198-
199-/** echo back, kernel private messages
200- * event data type = any type
201- */
202-#define SNDRV_SEQ_EVENT_ECHO 50 /* echo event */
203-#define SNDRV_SEQ_EVENT_OSS 51 /* OSS raw event */
204-
205-/** system status messages (broadcast for subscribers)
206- * event data type = snd_seq_addr
207- */
208-#define SNDRV_SEQ_EVENT_CLIENT_START 60 /* new client has connected */
209-#define SNDRV_SEQ_EVENT_CLIENT_EXIT 61 /* client has left the system */
210-#define SNDRV_SEQ_EVENT_CLIENT_CHANGE 62 /* client status/info has changed */
211-#define SNDRV_SEQ_EVENT_PORT_START 63 /* new port was created */
212-#define SNDRV_SEQ_EVENT_PORT_EXIT 64 /* port was deleted from system */
213-#define SNDRV_SEQ_EVENT_PORT_CHANGE 65 /* port status/info has changed */
214-
215-/** port connection changes
216- * event data type = snd_seq_connect
217- */
218-#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED 66 /* ports connected */
219-#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67 /* ports disconnected */
220-
221-/* 70-89: synthesizer events - obsoleted */
222-
223-/** user-defined events with fixed length
224- * event data type = any
225- */
226-#define SNDRV_SEQ_EVENT_USR0 90
227-#define SNDRV_SEQ_EVENT_USR1 91
228-#define SNDRV_SEQ_EVENT_USR2 92
229-#define SNDRV_SEQ_EVENT_USR3 93
230-#define SNDRV_SEQ_EVENT_USR4 94
231-#define SNDRV_SEQ_EVENT_USR5 95
232-#define SNDRV_SEQ_EVENT_USR6 96
233-#define SNDRV_SEQ_EVENT_USR7 97
234-#define SNDRV_SEQ_EVENT_USR8 98
235-#define SNDRV_SEQ_EVENT_USR9 99
236-
237-/* 100-118: instrument layer - obsoleted */
238-/* 119-129: reserved */
239-
240-/* 130-139: variable length events
241- * event data type = snd_seq_ev_ext
242- * (SNDRV_SEQ_EVENT_LENGTH_VARIABLE must be set)
243- */
244-#define SNDRV_SEQ_EVENT_SYSEX 130 /* system exclusive data (variable length) */
245-#define SNDRV_SEQ_EVENT_BOUNCE 131 /* error event */
246-/* 132-134: reserved */
247-#define SNDRV_SEQ_EVENT_USR_VAR0 135
248-#define SNDRV_SEQ_EVENT_USR_VAR1 136
249-#define SNDRV_SEQ_EVENT_USR_VAR2 137
250-#define SNDRV_SEQ_EVENT_USR_VAR3 138
251-#define SNDRV_SEQ_EVENT_USR_VAR4 139
252-
253-/* 150-151: kernel events with quote - DO NOT use in user clients */
254-#define SNDRV_SEQ_EVENT_KERNEL_ERROR 150
255-#define SNDRV_SEQ_EVENT_KERNEL_QUOTE 151 /* obsolete */
256-
257-/* 152-191: reserved */
258-
259-/* 192-254: hardware specific events */
260-
261-/* 255: special event */
262-#define SNDRV_SEQ_EVENT_NONE 255
263-
264-
265-typedef unsigned char snd_seq_event_type_t;
266-
267-/** event address */
268-struct snd_seq_addr {
269- unsigned char client; /**< Client number: 0..255, 255 = broadcast to all clients */
270- unsigned char port; /**< Port within client: 0..255, 255 = broadcast to all ports */
271-};
272-
273-/** port connection */
274-struct snd_seq_connect {
275- struct snd_seq_addr sender;
276- struct snd_seq_addr dest;
277-};
278-
279-
280-#define SNDRV_SEQ_ADDRESS_UNKNOWN 253 /* unknown source */
281-#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS 254 /* send event to all subscribed ports */
282-#define SNDRV_SEQ_ADDRESS_BROADCAST 255 /* send event to all queues/clients/ports/channels */
283-#define SNDRV_SEQ_QUEUE_DIRECT 253 /* direct dispatch */
284-
285- /* event mode flag - NOTE: only 8 bits available! */
286-#define SNDRV_SEQ_TIME_STAMP_TICK (0<<0) /* timestamp in clock ticks */
287-#define SNDRV_SEQ_TIME_STAMP_REAL (1<<0) /* timestamp in real time */
288-#define SNDRV_SEQ_TIME_STAMP_MASK (1<<0)
289-
290-#define SNDRV_SEQ_TIME_MODE_ABS (0<<1) /* absolute timestamp */
291-#define SNDRV_SEQ_TIME_MODE_REL (1<<1) /* relative to current time */
292-#define SNDRV_SEQ_TIME_MODE_MASK (1<<1)
293-
294-#define SNDRV_SEQ_EVENT_LENGTH_FIXED (0<<2) /* fixed event size */
295-#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE (1<<2) /* variable event size */
296-#define SNDRV_SEQ_EVENT_LENGTH_VARUSR (2<<2) /* variable event size - user memory space */
297-#define SNDRV_SEQ_EVENT_LENGTH_MASK (3<<2)
298-
299-#define SNDRV_SEQ_PRIORITY_NORMAL (0<<4) /* normal priority */
300-#define SNDRV_SEQ_PRIORITY_HIGH (1<<4) /* event should be processed before others */
301-#define SNDRV_SEQ_PRIORITY_MASK (1<<4)
302-
303-
304- /* note event */
305-struct snd_seq_ev_note {
306- unsigned char channel;
307- unsigned char note;
308- unsigned char velocity;
309- unsigned char off_velocity; /* only for SNDRV_SEQ_EVENT_NOTE */
310- unsigned int duration; /* only for SNDRV_SEQ_EVENT_NOTE */
311-};
312-
313- /* controller event */
314-struct snd_seq_ev_ctrl {
315- unsigned char channel;
316- unsigned char unused1, unused2, unused3; /* pad */
317- unsigned int param;
318- signed int value;
319-};
320-
321- /* generic set of bytes (12x8 bit) */
322-struct snd_seq_ev_raw8 {
323- unsigned char d[12]; /* 8 bit value */
324-};
325-
326- /* generic set of integers (3x32 bit) */
327-struct snd_seq_ev_raw32 {
328- unsigned int d[3]; /* 32 bit value */
329-};
330-
331- /* external stored data */
332-struct snd_seq_ev_ext {
333- unsigned int len; /* length of data */
334- void *ptr; /* pointer to data (note: maybe 64-bit) */
335-} __attribute__((packed));
336-
337-struct snd_seq_result {
338- int event; /* processed event type */
339- int result;
340-};
341-
342-
343-struct snd_seq_real_time {
344- unsigned int tv_sec; /* seconds */
345- unsigned int tv_nsec; /* nanoseconds */
346-};
347-
348-typedef unsigned int snd_seq_tick_time_t; /* midi ticks */
349-
350-union snd_seq_timestamp {
351- snd_seq_tick_time_t tick;
352- struct snd_seq_real_time time;
353-};
354-
355-struct snd_seq_queue_skew {
356- unsigned int value;
357- unsigned int base;
358-};
359-
360- /* queue timer control */
361-struct snd_seq_ev_queue_control {
362- unsigned char queue; /* affected queue */
363- unsigned char pad[3]; /* reserved */
364- union {
365- signed int value; /* affected value (e.g. tempo) */
366- union snd_seq_timestamp time; /* time */
367- unsigned int position; /* sync position */
368- struct snd_seq_queue_skew skew;
369- unsigned int d32[2];
370- unsigned char d8[8];
371- } param;
372-};
373-
374- /* quoted event - inside the kernel only */
375-struct snd_seq_ev_quote {
376- struct snd_seq_addr origin; /* original sender */
377- unsigned short value; /* optional data */
378- struct snd_seq_event *event; /* quoted event */
379-} __attribute__((packed));
380-
381-
382- /* sequencer event */
383-struct snd_seq_event {
384- snd_seq_event_type_t type; /* event type */
385- unsigned char flags; /* event flags */
386- char tag;
387-
388- unsigned char queue; /* schedule queue */
389- union snd_seq_timestamp time; /* schedule time */
390-
391-
392- struct snd_seq_addr source; /* source address */
393- struct snd_seq_addr dest; /* destination address */
394-
395- union { /* event data... */
396- struct snd_seq_ev_note note;
397- struct snd_seq_ev_ctrl control;
398- struct snd_seq_ev_raw8 raw8;
399- struct snd_seq_ev_raw32 raw32;
400- struct snd_seq_ev_ext ext;
401- struct snd_seq_ev_queue_control queue;
402- union snd_seq_timestamp time;
403- struct snd_seq_addr addr;
404- struct snd_seq_connect connect;
405- struct snd_seq_result result;
406- struct snd_seq_ev_quote quote;
407- } data;
408-};
409-
410-
411-/*
412- * bounce event - stored as variable size data
413- */
414-struct snd_seq_event_bounce {
415- int err;
416- struct snd_seq_event event;
417- /* external data follows here. */
418-};
419-
420-
421- /* system information */
422-struct snd_seq_system_info {
423- int queues; /* maximum queues count */
424- int clients; /* maximum clients count */
425- int ports; /* maximum ports per client */
426- int channels; /* maximum channels per port */
427- int cur_clients; /* current clients */
428- int cur_queues; /* current queues */
429- char reserved[24];
430-};
431-
432-
433- /* system running information */
434-struct snd_seq_running_info {
435- unsigned char client; /* client id */
436- unsigned char big_endian; /* 1 = big-endian */
437- unsigned char cpu_mode; /* 4 = 32bit, 8 = 64bit */
438- unsigned char pad; /* reserved */
439- unsigned char reserved[12];
440-};
441-
442-
443- /* known client numbers */
444-#define SNDRV_SEQ_CLIENT_SYSTEM 0
445- /* internal client numbers */
446-#define SNDRV_SEQ_CLIENT_DUMMY 14 /* midi through */
447-#define SNDRV_SEQ_CLIENT_OSS 15 /* oss sequencer emulator */
448-
449-
450- /* client types */
451-typedef int __bitwise snd_seq_client_type_t;
452-#define NO_CLIENT ((__force snd_seq_client_type_t) 0)
453-#define USER_CLIENT ((__force snd_seq_client_type_t) 1)
454-#define KERNEL_CLIENT ((__force snd_seq_client_type_t) 2)
455-
456- /* event filter flags */
457-#define SNDRV_SEQ_FILTER_BROADCAST (1<<0) /* accept broadcast messages */
458-#define SNDRV_SEQ_FILTER_MULTICAST (1<<1) /* accept multicast messages */
459-#define SNDRV_SEQ_FILTER_BOUNCE (1<<2) /* accept bounce event in error */
460-#define SNDRV_SEQ_FILTER_USE_EVENT (1<<31) /* use event filter */
461-
462-struct snd_seq_client_info {
463- int client; /* client number to inquire */
464- snd_seq_client_type_t type; /* client type */
465- char name[64]; /* client name */
466- unsigned int filter; /* filter flags */
467- unsigned char multicast_filter[8]; /* multicast filter bitmap */
468- unsigned char event_filter[32]; /* event filter bitmap */
469- int num_ports; /* RO: number of ports */
470- int event_lost; /* number of lost events */
471- int card; /* RO: card number[kernel] */
472- int pid; /* RO: pid[user] */
473- char reserved[56]; /* for future use */
474-};
475-
476-
477-/* client pool size */
478-struct snd_seq_client_pool {
479- int client; /* client number to inquire */
480- int output_pool; /* outgoing (write) pool size */
481- int input_pool; /* incoming (read) pool size */
482- int output_room; /* minimum free pool size for select/blocking mode */
483- int output_free; /* unused size */
484- int input_free; /* unused size */
485- char reserved[64];
486-};
487-
488-
489-/* Remove events by specified criteria */
490-
491-#define SNDRV_SEQ_REMOVE_INPUT (1<<0) /* Flush input queues */
492-#define SNDRV_SEQ_REMOVE_OUTPUT (1<<1) /* Flush output queues */
493-#define SNDRV_SEQ_REMOVE_DEST (1<<2) /* Restrict by destination q:client:port */
494-#define SNDRV_SEQ_REMOVE_DEST_CHANNEL (1<<3) /* Restrict by channel */
495-#define SNDRV_SEQ_REMOVE_TIME_BEFORE (1<<4) /* Restrict to before time */
496-#define SNDRV_SEQ_REMOVE_TIME_AFTER (1<<5) /* Restrict to time or after */
497-#define SNDRV_SEQ_REMOVE_TIME_TICK (1<<6) /* Time is in ticks */
498-#define SNDRV_SEQ_REMOVE_EVENT_TYPE (1<<7) /* Restrict to event type */
499-#define SNDRV_SEQ_REMOVE_IGNORE_OFF (1<<8) /* Do not flush off events */
500-#define SNDRV_SEQ_REMOVE_TAG_MATCH (1<<9) /* Restrict to events with given tag */
501-
502-struct snd_seq_remove_events {
503- unsigned int remove_mode; /* Flags that determine what gets removed */
504-
505- union snd_seq_timestamp time;
506-
507- unsigned char queue; /* Queue for REMOVE_DEST */
508- struct snd_seq_addr dest; /* Address for REMOVE_DEST */
509- unsigned char channel; /* Channel for REMOVE_DEST */
510-
511- int type; /* For REMOVE_EVENT_TYPE */
512- char tag; /* Tag for REMOVE_TAG */
513-
514- int reserved[10]; /* To allow for future binary compatibility */
515-
516-};
517-
518-
519- /* known port numbers */
520-#define SNDRV_SEQ_PORT_SYSTEM_TIMER 0
521-#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE 1
522-
523- /* port capabilities (32 bits) */
524-#define SNDRV_SEQ_PORT_CAP_READ (1<<0) /* readable from this port */
525-#define SNDRV_SEQ_PORT_CAP_WRITE (1<<1) /* writable to this port */
526-
527-#define SNDRV_SEQ_PORT_CAP_SYNC_READ (1<<2)
528-#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE (1<<3)
529-
530-#define SNDRV_SEQ_PORT_CAP_DUPLEX (1<<4)
531-
532-#define SNDRV_SEQ_PORT_CAP_SUBS_READ (1<<5) /* allow read subscription */
533-#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE (1<<6) /* allow write subscription */
534-#define SNDRV_SEQ_PORT_CAP_NO_EXPORT (1<<7) /* routing not allowed */
535-
536- /* port type */
537-#define SNDRV_SEQ_PORT_TYPE_SPECIFIC (1<<0) /* hardware specific */
538-#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1) /* generic MIDI device */
539-#define SNDRV_SEQ_PORT_TYPE_MIDI_GM (1<<2) /* General MIDI compatible device */
540-#define SNDRV_SEQ_PORT_TYPE_MIDI_GS (1<<3) /* GS compatible device */
541-#define SNDRV_SEQ_PORT_TYPE_MIDI_XG (1<<4) /* XG compatible device */
542-#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32 (1<<5) /* MT-32 compatible device */
543-#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2 (1<<6) /* General MIDI 2 compatible device */
544-
545-/* other standards...*/
546-#define SNDRV_SEQ_PORT_TYPE_SYNTH (1<<10) /* Synth device (no MIDI compatible - direct wavetable) */
547-#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11) /* Sampling device (support sample download) */
548-#define SNDRV_SEQ_PORT_TYPE_SAMPLE (1<<12) /* Sampling device (sample can be downloaded at any time) */
549-/*...*/
550-#define SNDRV_SEQ_PORT_TYPE_HARDWARE (1<<16) /* driver for a hardware device */
551-#define SNDRV_SEQ_PORT_TYPE_SOFTWARE (1<<17) /* implemented in software */
552-#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER (1<<18) /* generates sound */
553-#define SNDRV_SEQ_PORT_TYPE_PORT (1<<19) /* connects to other device(s) */
554-#define SNDRV_SEQ_PORT_TYPE_APPLICATION (1<<20) /* application (sequencer/editor) */
555-
556-/* misc. conditioning flags */
557-#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT (1<<0)
558-#define SNDRV_SEQ_PORT_FLG_TIMESTAMP (1<<1)
559-#define SNDRV_SEQ_PORT_FLG_TIME_REAL (1<<2)
560-
561-struct snd_seq_port_info {
562- struct snd_seq_addr addr; /* client/port numbers */
563- char name[64]; /* port name */
564-
565- unsigned int capability; /* port capability bits */
566- unsigned int type; /* port type bits */
567- int midi_channels; /* channels per MIDI port */
568- int midi_voices; /* voices per MIDI port */
569- int synth_voices; /* voices per SYNTH port */
570-
571- int read_use; /* R/O: subscribers for output (from this port) */
572- int write_use; /* R/O: subscribers for input (to this port) */
573-
574- void *kernel; /* reserved for kernel use (must be NULL) */
575- unsigned int flags; /* misc. conditioning */
576- unsigned char time_queue; /* queue # for timestamping */
577- char reserved[59]; /* for future use */
578-};
579-
580-
581-/* queue flags */
582-#define SNDRV_SEQ_QUEUE_FLG_SYNC (1<<0) /* sync enabled */
583-
584-/* queue information */
585-struct snd_seq_queue_info {
586- int queue; /* queue id */
587-
588- /*
589- * security settings, only owner of this queue can start/stop timer
590- * etc. if the queue is locked for other clients
591- */
592- int owner; /* client id for owner of the queue */
593- unsigned locked:1; /* timing queue locked for other queues */
594- char name[64]; /* name of this queue */
595- unsigned int flags; /* flags */
596- char reserved[60]; /* for future use */
597-
598-};
599-
600-/* queue info/status */
601-struct snd_seq_queue_status {
602- int queue; /* queue id */
603- int events; /* read-only - queue size */
604- snd_seq_tick_time_t tick; /* current tick */
605- struct snd_seq_real_time time; /* current time */
606- int running; /* running state of queue */
607- int flags; /* various flags */
608- char reserved[64]; /* for the future */
609-};
610-
611-
612-/* queue tempo */
613-struct snd_seq_queue_tempo {
614- int queue; /* sequencer queue */
615- unsigned int tempo; /* current tempo, us/tick */
616- int ppq; /* time resolution, ticks/quarter */
617- unsigned int skew_value; /* queue skew */
618- unsigned int skew_base; /* queue skew base */
619- char reserved[24]; /* for the future */
620-};
621-
622-
623-/* sequencer timer sources */
624-#define SNDRV_SEQ_TIMER_ALSA 0 /* ALSA timer */
625-#define SNDRV_SEQ_TIMER_MIDI_CLOCK 1 /* Midi Clock (CLOCK event) */
626-#define SNDRV_SEQ_TIMER_MIDI_TICK 2 /* Midi Timer Tick (TICK event) */
627-
628-/* queue timer info */
629-struct snd_seq_queue_timer {
630- int queue; /* sequencer queue */
631- int type; /* source timer type */
632- union {
633- struct {
634- struct snd_timer_id id; /* ALSA's timer ID */
635- unsigned int resolution; /* resolution in Hz */
636- } alsa;
637- } u;
638- char reserved[64]; /* for the future use */
639-};
640-
641-
642-struct snd_seq_queue_client {
643- int queue; /* sequencer queue */
644- int client; /* sequencer client */
645- int used; /* queue is used with this client
646- (must be set for accepting events) */
647- /* per client watermarks */
648- char reserved[64]; /* for future use */
649-};
650-
651-
652-#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE (1<<0) /* exclusive connection */
653-#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP (1<<1)
654-#define SNDRV_SEQ_PORT_SUBS_TIME_REAL (1<<2)
655-
656-struct snd_seq_port_subscribe {
657- struct snd_seq_addr sender; /* sender address */
658- struct snd_seq_addr dest; /* destination address */
659- unsigned int voices; /* number of voices to be allocated (0 = don't care) */
660- unsigned int flags; /* modes */
661- unsigned char queue; /* input time-stamp queue (optional) */
662- unsigned char pad[3]; /* reserved */
663- char reserved[64];
664-};
665-
666-/* type of query subscription */
667-#define SNDRV_SEQ_QUERY_SUBS_READ 0
668-#define SNDRV_SEQ_QUERY_SUBS_WRITE 1
669-
670-struct snd_seq_query_subs {
671- struct snd_seq_addr root; /* client/port id to be searched */
672- int type; /* READ or WRITE */
673- int index; /* 0..N-1 */
674- int num_subs; /* R/O: number of subscriptions on this port */
675- struct snd_seq_addr addr; /* R/O: result */
676- unsigned char queue; /* R/O: result */
677- unsigned int flags; /* R/O: result */
678- char reserved[64]; /* for future use */
679-};
680-
681-
682-/*
683- * IOCTL commands
684- */
685-
686-#define SNDRV_SEQ_IOCTL_PVERSION _IOR ('S', 0x00, int)
687-#define SNDRV_SEQ_IOCTL_CLIENT_ID _IOR ('S', 0x01, int)
688-#define SNDRV_SEQ_IOCTL_SYSTEM_INFO _IOWR('S', 0x02, struct snd_seq_system_info)
689-#define SNDRV_SEQ_IOCTL_RUNNING_MODE _IOWR('S', 0x03, struct snd_seq_running_info)
690-
691-#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO _IOWR('S', 0x10, struct snd_seq_client_info)
692-#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO _IOW ('S', 0x11, struct snd_seq_client_info)
693-
694-#define SNDRV_SEQ_IOCTL_CREATE_PORT _IOWR('S', 0x20, struct snd_seq_port_info)
695-#define SNDRV_SEQ_IOCTL_DELETE_PORT _IOW ('S', 0x21, struct snd_seq_port_info)
696-#define SNDRV_SEQ_IOCTL_GET_PORT_INFO _IOWR('S', 0x22, struct snd_seq_port_info)
697-#define SNDRV_SEQ_IOCTL_SET_PORT_INFO _IOW ('S', 0x23, struct snd_seq_port_info)
698-
699-#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT _IOW ('S', 0x30, struct snd_seq_port_subscribe)
700-#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct snd_seq_port_subscribe)
701-
702-#define SNDRV_SEQ_IOCTL_CREATE_QUEUE _IOWR('S', 0x32, struct snd_seq_queue_info)
703-#define SNDRV_SEQ_IOCTL_DELETE_QUEUE _IOW ('S', 0x33, struct snd_seq_queue_info)
704-#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO _IOWR('S', 0x34, struct snd_seq_queue_info)
705-#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO _IOWR('S', 0x35, struct snd_seq_queue_info)
706-#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE _IOWR('S', 0x36, struct snd_seq_queue_info)
707-#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status)
708-#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO _IOWR('S', 0x41, struct snd_seq_queue_tempo)
709-#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO _IOW ('S', 0x42, struct snd_seq_queue_tempo)
710-#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER _IOWR('S', 0x45, struct snd_seq_queue_timer)
711-#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER _IOW ('S', 0x46, struct snd_seq_queue_timer)
712-#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT _IOWR('S', 0x49, struct snd_seq_queue_client)
713-#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT _IOW ('S', 0x4a, struct snd_seq_queue_client)
714-#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL _IOWR('S', 0x4b, struct snd_seq_client_pool)
715-#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL _IOW ('S', 0x4c, struct snd_seq_client_pool)
716-#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS _IOW ('S', 0x4e, struct snd_seq_remove_events)
717-#define SNDRV_SEQ_IOCTL_QUERY_SUBS _IOWR('S', 0x4f, struct snd_seq_query_subs)
718-#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION _IOWR('S', 0x50, struct snd_seq_port_subscribe)
719-#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct snd_seq_client_info)
720-#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT _IOWR('S', 0x52, struct snd_seq_port_info)
721-
722-#endif /* _UAPI__SOUND_ASEQUENCER_H */
723+#include <alsa/sound/uapi/asequencer.h>
724diff --git a/include/sound/asoc.h b/include/sound/asoc.h
725index a74ca232..185bba81 100644
726--- a/include/sound/asoc.h
727+++ b/include/sound/asoc.h
728@@ -1,633 +1 @@
729-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
730-/*
731- * uapi/sound/asoc.h -- ALSA SoC Firmware Controls and DAPM
732- *
733- * Copyright (C) 2012 Texas Instruments Inc.
734- * Copyright (C) 2015 Intel Corporation.
735- *
736- * This program is free software; you can redistribute it and/or modify
737- * it under the terms of the GNU General Public License version 2 as
738- * published by the Free Software Foundation.
739- *
740- * Simple file API to load FW that includes mixers, coefficients, DAPM graphs,
741- * algorithms, equalisers, DAIs, widgets etc.
742-*/
743-
744-#ifndef __LINUX_UAPI_SND_ASOC_H
745-#define __LINUX_UAPI_SND_ASOC_H
746-
747-#include <linux/types.h>
748-#include <sound/asound.h>
749-
750-/*
751- * Maximum number of channels topology kcontrol can represent.
752- */
753-#define SND_SOC_TPLG_MAX_CHAN 8
754-
755-/*
756- * Maximum number of PCM formats capability
757- */
758-#define SND_SOC_TPLG_MAX_FORMATS 16
759-
760-/*
761- * Maximum number of PCM stream configs
762- */
763-#define SND_SOC_TPLG_STREAM_CONFIG_MAX 8
764-
765-/*
766- * Maximum number of physical link's hardware configs
767- */
768-#define SND_SOC_TPLG_HW_CONFIG_MAX 8
769-
770-/* individual kcontrol info types - can be mixed with other types */
771-#define SND_SOC_TPLG_CTL_VOLSW 1
772-#define SND_SOC_TPLG_CTL_VOLSW_SX 2
773-#define SND_SOC_TPLG_CTL_VOLSW_XR_SX 3
774-#define SND_SOC_TPLG_CTL_ENUM 4
775-#define SND_SOC_TPLG_CTL_BYTES 5
776-#define SND_SOC_TPLG_CTL_ENUM_VALUE 6
777-#define SND_SOC_TPLG_CTL_RANGE 7
778-#define SND_SOC_TPLG_CTL_STROBE 8
779-
780-
781-/* individual widget kcontrol info types - can be mixed with other types */
782-#define SND_SOC_TPLG_DAPM_CTL_VOLSW 64
783-#define SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE 65
784-#define SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT 66
785-#define SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE 67
786-#define SND_SOC_TPLG_DAPM_CTL_PIN 68
787-
788-/* DAPM widget types - add new items to the end */
789-#define SND_SOC_TPLG_DAPM_INPUT 0
790-#define SND_SOC_TPLG_DAPM_OUTPUT 1
791-#define SND_SOC_TPLG_DAPM_MUX 2
792-#define SND_SOC_TPLG_DAPM_MIXER 3
793-#define SND_SOC_TPLG_DAPM_PGA 4
794-#define SND_SOC_TPLG_DAPM_OUT_DRV 5
795-#define SND_SOC_TPLG_DAPM_ADC 6
796-#define SND_SOC_TPLG_DAPM_DAC 7
797-#define SND_SOC_TPLG_DAPM_SWITCH 8
798-#define SND_SOC_TPLG_DAPM_PRE 9
799-#define SND_SOC_TPLG_DAPM_POST 10
800-#define SND_SOC_TPLG_DAPM_AIF_IN 11
801-#define SND_SOC_TPLG_DAPM_AIF_OUT 12
802-#define SND_SOC_TPLG_DAPM_DAI_IN 13
803-#define SND_SOC_TPLG_DAPM_DAI_OUT 14
804-#define SND_SOC_TPLG_DAPM_DAI_LINK 15
805-#define SND_SOC_TPLG_DAPM_BUFFER 16
806-#define SND_SOC_TPLG_DAPM_SCHEDULER 17
807-#define SND_SOC_TPLG_DAPM_EFFECT 18
808-#define SND_SOC_TPLG_DAPM_SIGGEN 19
809-#define SND_SOC_TPLG_DAPM_SRC 20
810-#define SND_SOC_TPLG_DAPM_ASRC 21
811-#define SND_SOC_TPLG_DAPM_ENCODER 22
812-#define SND_SOC_TPLG_DAPM_DECODER 23
813-#define SND_SOC_TPLG_DAPM_LAST SND_SOC_TPLG_DAPM_DECODER
814-
815-/* Header magic number and string sizes */
816-#define SND_SOC_TPLG_MAGIC 0x41536F43 /* ASoC */
817-
818-/* string sizes */
819-#define SND_SOC_TPLG_NUM_TEXTS 16
820-
821-/* ABI version */
822-#define SND_SOC_TPLG_ABI_VERSION 0x5 /* current version */
823-#define SND_SOC_TPLG_ABI_VERSION_MIN 0x4 /* oldest version supported */
824-
825-/* Max size of TLV data */
826-#define SND_SOC_TPLG_TLV_SIZE 32
827-
828-/*
829- * File and Block header data types.
830- * Add new generic and vendor types to end of list.
831- * Generic types are handled by the core whilst vendors types are passed
832- * to the component drivers for handling.
833- */
834-#define SND_SOC_TPLG_TYPE_MIXER 1
835-#define SND_SOC_TPLG_TYPE_BYTES 2
836-#define SND_SOC_TPLG_TYPE_ENUM 3
837-#define SND_SOC_TPLG_TYPE_DAPM_GRAPH 4
838-#define SND_SOC_TPLG_TYPE_DAPM_WIDGET 5
839-#define SND_SOC_TPLG_TYPE_DAI_LINK 6
840-#define SND_SOC_TPLG_TYPE_PCM 7
841-#define SND_SOC_TPLG_TYPE_MANIFEST 8
842-#define SND_SOC_TPLG_TYPE_CODEC_LINK 9
843-#define SND_SOC_TPLG_TYPE_BACKEND_LINK 10
844-#define SND_SOC_TPLG_TYPE_PDATA 11
845-#define SND_SOC_TPLG_TYPE_DAI 12
846-#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_DAI
847-
848-/* vendor block IDs - please add new vendor types to end */
849-#define SND_SOC_TPLG_TYPE_VENDOR_FW 1000
850-#define SND_SOC_TPLG_TYPE_VENDOR_CONFIG 1001
851-#define SND_SOC_TPLG_TYPE_VENDOR_COEFF 1002
852-#define SND_SOC_TPLG_TYPEVENDOR_CODEC 1003
853-
854-#define SND_SOC_TPLG_STREAM_PLAYBACK 0
855-#define SND_SOC_TPLG_STREAM_CAPTURE 1
856-
857-/* vendor tuple types */
858-#define SND_SOC_TPLG_TUPLE_TYPE_UUID 0
859-#define SND_SOC_TPLG_TUPLE_TYPE_STRING 1
860-#define SND_SOC_TPLG_TUPLE_TYPE_BOOL 2
861-#define SND_SOC_TPLG_TUPLE_TYPE_BYTE 3
862-#define SND_SOC_TPLG_TUPLE_TYPE_WORD 4
863-#define SND_SOC_TPLG_TUPLE_TYPE_SHORT 5
864-
865-/* DAI flags */
866-#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES (1 << 0)
867-#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
868-#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
869-
870-/* DAI clock gating */
871-#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED 0
872-#define SND_SOC_TPLG_DAI_CLK_GATE_GATED 1
873-#define SND_SOC_TPLG_DAI_CLK_GATE_CONT 2
874-
875-/* DAI mclk_direction */
876-#define SND_SOC_TPLG_MCLK_CO 0 /* for codec, mclk is output */
877-#define SND_SOC_TPLG_MCLK_CI 1 /* for codec, mclk is input */
878-
879-/* DAI physical PCM data formats.
880- * Add new formats to the end of the list.
881- */
882-#define SND_SOC_DAI_FORMAT_I2S 1 /* I2S mode */
883-#define SND_SOC_DAI_FORMAT_RIGHT_J 2 /* Right Justified mode */
884-#define SND_SOC_DAI_FORMAT_LEFT_J 3 /* Left Justified mode */
885-#define SND_SOC_DAI_FORMAT_DSP_A 4 /* L data MSB after FRM LRC */
886-#define SND_SOC_DAI_FORMAT_DSP_B 5 /* L data MSB during FRM LRC */
887-#define SND_SOC_DAI_FORMAT_AC97 6 /* AC97 */
888-#define SND_SOC_DAI_FORMAT_PDM 7 /* Pulse density modulation */
889-
890-/* left and right justified also known as MSB and LSB respectively */
891-#define SND_SOC_DAI_FORMAT_MSB SND_SOC_DAI_FORMAT_LEFT_J
892-#define SND_SOC_DAI_FORMAT_LSB SND_SOC_DAI_FORMAT_RIGHT_J
893-
894-/* DAI link flags */
895-#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
896-#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
897-#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
898-#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3)
899-
900-/* DAI topology BCLK parameter
901- * For the backwards capability, by default codec is bclk master
902- */
903-#define SND_SOC_TPLG_BCLK_CM 0 /* codec is bclk master */
904-#define SND_SOC_TPLG_BCLK_CS 1 /* codec is bclk slave */
905-
906-/* DAI topology FSYNC parameter
907- * For the backwards capability, by default codec is fsync master
908- */
909-#define SND_SOC_TPLG_FSYNC_CM 0 /* codec is fsync master */
910-#define SND_SOC_TPLG_FSYNC_CS 1 /* codec is fsync slave */
911-
912-/*
913- * Block Header.
914- * This header precedes all object and object arrays below.
915- */
916-struct snd_soc_tplg_hdr {
917- __le32 magic; /* magic number */
918- __le32 abi; /* ABI version */
919- __le32 version; /* optional vendor specific version details */
920- __le32 type; /* SND_SOC_TPLG_TYPE_ */
921- __le32 size; /* size of this structure */
922- __le32 vendor_type; /* optional vendor specific type info */
923- __le32 payload_size; /* data bytes, excluding this header */
924- __le32 index; /* identifier for block */
925- __le32 count; /* number of elements in block */
926-} __attribute__((packed));
927-
928-/* vendor tuple for uuid */
929-struct snd_soc_tplg_vendor_uuid_elem {
930- __le32 token;
931- char uuid[16];
932-} __attribute__((packed));
933-
934-/* vendor tuple for a bool/byte/short/word value */
935-struct snd_soc_tplg_vendor_value_elem {
936- __le32 token;
937- __le32 value;
938-} __attribute__((packed));
939-
940-/* vendor tuple for string */
941-struct snd_soc_tplg_vendor_string_elem {
942- __le32 token;
943- char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
944-} __attribute__((packed));
945-
946-struct snd_soc_tplg_vendor_array {
947- __le32 size; /* size in bytes of the array, including all elements */
948- __le32 type; /* SND_SOC_TPLG_TUPLE_TYPE_ */
949- __le32 num_elems; /* number of elements in array */
950- union {
951- struct snd_soc_tplg_vendor_uuid_elem uuid[0];
952- struct snd_soc_tplg_vendor_value_elem value[0];
953- struct snd_soc_tplg_vendor_string_elem string[0];
954- };
955-} __attribute__((packed));
956-
957-/*
958- * Private data.
959- * All topology objects may have private data that can be used by the driver or
960- * firmware. Core will ignore this data.
961- */
962-struct snd_soc_tplg_private {
963- __le32 size; /* in bytes of private data */
964- union {
965- char data[0];
966- struct snd_soc_tplg_vendor_array array[0];
967- };
968-} __attribute__((packed));
969-
970-/*
971- * Kcontrol TLV data.
972- */
973-struct snd_soc_tplg_tlv_dbscale {
974- __le32 min;
975- __le32 step;
976- __le32 mute;
977-} __attribute__((packed));
978-
979-struct snd_soc_tplg_ctl_tlv {
980- __le32 size; /* in bytes of this structure */
981- __le32 type; /* SNDRV_CTL_TLVT_*, type of TLV */
982- union {
983- __le32 data[SND_SOC_TPLG_TLV_SIZE];
984- struct snd_soc_tplg_tlv_dbscale scale;
985- };
986-} __attribute__((packed));
987-
988-/*
989- * Kcontrol channel data
990- */
991-struct snd_soc_tplg_channel {
992- __le32 size; /* in bytes of this structure */
993- __le32 reg;
994- __le32 shift;
995- __le32 id; /* ID maps to Left, Right, LFE etc */
996-} __attribute__((packed));
997-
998-/*
999- * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
1000- * Kcontrol ops need get/put/info.
1001- * Bytes ext ops need get/put.
1002- */
1003-struct snd_soc_tplg_io_ops {
1004- __le32 get;
1005- __le32 put;
1006- __le32 info;
1007-} __attribute__((packed));
1008-
1009-/*
1010- * kcontrol header
1011- */
1012-struct snd_soc_tplg_ctl_hdr {
1013- __le32 size; /* in bytes of this structure */
1014- __le32 type;
1015- char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1016- __le32 access;
1017- struct snd_soc_tplg_io_ops ops;
1018- struct snd_soc_tplg_ctl_tlv tlv;
1019-} __attribute__((packed));
1020-
1021-/*
1022- * Stream Capabilities
1023- */
1024-struct snd_soc_tplg_stream_caps {
1025- __le32 size; /* in bytes of this structure */
1026- char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1027- __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
1028- __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
1029- __le32 rate_min; /* min rate */
1030- __le32 rate_max; /* max rate */
1031- __le32 channels_min; /* min channels */
1032- __le32 channels_max; /* max channels */
1033- __le32 periods_min; /* min number of periods */
1034- __le32 periods_max; /* max number of periods */
1035- __le32 period_size_min; /* min period size bytes */
1036- __le32 period_size_max; /* max period size bytes */
1037- __le32 buffer_size_min; /* min buffer size bytes */
1038- __le32 buffer_size_max; /* max buffer size bytes */
1039- __le32 sig_bits; /* number of bits of content */
1040-} __attribute__((packed));
1041-
1042-/*
1043- * FE or BE Stream configuration supported by SW/FW
1044- */
1045-struct snd_soc_tplg_stream {
1046- __le32 size; /* in bytes of this structure */
1047- char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */
1048- __le64 format; /* SNDRV_PCM_FMTBIT_* */
1049- __le32 rate; /* SNDRV_PCM_RATE_* */
1050- __le32 period_bytes; /* size of period in bytes */
1051- __le32 buffer_bytes; /* size of buffer in bytes */
1052- __le32 channels; /* channels */
1053-} __attribute__((packed));
1054-
1055-
1056-/*
1057- * Describes a physical link's runtime supported hardware config,
1058- * i.e. hardware audio formats.
1059- */
1060-struct snd_soc_tplg_hw_config {
1061- __le32 size; /* in bytes of this structure */
1062- __le32 id; /* unique ID - - used to match */
1063- __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
1064- __u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
1065- __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
1066- __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
1067- __u8 bclk_master; /* SND_SOC_TPLG_BCLK_ value */
1068- __u8 fsync_master; /* SND_SOC_TPLG_FSYNC_ value */
1069- __u8 mclk_direction; /* SND_SOC_TPLG_MCLK_ value */
1070- __le16 reserved; /* for 32bit alignment */
1071- __le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */
1072- __le32 bclk_rate; /* BCLK freqency in Hz */
1073- __le32 fsync_rate; /* frame clock in Hz */
1074- __le32 tdm_slots; /* number of TDM slots in use */
1075- __le32 tdm_slot_width; /* width in bits for each slot */
1076- __le32 tx_slots; /* bit mask for active Tx slots */
1077- __le32 rx_slots; /* bit mask for active Rx slots */
1078- __le32 tx_channels; /* number of Tx channels */
1079- __le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
1080- __le32 rx_channels; /* number of Rx channels */
1081- __le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
1082-} __attribute__((packed));
1083-
1084-/*
1085- * Manifest. List totals for each payload type. Not used in parsing, but will
1086- * be passed to the component driver before any other objects in order for any
1087- * global component resource allocations.
1088- *
1089- * File block representation for manifest :-
1090- * +-----------------------------------+----+
1091- * | struct snd_soc_tplg_hdr | 1 |
1092- * +-----------------------------------+----+
1093- * | struct snd_soc_tplg_manifest | 1 |
1094- * +-----------------------------------+----+
1095- */
1096-struct snd_soc_tplg_manifest {
1097- __le32 size; /* in bytes of this structure */
1098- __le32 control_elems; /* number of control elements */
1099- __le32 widget_elems; /* number of widget elements */
1100- __le32 graph_elems; /* number of graph elements */
1101- __le32 pcm_elems; /* number of PCM elements */
1102- __le32 dai_link_elems; /* number of DAI link elements */
1103- __le32 dai_elems; /* number of physical DAI elements */
1104- __le32 reserved[20]; /* reserved for new ABI element types */
1105- struct snd_soc_tplg_private priv;
1106-} __attribute__((packed));
1107-
1108-/*
1109- * Mixer kcontrol.
1110- *
1111- * File block representation for mixer kcontrol :-
1112- * +-----------------------------------+----+
1113- * | struct snd_soc_tplg_hdr | 1 |
1114- * +-----------------------------------+----+
1115- * | struct snd_soc_tplg_mixer_control | N |
1116- * +-----------------------------------+----+
1117- */
1118-struct snd_soc_tplg_mixer_control {
1119- struct snd_soc_tplg_ctl_hdr hdr;
1120- __le32 size; /* in bytes of this structure */
1121- __le32 min;
1122- __le32 max;
1123- __le32 platform_max;
1124- __le32 invert;
1125- __le32 num_channels;
1126- struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
1127- struct snd_soc_tplg_private priv;
1128-} __attribute__((packed));
1129-
1130-/*
1131- * Enumerated kcontrol
1132- *
1133- * File block representation for enum kcontrol :-
1134- * +-----------------------------------+----+
1135- * | struct snd_soc_tplg_hdr | 1 |
1136- * +-----------------------------------+----+
1137- * | struct snd_soc_tplg_enum_control | N |
1138- * +-----------------------------------+----+
1139- */
1140-struct snd_soc_tplg_enum_control {
1141- struct snd_soc_tplg_ctl_hdr hdr;
1142- __le32 size; /* in bytes of this structure */
1143- __le32 num_channels;
1144- struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
1145- __le32 items;
1146- __le32 mask;
1147- __le32 count;
1148- char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1149- __le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
1150- struct snd_soc_tplg_private priv;
1151-} __attribute__((packed));
1152-
1153-/*
1154- * Bytes kcontrol
1155- *
1156- * File block representation for bytes kcontrol :-
1157- * +-----------------------------------+----+
1158- * | struct snd_soc_tplg_hdr | 1 |
1159- * +-----------------------------------+----+
1160- * | struct snd_soc_tplg_bytes_control | N |
1161- * +-----------------------------------+----+
1162- */
1163-struct snd_soc_tplg_bytes_control {
1164- struct snd_soc_tplg_ctl_hdr hdr;
1165- __le32 size; /* in bytes of this structure */
1166- __le32 max;
1167- __le32 mask;
1168- __le32 base;
1169- __le32 num_regs;
1170- struct snd_soc_tplg_io_ops ext_ops;
1171- struct snd_soc_tplg_private priv;
1172-} __attribute__((packed));
1173-
1174-/*
1175- * DAPM Graph Element
1176- *
1177- * File block representation for DAPM graph elements :-
1178- * +-------------------------------------+----+
1179- * | struct snd_soc_tplg_hdr | 1 |
1180- * +-------------------------------------+----+
1181- * | struct snd_soc_tplg_dapm_graph_elem | N |
1182- * +-------------------------------------+----+
1183- */
1184-struct snd_soc_tplg_dapm_graph_elem {
1185- char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1186- char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1187- char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1188-} __attribute__((packed));
1189-
1190-/*
1191- * DAPM Widget.
1192- *
1193- * File block representation for DAPM widget :-
1194- * +-------------------------------------+-----+
1195- * | struct snd_soc_tplg_hdr | 1 |
1196- * +-------------------------------------+-----+
1197- * | struct snd_soc_tplg_dapm_widget | N |
1198- * +-------------------------------------+-----+
1199- * | struct snd_soc_tplg_enum_control | 0|1 |
1200- * | struct snd_soc_tplg_mixer_control | 0|N |
1201- * +-------------------------------------+-----+
1202- *
1203- * Optional enum or mixer control can be appended to the end of each widget
1204- * in the block.
1205- */
1206-struct snd_soc_tplg_dapm_widget {
1207- __le32 size; /* in bytes of this structure */
1208- __le32 id; /* SND_SOC_DAPM_CTL */
1209- char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1210- char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1211-
1212- __le32 reg; /* negative reg = no direct dapm */
1213- __le32 shift; /* bits to shift */
1214- __le32 mask; /* non-shifted mask */
1215- __le32 subseq; /* sort within widget type */
1216- __le32 invert; /* invert the power bit */
1217- __le32 ignore_suspend; /* kept enabled over suspend */
1218- __le16 event_flags;
1219- __le16 event_type;
1220- __le32 num_kcontrols;
1221- struct snd_soc_tplg_private priv;
1222- /*
1223- * kcontrols that relate to this widget
1224- * follow here after widget private data
1225- */
1226-} __attribute__((packed));
1227-
1228-
1229-/*
1230- * Describes SW/FW specific features of PCM (FE DAI & DAI link).
1231- *
1232- * File block representation for PCM :-
1233- * +-----------------------------------+-----+
1234- * | struct snd_soc_tplg_hdr | 1 |
1235- * +-----------------------------------+-----+
1236- * | struct snd_soc_tplg_pcm | N |
1237- * +-----------------------------------+-----+
1238- */
1239-struct snd_soc_tplg_pcm {
1240- __le32 size; /* in bytes of this structure */
1241- char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1242- char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1243- __le32 pcm_id; /* unique ID - used to match with DAI link */
1244- __le32 dai_id; /* unique ID - used to match */
1245- __le32 playback; /* supports playback mode */
1246- __le32 capture; /* supports capture mode */
1247- __le32 compress; /* 1 = compressed; 0 = PCM */
1248- struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
1249- __le32 num_streams; /* number of streams */
1250- struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
1251- __le32 flag_mask; /* bitmask of flags to configure */
1252- __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
1253- struct snd_soc_tplg_private priv;
1254-} __attribute__((packed));
1255-
1256-
1257-/*
1258- * Describes the physical link runtime supported configs or params
1259- *
1260- * File block representation for physical link config :-
1261- * +-----------------------------------+-----+
1262- * | struct snd_soc_tplg_hdr | 1 |
1263- * +-----------------------------------+-----+
1264- * | struct snd_soc_tplg_link_config | N |
1265- * +-----------------------------------+-----+
1266- */
1267-struct snd_soc_tplg_link_config {
1268- __le32 size; /* in bytes of this structure */
1269- __le32 id; /* unique ID - used to match */
1270- char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
1271- char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
1272- struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
1273- __le32 num_streams; /* number of streams */
1274- struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
1275- __le32 num_hw_configs; /* number of hw configs */
1276- __le32 default_hw_config_id; /* default hw config ID for init */
1277- __le32 flag_mask; /* bitmask of flags to configure */
1278- __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
1279- struct snd_soc_tplg_private priv;
1280-} __attribute__((packed));
1281-
1282-/*
1283- * Describes SW/FW specific features of physical DAI.
1284- * It can be used to configure backend DAIs for DPCM.
1285- *
1286- * File block representation for physical DAI :-
1287- * +-----------------------------------+-----+
1288- * | struct snd_soc_tplg_hdr | 1 |
1289- * +-----------------------------------+-----+
1290- * | struct snd_soc_tplg_dai | N |
1291- * +-----------------------------------+-----+
1292- */
1293-struct snd_soc_tplg_dai {
1294- __le32 size; /* in bytes of this structure */
1295- char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
1296- __le32 dai_id; /* unique ID - used to match */
1297- __le32 playback; /* supports playback mode */
1298- __le32 capture; /* supports capture mode */
1299- struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
1300- __le32 flag_mask; /* bitmask of flags to configure */
1301- __le32 flags; /* SND_SOC_TPLG_DAI_FLGBIT_* */
1302- struct snd_soc_tplg_private priv;
1303-} __attribute__((packed));
1304-
1305-/*
1306- * Old version of ABI structs, supported for backward compatibility.
1307- */
1308-
1309-/* Manifest v4 */
1310-struct snd_soc_tplg_manifest_v4 {
1311- __le32 size; /* in bytes of this structure */
1312- __le32 control_elems; /* number of control elements */
1313- __le32 widget_elems; /* number of widget elements */
1314- __le32 graph_elems; /* number of graph elements */
1315- __le32 pcm_elems; /* number of PCM elements */
1316- __le32 dai_link_elems; /* number of DAI link elements */
1317- struct snd_soc_tplg_private priv;
1318-} __packed;
1319-
1320-/* Stream Capabilities v4 */
1321-struct snd_soc_tplg_stream_caps_v4 {
1322- __le32 size; /* in bytes of this structure */
1323- char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1324- __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
1325- __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
1326- __le32 rate_min; /* min rate */
1327- __le32 rate_max; /* max rate */
1328- __le32 channels_min; /* min channels */
1329- __le32 channels_max; /* max channels */
1330- __le32 periods_min; /* min number of periods */
1331- __le32 periods_max; /* max number of periods */
1332- __le32 period_size_min; /* min period size bytes */
1333- __le32 period_size_max; /* max period size bytes */
1334- __le32 buffer_size_min; /* min buffer size bytes */
1335- __le32 buffer_size_max; /* max buffer size bytes */
1336-} __packed;
1337-
1338-/* PCM v4 */
1339-struct snd_soc_tplg_pcm_v4 {
1340- __le32 size; /* in bytes of this structure */
1341- char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1342- char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1343- __le32 pcm_id; /* unique ID - used to match with DAI link */
1344- __le32 dai_id; /* unique ID - used to match */
1345- __le32 playback; /* supports playback mode */
1346- __le32 capture; /* supports capture mode */
1347- __le32 compress; /* 1 = compressed; 0 = PCM */
1348- struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
1349- __le32 num_streams; /* number of streams */
1350- struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
1351-} __packed;
1352-
1353-/* Physical link config v4 */
1354-struct snd_soc_tplg_link_config_v4 {
1355- __le32 size; /* in bytes of this structure */
1356- __le32 id; /* unique ID - used to match */
1357- struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
1358- __le32 num_streams; /* number of streams */
1359-} __packed;
1360-
1361-#endif
1362+#include <alsa/sound/uapi/asoc.h>
1363diff --git a/include/sound/asound.h b/include/sound/asound.h
1364index df1153ce..3be4d850 100644
1365--- a/include/sound/asound.h
1366+++ b/include/sound/asound.h
1367@@ -1,1038 +1 @@
1368-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
1369-/*
1370- * Advanced Linux Sound Architecture - ALSA - Driver
1371- * Copyright (c) 1994-2003 by Jaroslav Kysela <perex@perex.cz>,
1372- * Abramo Bagnara <abramo@alsa-project.org>
1373- *
1374- *
1375- * This program is free software; you can redistribute it and/or modify
1376- * it under the terms of the GNU General Public License as published by
1377- * the Free Software Foundation; either version 2 of the License, or
1378- * (at your option) any later version.
1379- *
1380- * This program is distributed in the hope that it will be useful,
1381- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1382- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1383- * GNU General Public License for more details.
1384- *
1385- * You should have received a copy of the GNU General Public License
1386- * along with this program; if not, write to the Free Software
1387- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1388- *
1389- */
1390-
1391-#ifndef _UAPI__SOUND_ASOUND_H
1392-#define _UAPI__SOUND_ASOUND_H
1393-
1394-#if defined(__KERNEL__) || defined(__linux__)
1395-#include <linux/types.h>
1396-#else
1397-#include <sys/ioctl.h>
1398-#endif
1399-
1400-#ifndef __KERNEL__
1401-#include <stdlib.h>
1402-#include <time.h>
1403-#endif
1404-
1405-/*
1406- * protocol version
1407- */
1408-
1409-#define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor))
1410-#define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff)
1411-#define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff)
1412-#define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff)
1413-#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \
1414- (SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \
1415- (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \
1416- SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
1417-
1418-/****************************************************************************
1419- * *
1420- * Digital audio interface *
1421- * *
1422- ****************************************************************************/
1423-
1424-struct snd_aes_iec958 {
1425- unsigned char status[24]; /* AES/IEC958 channel status bits */
1426- unsigned char subcode[147]; /* AES/IEC958 subcode bits */
1427- unsigned char pad; /* nothing */
1428- unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */
1429-};
1430-
1431-/****************************************************************************
1432- * *
1433- * CEA-861 Audio InfoFrame. Used in HDMI and DisplayPort *
1434- * *
1435- ****************************************************************************/
1436-
1437-struct snd_cea_861_aud_if {
1438- unsigned char db1_ct_cc; /* coding type and channel count */
1439- unsigned char db2_sf_ss; /* sample frequency and size */
1440- unsigned char db3; /* not used, all zeros */
1441- unsigned char db4_ca; /* channel allocation code */
1442- unsigned char db5_dminh_lsv; /* downmix inhibit & level-shit values */
1443-};
1444-
1445-/****************************************************************************
1446- * *
1447- * Section for driver hardware dependent interface - /dev/snd/hw? *
1448- * *
1449- ****************************************************************************/
1450-
1451-#define SNDRV_HWDEP_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
1452-
1453-enum {
1454- SNDRV_HWDEP_IFACE_OPL2 = 0,
1455- SNDRV_HWDEP_IFACE_OPL3,
1456- SNDRV_HWDEP_IFACE_OPL4,
1457- SNDRV_HWDEP_IFACE_SB16CSP, /* Creative Signal Processor */
1458- SNDRV_HWDEP_IFACE_EMU10K1, /* FX8010 processor in EMU10K1 chip */
1459- SNDRV_HWDEP_IFACE_YSS225, /* Yamaha FX processor */
1460- SNDRV_HWDEP_IFACE_ICS2115, /* Wavetable synth */
1461- SNDRV_HWDEP_IFACE_SSCAPE, /* Ensoniq SoundScape ISA card (MC68EC000) */
1462- SNDRV_HWDEP_IFACE_VX, /* Digigram VX cards */
1463- SNDRV_HWDEP_IFACE_MIXART, /* Digigram miXart cards */
1464- SNDRV_HWDEP_IFACE_USX2Y, /* Tascam US122, US224 & US428 usb */
1465- SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */
1466- SNDRV_HWDEP_IFACE_BLUETOOTH, /* Bluetooth audio */
1467- SNDRV_HWDEP_IFACE_USX2Y_PCM, /* Tascam US122, US224 & US428 rawusb pcm */
1468- SNDRV_HWDEP_IFACE_PCXHR, /* Digigram PCXHR */
1469- SNDRV_HWDEP_IFACE_SB_RC, /* SB Extigy/Audigy2NX remote control */
1470- SNDRV_HWDEP_IFACE_HDA, /* HD-audio */
1471- SNDRV_HWDEP_IFACE_USB_STREAM, /* direct access to usb stream */
1472- SNDRV_HWDEP_IFACE_FW_DICE, /* TC DICE FireWire device */
1473- SNDRV_HWDEP_IFACE_FW_FIREWORKS, /* Echo Audio Fireworks based device */
1474- SNDRV_HWDEP_IFACE_FW_BEBOB, /* BridgeCo BeBoB based device */
1475- SNDRV_HWDEP_IFACE_FW_OXFW, /* Oxford OXFW970/971 based device */
1476- SNDRV_HWDEP_IFACE_FW_DIGI00X, /* Digidesign Digi 002/003 family */
1477- SNDRV_HWDEP_IFACE_FW_TASCAM, /* TASCAM FireWire series */
1478- SNDRV_HWDEP_IFACE_LINE6, /* Line6 USB processors */
1479- SNDRV_HWDEP_IFACE_FW_MOTU, /* MOTU FireWire series */
1480- SNDRV_HWDEP_IFACE_FW_FIREFACE, /* RME Fireface series */
1481-
1482- /* Don't forget to change the following: */
1483- SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_FW_FIREFACE
1484-};
1485-
1486-struct snd_hwdep_info {
1487- unsigned int device; /* WR: device number */
1488- int card; /* R: card number */
1489- unsigned char id[64]; /* ID (user selectable) */
1490- unsigned char name[80]; /* hwdep name */
1491- int iface; /* hwdep interface */
1492- unsigned char reserved[64]; /* reserved for future */
1493-};
1494-
1495-/* generic DSP loader */
1496-struct snd_hwdep_dsp_status {
1497- unsigned int version; /* R: driver-specific version */
1498- unsigned char id[32]; /* R: driver-specific ID string */
1499- unsigned int num_dsps; /* R: number of DSP images to transfer */
1500- unsigned int dsp_loaded; /* R: bit flags indicating the loaded DSPs */
1501- unsigned int chip_ready; /* R: 1 = initialization finished */
1502- unsigned char reserved[16]; /* reserved for future use */
1503-};
1504-
1505-struct snd_hwdep_dsp_image {
1506- unsigned int index; /* W: DSP index */
1507- unsigned char name[64]; /* W: ID (e.g. file name) */
1508- unsigned char __user *image; /* W: binary image */
1509- size_t length; /* W: size of image in bytes */
1510- unsigned long driver_data; /* W: driver-specific data */
1511-};
1512-
1513-#define SNDRV_HWDEP_IOCTL_PVERSION _IOR ('H', 0x00, int)
1514-#define SNDRV_HWDEP_IOCTL_INFO _IOR ('H', 0x01, struct snd_hwdep_info)
1515-#define SNDRV_HWDEP_IOCTL_DSP_STATUS _IOR('H', 0x02, struct snd_hwdep_dsp_status)
1516-#define SNDRV_HWDEP_IOCTL_DSP_LOAD _IOW('H', 0x03, struct snd_hwdep_dsp_image)
1517-
1518-/*****************************************************************************
1519- * *
1520- * Digital Audio (PCM) interface - /dev/snd/pcm?? *
1521- * *
1522- *****************************************************************************/
1523-
1524-#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 14)
1525-
1526-typedef unsigned long snd_pcm_uframes_t;
1527-typedef signed long snd_pcm_sframes_t;
1528-
1529-enum {
1530- SNDRV_PCM_CLASS_GENERIC = 0, /* standard mono or stereo device */
1531- SNDRV_PCM_CLASS_MULTI, /* multichannel device */
1532- SNDRV_PCM_CLASS_MODEM, /* software modem class */
1533- SNDRV_PCM_CLASS_DIGITIZER, /* digitizer class */
1534- /* Don't forget to change the following: */
1535- SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
1536-};
1537-
1538-enum {
1539- SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */
1540- SNDRV_PCM_SUBCLASS_MULTI_MIX, /* multichannel subdevices are mixed together */
1541- /* Don't forget to change the following: */
1542- SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX,
1543-};
1544-
1545-enum {
1546- SNDRV_PCM_STREAM_PLAYBACK = 0,
1547- SNDRV_PCM_STREAM_CAPTURE,
1548- SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
1549-};
1550-
1551-typedef int __bitwise snd_pcm_access_t;
1552-#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED ((__force snd_pcm_access_t) 0) /* interleaved mmap */
1553-#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED ((__force snd_pcm_access_t) 1) /* noninterleaved mmap */
1554-#define SNDRV_PCM_ACCESS_MMAP_COMPLEX ((__force snd_pcm_access_t) 2) /* complex mmap */
1555-#define SNDRV_PCM_ACCESS_RW_INTERLEAVED ((__force snd_pcm_access_t) 3) /* readi/writei */
1556-#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ((__force snd_pcm_access_t) 4) /* readn/writen */
1557-#define SNDRV_PCM_ACCESS_LAST SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
1558-
1559-typedef int __bitwise snd_pcm_format_t;
1560-#define SNDRV_PCM_FORMAT_S8 ((__force snd_pcm_format_t) 0)
1561-#define SNDRV_PCM_FORMAT_U8 ((__force snd_pcm_format_t) 1)
1562-#define SNDRV_PCM_FORMAT_S16_LE ((__force snd_pcm_format_t) 2)
1563-#define SNDRV_PCM_FORMAT_S16_BE ((__force snd_pcm_format_t) 3)
1564-#define SNDRV_PCM_FORMAT_U16_LE ((__force snd_pcm_format_t) 4)
1565-#define SNDRV_PCM_FORMAT_U16_BE ((__force snd_pcm_format_t) 5)
1566-#define SNDRV_PCM_FORMAT_S24_LE ((__force snd_pcm_format_t) 6) /* low three bytes */
1567-#define SNDRV_PCM_FORMAT_S24_BE ((__force snd_pcm_format_t) 7) /* low three bytes */
1568-#define SNDRV_PCM_FORMAT_U24_LE ((__force snd_pcm_format_t) 8) /* low three bytes */
1569-#define SNDRV_PCM_FORMAT_U24_BE ((__force snd_pcm_format_t) 9) /* low three bytes */
1570-#define SNDRV_PCM_FORMAT_S32_LE ((__force snd_pcm_format_t) 10)
1571-#define SNDRV_PCM_FORMAT_S32_BE ((__force snd_pcm_format_t) 11)
1572-#define SNDRV_PCM_FORMAT_U32_LE ((__force snd_pcm_format_t) 12)
1573-#define SNDRV_PCM_FORMAT_U32_BE ((__force snd_pcm_format_t) 13)
1574-#define SNDRV_PCM_FORMAT_FLOAT_LE ((__force snd_pcm_format_t) 14) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
1575-#define SNDRV_PCM_FORMAT_FLOAT_BE ((__force snd_pcm_format_t) 15) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
1576-#define SNDRV_PCM_FORMAT_FLOAT64_LE ((__force snd_pcm_format_t) 16) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
1577-#define SNDRV_PCM_FORMAT_FLOAT64_BE ((__force snd_pcm_format_t) 17) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
1578-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
1579-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
1580-#define SNDRV_PCM_FORMAT_MU_LAW ((__force snd_pcm_format_t) 20)
1581-#define SNDRV_PCM_FORMAT_A_LAW ((__force snd_pcm_format_t) 21)
1582-#define SNDRV_PCM_FORMAT_IMA_ADPCM ((__force snd_pcm_format_t) 22)
1583-#define SNDRV_PCM_FORMAT_MPEG ((__force snd_pcm_format_t) 23)
1584-#define SNDRV_PCM_FORMAT_GSM ((__force snd_pcm_format_t) 24)
1585-#define SNDRV_PCM_FORMAT_S20_LE ((__force snd_pcm_format_t) 25) /* in four bytes, LSB justified */
1586-#define SNDRV_PCM_FORMAT_S20_BE ((__force snd_pcm_format_t) 26) /* in four bytes, LSB justified */
1587-#define SNDRV_PCM_FORMAT_U20_LE ((__force snd_pcm_format_t) 27) /* in four bytes, LSB justified */
1588-#define SNDRV_PCM_FORMAT_U20_BE ((__force snd_pcm_format_t) 28) /* in four bytes, LSB justified */
1589-/* gap in the numbering for a future standard linear format */
1590-#define SNDRV_PCM_FORMAT_SPECIAL ((__force snd_pcm_format_t) 31)
1591-#define SNDRV_PCM_FORMAT_S24_3LE ((__force snd_pcm_format_t) 32) /* in three bytes */
1592-#define SNDRV_PCM_FORMAT_S24_3BE ((__force snd_pcm_format_t) 33) /* in three bytes */
1593-#define SNDRV_PCM_FORMAT_U24_3LE ((__force snd_pcm_format_t) 34) /* in three bytes */
1594-#define SNDRV_PCM_FORMAT_U24_3BE ((__force snd_pcm_format_t) 35) /* in three bytes */
1595-#define SNDRV_PCM_FORMAT_S20_3LE ((__force snd_pcm_format_t) 36) /* in three bytes */
1596-#define SNDRV_PCM_FORMAT_S20_3BE ((__force snd_pcm_format_t) 37) /* in three bytes */
1597-#define SNDRV_PCM_FORMAT_U20_3LE ((__force snd_pcm_format_t) 38) /* in three bytes */
1598-#define SNDRV_PCM_FORMAT_U20_3BE ((__force snd_pcm_format_t) 39) /* in three bytes */
1599-#define SNDRV_PCM_FORMAT_S18_3LE ((__force snd_pcm_format_t) 40) /* in three bytes */
1600-#define SNDRV_PCM_FORMAT_S18_3BE ((__force snd_pcm_format_t) 41) /* in three bytes */
1601-#define SNDRV_PCM_FORMAT_U18_3LE ((__force snd_pcm_format_t) 42) /* in three bytes */
1602-#define SNDRV_PCM_FORMAT_U18_3BE ((__force snd_pcm_format_t) 43) /* in three bytes */
1603-#define SNDRV_PCM_FORMAT_G723_24 ((__force snd_pcm_format_t) 44) /* 8 samples in 3 bytes */
1604-#define SNDRV_PCM_FORMAT_G723_24_1B ((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */
1605-#define SNDRV_PCM_FORMAT_G723_40 ((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
1606-#define SNDRV_PCM_FORMAT_G723_40_1B ((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */
1607-#define SNDRV_PCM_FORMAT_DSD_U8 ((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
1608-#define SNDRV_PCM_FORMAT_DSD_U16_LE ((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
1609-#define SNDRV_PCM_FORMAT_DSD_U32_LE ((__force snd_pcm_format_t) 50) /* DSD, 4-byte samples DSD (x32), little endian */
1610-#define SNDRV_PCM_FORMAT_DSD_U16_BE ((__force snd_pcm_format_t) 51) /* DSD, 2-byte samples DSD (x16), big endian */
1611-#define SNDRV_PCM_FORMAT_DSD_U32_BE ((__force snd_pcm_format_t) 52) /* DSD, 4-byte samples DSD (x32), big endian */
1612-#define SNDRV_PCM_FORMAT_LAST SNDRV_PCM_FORMAT_DSD_U32_BE
1613-#define SNDRV_PCM_FORMAT_FIRST SNDRV_PCM_FORMAT_S8
1614-
1615-#ifdef SNDRV_LITTLE_ENDIAN
1616-#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_LE
1617-#define SNDRV_PCM_FORMAT_U16 SNDRV_PCM_FORMAT_U16_LE
1618-#define SNDRV_PCM_FORMAT_S24 SNDRV_PCM_FORMAT_S24_LE
1619-#define SNDRV_PCM_FORMAT_U24 SNDRV_PCM_FORMAT_U24_LE
1620-#define SNDRV_PCM_FORMAT_S32 SNDRV_PCM_FORMAT_S32_LE
1621-#define SNDRV_PCM_FORMAT_U32 SNDRV_PCM_FORMAT_U32_LE
1622-#define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_LE
1623-#define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_LE
1624-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE
1625-#define SNDRV_PCM_FORMAT_S20 SNDRV_PCM_FORMAT_S20_LE
1626-#define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_LE
1627-#endif
1628-#ifdef SNDRV_BIG_ENDIAN
1629-#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_BE
1630-#define SNDRV_PCM_FORMAT_U16 SNDRV_PCM_FORMAT_U16_BE
1631-#define SNDRV_PCM_FORMAT_S24 SNDRV_PCM_FORMAT_S24_BE
1632-#define SNDRV_PCM_FORMAT_U24 SNDRV_PCM_FORMAT_U24_BE
1633-#define SNDRV_PCM_FORMAT_S32 SNDRV_PCM_FORMAT_S32_BE
1634-#define SNDRV_PCM_FORMAT_U32 SNDRV_PCM_FORMAT_U32_BE
1635-#define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_BE
1636-#define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_BE
1637-#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE
1638-#define SNDRV_PCM_FORMAT_S20 SNDRV_PCM_FORMAT_S20_BE
1639-#define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_BE
1640-#endif
1641-
1642-typedef int __bitwise snd_pcm_subformat_t;
1643-#define SNDRV_PCM_SUBFORMAT_STD ((__force snd_pcm_subformat_t) 0)
1644-#define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_STD
1645-
1646-#define SNDRV_PCM_INFO_MMAP 0x00000001 /* hardware supports mmap */
1647-#define SNDRV_PCM_INFO_MMAP_VALID 0x00000002 /* period data are valid during transfer */
1648-#define SNDRV_PCM_INFO_DOUBLE 0x00000004 /* Double buffering needed for PCM start/stop */
1649-#define SNDRV_PCM_INFO_BATCH 0x00000010 /* double buffering */
1650-#define SNDRV_PCM_INFO_SYNC_APPLPTR 0x00000020 /* need the explicit sync of appl_ptr update */
1651-#define SNDRV_PCM_INFO_INTERLEAVED 0x00000100 /* channels are interleaved */
1652-#define SNDRV_PCM_INFO_NONINTERLEAVED 0x00000200 /* channels are not interleaved */
1653-#define SNDRV_PCM_INFO_COMPLEX 0x00000400 /* complex frame organization (mmap only) */
1654-#define SNDRV_PCM_INFO_BLOCK_TRANSFER 0x00010000 /* hardware transfer block of samples */
1655-#define SNDRV_PCM_INFO_OVERRANGE 0x00020000 /* hardware supports ADC (capture) overrange detection */
1656-#define SNDRV_PCM_INFO_RESUME 0x00040000 /* hardware supports stream resume after suspend */
1657-#define SNDRV_PCM_INFO_PAUSE 0x00080000 /* pause ioctl is supported */
1658-#define SNDRV_PCM_INFO_HALF_DUPLEX 0x00100000 /* only half duplex */
1659-#define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */
1660-#define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */
1661-#define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 0x00800000 /* period wakeup can be disabled */
1662-#define SNDRV_PCM_INFO_HAS_WALL_CLOCK 0x01000000 /* (Deprecated)has audio wall clock for audio/system time sync */
1663-#define SNDRV_PCM_INFO_HAS_LINK_ATIME 0x01000000 /* report hardware link audio time, reset on startup */
1664-#define SNDRV_PCM_INFO_HAS_LINK_ABSOLUTE_ATIME 0x02000000 /* report absolute hardware link audio time, not reset on startup */
1665-#define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME 0x04000000 /* report estimated link audio time */
1666-#define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000 /* report synchronized audio/system time */
1667-
1668-#define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */
1669-#define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */
1670-
1671-
1672-
1673-typedef int __bitwise snd_pcm_state_t;
1674-#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */
1675-#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1) /* stream has a setup */
1676-#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2) /* stream is ready to start */
1677-#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3) /* stream is running */
1678-#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4) /* stream reached an xrun */
1679-#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5) /* stream is draining */
1680-#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6) /* stream is paused */
1681-#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7) /* hardware is suspended */
1682-#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8) /* hardware is disconnected */
1683-#define SNDRV_PCM_STATE_LAST SNDRV_PCM_STATE_DISCONNECTED
1684-
1685-enum {
1686- SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
1687- SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
1688- SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
1689-};
1690-
1691-union snd_pcm_sync_id {
1692- unsigned char id[16];
1693- unsigned short id16[8];
1694- unsigned int id32[4];
1695-};
1696-
1697-struct snd_pcm_info {
1698- unsigned int device; /* RO/WR (control): device number */
1699- unsigned int subdevice; /* RO/WR (control): subdevice number */
1700- int stream; /* RO/WR (control): stream direction */
1701- int card; /* R: card number */
1702- unsigned char id[64]; /* ID (user selectable) */
1703- unsigned char name[80]; /* name of this device */
1704- unsigned char subname[32]; /* subdevice name */
1705- int dev_class; /* SNDRV_PCM_CLASS_* */
1706- int dev_subclass; /* SNDRV_PCM_SUBCLASS_* */
1707- unsigned int subdevices_count;
1708- unsigned int subdevices_avail;
1709- union snd_pcm_sync_id sync; /* hardware synchronization ID */
1710- unsigned char reserved[64]; /* reserved for future... */
1711-};
1712-
1713-typedef int snd_pcm_hw_param_t;
1714-#define SNDRV_PCM_HW_PARAM_ACCESS 0 /* Access type */
1715-#define SNDRV_PCM_HW_PARAM_FORMAT 1 /* Format */
1716-#define SNDRV_PCM_HW_PARAM_SUBFORMAT 2 /* Subformat */
1717-#define SNDRV_PCM_HW_PARAM_FIRST_MASK SNDRV_PCM_HW_PARAM_ACCESS
1718-#define SNDRV_PCM_HW_PARAM_LAST_MASK SNDRV_PCM_HW_PARAM_SUBFORMAT
1719-
1720-#define SNDRV_PCM_HW_PARAM_SAMPLE_BITS 8 /* Bits per sample */
1721-#define SNDRV_PCM_HW_PARAM_FRAME_BITS 9 /* Bits per frame */
1722-#define SNDRV_PCM_HW_PARAM_CHANNELS 10 /* Channels */
1723-#define SNDRV_PCM_HW_PARAM_RATE 11 /* Approx rate */
1724-#define SNDRV_PCM_HW_PARAM_PERIOD_TIME 12 /* Approx distance between
1725- * interrupts in us
1726- */
1727-#define SNDRV_PCM_HW_PARAM_PERIOD_SIZE 13 /* Approx frames between
1728- * interrupts
1729- */
1730-#define SNDRV_PCM_HW_PARAM_PERIOD_BYTES 14 /* Approx bytes between
1731- * interrupts
1732- */
1733-#define SNDRV_PCM_HW_PARAM_PERIODS 15 /* Approx interrupts per
1734- * buffer
1735- */
1736-#define SNDRV_PCM_HW_PARAM_BUFFER_TIME 16 /* Approx duration of buffer
1737- * in us
1738- */
1739-#define SNDRV_PCM_HW_PARAM_BUFFER_SIZE 17 /* Size of buffer in frames */
1740-#define SNDRV_PCM_HW_PARAM_BUFFER_BYTES 18 /* Size of buffer in bytes */
1741-#define SNDRV_PCM_HW_PARAM_TICK_TIME 19 /* Approx tick duration in us */
1742-#define SNDRV_PCM_HW_PARAM_FIRST_INTERVAL SNDRV_PCM_HW_PARAM_SAMPLE_BITS
1743-#define SNDRV_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_TICK_TIME
1744-
1745-#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */
1746-#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1<<1) /* export buffer */
1747-#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1<<2) /* disable period wakeups */
1748-
1749-struct snd_interval {
1750- unsigned int min, max;
1751- unsigned int openmin:1,
1752- openmax:1,
1753- integer:1,
1754- empty:1;
1755-};
1756-
1757-#define SNDRV_MASK_MAX 256
1758-
1759-struct snd_mask {
1760- __u32 bits[(SNDRV_MASK_MAX+31)/32];
1761-};
1762-
1763-struct snd_pcm_hw_params {
1764- unsigned int flags;
1765- struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
1766- SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
1767- struct snd_mask mres[5]; /* reserved masks */
1768- struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
1769- SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
1770- struct snd_interval ires[9]; /* reserved intervals */
1771- unsigned int rmask; /* W: requested masks */
1772- unsigned int cmask; /* R: changed masks */
1773- unsigned int info; /* R: Info flags for returned setup */
1774- unsigned int msbits; /* R: used most significant bits */
1775- unsigned int rate_num; /* R: rate numerator */
1776- unsigned int rate_den; /* R: rate denominator */
1777- snd_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */
1778- unsigned char reserved[64]; /* reserved for future */
1779-};
1780-
1781-enum {
1782- SNDRV_PCM_TSTAMP_NONE = 0,
1783- SNDRV_PCM_TSTAMP_ENABLE,
1784- SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_ENABLE,
1785-};
1786-
1787-struct snd_pcm_sw_params {
1788- int tstamp_mode; /* timestamp mode */
1789- unsigned int period_step;
1790- unsigned int sleep_min; /* min ticks to sleep */
1791- snd_pcm_uframes_t avail_min; /* min avail frames for wakeup */
1792- snd_pcm_uframes_t xfer_align; /* obsolete: xfer size need to be a multiple */
1793- snd_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */
1794- snd_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */
1795- snd_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */
1796- snd_pcm_uframes_t silence_size; /* silence block size */
1797- snd_pcm_uframes_t boundary; /* pointers wrap point */
1798- unsigned int proto; /* protocol version */
1799- unsigned int tstamp_type; /* timestamp type (req. proto >= 2.0.12) */
1800- unsigned char reserved[56]; /* reserved for future */
1801-};
1802-
1803-struct snd_pcm_channel_info {
1804- unsigned int channel;
1805- __kernel_off_t offset; /* mmap offset */
1806- unsigned int first; /* offset to first sample in bits */
1807- unsigned int step; /* samples distance in bits */
1808-};
1809-
1810-enum {
1811- /*
1812- * first definition for backwards compatibility only,
1813- * maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
1814- */
1815- SNDRV_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
1816-
1817- /* timestamp definitions */
1818- SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1, /* DMA time, reported as per hw_ptr */
1819- SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK = 2, /* link time reported by sample or wallclock counter, reset on startup */
1820- SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3, /* link time reported by sample or wallclock counter, not reset on startup */
1821- SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4, /* link time estimated indirectly */
1822- SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /* link time synchronized with system time */
1823- SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
1824-};
1825-
1826-struct snd_pcm_status {
1827- snd_pcm_state_t state; /* stream state */
1828- struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */
1829- struct timespec tstamp; /* reference timestamp */
1830- snd_pcm_uframes_t appl_ptr; /* appl ptr */
1831- snd_pcm_uframes_t hw_ptr; /* hw ptr */
1832- snd_pcm_sframes_t delay; /* current delay in frames */
1833- snd_pcm_uframes_t avail; /* number of frames available */
1834- snd_pcm_uframes_t avail_max; /* max frames available on hw since last status */
1835- snd_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */
1836- snd_pcm_state_t suspended_state; /* suspended stream state */
1837- __u32 audio_tstamp_data; /* needed for 64-bit alignment, used for configs/report to/from userspace */
1838- struct timespec audio_tstamp; /* sample counter, wall clock, PHC or on-demand sync'ed */
1839- struct timespec driver_tstamp; /* useful in case reference system tstamp is reported with delay */
1840- __u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */
1841- unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */
1842-};
1843-
1844-struct snd_pcm_mmap_status {
1845- snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
1846- int pad1; /* Needed for 64 bit alignment */
1847- snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
1848- struct timespec tstamp; /* Timestamp */
1849- snd_pcm_state_t suspended_state; /* RO: suspended stream state */
1850- struct timespec audio_tstamp; /* from sample counter or wall clock */
1851-};
1852-
1853-struct snd_pcm_mmap_control {
1854- snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */
1855- snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */
1856-};
1857-
1858-#define SNDRV_PCM_SYNC_PTR_HWSYNC (1<<0) /* execute hwsync */
1859-#define SNDRV_PCM_SYNC_PTR_APPL (1<<1) /* get appl_ptr from driver (r/w op) */
1860-#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN (1<<2) /* get avail_min from driver */
1861-
1862-struct snd_pcm_sync_ptr {
1863- unsigned int flags;
1864- union {
1865- struct snd_pcm_mmap_status status;
1866- unsigned char reserved[64];
1867- } s;
1868- union {
1869- struct snd_pcm_mmap_control control;
1870- unsigned char reserved[64];
1871- } c;
1872-};
1873-
1874-struct snd_xferi {
1875- snd_pcm_sframes_t result;
1876- void __user *buf;
1877- snd_pcm_uframes_t frames;
1878-};
1879-
1880-struct snd_xfern {
1881- snd_pcm_sframes_t result;
1882- void __user * __user *bufs;
1883- snd_pcm_uframes_t frames;
1884-};
1885-
1886-enum {
1887- SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0, /* gettimeofday equivalent */
1888- SNDRV_PCM_TSTAMP_TYPE_MONOTONIC, /* posix_clock_monotonic equivalent */
1889- SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW, /* monotonic_raw (no NTP) */
1890- SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
1891-};
1892-
1893-/* channel positions */
1894-enum {
1895- SNDRV_CHMAP_UNKNOWN = 0,
1896- SNDRV_CHMAP_NA, /* N/A, silent */
1897- SNDRV_CHMAP_MONO, /* mono stream */
1898- /* this follows the alsa-lib mixer channel value + 3 */
1899- SNDRV_CHMAP_FL, /* front left */
1900- SNDRV_CHMAP_FR, /* front right */
1901- SNDRV_CHMAP_RL, /* rear left */
1902- SNDRV_CHMAP_RR, /* rear right */
1903- SNDRV_CHMAP_FC, /* front center */
1904- SNDRV_CHMAP_LFE, /* LFE */
1905- SNDRV_CHMAP_SL, /* side left */
1906- SNDRV_CHMAP_SR, /* side right */
1907- SNDRV_CHMAP_RC, /* rear center */
1908- /* new definitions */
1909- SNDRV_CHMAP_FLC, /* front left center */
1910- SNDRV_CHMAP_FRC, /* front right center */
1911- SNDRV_CHMAP_RLC, /* rear left center */
1912- SNDRV_CHMAP_RRC, /* rear right center */
1913- SNDRV_CHMAP_FLW, /* front left wide */
1914- SNDRV_CHMAP_FRW, /* front right wide */
1915- SNDRV_CHMAP_FLH, /* front left high */
1916- SNDRV_CHMAP_FCH, /* front center high */
1917- SNDRV_CHMAP_FRH, /* front right high */
1918- SNDRV_CHMAP_TC, /* top center */
1919- SNDRV_CHMAP_TFL, /* top front left */
1920- SNDRV_CHMAP_TFR, /* top front right */
1921- SNDRV_CHMAP_TFC, /* top front center */
1922- SNDRV_CHMAP_TRL, /* top rear left */
1923- SNDRV_CHMAP_TRR, /* top rear right */
1924- SNDRV_CHMAP_TRC, /* top rear center */
1925- /* new definitions for UAC2 */
1926- SNDRV_CHMAP_TFLC, /* top front left center */
1927- SNDRV_CHMAP_TFRC, /* top front right center */
1928- SNDRV_CHMAP_TSL, /* top side left */
1929- SNDRV_CHMAP_TSR, /* top side right */
1930- SNDRV_CHMAP_LLFE, /* left LFE */
1931- SNDRV_CHMAP_RLFE, /* right LFE */
1932- SNDRV_CHMAP_BC, /* bottom center */
1933- SNDRV_CHMAP_BLC, /* bottom left center */
1934- SNDRV_CHMAP_BRC, /* bottom right center */
1935- SNDRV_CHMAP_LAST = SNDRV_CHMAP_BRC,
1936-};
1937-
1938-#define SNDRV_CHMAP_POSITION_MASK 0xffff
1939-#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
1940-#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
1941-
1942-#define SNDRV_PCM_IOCTL_PVERSION _IOR('A', 0x00, int)
1943-#define SNDRV_PCM_IOCTL_INFO _IOR('A', 0x01, struct snd_pcm_info)
1944-#define SNDRV_PCM_IOCTL_TSTAMP _IOW('A', 0x02, int)
1945-#define SNDRV_PCM_IOCTL_TTSTAMP _IOW('A', 0x03, int)
1946-#define SNDRV_PCM_IOCTL_USER_PVERSION _IOW('A', 0x04, int)
1947-#define SNDRV_PCM_IOCTL_HW_REFINE _IOWR('A', 0x10, struct snd_pcm_hw_params)
1948-#define SNDRV_PCM_IOCTL_HW_PARAMS _IOWR('A', 0x11, struct snd_pcm_hw_params)
1949-#define SNDRV_PCM_IOCTL_HW_FREE _IO('A', 0x12)
1950-#define SNDRV_PCM_IOCTL_SW_PARAMS _IOWR('A', 0x13, struct snd_pcm_sw_params)
1951-#define SNDRV_PCM_IOCTL_STATUS _IOR('A', 0x20, struct snd_pcm_status)
1952-#define SNDRV_PCM_IOCTL_DELAY _IOR('A', 0x21, snd_pcm_sframes_t)
1953-#define SNDRV_PCM_IOCTL_HWSYNC _IO('A', 0x22)
1954-#define SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct snd_pcm_sync_ptr)
1955-#define SNDRV_PCM_IOCTL_STATUS_EXT _IOWR('A', 0x24, struct snd_pcm_status)
1956-#define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info)
1957-#define SNDRV_PCM_IOCTL_PREPARE _IO('A', 0x40)
1958-#define SNDRV_PCM_IOCTL_RESET _IO('A', 0x41)
1959-#define SNDRV_PCM_IOCTL_START _IO('A', 0x42)
1960-#define SNDRV_PCM_IOCTL_DROP _IO('A', 0x43)
1961-#define SNDRV_PCM_IOCTL_DRAIN _IO('A', 0x44)
1962-#define SNDRV_PCM_IOCTL_PAUSE _IOW('A', 0x45, int)
1963-#define SNDRV_PCM_IOCTL_REWIND _IOW('A', 0x46, snd_pcm_uframes_t)
1964-#define SNDRV_PCM_IOCTL_RESUME _IO('A', 0x47)
1965-#define SNDRV_PCM_IOCTL_XRUN _IO('A', 0x48)
1966-#define SNDRV_PCM_IOCTL_FORWARD _IOW('A', 0x49, snd_pcm_uframes_t)
1967-#define SNDRV_PCM_IOCTL_WRITEI_FRAMES _IOW('A', 0x50, struct snd_xferi)
1968-#define SNDRV_PCM_IOCTL_READI_FRAMES _IOR('A', 0x51, struct snd_xferi)
1969-#define SNDRV_PCM_IOCTL_WRITEN_FRAMES _IOW('A', 0x52, struct snd_xfern)
1970-#define SNDRV_PCM_IOCTL_READN_FRAMES _IOR('A', 0x53, struct snd_xfern)
1971-#define SNDRV_PCM_IOCTL_LINK _IOW('A', 0x60, int)
1972-#define SNDRV_PCM_IOCTL_UNLINK _IO('A', 0x61)
1973-
1974-/*****************************************************************************
1975- * *
1976- * MIDI v1.0 interface *
1977- * *
1978- *****************************************************************************/
1979-
1980-/*
1981- * Raw MIDI section - /dev/snd/midi??
1982- */
1983-
1984-#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0)
1985-
1986-enum {
1987- SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
1988- SNDRV_RAWMIDI_STREAM_INPUT,
1989- SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
1990-};
1991-
1992-#define SNDRV_RAWMIDI_INFO_OUTPUT 0x00000001
1993-#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
1994-#define SNDRV_RAWMIDI_INFO_DUPLEX 0x00000004
1995-
1996-struct snd_rawmidi_info {
1997- unsigned int device; /* RO/WR (control): device number */
1998- unsigned int subdevice; /* RO/WR (control): subdevice number */
1999- int stream; /* WR: stream */
2000- int card; /* R: card number */
2001- unsigned int flags; /* SNDRV_RAWMIDI_INFO_XXXX */
2002- unsigned char id[64]; /* ID (user selectable) */
2003- unsigned char name[80]; /* name of device */
2004- unsigned char subname[32]; /* name of active or selected subdevice */
2005- unsigned int subdevices_count;
2006- unsigned int subdevices_avail;
2007- unsigned char reserved[64]; /* reserved for future use */
2008-};
2009-
2010-struct snd_rawmidi_params {
2011- int stream;
2012- size_t buffer_size; /* queue size in bytes */
2013- size_t avail_min; /* minimum avail bytes for wakeup */
2014- unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
2015- unsigned char reserved[16]; /* reserved for future use */
2016-};
2017-
2018-struct snd_rawmidi_status {
2019- int stream;
2020- struct timespec tstamp; /* Timestamp */
2021- size_t avail; /* available bytes */
2022- size_t xruns; /* count of overruns since last status (in bytes) */
2023- unsigned char reserved[16]; /* reserved for future use */
2024-};
2025-
2026-#define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int)
2027-#define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info)
2028-#define SNDRV_RAWMIDI_IOCTL_PARAMS _IOWR('W', 0x10, struct snd_rawmidi_params)
2029-#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
2030-#define SNDRV_RAWMIDI_IOCTL_DROP _IOW('W', 0x30, int)
2031-#define SNDRV_RAWMIDI_IOCTL_DRAIN _IOW('W', 0x31, int)
2032-
2033-/*
2034- * Timer section - /dev/snd/timer
2035- */
2036-
2037-#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 6)
2038-
2039-enum {
2040- SNDRV_TIMER_CLASS_NONE = -1,
2041- SNDRV_TIMER_CLASS_SLAVE = 0,
2042- SNDRV_TIMER_CLASS_GLOBAL,
2043- SNDRV_TIMER_CLASS_CARD,
2044- SNDRV_TIMER_CLASS_PCM,
2045- SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
2046-};
2047-
2048-/* slave timer classes */
2049-enum {
2050- SNDRV_TIMER_SCLASS_NONE = 0,
2051- SNDRV_TIMER_SCLASS_APPLICATION,
2052- SNDRV_TIMER_SCLASS_SEQUENCER, /* alias */
2053- SNDRV_TIMER_SCLASS_OSS_SEQUENCER, /* alias */
2054- SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
2055-};
2056-
2057-/* global timers (device member) */
2058-#define SNDRV_TIMER_GLOBAL_SYSTEM 0
2059-#define SNDRV_TIMER_GLOBAL_RTC 1 /* unused */
2060-#define SNDRV_TIMER_GLOBAL_HPET 2
2061-#define SNDRV_TIMER_GLOBAL_HRTIMER 3
2062-
2063-/* info flags */
2064-#define SNDRV_TIMER_FLG_SLAVE (1<<0) /* cannot be controlled */
2065-
2066-struct snd_timer_id {
2067- int dev_class;
2068- int dev_sclass;
2069- int card;
2070- int device;
2071- int subdevice;
2072-};
2073-
2074-struct snd_timer_ginfo {
2075- struct snd_timer_id tid; /* requested timer ID */
2076- unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
2077- int card; /* card number */
2078- unsigned char id[64]; /* timer identification */
2079- unsigned char name[80]; /* timer name */
2080- unsigned long reserved0; /* reserved for future use */
2081- unsigned long resolution; /* average period resolution in ns */
2082- unsigned long resolution_min; /* minimal period resolution in ns */
2083- unsigned long resolution_max; /* maximal period resolution in ns */
2084- unsigned int clients; /* active timer clients */
2085- unsigned char reserved[32];
2086-};
2087-
2088-struct snd_timer_gparams {
2089- struct snd_timer_id tid; /* requested timer ID */
2090- unsigned long period_num; /* requested precise period duration (in seconds) - numerator */
2091- unsigned long period_den; /* requested precise period duration (in seconds) - denominator */
2092- unsigned char reserved[32];
2093-};
2094-
2095-struct snd_timer_gstatus {
2096- struct snd_timer_id tid; /* requested timer ID */
2097- unsigned long resolution; /* current period resolution in ns */
2098- unsigned long resolution_num; /* precise current period resolution (in seconds) - numerator */
2099- unsigned long resolution_den; /* precise current period resolution (in seconds) - denominator */
2100- unsigned char reserved[32];
2101-};
2102-
2103-struct snd_timer_select {
2104- struct snd_timer_id id; /* bind to timer ID */
2105- unsigned char reserved[32]; /* reserved */
2106-};
2107-
2108-struct snd_timer_info {
2109- unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
2110- int card; /* card number */
2111- unsigned char id[64]; /* timer identificator */
2112- unsigned char name[80]; /* timer name */
2113- unsigned long reserved0; /* reserved for future use */
2114- unsigned long resolution; /* average period resolution in ns */
2115- unsigned char reserved[64]; /* reserved */
2116-};
2117-
2118-#define SNDRV_TIMER_PSFLG_AUTO (1<<0) /* auto start, otherwise one-shot */
2119-#define SNDRV_TIMER_PSFLG_EXCLUSIVE (1<<1) /* exclusive use, precise start/stop/pause/continue */
2120-#define SNDRV_TIMER_PSFLG_EARLY_EVENT (1<<2) /* write early event to the poll queue */
2121-
2122-struct snd_timer_params {
2123- unsigned int flags; /* flags - SNDRV_TIMER_PSFLG_* */
2124- unsigned int ticks; /* requested resolution in ticks */
2125- unsigned int queue_size; /* total size of queue (32-1024) */
2126- unsigned int reserved0; /* reserved, was: failure locations */
2127- unsigned int filter; /* event filter (bitmask of SNDRV_TIMER_EVENT_*) */
2128- unsigned char reserved[60]; /* reserved */
2129-};
2130-
2131-struct snd_timer_status {
2132- struct timespec tstamp; /* Timestamp - last update */
2133- unsigned int resolution; /* current period resolution in ns */
2134- unsigned int lost; /* counter of master tick lost */
2135- unsigned int overrun; /* count of read queue overruns */
2136- unsigned int queue; /* used queue size */
2137- unsigned char reserved[64]; /* reserved */
2138-};
2139-
2140-#define SNDRV_TIMER_IOCTL_PVERSION _IOR('T', 0x00, int)
2141-#define SNDRV_TIMER_IOCTL_NEXT_DEVICE _IOWR('T', 0x01, struct snd_timer_id)
2142-#define SNDRV_TIMER_IOCTL_TREAD _IOW('T', 0x02, int)
2143-#define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo)
2144-#define SNDRV_TIMER_IOCTL_GPARAMS _IOW('T', 0x04, struct snd_timer_gparams)
2145-#define SNDRV_TIMER_IOCTL_GSTATUS _IOWR('T', 0x05, struct snd_timer_gstatus)
2146-#define SNDRV_TIMER_IOCTL_SELECT _IOW('T', 0x10, struct snd_timer_select)
2147-#define SNDRV_TIMER_IOCTL_INFO _IOR('T', 0x11, struct snd_timer_info)
2148-#define SNDRV_TIMER_IOCTL_PARAMS _IOW('T', 0x12, struct snd_timer_params)
2149-#define SNDRV_TIMER_IOCTL_STATUS _IOR('T', 0x14, struct snd_timer_status)
2150-/* The following four ioctls are changed since 1.0.9 due to confliction */
2151-#define SNDRV_TIMER_IOCTL_START _IO('T', 0xa0)
2152-#define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1)
2153-#define SNDRV_TIMER_IOCTL_CONTINUE _IO('T', 0xa2)
2154-#define SNDRV_TIMER_IOCTL_PAUSE _IO('T', 0xa3)
2155-
2156-struct snd_timer_read {
2157- unsigned int resolution;
2158- unsigned int ticks;
2159-};
2160-
2161-enum {
2162- SNDRV_TIMER_EVENT_RESOLUTION = 0, /* val = resolution in ns */
2163- SNDRV_TIMER_EVENT_TICK, /* val = ticks */
2164- SNDRV_TIMER_EVENT_START, /* val = resolution in ns */
2165- SNDRV_TIMER_EVENT_STOP, /* val = 0 */
2166- SNDRV_TIMER_EVENT_CONTINUE, /* val = resolution in ns */
2167- SNDRV_TIMER_EVENT_PAUSE, /* val = 0 */
2168- SNDRV_TIMER_EVENT_EARLY, /* val = 0, early event */
2169- SNDRV_TIMER_EVENT_SUSPEND, /* val = 0 */
2170- SNDRV_TIMER_EVENT_RESUME, /* val = resolution in ns */
2171- /* master timer events for slave timer instances */
2172- SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
2173- SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
2174- SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
2175- SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
2176- SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
2177- SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
2178-};
2179-
2180-struct snd_timer_tread {
2181- int event;
2182- struct timespec tstamp;
2183- unsigned int val;
2184-};
2185-
2186-/****************************************************************************
2187- * *
2188- * Section for driver control interface - /dev/snd/control? *
2189- * *
2190- ****************************************************************************/
2191-
2192-#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7)
2193-
2194-struct snd_ctl_card_info {
2195- int card; /* card number */
2196- int pad; /* reserved for future (was type) */
2197- unsigned char id[16]; /* ID of card (user selectable) */
2198- unsigned char driver[16]; /* Driver name */
2199- unsigned char name[32]; /* Short name of soundcard */
2200- unsigned char longname[80]; /* name + info text about soundcard */
2201- unsigned char reserved_[16]; /* reserved for future (was ID of mixer) */
2202- unsigned char mixername[80]; /* visual mixer identification */
2203- unsigned char components[128]; /* card components / fine identification, delimited with one space (AC97 etc..) */
2204-};
2205-
2206-typedef int __bitwise snd_ctl_elem_type_t;
2207-#define SNDRV_CTL_ELEM_TYPE_NONE ((__force snd_ctl_elem_type_t) 0) /* invalid */
2208-#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((__force snd_ctl_elem_type_t) 1) /* boolean type */
2209-#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2) /* integer type */
2210-#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((__force snd_ctl_elem_type_t) 3) /* enumerated type */
2211-#define SNDRV_CTL_ELEM_TYPE_BYTES ((__force snd_ctl_elem_type_t) 4) /* byte array */
2212-#define SNDRV_CTL_ELEM_TYPE_IEC958 ((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
2213-#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */
2214-#define SNDRV_CTL_ELEM_TYPE_LAST SNDRV_CTL_ELEM_TYPE_INTEGER64
2215-
2216-typedef int __bitwise snd_ctl_elem_iface_t;
2217-#define SNDRV_CTL_ELEM_IFACE_CARD ((__force snd_ctl_elem_iface_t) 0) /* global control */
2218-#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */
2219-#define SNDRV_CTL_ELEM_IFACE_MIXER ((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */
2220-#define SNDRV_CTL_ELEM_IFACE_PCM ((__force snd_ctl_elem_iface_t) 3) /* PCM device */
2221-#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */
2222-#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5) /* timer device */
2223-#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((__force snd_ctl_elem_iface_t) 6) /* sequencer client */
2224-#define SNDRV_CTL_ELEM_IFACE_LAST SNDRV_CTL_ELEM_IFACE_SEQUENCER
2225-
2226-#define SNDRV_CTL_ELEM_ACCESS_READ (1<<0)
2227-#define SNDRV_CTL_ELEM_ACCESS_WRITE (1<<1)
2228-#define SNDRV_CTL_ELEM_ACCESS_READWRITE (SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
2229-#define SNDRV_CTL_ELEM_ACCESS_VOLATILE (1<<2) /* control value may be changed without a notification */
2230-#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP (1<<3) /* when was control changed */
2231-#define SNDRV_CTL_ELEM_ACCESS_TLV_READ (1<<4) /* TLV read is possible */
2232-#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE (1<<5) /* TLV write is possible */
2233-#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE (SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
2234-#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND (1<<6) /* TLV command is possible */
2235-#define SNDRV_CTL_ELEM_ACCESS_INACTIVE (1<<8) /* control does actually nothing, but may be updated */
2236-#define SNDRV_CTL_ELEM_ACCESS_LOCK (1<<9) /* write lock */
2237-#define SNDRV_CTL_ELEM_ACCESS_OWNER (1<<10) /* write lock owner */
2238-#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK (1<<28) /* kernel use a TLV callback */
2239-#define SNDRV_CTL_ELEM_ACCESS_USER (1<<29) /* user space element */
2240-/* bits 30 and 31 are obsoleted (for indirect access) */
2241-
2242-/* for further details see the ACPI and PCI power management specification */
2243-#define SNDRV_CTL_POWER_D0 0x0000 /* full On */
2244-#define SNDRV_CTL_POWER_D1 0x0100 /* partial On */
2245-#define SNDRV_CTL_POWER_D2 0x0200 /* partial On */
2246-#define SNDRV_CTL_POWER_D3 0x0300 /* Off */
2247-#define SNDRV_CTL_POWER_D3hot (SNDRV_CTL_POWER_D3|0x0000) /* Off, with power */
2248-#define SNDRV_CTL_POWER_D3cold (SNDRV_CTL_POWER_D3|0x0001) /* Off, without power */
2249-
2250-#define SNDRV_CTL_ELEM_ID_NAME_MAXLEN 44
2251-
2252-struct snd_ctl_elem_id {
2253- unsigned int numid; /* numeric identifier, zero = invalid */
2254- snd_ctl_elem_iface_t iface; /* interface identifier */
2255- unsigned int device; /* device/client number */
2256- unsigned int subdevice; /* subdevice (substream) number */
2257- unsigned char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* ASCII name of item */
2258- unsigned int index; /* index of item */
2259-};
2260-
2261-struct snd_ctl_elem_list {
2262- unsigned int offset; /* W: first element ID to get */
2263- unsigned int space; /* W: count of element IDs to get */
2264- unsigned int used; /* R: count of element IDs set */
2265- unsigned int count; /* R: count of all elements */
2266- struct snd_ctl_elem_id __user *pids; /* R: IDs */
2267- unsigned char reserved[50];
2268-};
2269-
2270-struct snd_ctl_elem_info {
2271- struct snd_ctl_elem_id id; /* W: element ID */
2272- snd_ctl_elem_type_t type; /* R: value type - SNDRV_CTL_ELEM_TYPE_* */
2273- unsigned int access; /* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */
2274- unsigned int count; /* count of values */
2275- __kernel_pid_t owner; /* owner's PID of this control */
2276- union {
2277- struct {
2278- long min; /* R: minimum value */
2279- long max; /* R: maximum value */
2280- long step; /* R: step (0 variable) */
2281- } integer;
2282- struct {
2283- long long min; /* R: minimum value */
2284- long long max; /* R: maximum value */
2285- long long step; /* R: step (0 variable) */
2286- } integer64;
2287- struct {
2288- unsigned int items; /* R: number of items */
2289- unsigned int item; /* W: item number */
2290- char name[64]; /* R: value name */
2291- __u64 names_ptr; /* W: names list (ELEM_ADD only) */
2292- unsigned int names_length;
2293- } enumerated;
2294- unsigned char reserved[128];
2295- } value;
2296- union {
2297- unsigned short d[4]; /* dimensions */
2298- unsigned short *d_ptr; /* indirect - obsoleted */
2299- } dimen;
2300- unsigned char reserved[64-4*sizeof(unsigned short)];
2301-};
2302-
2303-struct snd_ctl_elem_value {
2304- struct snd_ctl_elem_id id; /* W: element ID */
2305- unsigned int indirect: 1; /* W: indirect access - obsoleted */
2306- union {
2307- union {
2308- long value[128];
2309- long *value_ptr; /* obsoleted */
2310- } integer;
2311- union {
2312- long long value[64];
2313- long long *value_ptr; /* obsoleted */
2314- } integer64;
2315- union {
2316- unsigned int item[128];
2317- unsigned int *item_ptr; /* obsoleted */
2318- } enumerated;
2319- union {
2320- unsigned char data[512];
2321- unsigned char *data_ptr; /* obsoleted */
2322- } bytes;
2323- struct snd_aes_iec958 iec958;
2324- } value; /* RO */
2325- struct timespec tstamp;
2326- unsigned char reserved[128-sizeof(struct timespec)];
2327-};
2328-
2329-struct snd_ctl_tlv {
2330- unsigned int numid; /* control element numeric identification */
2331- unsigned int length; /* in bytes aligned to 4 */
2332- unsigned int tlv[0]; /* first TLV */
2333-};
2334-
2335-#define SNDRV_CTL_IOCTL_PVERSION _IOR('U', 0x00, int)
2336-#define SNDRV_CTL_IOCTL_CARD_INFO _IOR('U', 0x01, struct snd_ctl_card_info)
2337-#define SNDRV_CTL_IOCTL_ELEM_LIST _IOWR('U', 0x10, struct snd_ctl_elem_list)
2338-#define SNDRV_CTL_IOCTL_ELEM_INFO _IOWR('U', 0x11, struct snd_ctl_elem_info)
2339-#define SNDRV_CTL_IOCTL_ELEM_READ _IOWR('U', 0x12, struct snd_ctl_elem_value)
2340-#define SNDRV_CTL_IOCTL_ELEM_WRITE _IOWR('U', 0x13, struct snd_ctl_elem_value)
2341-#define SNDRV_CTL_IOCTL_ELEM_LOCK _IOW('U', 0x14, struct snd_ctl_elem_id)
2342-#define SNDRV_CTL_IOCTL_ELEM_UNLOCK _IOW('U', 0x15, struct snd_ctl_elem_id)
2343-#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int)
2344-#define SNDRV_CTL_IOCTL_ELEM_ADD _IOWR('U', 0x17, struct snd_ctl_elem_info)
2345-#define SNDRV_CTL_IOCTL_ELEM_REPLACE _IOWR('U', 0x18, struct snd_ctl_elem_info)
2346-#define SNDRV_CTL_IOCTL_ELEM_REMOVE _IOWR('U', 0x19, struct snd_ctl_elem_id)
2347-#define SNDRV_CTL_IOCTL_TLV_READ _IOWR('U', 0x1a, struct snd_ctl_tlv)
2348-#define SNDRV_CTL_IOCTL_TLV_WRITE _IOWR('U', 0x1b, struct snd_ctl_tlv)
2349-#define SNDRV_CTL_IOCTL_TLV_COMMAND _IOWR('U', 0x1c, struct snd_ctl_tlv)
2350-#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int)
2351-#define SNDRV_CTL_IOCTL_HWDEP_INFO _IOR('U', 0x21, struct snd_hwdep_info)
2352-#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE _IOR('U', 0x30, int)
2353-#define SNDRV_CTL_IOCTL_PCM_INFO _IOWR('U', 0x31, struct snd_pcm_info)
2354-#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int)
2355-#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
2356-#define SNDRV_CTL_IOCTL_RAWMIDI_INFO _IOWR('U', 0x41, struct snd_rawmidi_info)
2357-#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
2358-#define SNDRV_CTL_IOCTL_POWER _IOWR('U', 0xd0, int)
2359-#define SNDRV_CTL_IOCTL_POWER_STATE _IOR('U', 0xd1, int)
2360-
2361-/*
2362- * Read interface.
2363- */
2364-
2365-enum sndrv_ctl_event_type {
2366- SNDRV_CTL_EVENT_ELEM = 0,
2367- SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
2368-};
2369-
2370-#define SNDRV_CTL_EVENT_MASK_VALUE (1<<0) /* element value was changed */
2371-#define SNDRV_CTL_EVENT_MASK_INFO (1<<1) /* element info was changed */
2372-#define SNDRV_CTL_EVENT_MASK_ADD (1<<2) /* element was added */
2373-#define SNDRV_CTL_EVENT_MASK_TLV (1<<3) /* element TLV tree was changed */
2374-#define SNDRV_CTL_EVENT_MASK_REMOVE (~0U) /* element was removed */
2375-
2376-struct snd_ctl_event {
2377- int type; /* event type - SNDRV_CTL_EVENT_* */
2378- union {
2379- struct {
2380- unsigned int mask;
2381- struct snd_ctl_elem_id id;
2382- } elem;
2383- unsigned char data8[60];
2384- } data;
2385-};
2386-
2387-/*
2388- * Control names
2389- */
2390-
2391-#define SNDRV_CTL_NAME_NONE ""
2392-#define SNDRV_CTL_NAME_PLAYBACK "Playback "
2393-#define SNDRV_CTL_NAME_CAPTURE "Capture "
2394-
2395-#define SNDRV_CTL_NAME_IEC958_NONE ""
2396-#define SNDRV_CTL_NAME_IEC958_SWITCH "Switch"
2397-#define SNDRV_CTL_NAME_IEC958_VOLUME "Volume"
2398-#define SNDRV_CTL_NAME_IEC958_DEFAULT "Default"
2399-#define SNDRV_CTL_NAME_IEC958_MASK "Mask"
2400-#define SNDRV_CTL_NAME_IEC958_CON_MASK "Con Mask"
2401-#define SNDRV_CTL_NAME_IEC958_PRO_MASK "Pro Mask"
2402-#define SNDRV_CTL_NAME_IEC958_PCM_STREAM "PCM Stream"
2403-#define SNDRV_CTL_NAME_IEC958(expl,direction,what) "IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
2404-
2405-#endif /* _UAPI__SOUND_ASOUND_H */
2406+#include <alsa/sound/uapi/asound.h>
2407diff --git a/include/sound/asound_fm.h b/include/sound/asound_fm.h
2408index 8471f404..3e5da4d0 100644
2409--- a/include/sound/asound_fm.h
2410+++ b/include/sound/asound_fm.h
2411@@ -1,135 +1 @@
2412-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2413-#ifndef __SOUND_ASOUND_FM_H
2414-#define __SOUND_ASOUND_FM_H
2415-
2416-/*
2417- * Advanced Linux Sound Architecture - ALSA
2418- *
2419- * Interface file between ALSA driver & user space
2420- * Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>,
2421- * 4Front Technologies
2422- *
2423- * Direct FM control
2424- *
2425- * This program is free software; you can redistribute it and/or modify
2426- * it under the terms of the GNU General Public License as published by
2427- * the Free Software Foundation; either version 2 of the License, or
2428- * (at your option) any later version.
2429- *
2430- * This program is distributed in the hope that it will be useful,
2431- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2432- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2433- * GNU General Public License for more details.
2434- *
2435- * You should have received a copy of the GNU General Public License
2436- * along with this program; if not, write to the Free Software
2437- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2438- *
2439- */
2440-
2441-#define SNDRV_DM_FM_MODE_OPL2 0x00
2442-#define SNDRV_DM_FM_MODE_OPL3 0x01
2443-
2444-struct snd_dm_fm_info {
2445- unsigned char fm_mode; /* OPL mode, see SNDRV_DM_FM_MODE_XXX */
2446- unsigned char rhythm; /* percussion mode flag */
2447-};
2448-
2449-/*
2450- * Data structure composing an FM "note" or sound event.
2451- */
2452-
2453-struct snd_dm_fm_voice {
2454- unsigned char op; /* operator cell (0 or 1) */
2455- unsigned char voice; /* FM voice (0 to 17) */
2456-
2457- unsigned char am; /* amplitude modulation */
2458- unsigned char vibrato; /* vibrato effect */
2459- unsigned char do_sustain; /* sustain phase */
2460- unsigned char kbd_scale; /* keyboard scaling */
2461- unsigned char harmonic; /* 4 bits: harmonic and multiplier */
2462- unsigned char scale_level; /* 2 bits: decrease output freq rises */
2463- unsigned char volume; /* 6 bits: volume */
2464-
2465- unsigned char attack; /* 4 bits: attack rate */
2466- unsigned char decay; /* 4 bits: decay rate */
2467- unsigned char sustain; /* 4 bits: sustain level */
2468- unsigned char release; /* 4 bits: release rate */
2469-
2470- unsigned char feedback; /* 3 bits: feedback for op0 */
2471- unsigned char connection; /* 0 for serial, 1 for parallel */
2472- unsigned char left; /* stereo left */
2473- unsigned char right; /* stereo right */
2474- unsigned char waveform; /* 3 bits: waveform shape */
2475-};
2476-
2477-/*
2478- * This describes an FM note by its voice, octave, frequency number (10bit)
2479- * and key on/off.
2480- */
2481-
2482-struct snd_dm_fm_note {
2483- unsigned char voice; /* 0-17 voice channel */
2484- unsigned char octave; /* 3 bits: what octave to play */
2485- unsigned int fnum; /* 10 bits: frequency number */
2486- unsigned char key_on; /* set for active, clear for silent */
2487-};
2488-
2489-/*
2490- * FM parameters that apply globally to all voices, and thus are not "notes"
2491- */
2492-
2493-struct snd_dm_fm_params {
2494- unsigned char am_depth; /* amplitude modulation depth (1=hi) */
2495- unsigned char vib_depth; /* vibrato depth (1=hi) */
2496- unsigned char kbd_split; /* keyboard split */
2497- unsigned char rhythm; /* percussion mode select */
2498-
2499- /* This block is the percussion instrument data */
2500- unsigned char bass;
2501- unsigned char snare;
2502- unsigned char tomtom;
2503- unsigned char cymbal;
2504- unsigned char hihat;
2505-};
2506-
2507-/*
2508- * FM mode ioctl settings
2509- */
2510-
2511-#define SNDRV_DM_FM_IOCTL_INFO _IOR('H', 0x20, struct snd_dm_fm_info)
2512-#define SNDRV_DM_FM_IOCTL_RESET _IO ('H', 0x21)
2513-#define SNDRV_DM_FM_IOCTL_PLAY_NOTE _IOW('H', 0x22, struct snd_dm_fm_note)
2514-#define SNDRV_DM_FM_IOCTL_SET_VOICE _IOW('H', 0x23, struct snd_dm_fm_voice)
2515-#define SNDRV_DM_FM_IOCTL_SET_PARAMS _IOW('H', 0x24, struct snd_dm_fm_params)
2516-#define SNDRV_DM_FM_IOCTL_SET_MODE _IOW('H', 0x25, int)
2517-/* for OPL3 only */
2518-#define SNDRV_DM_FM_IOCTL_SET_CONNECTION _IOW('H', 0x26, int)
2519-/* SBI patch management */
2520-#define SNDRV_DM_FM_IOCTL_CLEAR_PATCHES _IO ('H', 0x40)
2521-
2522-#define SNDRV_DM_FM_OSS_IOCTL_RESET 0x20
2523-#define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE 0x21
2524-#define SNDRV_DM_FM_OSS_IOCTL_SET_VOICE 0x22
2525-#define SNDRV_DM_FM_OSS_IOCTL_SET_PARAMS 0x23
2526-#define SNDRV_DM_FM_OSS_IOCTL_SET_MODE 0x24
2527-#define SNDRV_DM_FM_OSS_IOCTL_SET_OPL 0x25
2528-
2529-/*
2530- * Patch Record - fixed size for write
2531- */
2532-
2533-#define FM_KEY_SBI "SBI\032"
2534-#define FM_KEY_2OP "2OP\032"
2535-#define FM_KEY_4OP "4OP\032"
2536-
2537-struct sbi_patch {
2538- unsigned char prog;
2539- unsigned char bank;
2540- char key[4];
2541- char name[25];
2542- char extension[7];
2543- unsigned char data[32];
2544-};
2545-
2546-#endif /* __SOUND_ASOUND_FM_H */
2547+#include <alsa/sound/uapi/asound_fm.h>
2548diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
2549index 042c5a6f..f06ecee5 100644
2550--- a/include/sound/emu10k1.h
2551+++ b/include/sound/emu10k1.h
2552@@ -1,381 +1,2 @@
2553-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2554-/*
2555- * Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
2556- * Creative Labs, Inc.
2557- * Definitions for EMU10K1 (SB Live!) chips
2558- *
2559- *
2560- * This program is free software; you can redistribute it and/or modify
2561- * it under the terms of the GNU General Public License as published by
2562- * the Free Software Foundation; either version 2 of the License, or
2563- * (at your option) any later version.
2564- *
2565- * This program is distributed in the hope that it will be useful,
2566- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2567- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2568- * GNU General Public License for more details.
2569- *
2570- * You should have received a copy of the GNU General Public License
2571- * along with this program; if not, write to the Free Software
2572- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2573- *
2574- */
2575-#ifndef _UAPI__SOUND_EMU10K1_H
2576-#define _UAPI__SOUND_EMU10K1_H
2577-
2578-#include <linux/types.h>
2579-#include <sound/asound.h>
2580-
2581-/*
2582- * ---- FX8010 ----
2583- */
2584-
2585-#define EMU10K1_CARD_CREATIVE 0x00000000
2586-#define EMU10K1_CARD_EMUAPS 0x00000001
2587-
2588-#define EMU10K1_FX8010_PCM_COUNT 8
2589-
2590-/*
2591- * Following definition is copied from linux/types.h to support compiling
2592- * this header file in userspace since they are not generally available for
2593- * uapi headers.
2594- */
2595-#define __EMU10K1_DECLARE_BITMAP(name,bits) \
2596- unsigned long name[(bits) / (sizeof(unsigned long) * 8)]
2597-
2598-/* instruction set */
2599-#define iMAC0 0x00 /* R = A + (X * Y >> 31) ; saturation */
2600-#define iMAC1 0x01 /* R = A + (-X * Y >> 31) ; saturation */
2601-#define iMAC2 0x02 /* R = A + (X * Y >> 31) ; wraparound */
2602-#define iMAC3 0x03 /* R = A + (-X * Y >> 31) ; wraparound */
2603-#define iMACINT0 0x04 /* R = A + X * Y ; saturation */
2604-#define iMACINT1 0x05 /* R = A + X * Y ; wraparound (31-bit) */
2605-#define iACC3 0x06 /* R = A + X + Y ; saturation */
2606-#define iMACMV 0x07 /* R = A, acc += X * Y >> 31 */
2607-#define iANDXOR 0x08 /* R = (A & X) ^ Y */
2608-#define iTSTNEG 0x09 /* R = (A >= Y) ? X : ~X */
2609-#define iLIMITGE 0x0a /* R = (A >= Y) ? X : Y */
2610-#define iLIMITLT 0x0b /* R = (A < Y) ? X : Y */
2611-#define iLOG 0x0c /* R = linear_data, A (log_data), X (max_exp), Y (format_word) */
2612-#define iEXP 0x0d /* R = log_data, A (linear_data), X (max_exp), Y (format_word) */
2613-#define iINTERP 0x0e /* R = A + (X * (Y - A) >> 31) ; saturation */
2614-#define iSKIP 0x0f /* R = A (cc_reg), X (count), Y (cc_test) */
2615-
2616-/* GPRs */
2617-#define FXBUS(x) (0x00 + (x)) /* x = 0x00 - 0x0f */
2618-#define EXTIN(x) (0x10 + (x)) /* x = 0x00 - 0x0f */
2619-#define EXTOUT(x) (0x20 + (x)) /* x = 0x00 - 0x0f physical outs -> FXWC low 16 bits */
2620-#define FXBUS2(x) (0x30 + (x)) /* x = 0x00 - 0x0f copies of fx buses for capture -> FXWC high 16 bits */
2621- /* NB: 0x31 and 0x32 are shared with Center/LFE on SB live 5.1 */
2622-
2623-#define C_00000000 0x40
2624-#define C_00000001 0x41
2625-#define C_00000002 0x42
2626-#define C_00000003 0x43
2627-#define C_00000004 0x44
2628-#define C_00000008 0x45
2629-#define C_00000010 0x46
2630-#define C_00000020 0x47
2631-#define C_00000100 0x48
2632-#define C_00010000 0x49
2633-#define C_00080000 0x4a
2634-#define C_10000000 0x4b
2635-#define C_20000000 0x4c
2636-#define C_40000000 0x4d
2637-#define C_80000000 0x4e
2638-#define C_7fffffff 0x4f
2639-#define C_ffffffff 0x50
2640-#define C_fffffffe 0x51
2641-#define C_c0000000 0x52
2642-#define C_4f1bbcdc 0x53
2643-#define C_5a7ef9db 0x54
2644-#define C_00100000 0x55 /* ?? */
2645-#define GPR_ACCU 0x56 /* ACCUM, accumulator */
2646-#define GPR_COND 0x57 /* CCR, condition register */
2647-#define GPR_NOISE0 0x58 /* noise source */
2648-#define GPR_NOISE1 0x59 /* noise source */
2649-#define GPR_IRQ 0x5a /* IRQ register */
2650-#define GPR_DBAC 0x5b /* TRAM Delay Base Address Counter */
2651-#define GPR(x) (FXGPREGBASE + (x)) /* free GPRs: x = 0x00 - 0xff */
2652-#define ITRAM_DATA(x) (TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
2653-#define ETRAM_DATA(x) (TANKMEMDATAREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
2654-#define ITRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
2655-#define ETRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
2656-
2657-#define A_ITRAM_DATA(x) (TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
2658-#define A_ETRAM_DATA(x) (TANKMEMDATAREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
2659-#define A_ITRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
2660-#define A_ETRAM_ADDR(x) (TANKMEMADDRREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
2661-#define A_ITRAM_CTL(x) (A_TANKMEMCTLREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
2662-#define A_ETRAM_CTL(x) (A_TANKMEMCTLREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
2663-
2664-#define A_FXBUS(x) (0x00 + (x)) /* x = 0x00 - 0x3f FX buses */
2665-#define A_EXTIN(x) (0x40 + (x)) /* x = 0x00 - 0x0f physical ins */
2666-#define A_P16VIN(x) (0x50 + (x)) /* x = 0x00 - 0x0f p16v ins (A2 only) "EMU32 inputs" */
2667-#define A_EXTOUT(x) (0x60 + (x)) /* x = 0x00 - 0x1f physical outs -> A_FXWC1 0x79-7f unknown */
2668-#define A_FXBUS2(x) (0x80 + (x)) /* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
2669-#define A_EMU32OUTH(x) (0xa0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
2670-#define A_EMU32OUTL(x) (0xb0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
2671-#define A3_EMU32IN(x) (0x160 + (x)) /* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */
2672-#define A3_EMU32OUT(x) (0x1E0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */
2673-#define A_GPR(x) (A_FXGPREGBASE + (x))
2674-
2675-/* cc_reg constants */
2676-#define CC_REG_NORMALIZED C_00000001
2677-#define CC_REG_BORROW C_00000002
2678-#define CC_REG_MINUS C_00000004
2679-#define CC_REG_ZERO C_00000008
2680-#define CC_REG_SATURATE C_00000010
2681-#define CC_REG_NONZERO C_00000100
2682-
2683-/* FX buses */
2684-#define FXBUS_PCM_LEFT 0x00
2685-#define FXBUS_PCM_RIGHT 0x01
2686-#define FXBUS_PCM_LEFT_REAR 0x02
2687-#define FXBUS_PCM_RIGHT_REAR 0x03
2688-#define FXBUS_MIDI_LEFT 0x04
2689-#define FXBUS_MIDI_RIGHT 0x05
2690-#define FXBUS_PCM_CENTER 0x06
2691-#define FXBUS_PCM_LFE 0x07
2692-#define FXBUS_PCM_LEFT_FRONT 0x08
2693-#define FXBUS_PCM_RIGHT_FRONT 0x09
2694-#define FXBUS_MIDI_REVERB 0x0c
2695-#define FXBUS_MIDI_CHORUS 0x0d
2696-#define FXBUS_PCM_LEFT_SIDE 0x0e
2697-#define FXBUS_PCM_RIGHT_SIDE 0x0f
2698-#define FXBUS_PT_LEFT 0x14
2699-#define FXBUS_PT_RIGHT 0x15
2700-
2701-/* Inputs */
2702-#define EXTIN_AC97_L 0x00 /* AC'97 capture channel - left */
2703-#define EXTIN_AC97_R 0x01 /* AC'97 capture channel - right */
2704-#define EXTIN_SPDIF_CD_L 0x02 /* internal S/PDIF CD - onboard - left */
2705-#define EXTIN_SPDIF_CD_R 0x03 /* internal S/PDIF CD - onboard - right */
2706-#define EXTIN_ZOOM_L 0x04 /* Zoom Video I2S - left */
2707-#define EXTIN_ZOOM_R 0x05 /* Zoom Video I2S - right */
2708-#define EXTIN_TOSLINK_L 0x06 /* LiveDrive - TOSLink Optical - left */
2709-#define EXTIN_TOSLINK_R 0x07 /* LiveDrive - TOSLink Optical - right */
2710-#define EXTIN_LINE1_L 0x08 /* LiveDrive - Line/Mic 1 - left */
2711-#define EXTIN_LINE1_R 0x09 /* LiveDrive - Line/Mic 1 - right */
2712-#define EXTIN_COAX_SPDIF_L 0x0a /* LiveDrive - Coaxial S/PDIF - left */
2713-#define EXTIN_COAX_SPDIF_R 0x0b /* LiveDrive - Coaxial S/PDIF - right */
2714-#define EXTIN_LINE2_L 0x0c /* LiveDrive - Line/Mic 2 - left */
2715-#define EXTIN_LINE2_R 0x0d /* LiveDrive - Line/Mic 2 - right */
2716-
2717-/* Outputs */
2718-#define EXTOUT_AC97_L 0x00 /* AC'97 playback channel - left */
2719-#define EXTOUT_AC97_R 0x01 /* AC'97 playback channel - right */
2720-#define EXTOUT_TOSLINK_L 0x02 /* LiveDrive - TOSLink Optical - left */
2721-#define EXTOUT_TOSLINK_R 0x03 /* LiveDrive - TOSLink Optical - right */
2722-#define EXTOUT_AC97_CENTER 0x04 /* SB Live 5.1 - center */
2723-#define EXTOUT_AC97_LFE 0x05 /* SB Live 5.1 - LFE */
2724-#define EXTOUT_HEADPHONE_L 0x06 /* LiveDrive - Headphone - left */
2725-#define EXTOUT_HEADPHONE_R 0x07 /* LiveDrive - Headphone - right */
2726-#define EXTOUT_REAR_L 0x08 /* Rear channel - left */
2727-#define EXTOUT_REAR_R 0x09 /* Rear channel - right */
2728-#define EXTOUT_ADC_CAP_L 0x0a /* ADC Capture buffer - left */
2729-#define EXTOUT_ADC_CAP_R 0x0b /* ADC Capture buffer - right */
2730-#define EXTOUT_MIC_CAP 0x0c /* MIC Capture buffer */
2731-#define EXTOUT_AC97_REAR_L 0x0d /* SB Live 5.1 (c) 2003 - Rear Left */
2732-#define EXTOUT_AC97_REAR_R 0x0e /* SB Live 5.1 (c) 2003 - Rear Right */
2733-#define EXTOUT_ACENTER 0x11 /* Analog Center */
2734-#define EXTOUT_ALFE 0x12 /* Analog LFE */
2735-
2736-/* Audigy Inputs */
2737-#define A_EXTIN_AC97_L 0x00 /* AC'97 capture channel - left */
2738-#define A_EXTIN_AC97_R 0x01 /* AC'97 capture channel - right */
2739-#define A_EXTIN_SPDIF_CD_L 0x02 /* digital CD left */
2740-#define A_EXTIN_SPDIF_CD_R 0x03 /* digital CD left */
2741-#define A_EXTIN_OPT_SPDIF_L 0x04 /* audigy drive Optical SPDIF - left */
2742-#define A_EXTIN_OPT_SPDIF_R 0x05 /* right */
2743-#define A_EXTIN_LINE2_L 0x08 /* audigy drive line2/mic2 - left */
2744-#define A_EXTIN_LINE2_R 0x09 /* right */
2745-#define A_EXTIN_ADC_L 0x0a /* Philips ADC - left */
2746-#define A_EXTIN_ADC_R 0x0b /* right */
2747-#define A_EXTIN_AUX2_L 0x0c /* audigy drive aux2 - left */
2748-#define A_EXTIN_AUX2_R 0x0d /* - right */
2749-
2750-/* Audigiy Outputs */
2751-#define A_EXTOUT_FRONT_L 0x00 /* digital front left */
2752-#define A_EXTOUT_FRONT_R 0x01 /* right */
2753-#define A_EXTOUT_CENTER 0x02 /* digital front center */
2754-#define A_EXTOUT_LFE 0x03 /* digital front lfe */
2755-#define A_EXTOUT_HEADPHONE_L 0x04 /* headphone audigy drive left */
2756-#define A_EXTOUT_HEADPHONE_R 0x05 /* right */
2757-#define A_EXTOUT_REAR_L 0x06 /* digital rear left */
2758-#define A_EXTOUT_REAR_R 0x07 /* right */
2759-#define A_EXTOUT_AFRONT_L 0x08 /* analog front left */
2760-#define A_EXTOUT_AFRONT_R 0x09 /* right */
2761-#define A_EXTOUT_ACENTER 0x0a /* analog center */
2762-#define A_EXTOUT_ALFE 0x0b /* analog LFE */
2763-#define A_EXTOUT_ASIDE_L 0x0c /* analog side left - Audigy 2 ZS */
2764-#define A_EXTOUT_ASIDE_R 0x0d /* right - Audigy 2 ZS */
2765-#define A_EXTOUT_AREAR_L 0x0e /* analog rear left */
2766-#define A_EXTOUT_AREAR_R 0x0f /* right */
2767-#define A_EXTOUT_AC97_L 0x10 /* AC97 left (front) */
2768-#define A_EXTOUT_AC97_R 0x11 /* right */
2769-#define A_EXTOUT_ADC_CAP_L 0x16 /* ADC capture buffer left */
2770-#define A_EXTOUT_ADC_CAP_R 0x17 /* right */
2771-#define A_EXTOUT_MIC_CAP 0x18 /* Mic capture buffer */
2772-
2773-/* Audigy constants */
2774-#define A_C_00000000 0xc0
2775-#define A_C_00000001 0xc1
2776-#define A_C_00000002 0xc2
2777-#define A_C_00000003 0xc3
2778-#define A_C_00000004 0xc4
2779-#define A_C_00000008 0xc5
2780-#define A_C_00000010 0xc6
2781-#define A_C_00000020 0xc7
2782-#define A_C_00000100 0xc8
2783-#define A_C_00010000 0xc9
2784-#define A_C_00000800 0xca
2785-#define A_C_10000000 0xcb
2786-#define A_C_20000000 0xcc
2787-#define A_C_40000000 0xcd
2788-#define A_C_80000000 0xce
2789-#define A_C_7fffffff 0xcf
2790-#define A_C_ffffffff 0xd0
2791-#define A_C_fffffffe 0xd1
2792-#define A_C_c0000000 0xd2
2793-#define A_C_4f1bbcdc 0xd3
2794-#define A_C_5a7ef9db 0xd4
2795-#define A_C_00100000 0xd5
2796-#define A_GPR_ACCU 0xd6 /* ACCUM, accumulator */
2797-#define A_GPR_COND 0xd7 /* CCR, condition register */
2798-#define A_GPR_NOISE0 0xd8 /* noise source */
2799-#define A_GPR_NOISE1 0xd9 /* noise source */
2800-#define A_GPR_IRQ 0xda /* IRQ register */
2801-#define A_GPR_DBAC 0xdb /* TRAM Delay Base Address Counter - internal */
2802-#define A_GPR_DBACE 0xde /* TRAM Delay Base Address Counter - external */
2803-
2804-/* definitions for debug register */
2805-#define EMU10K1_DBG_ZC 0x80000000 /* zero tram counter */
2806-#define EMU10K1_DBG_SATURATION_OCCURED 0x02000000 /* saturation control */
2807-#define EMU10K1_DBG_SATURATION_ADDR 0x01ff0000 /* saturation address */
2808-#define EMU10K1_DBG_SINGLE_STEP 0x00008000 /* single step mode */
2809-#define EMU10K1_DBG_STEP 0x00004000 /* start single step */
2810-#define EMU10K1_DBG_CONDITION_CODE 0x00003e00 /* condition code */
2811-#define EMU10K1_DBG_SINGLE_STEP_ADDR 0x000001ff /* single step address */
2812-
2813-/* tank memory address line */
2814-#ifndef __KERNEL__
2815-#define TANKMEMADDRREG_ADDR_MASK 0x000fffff /* 20 bit tank address field */
2816-#define TANKMEMADDRREG_CLEAR 0x00800000 /* Clear tank memory */
2817-#define TANKMEMADDRREG_ALIGN 0x00400000 /* Align read or write relative to tank access */
2818-#define TANKMEMADDRREG_WRITE 0x00200000 /* Write to tank memory */
2819-#define TANKMEMADDRREG_READ 0x00100000 /* Read from tank memory */
2820-#endif
2821-
2822-struct snd_emu10k1_fx8010_info {
2823- unsigned int internal_tram_size; /* in samples */
2824- unsigned int external_tram_size; /* in samples */
2825- char fxbus_names[16][32]; /* names of FXBUSes */
2826- char extin_names[16][32]; /* names of external inputs */
2827- char extout_names[32][32]; /* names of external outputs */
2828- unsigned int gpr_controls; /* count of GPR controls */
2829-};
2830-
2831-#define EMU10K1_GPR_TRANSLATION_NONE 0
2832-#define EMU10K1_GPR_TRANSLATION_TABLE100 1
2833-#define EMU10K1_GPR_TRANSLATION_BASS 2
2834-#define EMU10K1_GPR_TRANSLATION_TREBLE 3
2835-#define EMU10K1_GPR_TRANSLATION_ONOFF 4
2836-
2837-struct snd_emu10k1_fx8010_control_gpr {
2838- struct snd_ctl_elem_id id; /* full control ID definition */
2839- unsigned int vcount; /* visible count */
2840- unsigned int count; /* count of GPR (1..16) */
2841- unsigned short gpr[32]; /* GPR number(s) */
2842- unsigned int value[32]; /* initial values */
2843- unsigned int min; /* minimum range */
2844- unsigned int max; /* maximum range */
2845- unsigned int translation; /* translation type (EMU10K1_GPR_TRANSLATION*) */
2846- const unsigned int *tlv;
2847-};
2848-
2849-/* old ABI without TLV support */
2850-struct snd_emu10k1_fx8010_control_old_gpr {
2851- struct snd_ctl_elem_id id;
2852- unsigned int vcount;
2853- unsigned int count;
2854- unsigned short gpr[32];
2855- unsigned int value[32];
2856- unsigned int min;
2857- unsigned int max;
2858- unsigned int translation;
2859-};
2860-
2861-struct snd_emu10k1_fx8010_code {
2862- char name[128];
2863-
2864- __EMU10K1_DECLARE_BITMAP(gpr_valid, 0x200); /* bitmask of valid initializers */
2865- __u32 __user *gpr_map; /* initializers */
2866-
2867- unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */
2868- struct snd_emu10k1_fx8010_control_gpr __user *gpr_add_controls; /* GPR controls to add/replace */
2869-
2870- unsigned int gpr_del_control_count; /* count of GPR controls to remove */
2871- struct snd_ctl_elem_id __user *gpr_del_controls; /* IDs of GPR controls to remove */
2872-
2873- unsigned int gpr_list_control_count; /* count of GPR controls to list */
2874- unsigned int gpr_list_control_total; /* total count of GPR controls */
2875- struct snd_emu10k1_fx8010_control_gpr __user *gpr_list_controls; /* listed GPR controls */
2876-
2877- __EMU10K1_DECLARE_BITMAP(tram_valid, 0x100); /* bitmask of valid initializers */
2878- __u32 __user *tram_data_map; /* data initializers */
2879- __u32 __user *tram_addr_map; /* map initializers */
2880-
2881- __EMU10K1_DECLARE_BITMAP(code_valid, 1024); /* bitmask of valid instructions */
2882- __u32 __user *code; /* one instruction - 64 bits */
2883-};
2884-
2885-struct snd_emu10k1_fx8010_tram {
2886- unsigned int address; /* 31.bit == 1 -> external TRAM */
2887- unsigned int size; /* size in samples (4 bytes) */
2888- unsigned int *samples; /* pointer to samples (20-bit) */
2889- /* NULL->clear memory */
2890-};
2891-
2892-struct snd_emu10k1_fx8010_pcm_rec {
2893- unsigned int substream; /* substream number */
2894- unsigned int res1; /* reserved */
2895- unsigned int channels; /* 16-bit channels count, zero = remove this substream */
2896- unsigned int tram_start; /* ring buffer position in TRAM (in samples) */
2897- unsigned int buffer_size; /* count of buffered samples */
2898- unsigned short gpr_size; /* GPR containing size of ringbuffer in samples (host) */
2899- unsigned short gpr_ptr; /* GPR containing current pointer in the ring buffer (host = reset, FX8010) */
2900- unsigned short gpr_count; /* GPR containing count of samples between two interrupts (host) */
2901- unsigned short gpr_tmpcount; /* GPR containing current count of samples to interrupt (host = set, FX8010) */
2902- unsigned short gpr_trigger; /* GPR containing trigger (activate) information (host) */
2903- unsigned short gpr_running; /* GPR containing info if PCM is running (FX8010) */
2904- unsigned char pad; /* reserved */
2905- unsigned char etram[32]; /* external TRAM address & data (one per channel) */
2906- unsigned int res2; /* reserved */
2907-};
2908-
2909-#define SNDRV_EMU10K1_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
2910-
2911-#define SNDRV_EMU10K1_IOCTL_INFO _IOR ('H', 0x10, struct snd_emu10k1_fx8010_info)
2912-#define SNDRV_EMU10K1_IOCTL_CODE_POKE _IOW ('H', 0x11, struct snd_emu10k1_fx8010_code)
2913-#define SNDRV_EMU10K1_IOCTL_CODE_PEEK _IOWR('H', 0x12, struct snd_emu10k1_fx8010_code)
2914-#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP _IOW ('H', 0x20, int)
2915-#define SNDRV_EMU10K1_IOCTL_TRAM_POKE _IOW ('H', 0x21, struct snd_emu10k1_fx8010_tram)
2916-#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK _IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram)
2917-#define SNDRV_EMU10K1_IOCTL_PCM_POKE _IOW ('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec)
2918-#define SNDRV_EMU10K1_IOCTL_PCM_PEEK _IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec)
2919-#define SNDRV_EMU10K1_IOCTL_PVERSION _IOR ('H', 0x40, int)
2920-#define SNDRV_EMU10K1_IOCTL_STOP _IO ('H', 0x80)
2921-#define SNDRV_EMU10K1_IOCTL_CONTINUE _IO ('H', 0x81)
2922-#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO ('H', 0x82)
2923-#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW ('H', 0x83, int)
2924-#define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR ('H', 0x84, int)
2925-
2926-/* typedefs for compatibility to user-space */
2927-typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
2928-typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
2929-typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
2930-typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
2931-typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
2932-
2933-#endif /* _UAPI__SOUND_EMU10K1_H */
2934+#include <alsa/sound/type_compat.h>
2935+#include <alsa/sound/uapi/emu10k1.h>
2936diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h
2937index 5dc0c3db..78fb745b 100644
2938--- a/include/sound/hdsp.h
2939+++ b/include/sound/hdsp.h
2940@@ -1,111 +1,2 @@
2941-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2942-#ifndef __SOUND_HDSP_H
2943-#define __SOUND_HDSP_H
2944-
2945-/*
2946- * Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
2947- *
2948- * This program is free software; you can redistribute it and/or modify
2949- * it under the terms of the GNU General Public License as published by
2950- * the Free Software Foundation; either version 2 of the License, or
2951- * (at your option) any later version.
2952- *
2953- * This program is distributed in the hope that it will be useful,
2954- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2955- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2956- * GNU General Public License for more details.
2957- *
2958- * You should have received a copy of the GNU General Public License
2959- * along with this program; if not, write to the Free Software
2960- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2961- */
2962-
2963-#include <linux/types.h>
2964-
2965-#define HDSP_MATRIX_MIXER_SIZE 2048
2966-
2967-enum HDSP_IO_Type {
2968- Digiface,
2969- Multiface,
2970- H9652,
2971- H9632,
2972- RPM,
2973- Undefined,
2974-};
2975-
2976-struct hdsp_peak_rms {
2977- __u32 input_peaks[26];
2978- __u32 playback_peaks[26];
2979- __u32 output_peaks[28];
2980- __u64 input_rms[26];
2981- __u64 playback_rms[26];
2982- /* These are only used for H96xx cards */
2983- __u64 output_rms[26];
2984-};
2985-
2986-#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms)
2987-
2988-struct hdsp_config_info {
2989- unsigned char pref_sync_ref;
2990- unsigned char wordclock_sync_check;
2991- unsigned char spdif_sync_check;
2992- unsigned char adatsync_sync_check;
2993- unsigned char adat_sync_check[3];
2994- unsigned char spdif_in;
2995- unsigned char spdif_out;
2996- unsigned char spdif_professional;
2997- unsigned char spdif_emphasis;
2998- unsigned char spdif_nonaudio;
2999- unsigned int spdif_sample_rate;
3000- unsigned int system_sample_rate;
3001- unsigned int autosync_sample_rate;
3002- unsigned char system_clock_mode;
3003- unsigned char clock_source;
3004- unsigned char autosync_ref;
3005- unsigned char line_out;
3006- unsigned char passthru;
3007- unsigned char da_gain;
3008- unsigned char ad_gain;
3009- unsigned char phone_gain;
3010- unsigned char xlr_breakout_cable;
3011- unsigned char analog_extension_board;
3012-};
3013-
3014-#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info)
3015-
3016-struct hdsp_firmware {
3017- void __user *firmware_data; /* 24413 x 4 bytes */
3018-};
3019-
3020-#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware)
3021-
3022-struct hdsp_version {
3023- enum HDSP_IO_Type io_type;
3024- unsigned short firmware_rev;
3025-};
3026-
3027-#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version)
3028-
3029-struct hdsp_mixer {
3030- unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
3031-};
3032-
3033-#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer)
3034-
3035-struct hdsp_9632_aeb {
3036- int aebi;
3037- int aebo;
3038-};
3039-
3040-#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
3041-
3042-/* typedefs for compatibility to user-space */
3043-typedef enum HDSP_IO_Type HDSP_IO_Type;
3044-typedef struct hdsp_peak_rms hdsp_peak_rms_t;
3045-typedef struct hdsp_config_info hdsp_config_info_t;
3046-typedef struct hdsp_firmware hdsp_firmware_t;
3047-typedef struct hdsp_version hdsp_version_t;
3048-typedef struct hdsp_mixer hdsp_mixer_t;
3049-typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
3050-
3051-#endif /* __SOUND_HDSP_H */
3052+#include <alsa/sound/type_compat.h>
3053+#include <alsa/sound/uapi/hdsp.h>
3054diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h
3055index a38f3f79..af6d19ed 100644
3056--- a/include/sound/hdspm.h
3057+++ b/include/sound/hdspm.h
3058@@ -1,232 +1,2 @@
3059-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
3060-#ifndef __SOUND_HDSPM_H
3061-#define __SOUND_HDSPM_H
3062-/*
3063- * Copyright (C) 2003 Winfried Ritsch (IEM)
3064- * based on hdsp.h from Thomas Charbonnel (thomas@undata.org)
3065- *
3066- *
3067- * This program is free software; you can redistribute it and/or modify
3068- * it under the terms of the GNU General Public License as published by
3069- * the Free Software Foundation; either version 2 of the License, or
3070- * (at your option) any later version.
3071- *
3072- * This program is distributed in the hope that it will be useful,
3073- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3074- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3075- * GNU General Public License for more details.
3076- *
3077- * You should have received a copy of the GNU General Public License
3078- * along with this program; if not, write to the Free Software
3079- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3080- */
3081-
3082-#include <linux/types.h>
3083-
3084-/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
3085-#define HDSPM_MAX_CHANNELS 64
3086-
3087-enum hdspm_io_type {
3088- MADI,
3089- MADIface,
3090- AIO,
3091- AES32,
3092- RayDAT
3093-};
3094-
3095-enum hdspm_speed {
3096- ss,
3097- ds,
3098- qs
3099-};
3100-
3101-/* -------------------- IOCTL Peak/RMS Meters -------------------- */
3102-
3103-struct hdspm_peak_rms {
3104- __u32 input_peaks[64];
3105- __u32 playback_peaks[64];
3106- __u32 output_peaks[64];
3107-
3108- __u64 input_rms[64];
3109- __u64 playback_rms[64];
3110- __u64 output_rms[64];
3111-
3112- __u8 speed; /* enum {ss, ds, qs} */
3113- int status2;
3114-};
3115-
3116-#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
3117- _IOR('H', 0x42, struct hdspm_peak_rms)
3118-
3119-/* ------------ CONFIG block IOCTL ---------------------- */
3120-
3121-struct hdspm_config {
3122- unsigned char pref_sync_ref;
3123- unsigned char wordclock_sync_check;
3124- unsigned char madi_sync_check;
3125- unsigned int system_sample_rate;
3126- unsigned int autosync_sample_rate;
3127- unsigned char system_clock_mode;
3128- unsigned char clock_source;
3129- unsigned char autosync_ref;
3130- unsigned char line_out;
3131- unsigned int passthru;
3132- unsigned int analog_out;
3133-};
3134-
3135-#define SNDRV_HDSPM_IOCTL_GET_CONFIG \
3136- _IOR('H', 0x41, struct hdspm_config)
3137-
3138-/*
3139- * If there's a TCO (TimeCode Option) board installed,
3140- * there are further options and status data available.
3141- * The hdspm_ltc structure contains the current SMPTE
3142- * timecode and some status information and can be
3143- * obtained via SNDRV_HDSPM_IOCTL_GET_LTC or in the
3144- * hdspm_status struct.
3145- */
3146-
3147-enum hdspm_ltc_format {
3148- format_invalid,
3149- fps_24,
3150- fps_25,
3151- fps_2997,
3152- fps_30
3153-};
3154-
3155-enum hdspm_ltc_frame {
3156- frame_invalid,
3157- drop_frame,
3158- full_frame
3159-};
3160-
3161-enum hdspm_ltc_input_format {
3162- ntsc,
3163- pal,
3164- no_video
3165-};
3166-
3167-struct hdspm_ltc {
3168- unsigned int ltc;
3169-
3170- enum hdspm_ltc_format format;
3171- enum hdspm_ltc_frame frame;
3172- enum hdspm_ltc_input_format input_format;
3173-};
3174-
3175-#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
3176-
3177-/*
3178- * The status data reflects the device's current state
3179- * as determined by the card's configuration and
3180- * connection status.
3181- */
3182-
3183-enum hdspm_sync {
3184- hdspm_sync_no_lock = 0,
3185- hdspm_sync_lock = 1,
3186- hdspm_sync_sync = 2
3187-};
3188-
3189-enum hdspm_madi_input {
3190- hdspm_input_optical = 0,
3191- hdspm_input_coax = 1
3192-};
3193-
3194-enum hdspm_madi_channel_format {
3195- hdspm_format_ch_64 = 0,
3196- hdspm_format_ch_56 = 1
3197-};
3198-
3199-enum hdspm_madi_frame_format {
3200- hdspm_frame_48 = 0,
3201- hdspm_frame_96 = 1
3202-};
3203-
3204-enum hdspm_syncsource {
3205- syncsource_wc = 0,
3206- syncsource_madi = 1,
3207- syncsource_tco = 2,
3208- syncsource_sync = 3,
3209- syncsource_none = 4
3210-};
3211-
3212-struct hdspm_status {
3213- __u8 card_type; /* enum hdspm_io_type */
3214- enum hdspm_syncsource autosync_source;
3215-
3216- __u64 card_clock;
3217- __u32 master_period;
3218-
3219- union {
3220- struct {
3221- __u8 sync_wc; /* enum hdspm_sync */
3222- __u8 sync_madi; /* enum hdspm_sync */
3223- __u8 sync_tco; /* enum hdspm_sync */
3224- __u8 sync_in; /* enum hdspm_sync */
3225- __u8 madi_input; /* enum hdspm_madi_input */
3226- __u8 channel_format; /* enum hdspm_madi_channel_format */
3227- __u8 frame_format; /* enum hdspm_madi_frame_format */
3228- } madi;
3229- } card_specific;
3230-};
3231-
3232-#define SNDRV_HDSPM_IOCTL_GET_STATUS \
3233- _IOR('H', 0x47, struct hdspm_status)
3234-
3235-/*
3236- * Get information about the card and its add-ons.
3237- */
3238-
3239-#define HDSPM_ADDON_TCO 1
3240-
3241-struct hdspm_version {
3242- __u8 card_type; /* enum hdspm_io_type */
3243- char cardname[20];
3244- unsigned int serial;
3245- unsigned short firmware_rev;
3246- int addons;
3247-};
3248-
3249-#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version)
3250-
3251-/* ------------- get Matrix Mixer IOCTL --------------- */
3252-
3253-/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
3254- * 32768 Bytes
3255- */
3256-
3257-/* organisation is 64 channelfader in a continuous memory block */
3258-/* equivalent to hardware definition, maybe for future feature of mmap of
3259- * them
3260- */
3261-/* each of 64 outputs has 64 infader and 64 outfader:
3262- Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
3263-
3264-#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
3265-
3266-struct hdspm_channelfader {
3267- unsigned int in[HDSPM_MIXER_CHANNELS];
3268- unsigned int pb[HDSPM_MIXER_CHANNELS];
3269-};
3270-
3271-struct hdspm_mixer {
3272- struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
3273-};
3274-
3275-struct hdspm_mixer_ioctl {
3276- struct hdspm_mixer *mixer;
3277-};
3278-
3279-/* use indirect access due to the limit of ioctl bit size */
3280-#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
3281-
3282-/* typedefs for compatibility to user-space */
3283-typedef struct hdspm_peak_rms hdspm_peak_rms_t;
3284-typedef struct hdspm_config_info hdspm_config_info_t;
3285-typedef struct hdspm_version hdspm_version_t;
3286-typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
3287-typedef struct hdspm_mixer hdspm_mixer_t;
3288-
3289-
3290-#endif
3291+#include <alsa/sound/type_compat.h>
3292+#include <alsa/sound/uapi/hdspm.h>
3293diff --git a/include/sound/sb16_csp.h b/include/sound/sb16_csp.h
3294index e6485148..24121fcb 100644
3295--- a/include/sound/sb16_csp.h
3296+++ b/include/sound/sb16_csp.h
3297@@ -1,123 +1 @@
3298-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
3299-/*
3300- * Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
3301- * Takashi Iwai <tiwai@suse.de>
3302- *
3303- * SB16ASP/AWE32 CSP control
3304- *
3305- * This program is free software; you can redistribute it and/or modify
3306- * it under the terms of the GNU General Public License as published by
3307- * the Free Software Foundation; either version 2 of the License, or
3308- * (at your option) any later version.
3309- *
3310- * This program is distributed in the hope that it will be useful,
3311- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3312- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3313- * GNU General Public License for more details.
3314- *
3315- * You should have received a copy of the GNU General Public License
3316- * along with this program; if not, write to the Free Software
3317- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3318- *
3319- */
3320-#ifndef _UAPI__SOUND_SB16_CSP_H
3321-#define _UAPI__SOUND_SB16_CSP_H
3322-
3323-
3324-/* CSP modes */
3325-#define SNDRV_SB_CSP_MODE_NONE 0x00
3326-#define SNDRV_SB_CSP_MODE_DSP_READ 0x01 /* Record from DSP */
3327-#define SNDRV_SB_CSP_MODE_DSP_WRITE 0x02 /* Play to DSP */
3328-#define SNDRV_SB_CSP_MODE_QSOUND 0x04 /* QSound */
3329-
3330-/* CSP load flags */
3331-#define SNDRV_SB_CSP_LOAD_FROMUSER 0x01
3332-#define SNDRV_SB_CSP_LOAD_INITBLOCK 0x02
3333-
3334-/* CSP sample width */
3335-#define SNDRV_SB_CSP_SAMPLE_8BIT 0x01
3336-#define SNDRV_SB_CSP_SAMPLE_16BIT 0x02
3337-
3338-/* CSP channels */
3339-#define SNDRV_SB_CSP_MONO 0x01
3340-#define SNDRV_SB_CSP_STEREO 0x02
3341-
3342-/* CSP rates */
3343-#define SNDRV_SB_CSP_RATE_8000 0x01
3344-#define SNDRV_SB_CSP_RATE_11025 0x02
3345-#define SNDRV_SB_CSP_RATE_22050 0x04
3346-#define SNDRV_SB_CSP_RATE_44100 0x08
3347-#define SNDRV_SB_CSP_RATE_ALL 0x0f
3348-
3349-/* CSP running state */
3350-#define SNDRV_SB_CSP_ST_IDLE 0x00
3351-#define SNDRV_SB_CSP_ST_LOADED 0x01
3352-#define SNDRV_SB_CSP_ST_RUNNING 0x02
3353-#define SNDRV_SB_CSP_ST_PAUSED 0x04
3354-#define SNDRV_SB_CSP_ST_AUTO 0x08
3355-#define SNDRV_SB_CSP_ST_QSOUND 0x10
3356-
3357-/* maximum QSound value (180 degrees right) */
3358-#define SNDRV_SB_CSP_QSOUND_MAX_RIGHT 0x20
3359-
3360-/* maximum microcode RIFF file size */
3361-#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE 0x3000
3362-
3363-/* microcode header */
3364-struct snd_sb_csp_mc_header {
3365- char codec_name[16]; /* id name of codec */
3366- unsigned short func_req; /* requested function */
3367-};
3368-
3369-/* microcode to be loaded */
3370-struct snd_sb_csp_microcode {
3371- struct snd_sb_csp_mc_header info;
3372- unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE];
3373-};
3374-
3375-/* start CSP with sample_width in mono/stereo */
3376-struct snd_sb_csp_start {
3377- int sample_width; /* sample width, look above */
3378- int channels; /* channels, look above */
3379-};
3380-
3381-/* CSP information */
3382-struct snd_sb_csp_info {
3383- char codec_name[16]; /* id name of codec */
3384- unsigned short func_nr; /* function number */
3385- unsigned int acc_format; /* accepted PCM formats */
3386- unsigned short acc_channels; /* accepted channels */
3387- unsigned short acc_width; /* accepted sample width */
3388- unsigned short acc_rates; /* accepted sample rates */
3389- unsigned short csp_mode; /* CSP mode, see above */
3390- unsigned short run_channels; /* current channels */
3391- unsigned short run_width; /* current sample width */
3392- unsigned short version; /* version id: 0x10 - 0x1f */
3393- unsigned short state; /* state bits */
3394-};
3395-
3396-/* HWDEP controls */
3397-/* get CSP information */
3398-#define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, struct snd_sb_csp_info)
3399-/* load microcode to CSP */
3400-/* NOTE: struct snd_sb_csp_microcode overflows the max size (13 bits)
3401- * defined for some architectures like MIPS, and it leads to build errors.
3402- * (x86 and co have 14-bit size, thus it's valid, though.)
3403- * As a workaround for skipping the size-limit check, here we don't use the
3404- * normal _IOW() macro but _IOC() with the manual argument.
3405- */
3406-#define SNDRV_SB_CSP_IOCTL_LOAD_CODE \
3407- _IOC(_IOC_WRITE, 'H', 0x11, sizeof(struct snd_sb_csp_microcode))
3408-/* unload microcode from CSP */
3409-#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE _IO('H', 0x12)
3410-/* start CSP */
3411-#define SNDRV_SB_CSP_IOCTL_START _IOW('H', 0x13, struct snd_sb_csp_start)
3412-/* stop CSP */
3413-#define SNDRV_SB_CSP_IOCTL_STOP _IO('H', 0x14)
3414-/* pause CSP and DMA transfer */
3415-#define SNDRV_SB_CSP_IOCTL_PAUSE _IO('H', 0x15)
3416-/* restart CSP and DMA transfer */
3417-#define SNDRV_SB_CSP_IOCTL_RESTART _IO('H', 0x16)
3418-
3419-
3420-#endif /* _UAPI__SOUND_SB16_CSP_H */
3421+#include <alsa/sound/uapi/sb16_csp.h>
3422diff --git a/include/sound/sscape_ioctl.h b/include/sound/sscape_ioctl.h
3423index c6653ebf..23b48d33 100644
3424--- a/include/sound/sscape_ioctl.h
3425+++ b/include/sound/sscape_ioctl.h
3426@@ -1,21 +1 @@
3427-#ifndef SSCAPE_IOCTL_H
3428-#define SSCAPE_IOCTL_H
3429-
3430-
3431-struct sscape_bootblock
3432-{
3433- unsigned char code[256];
3434- unsigned version;
3435-};
3436-
3437-#define SSCAPE_MICROCODE_SIZE 65536
3438-
3439-struct sscape_microcode
3440-{
3441- unsigned char *code;
3442-};
3443-
3444-#define SND_SSCAPE_LOAD_BOOTB _IOWR('P', 100, struct sscape_bootblock)
3445-#define SND_SSCAPE_LOAD_MCODE _IOW ('P', 101, struct sscape_microcode)
3446-
3447-#endif
3448+#include <alsa/sound/uapi/sscape_ioctl.h>
3449diff --git a/include/sound/tlv.h b/include/sound/tlv.h
3450index 7d6d65f6..e435a5fc 100644
3451--- a/include/sound/tlv.h
3452+++ b/include/sound/tlv.h
3453@@ -1,117 +1 @@
3454-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
3455-/*
3456- * This program is free software; you can redistribute it and/or modify
3457- * it under the terms of the GNU General Public License as published by
3458- * the Free Software Foundation; either version 2 of the License, or
3459- * (at your option) any later version.
3460- *
3461- * This program is distributed in the hope that it will be useful,
3462- * but WITHOUT ANY WARRANTY; without even the implied warranty of
3463- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3464- * GNU General Public License for more details.
3465- */
3466-
3467-#ifndef __UAPI_SOUND_TLV_H
3468-#define __UAPI_SOUND_TLV_H
3469-
3470-#define SNDRV_CTL_TLVT_CONTAINER 0 /* one level down - group of TLVs */
3471-#define SNDRV_CTL_TLVT_DB_SCALE 1 /* dB scale */
3472-#define SNDRV_CTL_TLVT_DB_LINEAR 2 /* linear volume */
3473-#define SNDRV_CTL_TLVT_DB_RANGE 3 /* dB range container */
3474-#define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */
3475-#define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */
3476-
3477-/*
3478- * channel-mapping TLV items
3479- * TLV length must match with num_channels
3480- */
3481-#define SNDRV_CTL_TLVT_CHMAP_FIXED 0x101 /* fixed channel position */
3482-#define SNDRV_CTL_TLVT_CHMAP_VAR 0x102 /* channels freely swappable */
3483-#define SNDRV_CTL_TLVT_CHMAP_PAIRED 0x103 /* pair-wise swappable */
3484-
3485-/*
3486- * TLV structure is right behind the struct snd_ctl_tlv:
3487- * unsigned int type - see SNDRV_CTL_TLVT_*
3488- * unsigned int length
3489- * .... data aligned to sizeof(unsigned int), use
3490- * block_length = (length + (sizeof(unsigned int) - 1)) &
3491- * ~(sizeof(unsigned int) - 1)) ....
3492- */
3493-#define SNDRV_CTL_TLVD_ITEM(type, ...) \
3494- (type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__
3495-#define SNDRV_CTL_TLVD_LENGTH(...) \
3496- ((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
3497-
3498-/* Accessor offsets for TLV data items */
3499-#define SNDRV_CTL_TLVO_TYPE 0
3500-#define SNDRV_CTL_TLVO_LEN 1
3501-
3502-#define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \
3503- SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
3504-#define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \
3505- unsigned int name[] = { \
3506- SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \
3507- }
3508-
3509-#define SNDRV_CTL_TLVD_DB_SCALE_MASK 0xffff
3510-#define SNDRV_CTL_TLVD_DB_SCALE_MUTE 0x10000
3511-#define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
3512- SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \
3513- (min), \
3514- ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \
3515- ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0))
3516-#define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \
3517- unsigned int name[] = { \
3518- SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
3519- }
3520-
3521-/* Accessor offsets for min, mute and step items in dB scale type TLV */
3522-#define SNDRV_CTL_TLVO_DB_SCALE_MIN 2
3523-#define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP 3
3524-
3525-/* dB scale specified with min/max values instead of step */
3526-#define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
3527- SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
3528-#define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
3529- SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
3530-#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \
3531- unsigned int name[] = { \
3532- SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
3533- }
3534-#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \
3535- unsigned int name[] = { \
3536- SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
3537- }
3538-
3539-/* Accessor offsets for min, max items in db-minmax types of TLV. */
3540-#define SNDRV_CTL_TLVO_DB_MINMAX_MIN 2
3541-#define SNDRV_CTL_TLVO_DB_MINMAX_MAX 3
3542-
3543-/* linear volume between min_dB and max_dB (.01dB unit) */
3544-#define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
3545- SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
3546-#define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \
3547- unsigned int name[] = { \
3548- SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
3549- }
3550-
3551-/* Accessor offsets for min, max items in db-linear type of TLV. */
3552-#define SNDRV_CTL_TLVO_DB_LINEAR_MIN 2
3553-#define SNDRV_CTL_TLVO_DB_LINEAR_MAX 3
3554-
3555-/* dB range container:
3556- * Items in dB range container must be ordered by their values and by their
3557- * dB values. This implies that larger values must correspond with larger
3558- * dB values (which is also required for all other mixer controls).
3559- */
3560-/* Each item is: <min> <max> <TLV> */
3561-#define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \
3562- SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
3563-#define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \
3564- unsigned int name[] = { \
3565- SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \
3566- }
3567-
3568-#define SNDRV_CTL_TLVD_DB_GAIN_MUTE -9999999
3569-
3570-#endif
3571+#include <alsa/sound/uapi/tlv.h>
3572diff --git a/include/sound/type_compat.h b/include/sound/type_compat.h
3573index e973ff31..d4790c1f 100644
3574--- a/include/sound/type_compat.h
3575+++ b/include/sound/type_compat.h
3576@@ -3,6 +3,9 @@
3577
3578 #ifndef DOC_HIDDEN
3579 #include <stdint.h>
3580+#ifdef __linux__
3581+#include <linux/types.h>
3582+#else
3583 typedef uint8_t __u8;
3584 typedef uint16_t __u16;
3585 typedef uint32_t __u32;
3586@@ -37,6 +40,16 @@ typedef int32_t __s32;
3587 #define __be32 __u32
3588 #define __be16 __u16
3589 #define __be8 __u8
3590+#endif
3591+
3592+#ifndef __user
3593+#define __user
3594+#endif
3595+
3596+#ifndef __packed
3597+#define __packed __attribute__((__packed__))
3598+#endif
3599+
3600 #endif /* DOC_HIDDEN */
3601
3602 #endif /* __TYPE_COMPAT_H */
3603diff --git a/include/sound/uapi/Makefile.am b/include/sound/uapi/Makefile.am
3604new file mode 100644
3605index 00000000..99197108
3606--- /dev/null
3607+++ b/include/sound/uapi/Makefile.am
3608@@ -0,0 +1,6 @@
3609+alsasounduapiincludedir = ${includedir}/alsa/sound/uapi
3610+
3611+alsasounduapiinclude_HEADERS = asound_fm.h hdsp.h hdspm.h sb16_csp.h \
3612+ sscape_ioctl.h emu10k1.h asoc.h tlv.h
3613+
3614+noinst_HEADERS = asound.h asequencer.h
3615diff --git a/include/sound/uapi/asequencer.h b/include/sound/uapi/asequencer.h
3616new file mode 100644
3617index 00000000..a75e14ed
3618--- /dev/null
3619+++ b/include/sound/uapi/asequencer.h
3620@@ -0,0 +1,612 @@
3621+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
3622+/*
3623+ * Main header file for the ALSA sequencer
3624+ * Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
3625+ * (c) 1998-1999 by Jaroslav Kysela <perex@perex.cz>
3626+ *
3627+ *
3628+ * This program is free software; you can redistribute it and/or modify
3629+ * it under the terms of the GNU General Public License as published by
3630+ * the Free Software Foundation; either version 2 of the License, or
3631+ * (at your option) any later version.
3632+ *
3633+ * This program is distributed in the hope that it will be useful,
3634+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3635+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3636+ * GNU General Public License for more details.
3637+ *
3638+ * You should have received a copy of the GNU General Public License
3639+ * along with this program; if not, write to the Free Software
3640+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3641+ *
3642+ */
3643+#ifndef _UAPI__SOUND_ASEQUENCER_H
3644+#define _UAPI__SOUND_ASEQUENCER_H
3645+
3646+#include <sound/asound.h>
3647+
3648+/** version of the sequencer */
3649+#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 2)
3650+
3651+/**
3652+ * definition of sequencer event types
3653+ */
3654+
3655+/** system messages
3656+ * event data type = #snd_seq_result
3657+ */
3658+#define SNDRV_SEQ_EVENT_SYSTEM 0
3659+#define SNDRV_SEQ_EVENT_RESULT 1
3660+
3661+/** note messages (channel specific)
3662+ * event data type = #snd_seq_ev_note
3663+ */
3664+#define SNDRV_SEQ_EVENT_NOTE 5
3665+#define SNDRV_SEQ_EVENT_NOTEON 6
3666+#define SNDRV_SEQ_EVENT_NOTEOFF 7
3667+#define SNDRV_SEQ_EVENT_KEYPRESS 8
3668+
3669+/** control messages (channel specific)
3670+ * event data type = #snd_seq_ev_ctrl
3671+ */
3672+#define SNDRV_SEQ_EVENT_CONTROLLER 10
3673+#define SNDRV_SEQ_EVENT_PGMCHANGE 11
3674+#define SNDRV_SEQ_EVENT_CHANPRESS 12
3675+#define SNDRV_SEQ_EVENT_PITCHBEND 13 /**< from -8192 to 8191 */
3676+#define SNDRV_SEQ_EVENT_CONTROL14 14 /**< 14 bit controller value */
3677+#define SNDRV_SEQ_EVENT_NONREGPARAM 15 /**< 14 bit NRPN address + 14 bit unsigned value */
3678+#define SNDRV_SEQ_EVENT_REGPARAM 16 /**< 14 bit RPN address + 14 bit unsigned value */
3679+
3680+/** synchronisation messages
3681+ * event data type = #snd_seq_ev_ctrl
3682+ */
3683+#define SNDRV_SEQ_EVENT_SONGPOS 20 /* Song Position Pointer with LSB and MSB values */
3684+#define SNDRV_SEQ_EVENT_SONGSEL 21 /* Song Select with song ID number */
3685+#define SNDRV_SEQ_EVENT_QFRAME 22 /* midi time code quarter frame */
3686+#define SNDRV_SEQ_EVENT_TIMESIGN 23 /* SMF Time Signature event */
3687+#define SNDRV_SEQ_EVENT_KEYSIGN 24 /* SMF Key Signature event */
3688+
3689+/** timer messages
3690+ * event data type = snd_seq_ev_queue_control
3691+ */
3692+#define SNDRV_SEQ_EVENT_START 30 /* midi Real Time Start message */
3693+#define SNDRV_SEQ_EVENT_CONTINUE 31 /* midi Real Time Continue message */
3694+#define SNDRV_SEQ_EVENT_STOP 32 /* midi Real Time Stop message */
3695+#define SNDRV_SEQ_EVENT_SETPOS_TICK 33 /* set tick queue position */
3696+#define SNDRV_SEQ_EVENT_SETPOS_TIME 34 /* set realtime queue position */
3697+#define SNDRV_SEQ_EVENT_TEMPO 35 /* (SMF) Tempo event */
3698+#define SNDRV_SEQ_EVENT_CLOCK 36 /* midi Real Time Clock message */
3699+#define SNDRV_SEQ_EVENT_TICK 37 /* midi Real Time Tick message */
3700+#define SNDRV_SEQ_EVENT_QUEUE_SKEW 38 /* skew queue tempo */
3701+
3702+/** others
3703+ * event data type = none
3704+ */
3705+#define SNDRV_SEQ_EVENT_TUNE_REQUEST 40 /* tune request */
3706+#define SNDRV_SEQ_EVENT_RESET 41 /* reset to power-on state */
3707+#define SNDRV_SEQ_EVENT_SENSING 42 /* "active sensing" event */
3708+
3709+/** echo back, kernel private messages
3710+ * event data type = any type
3711+ */
3712+#define SNDRV_SEQ_EVENT_ECHO 50 /* echo event */
3713+#define SNDRV_SEQ_EVENT_OSS 51 /* OSS raw event */
3714+
3715+/** system status messages (broadcast for subscribers)
3716+ * event data type = snd_seq_addr
3717+ */
3718+#define SNDRV_SEQ_EVENT_CLIENT_START 60 /* new client has connected */
3719+#define SNDRV_SEQ_EVENT_CLIENT_EXIT 61 /* client has left the system */
3720+#define SNDRV_SEQ_EVENT_CLIENT_CHANGE 62 /* client status/info has changed */
3721+#define SNDRV_SEQ_EVENT_PORT_START 63 /* new port was created */
3722+#define SNDRV_SEQ_EVENT_PORT_EXIT 64 /* port was deleted from system */
3723+#define SNDRV_SEQ_EVENT_PORT_CHANGE 65 /* port status/info has changed */
3724+
3725+/** port connection changes
3726+ * event data type = snd_seq_connect
3727+ */
3728+#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED 66 /* ports connected */
3729+#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67 /* ports disconnected */
3730+
3731+/* 70-89: synthesizer events - obsoleted */
3732+
3733+/** user-defined events with fixed length
3734+ * event data type = any
3735+ */
3736+#define SNDRV_SEQ_EVENT_USR0 90
3737+#define SNDRV_SEQ_EVENT_USR1 91
3738+#define SNDRV_SEQ_EVENT_USR2 92
3739+#define SNDRV_SEQ_EVENT_USR3 93
3740+#define SNDRV_SEQ_EVENT_USR4 94
3741+#define SNDRV_SEQ_EVENT_USR5 95
3742+#define SNDRV_SEQ_EVENT_USR6 96
3743+#define SNDRV_SEQ_EVENT_USR7 97
3744+#define SNDRV_SEQ_EVENT_USR8 98
3745+#define SNDRV_SEQ_EVENT_USR9 99
3746+
3747+/* 100-118: instrument layer - obsoleted */
3748+/* 119-129: reserved */
3749+
3750+/* 130-139: variable length events
3751+ * event data type = snd_seq_ev_ext
3752+ * (SNDRV_SEQ_EVENT_LENGTH_VARIABLE must be set)
3753+ */
3754+#define SNDRV_SEQ_EVENT_SYSEX 130 /* system exclusive data (variable length) */
3755+#define SNDRV_SEQ_EVENT_BOUNCE 131 /* error event */
3756+/* 132-134: reserved */
3757+#define SNDRV_SEQ_EVENT_USR_VAR0 135
3758+#define SNDRV_SEQ_EVENT_USR_VAR1 136
3759+#define SNDRV_SEQ_EVENT_USR_VAR2 137
3760+#define SNDRV_SEQ_EVENT_USR_VAR3 138
3761+#define SNDRV_SEQ_EVENT_USR_VAR4 139
3762+
3763+/* 150-151: kernel events with quote - DO NOT use in user clients */
3764+#define SNDRV_SEQ_EVENT_KERNEL_ERROR 150
3765+#define SNDRV_SEQ_EVENT_KERNEL_QUOTE 151 /* obsolete */
3766+
3767+/* 152-191: reserved */
3768+
3769+/* 192-254: hardware specific events */
3770+
3771+/* 255: special event */
3772+#define SNDRV_SEQ_EVENT_NONE 255
3773+
3774+
3775+typedef unsigned char snd_seq_event_type_t;
3776+
3777+/** event address */
3778+struct snd_seq_addr {
3779+ unsigned char client; /**< Client number: 0..255, 255 = broadcast to all clients */
3780+ unsigned char port; /**< Port within client: 0..255, 255 = broadcast to all ports */
3781+};
3782+
3783+/** port connection */
3784+struct snd_seq_connect {
3785+ struct snd_seq_addr sender;
3786+ struct snd_seq_addr dest;
3787+};
3788+
3789+
3790+#define SNDRV_SEQ_ADDRESS_UNKNOWN 253 /* unknown source */
3791+#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS 254 /* send event to all subscribed ports */
3792+#define SNDRV_SEQ_ADDRESS_BROADCAST 255 /* send event to all queues/clients/ports/channels */
3793+#define SNDRV_SEQ_QUEUE_DIRECT 253 /* direct dispatch */
3794+
3795+ /* event mode flag - NOTE: only 8 bits available! */
3796+#define SNDRV_SEQ_TIME_STAMP_TICK (0<<0) /* timestamp in clock ticks */
3797+#define SNDRV_SEQ_TIME_STAMP_REAL (1<<0) /* timestamp in real time */
3798+#define SNDRV_SEQ_TIME_STAMP_MASK (1<<0)
3799+
3800+#define SNDRV_SEQ_TIME_MODE_ABS (0<<1) /* absolute timestamp */
3801+#define SNDRV_SEQ_TIME_MODE_REL (1<<1) /* relative to current time */
3802+#define SNDRV_SEQ_TIME_MODE_MASK (1<<1)
3803+
3804+#define SNDRV_SEQ_EVENT_LENGTH_FIXED (0<<2) /* fixed event size */
3805+#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE (1<<2) /* variable event size */
3806+#define SNDRV_SEQ_EVENT_LENGTH_VARUSR (2<<2) /* variable event size - user memory space */
3807+#define SNDRV_SEQ_EVENT_LENGTH_MASK (3<<2)
3808+
3809+#define SNDRV_SEQ_PRIORITY_NORMAL (0<<4) /* normal priority */
3810+#define SNDRV_SEQ_PRIORITY_HIGH (1<<4) /* event should be processed before others */
3811+#define SNDRV_SEQ_PRIORITY_MASK (1<<4)
3812+
3813+
3814+ /* note event */
3815+struct snd_seq_ev_note {
3816+ unsigned char channel;
3817+ unsigned char note;
3818+ unsigned char velocity;
3819+ unsigned char off_velocity; /* only for SNDRV_SEQ_EVENT_NOTE */
3820+ unsigned int duration; /* only for SNDRV_SEQ_EVENT_NOTE */
3821+};
3822+
3823+ /* controller event */
3824+struct snd_seq_ev_ctrl {
3825+ unsigned char channel;
3826+ unsigned char unused1, unused2, unused3; /* pad */
3827+ unsigned int param;
3828+ signed int value;
3829+};
3830+
3831+ /* generic set of bytes (12x8 bit) */
3832+struct snd_seq_ev_raw8 {
3833+ unsigned char d[12]; /* 8 bit value */
3834+};
3835+
3836+ /* generic set of integers (3x32 bit) */
3837+struct snd_seq_ev_raw32 {
3838+ unsigned int d[3]; /* 32 bit value */
3839+};
3840+
3841+ /* external stored data */
3842+struct snd_seq_ev_ext {
3843+ unsigned int len; /* length of data */
3844+ void *ptr; /* pointer to data (note: maybe 64-bit) */
3845+} __attribute__((packed));
3846+
3847+struct snd_seq_result {
3848+ int event; /* processed event type */
3849+ int result;
3850+};
3851+
3852+
3853+struct snd_seq_real_time {
3854+ unsigned int tv_sec; /* seconds */
3855+ unsigned int tv_nsec; /* nanoseconds */
3856+};
3857+
3858+typedef unsigned int snd_seq_tick_time_t; /* midi ticks */
3859+
3860+union snd_seq_timestamp {
3861+ snd_seq_tick_time_t tick;
3862+ struct snd_seq_real_time time;
3863+};
3864+
3865+struct snd_seq_queue_skew {
3866+ unsigned int value;
3867+ unsigned int base;
3868+};
3869+
3870+ /* queue timer control */
3871+struct snd_seq_ev_queue_control {
3872+ unsigned char queue; /* affected queue */
3873+ unsigned char pad[3]; /* reserved */
3874+ union {
3875+ signed int value; /* affected value (e.g. tempo) */
3876+ union snd_seq_timestamp time; /* time */
3877+ unsigned int position; /* sync position */
3878+ struct snd_seq_queue_skew skew;
3879+ unsigned int d32[2];
3880+ unsigned char d8[8];
3881+ } param;
3882+};
3883+
3884+ /* quoted event - inside the kernel only */
3885+struct snd_seq_ev_quote {
3886+ struct snd_seq_addr origin; /* original sender */
3887+ unsigned short value; /* optional data */
3888+ struct snd_seq_event *event; /* quoted event */
3889+} __attribute__((packed));
3890+
3891+
3892+ /* sequencer event */
3893+struct snd_seq_event {
3894+ snd_seq_event_type_t type; /* event type */
3895+ unsigned char flags; /* event flags */
3896+ char tag;
3897+
3898+ unsigned char queue; /* schedule queue */
3899+ union snd_seq_timestamp time; /* schedule time */
3900+
3901+
3902+ struct snd_seq_addr source; /* source address */
3903+ struct snd_seq_addr dest; /* destination address */
3904+
3905+ union { /* event data... */
3906+ struct snd_seq_ev_note note;
3907+ struct snd_seq_ev_ctrl control;
3908+ struct snd_seq_ev_raw8 raw8;
3909+ struct snd_seq_ev_raw32 raw32;
3910+ struct snd_seq_ev_ext ext;
3911+ struct snd_seq_ev_queue_control queue;
3912+ union snd_seq_timestamp time;
3913+ struct snd_seq_addr addr;
3914+ struct snd_seq_connect connect;
3915+ struct snd_seq_result result;
3916+ struct snd_seq_ev_quote quote;
3917+ } data;
3918+};
3919+
3920+
3921+/*
3922+ * bounce event - stored as variable size data
3923+ */
3924+struct snd_seq_event_bounce {
3925+ int err;
3926+ struct snd_seq_event event;
3927+ /* external data follows here. */
3928+};
3929+
3930+
3931+ /* system information */
3932+struct snd_seq_system_info {
3933+ int queues; /* maximum queues count */
3934+ int clients; /* maximum clients count */
3935+ int ports; /* maximum ports per client */
3936+ int channels; /* maximum channels per port */
3937+ int cur_clients; /* current clients */
3938+ int cur_queues; /* current queues */
3939+ char reserved[24];
3940+};
3941+
3942+
3943+ /* system running information */
3944+struct snd_seq_running_info {
3945+ unsigned char client; /* client id */
3946+ unsigned char big_endian; /* 1 = big-endian */
3947+ unsigned char cpu_mode; /* 4 = 32bit, 8 = 64bit */
3948+ unsigned char pad; /* reserved */
3949+ unsigned char reserved[12];
3950+};
3951+
3952+
3953+ /* known client numbers */
3954+#define SNDRV_SEQ_CLIENT_SYSTEM 0
3955+ /* internal client numbers */
3956+#define SNDRV_SEQ_CLIENT_DUMMY 14 /* midi through */
3957+#define SNDRV_SEQ_CLIENT_OSS 15 /* oss sequencer emulator */
3958+
3959+
3960+ /* client types */
3961+typedef int __bitwise snd_seq_client_type_t;
3962+#define NO_CLIENT ((__force snd_seq_client_type_t) 0)
3963+#define USER_CLIENT ((__force snd_seq_client_type_t) 1)
3964+#define KERNEL_CLIENT ((__force snd_seq_client_type_t) 2)
3965+
3966+ /* event filter flags */
3967+#define SNDRV_SEQ_FILTER_BROADCAST (1<<0) /* accept broadcast messages */
3968+#define SNDRV_SEQ_FILTER_MULTICAST (1<<1) /* accept multicast messages */
3969+#define SNDRV_SEQ_FILTER_BOUNCE (1<<2) /* accept bounce event in error */
3970+#define SNDRV_SEQ_FILTER_USE_EVENT (1<<31) /* use event filter */
3971+
3972+struct snd_seq_client_info {
3973+ int client; /* client number to inquire */
3974+ snd_seq_client_type_t type; /* client type */
3975+ char name[64]; /* client name */
3976+ unsigned int filter; /* filter flags */
3977+ unsigned char multicast_filter[8]; /* multicast filter bitmap */
3978+ unsigned char event_filter[32]; /* event filter bitmap */
3979+ int num_ports; /* RO: number of ports */
3980+ int event_lost; /* number of lost events */
3981+ int card; /* RO: card number[kernel] */
3982+ int pid; /* RO: pid[user] */
3983+ char reserved[56]; /* for future use */
3984+};
3985+
3986+
3987+/* client pool size */
3988+struct snd_seq_client_pool {
3989+ int client; /* client number to inquire */
3990+ int output_pool; /* outgoing (write) pool size */
3991+ int input_pool; /* incoming (read) pool size */
3992+ int output_room; /* minimum free pool size for select/blocking mode */
3993+ int output_free; /* unused size */
3994+ int input_free; /* unused size */
3995+ char reserved[64];
3996+};
3997+
3998+
3999+/* Remove events by specified criteria */
4000+
4001+#define SNDRV_SEQ_REMOVE_INPUT (1<<0) /* Flush input queues */
4002+#define SNDRV_SEQ_REMOVE_OUTPUT (1<<1) /* Flush output queues */
4003+#define SNDRV_SEQ_REMOVE_DEST (1<<2) /* Restrict by destination q:client:port */
4004+#define SNDRV_SEQ_REMOVE_DEST_CHANNEL (1<<3) /* Restrict by channel */
4005+#define SNDRV_SEQ_REMOVE_TIME_BEFORE (1<<4) /* Restrict to before time */
4006+#define SNDRV_SEQ_REMOVE_TIME_AFTER (1<<5) /* Restrict to time or after */
4007+#define SNDRV_SEQ_REMOVE_TIME_TICK (1<<6) /* Time is in ticks */
4008+#define SNDRV_SEQ_REMOVE_EVENT_TYPE (1<<7) /* Restrict to event type */
4009+#define SNDRV_SEQ_REMOVE_IGNORE_OFF (1<<8) /* Do not flush off events */
4010+#define SNDRV_SEQ_REMOVE_TAG_MATCH (1<<9) /* Restrict to events with given tag */
4011+
4012+struct snd_seq_remove_events {
4013+ unsigned int remove_mode; /* Flags that determine what gets removed */
4014+
4015+ union snd_seq_timestamp time;
4016+
4017+ unsigned char queue; /* Queue for REMOVE_DEST */
4018+ struct snd_seq_addr dest; /* Address for REMOVE_DEST */
4019+ unsigned char channel; /* Channel for REMOVE_DEST */
4020+
4021+ int type; /* For REMOVE_EVENT_TYPE */
4022+ char tag; /* Tag for REMOVE_TAG */
4023+
4024+ int reserved[10]; /* To allow for future binary compatibility */
4025+
4026+};
4027+
4028+
4029+ /* known port numbers */
4030+#define SNDRV_SEQ_PORT_SYSTEM_TIMER 0
4031+#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE 1
4032+
4033+ /* port capabilities (32 bits) */
4034+#define SNDRV_SEQ_PORT_CAP_READ (1<<0) /* readable from this port */
4035+#define SNDRV_SEQ_PORT_CAP_WRITE (1<<1) /* writable to this port */
4036+
4037+#define SNDRV_SEQ_PORT_CAP_SYNC_READ (1<<2)
4038+#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE (1<<3)
4039+
4040+#define SNDRV_SEQ_PORT_CAP_DUPLEX (1<<4)
4041+
4042+#define SNDRV_SEQ_PORT_CAP_SUBS_READ (1<<5) /* allow read subscription */
4043+#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE (1<<6) /* allow write subscription */
4044+#define SNDRV_SEQ_PORT_CAP_NO_EXPORT (1<<7) /* routing not allowed */
4045+
4046+ /* port type */
4047+#define SNDRV_SEQ_PORT_TYPE_SPECIFIC (1<<0) /* hardware specific */
4048+#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1) /* generic MIDI device */
4049+#define SNDRV_SEQ_PORT_TYPE_MIDI_GM (1<<2) /* General MIDI compatible device */
4050+#define SNDRV_SEQ_PORT_TYPE_MIDI_GS (1<<3) /* GS compatible device */
4051+#define SNDRV_SEQ_PORT_TYPE_MIDI_XG (1<<4) /* XG compatible device */
4052+#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32 (1<<5) /* MT-32 compatible device */
4053+#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2 (1<<6) /* General MIDI 2 compatible device */
4054+
4055+/* other standards...*/
4056+#define SNDRV_SEQ_PORT_TYPE_SYNTH (1<<10) /* Synth device (no MIDI compatible - direct wavetable) */
4057+#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11) /* Sampling device (support sample download) */
4058+#define SNDRV_SEQ_PORT_TYPE_SAMPLE (1<<12) /* Sampling device (sample can be downloaded at any time) */
4059+/*...*/
4060+#define SNDRV_SEQ_PORT_TYPE_HARDWARE (1<<16) /* driver for a hardware device */
4061+#define SNDRV_SEQ_PORT_TYPE_SOFTWARE (1<<17) /* implemented in software */
4062+#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER (1<<18) /* generates sound */
4063+#define SNDRV_SEQ_PORT_TYPE_PORT (1<<19) /* connects to other device(s) */
4064+#define SNDRV_SEQ_PORT_TYPE_APPLICATION (1<<20) /* application (sequencer/editor) */
4065+
4066+/* misc. conditioning flags */
4067+#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT (1<<0)
4068+#define SNDRV_SEQ_PORT_FLG_TIMESTAMP (1<<1)
4069+#define SNDRV_SEQ_PORT_FLG_TIME_REAL (1<<2)
4070+
4071+struct snd_seq_port_info {
4072+ struct snd_seq_addr addr; /* client/port numbers */
4073+ char name[64]; /* port name */
4074+
4075+ unsigned int capability; /* port capability bits */
4076+ unsigned int type; /* port type bits */
4077+ int midi_channels; /* channels per MIDI port */
4078+ int midi_voices; /* voices per MIDI port */
4079+ int synth_voices; /* voices per SYNTH port */
4080+
4081+ int read_use; /* R/O: subscribers for output (from this port) */
4082+ int write_use; /* R/O: subscribers for input (to this port) */
4083+
4084+ void *kernel; /* reserved for kernel use (must be NULL) */
4085+ unsigned int flags; /* misc. conditioning */
4086+ unsigned char time_queue; /* queue # for timestamping */
4087+ char reserved[59]; /* for future use */
4088+};
4089+
4090+
4091+/* queue flags */
4092+#define SNDRV_SEQ_QUEUE_FLG_SYNC (1<<0) /* sync enabled */
4093+
4094+/* queue information */
4095+struct snd_seq_queue_info {
4096+ int queue; /* queue id */
4097+
4098+ /*
4099+ * security settings, only owner of this queue can start/stop timer
4100+ * etc. if the queue is locked for other clients
4101+ */
4102+ int owner; /* client id for owner of the queue */
4103+ unsigned locked:1; /* timing queue locked for other queues */
4104+ char name[64]; /* name of this queue */
4105+ unsigned int flags; /* flags */
4106+ char reserved[60]; /* for future use */
4107+
4108+};
4109+
4110+/* queue info/status */
4111+struct snd_seq_queue_status {
4112+ int queue; /* queue id */
4113+ int events; /* read-only - queue size */
4114+ snd_seq_tick_time_t tick; /* current tick */
4115+ struct snd_seq_real_time time; /* current time */
4116+ int running; /* running state of queue */
4117+ int flags; /* various flags */
4118+ char reserved[64]; /* for the future */
4119+};
4120+
4121+
4122+/* queue tempo */
4123+struct snd_seq_queue_tempo {
4124+ int queue; /* sequencer queue */
4125+ unsigned int tempo; /* current tempo, us/tick */
4126+ int ppq; /* time resolution, ticks/quarter */
4127+ unsigned int skew_value; /* queue skew */
4128+ unsigned int skew_base; /* queue skew base */
4129+ char reserved[24]; /* for the future */
4130+};
4131+
4132+
4133+/* sequencer timer sources */
4134+#define SNDRV_SEQ_TIMER_ALSA 0 /* ALSA timer */
4135+#define SNDRV_SEQ_TIMER_MIDI_CLOCK 1 /* Midi Clock (CLOCK event) */
4136+#define SNDRV_SEQ_TIMER_MIDI_TICK 2 /* Midi Timer Tick (TICK event) */
4137+
4138+/* queue timer info */
4139+struct snd_seq_queue_timer {
4140+ int queue; /* sequencer queue */
4141+ int type; /* source timer type */
4142+ union {
4143+ struct {
4144+ struct snd_timer_id id; /* ALSA's timer ID */
4145+ unsigned int resolution; /* resolution in Hz */
4146+ } alsa;
4147+ } u;
4148+ char reserved[64]; /* for the future use */
4149+};
4150+
4151+
4152+struct snd_seq_queue_client {
4153+ int queue; /* sequencer queue */
4154+ int client; /* sequencer client */
4155+ int used; /* queue is used with this client
4156+ (must be set for accepting events) */
4157+ /* per client watermarks */
4158+ char reserved[64]; /* for future use */
4159+};
4160+
4161+
4162+#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE (1<<0) /* exclusive connection */
4163+#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP (1<<1)
4164+#define SNDRV_SEQ_PORT_SUBS_TIME_REAL (1<<2)
4165+
4166+struct snd_seq_port_subscribe {
4167+ struct snd_seq_addr sender; /* sender address */
4168+ struct snd_seq_addr dest; /* destination address */
4169+ unsigned int voices; /* number of voices to be allocated (0 = don't care) */
4170+ unsigned int flags; /* modes */
4171+ unsigned char queue; /* input time-stamp queue (optional) */
4172+ unsigned char pad[3]; /* reserved */
4173+ char reserved[64];
4174+};
4175+
4176+/* type of query subscription */
4177+#define SNDRV_SEQ_QUERY_SUBS_READ 0
4178+#define SNDRV_SEQ_QUERY_SUBS_WRITE 1
4179+
4180+struct snd_seq_query_subs {
4181+ struct snd_seq_addr root; /* client/port id to be searched */
4182+ int type; /* READ or WRITE */
4183+ int index; /* 0..N-1 */
4184+ int num_subs; /* R/O: number of subscriptions on this port */
4185+ struct snd_seq_addr addr; /* R/O: result */
4186+ unsigned char queue; /* R/O: result */
4187+ unsigned int flags; /* R/O: result */
4188+ char reserved[64]; /* for future use */
4189+};
4190+
4191+
4192+/*
4193+ * IOCTL commands
4194+ */
4195+
4196+#define SNDRV_SEQ_IOCTL_PVERSION _IOR ('S', 0x00, int)
4197+#define SNDRV_SEQ_IOCTL_CLIENT_ID _IOR ('S', 0x01, int)
4198+#define SNDRV_SEQ_IOCTL_SYSTEM_INFO _IOWR('S', 0x02, struct snd_seq_system_info)
4199+#define SNDRV_SEQ_IOCTL_RUNNING_MODE _IOWR('S', 0x03, struct snd_seq_running_info)
4200+
4201+#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO _IOWR('S', 0x10, struct snd_seq_client_info)
4202+#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO _IOW ('S', 0x11, struct snd_seq_client_info)
4203+
4204+#define SNDRV_SEQ_IOCTL_CREATE_PORT _IOWR('S', 0x20, struct snd_seq_port_info)
4205+#define SNDRV_SEQ_IOCTL_DELETE_PORT _IOW ('S', 0x21, struct snd_seq_port_info)
4206+#define SNDRV_SEQ_IOCTL_GET_PORT_INFO _IOWR('S', 0x22, struct snd_seq_port_info)
4207+#define SNDRV_SEQ_IOCTL_SET_PORT_INFO _IOW ('S', 0x23, struct snd_seq_port_info)
4208+
4209+#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT _IOW ('S', 0x30, struct snd_seq_port_subscribe)
4210+#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct snd_seq_port_subscribe)
4211+
4212+#define SNDRV_SEQ_IOCTL_CREATE_QUEUE _IOWR('S', 0x32, struct snd_seq_queue_info)
4213+#define SNDRV_SEQ_IOCTL_DELETE_QUEUE _IOW ('S', 0x33, struct snd_seq_queue_info)
4214+#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO _IOWR('S', 0x34, struct snd_seq_queue_info)
4215+#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO _IOWR('S', 0x35, struct snd_seq_queue_info)
4216+#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE _IOWR('S', 0x36, struct snd_seq_queue_info)
4217+#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status)
4218+#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO _IOWR('S', 0x41, struct snd_seq_queue_tempo)
4219+#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO _IOW ('S', 0x42, struct snd_seq_queue_tempo)
4220+#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER _IOWR('S', 0x45, struct snd_seq_queue_timer)
4221+#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER _IOW ('S', 0x46, struct snd_seq_queue_timer)
4222+#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT _IOWR('S', 0x49, struct snd_seq_queue_client)
4223+#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT _IOW ('S', 0x4a, struct snd_seq_queue_client)
4224+#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL _IOWR('S', 0x4b, struct snd_seq_client_pool)
4225+#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL _IOW ('S', 0x4c, struct snd_seq_client_pool)
4226+#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS _IOW ('S', 0x4e, struct snd_seq_remove_events)
4227+#define SNDRV_SEQ_IOCTL_QUERY_SUBS _IOWR('S', 0x4f, struct snd_seq_query_subs)
4228+#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION _IOWR('S', 0x50, struct snd_seq_port_subscribe)
4229+#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct snd_seq_client_info)
4230+#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT _IOWR('S', 0x52, struct snd_seq_port_info)
4231+
4232+#endif /* _UAPI__SOUND_ASEQUENCER_H */
4233diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
4234new file mode 100644
4235index 00000000..a74ca232
4236--- /dev/null
4237+++ b/include/sound/uapi/asoc.h
4238@@ -0,0 +1,633 @@
4239+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
4240+/*
4241+ * uapi/sound/asoc.h -- ALSA SoC Firmware Controls and DAPM
4242+ *
4243+ * Copyright (C) 2012 Texas Instruments Inc.
4244+ * Copyright (C) 2015 Intel Corporation.
4245+ *
4246+ * This program is free software; you can redistribute it and/or modify
4247+ * it under the terms of the GNU General Public License version 2 as
4248+ * published by the Free Software Foundation.
4249+ *
4250+ * Simple file API to load FW that includes mixers, coefficients, DAPM graphs,
4251+ * algorithms, equalisers, DAIs, widgets etc.
4252+*/
4253+
4254+#ifndef __LINUX_UAPI_SND_ASOC_H
4255+#define __LINUX_UAPI_SND_ASOC_H
4256+
4257+#include <linux/types.h>
4258+#include <sound/asound.h>
4259+
4260+/*
4261+ * Maximum number of channels topology kcontrol can represent.
4262+ */
4263+#define SND_SOC_TPLG_MAX_CHAN 8
4264+
4265+/*
4266+ * Maximum number of PCM formats capability
4267+ */
4268+#define SND_SOC_TPLG_MAX_FORMATS 16
4269+
4270+/*
4271+ * Maximum number of PCM stream configs
4272+ */
4273+#define SND_SOC_TPLG_STREAM_CONFIG_MAX 8
4274+
4275+/*
4276+ * Maximum number of physical link's hardware configs
4277+ */
4278+#define SND_SOC_TPLG_HW_CONFIG_MAX 8
4279+
4280+/* individual kcontrol info types - can be mixed with other types */
4281+#define SND_SOC_TPLG_CTL_VOLSW 1
4282+#define SND_SOC_TPLG_CTL_VOLSW_SX 2
4283+#define SND_SOC_TPLG_CTL_VOLSW_XR_SX 3
4284+#define SND_SOC_TPLG_CTL_ENUM 4
4285+#define SND_SOC_TPLG_CTL_BYTES 5
4286+#define SND_SOC_TPLG_CTL_ENUM_VALUE 6
4287+#define SND_SOC_TPLG_CTL_RANGE 7
4288+#define SND_SOC_TPLG_CTL_STROBE 8
4289+
4290+
4291+/* individual widget kcontrol info types - can be mixed with other types */
4292+#define SND_SOC_TPLG_DAPM_CTL_VOLSW 64
4293+#define SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE 65
4294+#define SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT 66
4295+#define SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE 67
4296+#define SND_SOC_TPLG_DAPM_CTL_PIN 68
4297+
4298+/* DAPM widget types - add new items to the end */
4299+#define SND_SOC_TPLG_DAPM_INPUT 0
4300+#define SND_SOC_TPLG_DAPM_OUTPUT 1
4301+#define SND_SOC_TPLG_DAPM_MUX 2
4302+#define SND_SOC_TPLG_DAPM_MIXER 3
4303+#define SND_SOC_TPLG_DAPM_PGA 4
4304+#define SND_SOC_TPLG_DAPM_OUT_DRV 5
4305+#define SND_SOC_TPLG_DAPM_ADC 6
4306+#define SND_SOC_TPLG_DAPM_DAC 7
4307+#define SND_SOC_TPLG_DAPM_SWITCH 8
4308+#define SND_SOC_TPLG_DAPM_PRE 9
4309+#define SND_SOC_TPLG_DAPM_POST 10
4310+#define SND_SOC_TPLG_DAPM_AIF_IN 11
4311+#define SND_SOC_TPLG_DAPM_AIF_OUT 12
4312+#define SND_SOC_TPLG_DAPM_DAI_IN 13
4313+#define SND_SOC_TPLG_DAPM_DAI_OUT 14
4314+#define SND_SOC_TPLG_DAPM_DAI_LINK 15
4315+#define SND_SOC_TPLG_DAPM_BUFFER 16
4316+#define SND_SOC_TPLG_DAPM_SCHEDULER 17
4317+#define SND_SOC_TPLG_DAPM_EFFECT 18
4318+#define SND_SOC_TPLG_DAPM_SIGGEN 19
4319+#define SND_SOC_TPLG_DAPM_SRC 20
4320+#define SND_SOC_TPLG_DAPM_ASRC 21
4321+#define SND_SOC_TPLG_DAPM_ENCODER 22
4322+#define SND_SOC_TPLG_DAPM_DECODER 23
4323+#define SND_SOC_TPLG_DAPM_LAST SND_SOC_TPLG_DAPM_DECODER
4324+
4325+/* Header magic number and string sizes */
4326+#define SND_SOC_TPLG_MAGIC 0x41536F43 /* ASoC */
4327+
4328+/* string sizes */
4329+#define SND_SOC_TPLG_NUM_TEXTS 16
4330+
4331+/* ABI version */
4332+#define SND_SOC_TPLG_ABI_VERSION 0x5 /* current version */
4333+#define SND_SOC_TPLG_ABI_VERSION_MIN 0x4 /* oldest version supported */
4334+
4335+/* Max size of TLV data */
4336+#define SND_SOC_TPLG_TLV_SIZE 32
4337+
4338+/*
4339+ * File and Block header data types.
4340+ * Add new generic and vendor types to end of list.
4341+ * Generic types are handled by the core whilst vendors types are passed
4342+ * to the component drivers for handling.
4343+ */
4344+#define SND_SOC_TPLG_TYPE_MIXER 1
4345+#define SND_SOC_TPLG_TYPE_BYTES 2
4346+#define SND_SOC_TPLG_TYPE_ENUM 3
4347+#define SND_SOC_TPLG_TYPE_DAPM_GRAPH 4
4348+#define SND_SOC_TPLG_TYPE_DAPM_WIDGET 5
4349+#define SND_SOC_TPLG_TYPE_DAI_LINK 6
4350+#define SND_SOC_TPLG_TYPE_PCM 7
4351+#define SND_SOC_TPLG_TYPE_MANIFEST 8
4352+#define SND_SOC_TPLG_TYPE_CODEC_LINK 9
4353+#define SND_SOC_TPLG_TYPE_BACKEND_LINK 10
4354+#define SND_SOC_TPLG_TYPE_PDATA 11
4355+#define SND_SOC_TPLG_TYPE_DAI 12
4356+#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_DAI
4357+
4358+/* vendor block IDs - please add new vendor types to end */
4359+#define SND_SOC_TPLG_TYPE_VENDOR_FW 1000
4360+#define SND_SOC_TPLG_TYPE_VENDOR_CONFIG 1001
4361+#define SND_SOC_TPLG_TYPE_VENDOR_COEFF 1002
4362+#define SND_SOC_TPLG_TYPEVENDOR_CODEC 1003
4363+
4364+#define SND_SOC_TPLG_STREAM_PLAYBACK 0
4365+#define SND_SOC_TPLG_STREAM_CAPTURE 1
4366+
4367+/* vendor tuple types */
4368+#define SND_SOC_TPLG_TUPLE_TYPE_UUID 0
4369+#define SND_SOC_TPLG_TUPLE_TYPE_STRING 1
4370+#define SND_SOC_TPLG_TUPLE_TYPE_BOOL 2
4371+#define SND_SOC_TPLG_TUPLE_TYPE_BYTE 3
4372+#define SND_SOC_TPLG_TUPLE_TYPE_WORD 4
4373+#define SND_SOC_TPLG_TUPLE_TYPE_SHORT 5
4374+
4375+/* DAI flags */
4376+#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES (1 << 0)
4377+#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
4378+#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
4379+
4380+/* DAI clock gating */
4381+#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED 0
4382+#define SND_SOC_TPLG_DAI_CLK_GATE_GATED 1
4383+#define SND_SOC_TPLG_DAI_CLK_GATE_CONT 2
4384+
4385+/* DAI mclk_direction */
4386+#define SND_SOC_TPLG_MCLK_CO 0 /* for codec, mclk is output */
4387+#define SND_SOC_TPLG_MCLK_CI 1 /* for codec, mclk is input */
4388+
4389+/* DAI physical PCM data formats.
4390+ * Add new formats to the end of the list.
4391+ */
4392+#define SND_SOC_DAI_FORMAT_I2S 1 /* I2S mode */
4393+#define SND_SOC_DAI_FORMAT_RIGHT_J 2 /* Right Justified mode */
4394+#define SND_SOC_DAI_FORMAT_LEFT_J 3 /* Left Justified mode */
4395+#define SND_SOC_DAI_FORMAT_DSP_A 4 /* L data MSB after FRM LRC */
4396+#define SND_SOC_DAI_FORMAT_DSP_B 5 /* L data MSB during FRM LRC */
4397+#define SND_SOC_DAI_FORMAT_AC97 6 /* AC97 */
4398+#define SND_SOC_DAI_FORMAT_PDM 7 /* Pulse density modulation */
4399+
4400+/* left and right justified also known as MSB and LSB respectively */
4401+#define SND_SOC_DAI_FORMAT_MSB SND_SOC_DAI_FORMAT_LEFT_J
4402+#define SND_SOC_DAI_FORMAT_LSB SND_SOC_DAI_FORMAT_RIGHT_J
4403+
4404+/* DAI link flags */
4405+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
4406+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
4407+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
4408+#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3)
4409+
4410+/* DAI topology BCLK parameter
4411+ * For the backwards capability, by default codec is bclk master
4412+ */
4413+#define SND_SOC_TPLG_BCLK_CM 0 /* codec is bclk master */
4414+#define SND_SOC_TPLG_BCLK_CS 1 /* codec is bclk slave */
4415+
4416+/* DAI topology FSYNC parameter
4417+ * For the backwards capability, by default codec is fsync master
4418+ */
4419+#define SND_SOC_TPLG_FSYNC_CM 0 /* codec is fsync master */
4420+#define SND_SOC_TPLG_FSYNC_CS 1 /* codec is fsync slave */
4421+
4422+/*
4423+ * Block Header.
4424+ * This header precedes all object and object arrays below.
4425+ */
4426+struct snd_soc_tplg_hdr {
4427+ __le32 magic; /* magic number */
4428+ __le32 abi; /* ABI version */
4429+ __le32 version; /* optional vendor specific version details */
4430+ __le32 type; /* SND_SOC_TPLG_TYPE_ */
4431+ __le32 size; /* size of this structure */
4432+ __le32 vendor_type; /* optional vendor specific type info */
4433+ __le32 payload_size; /* data bytes, excluding this header */
4434+ __le32 index; /* identifier for block */
4435+ __le32 count; /* number of elements in block */
4436+} __attribute__((packed));
4437+
4438+/* vendor tuple for uuid */
4439+struct snd_soc_tplg_vendor_uuid_elem {
4440+ __le32 token;
4441+ char uuid[16];
4442+} __attribute__((packed));
4443+
4444+/* vendor tuple for a bool/byte/short/word value */
4445+struct snd_soc_tplg_vendor_value_elem {
4446+ __le32 token;
4447+ __le32 value;
4448+} __attribute__((packed));
4449+
4450+/* vendor tuple for string */
4451+struct snd_soc_tplg_vendor_string_elem {
4452+ __le32 token;
4453+ char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4454+} __attribute__((packed));
4455+
4456+struct snd_soc_tplg_vendor_array {
4457+ __le32 size; /* size in bytes of the array, including all elements */
4458+ __le32 type; /* SND_SOC_TPLG_TUPLE_TYPE_ */
4459+ __le32 num_elems; /* number of elements in array */
4460+ union {
4461+ struct snd_soc_tplg_vendor_uuid_elem uuid[0];
4462+ struct snd_soc_tplg_vendor_value_elem value[0];
4463+ struct snd_soc_tplg_vendor_string_elem string[0];
4464+ };
4465+} __attribute__((packed));
4466+
4467+/*
4468+ * Private data.
4469+ * All topology objects may have private data that can be used by the driver or
4470+ * firmware. Core will ignore this data.
4471+ */
4472+struct snd_soc_tplg_private {
4473+ __le32 size; /* in bytes of private data */
4474+ union {
4475+ char data[0];
4476+ struct snd_soc_tplg_vendor_array array[0];
4477+ };
4478+} __attribute__((packed));
4479+
4480+/*
4481+ * Kcontrol TLV data.
4482+ */
4483+struct snd_soc_tplg_tlv_dbscale {
4484+ __le32 min;
4485+ __le32 step;
4486+ __le32 mute;
4487+} __attribute__((packed));
4488+
4489+struct snd_soc_tplg_ctl_tlv {
4490+ __le32 size; /* in bytes of this structure */
4491+ __le32 type; /* SNDRV_CTL_TLVT_*, type of TLV */
4492+ union {
4493+ __le32 data[SND_SOC_TPLG_TLV_SIZE];
4494+ struct snd_soc_tplg_tlv_dbscale scale;
4495+ };
4496+} __attribute__((packed));
4497+
4498+/*
4499+ * Kcontrol channel data
4500+ */
4501+struct snd_soc_tplg_channel {
4502+ __le32 size; /* in bytes of this structure */
4503+ __le32 reg;
4504+ __le32 shift;
4505+ __le32 id; /* ID maps to Left, Right, LFE etc */
4506+} __attribute__((packed));
4507+
4508+/*
4509+ * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
4510+ * Kcontrol ops need get/put/info.
4511+ * Bytes ext ops need get/put.
4512+ */
4513+struct snd_soc_tplg_io_ops {
4514+ __le32 get;
4515+ __le32 put;
4516+ __le32 info;
4517+} __attribute__((packed));
4518+
4519+/*
4520+ * kcontrol header
4521+ */
4522+struct snd_soc_tplg_ctl_hdr {
4523+ __le32 size; /* in bytes of this structure */
4524+ __le32 type;
4525+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4526+ __le32 access;
4527+ struct snd_soc_tplg_io_ops ops;
4528+ struct snd_soc_tplg_ctl_tlv tlv;
4529+} __attribute__((packed));
4530+
4531+/*
4532+ * Stream Capabilities
4533+ */
4534+struct snd_soc_tplg_stream_caps {
4535+ __le32 size; /* in bytes of this structure */
4536+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4537+ __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
4538+ __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
4539+ __le32 rate_min; /* min rate */
4540+ __le32 rate_max; /* max rate */
4541+ __le32 channels_min; /* min channels */
4542+ __le32 channels_max; /* max channels */
4543+ __le32 periods_min; /* min number of periods */
4544+ __le32 periods_max; /* max number of periods */
4545+ __le32 period_size_min; /* min period size bytes */
4546+ __le32 period_size_max; /* max period size bytes */
4547+ __le32 buffer_size_min; /* min buffer size bytes */
4548+ __le32 buffer_size_max; /* max buffer size bytes */
4549+ __le32 sig_bits; /* number of bits of content */
4550+} __attribute__((packed));
4551+
4552+/*
4553+ * FE or BE Stream configuration supported by SW/FW
4554+ */
4555+struct snd_soc_tplg_stream {
4556+ __le32 size; /* in bytes of this structure */
4557+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */
4558+ __le64 format; /* SNDRV_PCM_FMTBIT_* */
4559+ __le32 rate; /* SNDRV_PCM_RATE_* */
4560+ __le32 period_bytes; /* size of period in bytes */
4561+ __le32 buffer_bytes; /* size of buffer in bytes */
4562+ __le32 channels; /* channels */
4563+} __attribute__((packed));
4564+
4565+
4566+/*
4567+ * Describes a physical link's runtime supported hardware config,
4568+ * i.e. hardware audio formats.
4569+ */
4570+struct snd_soc_tplg_hw_config {
4571+ __le32 size; /* in bytes of this structure */
4572+ __le32 id; /* unique ID - - used to match */
4573+ __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
4574+ __u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
4575+ __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
4576+ __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
4577+ __u8 bclk_master; /* SND_SOC_TPLG_BCLK_ value */
4578+ __u8 fsync_master; /* SND_SOC_TPLG_FSYNC_ value */
4579+ __u8 mclk_direction; /* SND_SOC_TPLG_MCLK_ value */
4580+ __le16 reserved; /* for 32bit alignment */
4581+ __le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */
4582+ __le32 bclk_rate; /* BCLK freqency in Hz */
4583+ __le32 fsync_rate; /* frame clock in Hz */
4584+ __le32 tdm_slots; /* number of TDM slots in use */
4585+ __le32 tdm_slot_width; /* width in bits for each slot */
4586+ __le32 tx_slots; /* bit mask for active Tx slots */
4587+ __le32 rx_slots; /* bit mask for active Rx slots */
4588+ __le32 tx_channels; /* number of Tx channels */
4589+ __le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
4590+ __le32 rx_channels; /* number of Rx channels */
4591+ __le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
4592+} __attribute__((packed));
4593+
4594+/*
4595+ * Manifest. List totals for each payload type. Not used in parsing, but will
4596+ * be passed to the component driver before any other objects in order for any
4597+ * global component resource allocations.
4598+ *
4599+ * File block representation for manifest :-
4600+ * +-----------------------------------+----+
4601+ * | struct snd_soc_tplg_hdr | 1 |
4602+ * +-----------------------------------+----+
4603+ * | struct snd_soc_tplg_manifest | 1 |
4604+ * +-----------------------------------+----+
4605+ */
4606+struct snd_soc_tplg_manifest {
4607+ __le32 size; /* in bytes of this structure */
4608+ __le32 control_elems; /* number of control elements */
4609+ __le32 widget_elems; /* number of widget elements */
4610+ __le32 graph_elems; /* number of graph elements */
4611+ __le32 pcm_elems; /* number of PCM elements */
4612+ __le32 dai_link_elems; /* number of DAI link elements */
4613+ __le32 dai_elems; /* number of physical DAI elements */
4614+ __le32 reserved[20]; /* reserved for new ABI element types */
4615+ struct snd_soc_tplg_private priv;
4616+} __attribute__((packed));
4617+
4618+/*
4619+ * Mixer kcontrol.
4620+ *
4621+ * File block representation for mixer kcontrol :-
4622+ * +-----------------------------------+----+
4623+ * | struct snd_soc_tplg_hdr | 1 |
4624+ * +-----------------------------------+----+
4625+ * | struct snd_soc_tplg_mixer_control | N |
4626+ * +-----------------------------------+----+
4627+ */
4628+struct snd_soc_tplg_mixer_control {
4629+ struct snd_soc_tplg_ctl_hdr hdr;
4630+ __le32 size; /* in bytes of this structure */
4631+ __le32 min;
4632+ __le32 max;
4633+ __le32 platform_max;
4634+ __le32 invert;
4635+ __le32 num_channels;
4636+ struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
4637+ struct snd_soc_tplg_private priv;
4638+} __attribute__((packed));
4639+
4640+/*
4641+ * Enumerated kcontrol
4642+ *
4643+ * File block representation for enum kcontrol :-
4644+ * +-----------------------------------+----+
4645+ * | struct snd_soc_tplg_hdr | 1 |
4646+ * +-----------------------------------+----+
4647+ * | struct snd_soc_tplg_enum_control | N |
4648+ * +-----------------------------------+----+
4649+ */
4650+struct snd_soc_tplg_enum_control {
4651+ struct snd_soc_tplg_ctl_hdr hdr;
4652+ __le32 size; /* in bytes of this structure */
4653+ __le32 num_channels;
4654+ struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
4655+ __le32 items;
4656+ __le32 mask;
4657+ __le32 count;
4658+ char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4659+ __le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
4660+ struct snd_soc_tplg_private priv;
4661+} __attribute__((packed));
4662+
4663+/*
4664+ * Bytes kcontrol
4665+ *
4666+ * File block representation for bytes kcontrol :-
4667+ * +-----------------------------------+----+
4668+ * | struct snd_soc_tplg_hdr | 1 |
4669+ * +-----------------------------------+----+
4670+ * | struct snd_soc_tplg_bytes_control | N |
4671+ * +-----------------------------------+----+
4672+ */
4673+struct snd_soc_tplg_bytes_control {
4674+ struct snd_soc_tplg_ctl_hdr hdr;
4675+ __le32 size; /* in bytes of this structure */
4676+ __le32 max;
4677+ __le32 mask;
4678+ __le32 base;
4679+ __le32 num_regs;
4680+ struct snd_soc_tplg_io_ops ext_ops;
4681+ struct snd_soc_tplg_private priv;
4682+} __attribute__((packed));
4683+
4684+/*
4685+ * DAPM Graph Element
4686+ *
4687+ * File block representation for DAPM graph elements :-
4688+ * +-------------------------------------+----+
4689+ * | struct snd_soc_tplg_hdr | 1 |
4690+ * +-------------------------------------+----+
4691+ * | struct snd_soc_tplg_dapm_graph_elem | N |
4692+ * +-------------------------------------+----+
4693+ */
4694+struct snd_soc_tplg_dapm_graph_elem {
4695+ char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4696+ char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4697+ char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4698+} __attribute__((packed));
4699+
4700+/*
4701+ * DAPM Widget.
4702+ *
4703+ * File block representation for DAPM widget :-
4704+ * +-------------------------------------+-----+
4705+ * | struct snd_soc_tplg_hdr | 1 |
4706+ * +-------------------------------------+-----+
4707+ * | struct snd_soc_tplg_dapm_widget | N |
4708+ * +-------------------------------------+-----+
4709+ * | struct snd_soc_tplg_enum_control | 0|1 |
4710+ * | struct snd_soc_tplg_mixer_control | 0|N |
4711+ * +-------------------------------------+-----+
4712+ *
4713+ * Optional enum or mixer control can be appended to the end of each widget
4714+ * in the block.
4715+ */
4716+struct snd_soc_tplg_dapm_widget {
4717+ __le32 size; /* in bytes of this structure */
4718+ __le32 id; /* SND_SOC_DAPM_CTL */
4719+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4720+ char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4721+
4722+ __le32 reg; /* negative reg = no direct dapm */
4723+ __le32 shift; /* bits to shift */
4724+ __le32 mask; /* non-shifted mask */
4725+ __le32 subseq; /* sort within widget type */
4726+ __le32 invert; /* invert the power bit */
4727+ __le32 ignore_suspend; /* kept enabled over suspend */
4728+ __le16 event_flags;
4729+ __le16 event_type;
4730+ __le32 num_kcontrols;
4731+ struct snd_soc_tplg_private priv;
4732+ /*
4733+ * kcontrols that relate to this widget
4734+ * follow here after widget private data
4735+ */
4736+} __attribute__((packed));
4737+
4738+
4739+/*
4740+ * Describes SW/FW specific features of PCM (FE DAI & DAI link).
4741+ *
4742+ * File block representation for PCM :-
4743+ * +-----------------------------------+-----+
4744+ * | struct snd_soc_tplg_hdr | 1 |
4745+ * +-----------------------------------+-----+
4746+ * | struct snd_soc_tplg_pcm | N |
4747+ * +-----------------------------------+-----+
4748+ */
4749+struct snd_soc_tplg_pcm {
4750+ __le32 size; /* in bytes of this structure */
4751+ char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4752+ char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4753+ __le32 pcm_id; /* unique ID - used to match with DAI link */
4754+ __le32 dai_id; /* unique ID - used to match */
4755+ __le32 playback; /* supports playback mode */
4756+ __le32 capture; /* supports capture mode */
4757+ __le32 compress; /* 1 = compressed; 0 = PCM */
4758+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
4759+ __le32 num_streams; /* number of streams */
4760+ struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
4761+ __le32 flag_mask; /* bitmask of flags to configure */
4762+ __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
4763+ struct snd_soc_tplg_private priv;
4764+} __attribute__((packed));
4765+
4766+
4767+/*
4768+ * Describes the physical link runtime supported configs or params
4769+ *
4770+ * File block representation for physical link config :-
4771+ * +-----------------------------------+-----+
4772+ * | struct snd_soc_tplg_hdr | 1 |
4773+ * +-----------------------------------+-----+
4774+ * | struct snd_soc_tplg_link_config | N |
4775+ * +-----------------------------------+-----+
4776+ */
4777+struct snd_soc_tplg_link_config {
4778+ __le32 size; /* in bytes of this structure */
4779+ __le32 id; /* unique ID - used to match */
4780+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
4781+ char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
4782+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
4783+ __le32 num_streams; /* number of streams */
4784+ struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
4785+ __le32 num_hw_configs; /* number of hw configs */
4786+ __le32 default_hw_config_id; /* default hw config ID for init */
4787+ __le32 flag_mask; /* bitmask of flags to configure */
4788+ __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
4789+ struct snd_soc_tplg_private priv;
4790+} __attribute__((packed));
4791+
4792+/*
4793+ * Describes SW/FW specific features of physical DAI.
4794+ * It can be used to configure backend DAIs for DPCM.
4795+ *
4796+ * File block representation for physical DAI :-
4797+ * +-----------------------------------+-----+
4798+ * | struct snd_soc_tplg_hdr | 1 |
4799+ * +-----------------------------------+-----+
4800+ * | struct snd_soc_tplg_dai | N |
4801+ * +-----------------------------------+-----+
4802+ */
4803+struct snd_soc_tplg_dai {
4804+ __le32 size; /* in bytes of this structure */
4805+ char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
4806+ __le32 dai_id; /* unique ID - used to match */
4807+ __le32 playback; /* supports playback mode */
4808+ __le32 capture; /* supports capture mode */
4809+ struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
4810+ __le32 flag_mask; /* bitmask of flags to configure */
4811+ __le32 flags; /* SND_SOC_TPLG_DAI_FLGBIT_* */
4812+ struct snd_soc_tplg_private priv;
4813+} __attribute__((packed));
4814+
4815+/*
4816+ * Old version of ABI structs, supported for backward compatibility.
4817+ */
4818+
4819+/* Manifest v4 */
4820+struct snd_soc_tplg_manifest_v4 {
4821+ __le32 size; /* in bytes of this structure */
4822+ __le32 control_elems; /* number of control elements */
4823+ __le32 widget_elems; /* number of widget elements */
4824+ __le32 graph_elems; /* number of graph elements */
4825+ __le32 pcm_elems; /* number of PCM elements */
4826+ __le32 dai_link_elems; /* number of DAI link elements */
4827+ struct snd_soc_tplg_private priv;
4828+} __packed;
4829+
4830+/* Stream Capabilities v4 */
4831+struct snd_soc_tplg_stream_caps_v4 {
4832+ __le32 size; /* in bytes of this structure */
4833+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4834+ __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
4835+ __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
4836+ __le32 rate_min; /* min rate */
4837+ __le32 rate_max; /* max rate */
4838+ __le32 channels_min; /* min channels */
4839+ __le32 channels_max; /* max channels */
4840+ __le32 periods_min; /* min number of periods */
4841+ __le32 periods_max; /* max number of periods */
4842+ __le32 period_size_min; /* min period size bytes */
4843+ __le32 period_size_max; /* max period size bytes */
4844+ __le32 buffer_size_min; /* min buffer size bytes */
4845+ __le32 buffer_size_max; /* max buffer size bytes */
4846+} __packed;
4847+
4848+/* PCM v4 */
4849+struct snd_soc_tplg_pcm_v4 {
4850+ __le32 size; /* in bytes of this structure */
4851+ char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4852+ char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4853+ __le32 pcm_id; /* unique ID - used to match with DAI link */
4854+ __le32 dai_id; /* unique ID - used to match */
4855+ __le32 playback; /* supports playback mode */
4856+ __le32 capture; /* supports capture mode */
4857+ __le32 compress; /* 1 = compressed; 0 = PCM */
4858+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
4859+ __le32 num_streams; /* number of streams */
4860+ struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
4861+} __packed;
4862+
4863+/* Physical link config v4 */
4864+struct snd_soc_tplg_link_config_v4 {
4865+ __le32 size; /* in bytes of this structure */
4866+ __le32 id; /* unique ID - used to match */
4867+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
4868+ __le32 num_streams; /* number of streams */
4869+} __packed;
4870+
4871+#endif
4872diff --git a/include/sound/uapi/asound.h b/include/sound/uapi/asound.h
4873new file mode 100644
4874index 00000000..df1153ce
4875--- /dev/null
4876+++ b/include/sound/uapi/asound.h
4877@@ -0,0 +1,1038 @@
4878+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
4879+/*
4880+ * Advanced Linux Sound Architecture - ALSA - Driver
4881+ * Copyright (c) 1994-2003 by Jaroslav Kysela <perex@perex.cz>,
4882+ * Abramo Bagnara <abramo@alsa-project.org>
4883+ *
4884+ *
4885+ * This program is free software; you can redistribute it and/or modify
4886+ * it under the terms of the GNU General Public License as published by
4887+ * the Free Software Foundation; either version 2 of the License, or
4888+ * (at your option) any later version.
4889+ *
4890+ * This program is distributed in the hope that it will be useful,
4891+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4892+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4893+ * GNU General Public License for more details.
4894+ *
4895+ * You should have received a copy of the GNU General Public License
4896+ * along with this program; if not, write to the Free Software
4897+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4898+ *
4899+ */
4900+
4901+#ifndef _UAPI__SOUND_ASOUND_H
4902+#define _UAPI__SOUND_ASOUND_H
4903+
4904+#if defined(__KERNEL__) || defined(__linux__)
4905+#include <linux/types.h>
4906+#else
4907+#include <sys/ioctl.h>
4908+#endif
4909+
4910+#ifndef __KERNEL__
4911+#include <stdlib.h>
4912+#include <time.h>
4913+#endif
4914+
4915+/*
4916+ * protocol version
4917+ */
4918+
4919+#define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor))
4920+#define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff)
4921+#define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff)
4922+#define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff)
4923+#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \
4924+ (SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \
4925+ (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \
4926+ SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
4927+
4928+/****************************************************************************
4929+ * *
4930+ * Digital audio interface *
4931+ * *
4932+ ****************************************************************************/
4933+
4934+struct snd_aes_iec958 {
4935+ unsigned char status[24]; /* AES/IEC958 channel status bits */
4936+ unsigned char subcode[147]; /* AES/IEC958 subcode bits */
4937+ unsigned char pad; /* nothing */
4938+ unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */
4939+};
4940+
4941+/****************************************************************************
4942+ * *
4943+ * CEA-861 Audio InfoFrame. Used in HDMI and DisplayPort *
4944+ * *
4945+ ****************************************************************************/
4946+
4947+struct snd_cea_861_aud_if {
4948+ unsigned char db1_ct_cc; /* coding type and channel count */
4949+ unsigned char db2_sf_ss; /* sample frequency and size */
4950+ unsigned char db3; /* not used, all zeros */
4951+ unsigned char db4_ca; /* channel allocation code */
4952+ unsigned char db5_dminh_lsv; /* downmix inhibit & level-shit values */
4953+};
4954+
4955+/****************************************************************************
4956+ * *
4957+ * Section for driver hardware dependent interface - /dev/snd/hw? *
4958+ * *
4959+ ****************************************************************************/
4960+
4961+#define SNDRV_HWDEP_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
4962+
4963+enum {
4964+ SNDRV_HWDEP_IFACE_OPL2 = 0,
4965+ SNDRV_HWDEP_IFACE_OPL3,
4966+ SNDRV_HWDEP_IFACE_OPL4,
4967+ SNDRV_HWDEP_IFACE_SB16CSP, /* Creative Signal Processor */
4968+ SNDRV_HWDEP_IFACE_EMU10K1, /* FX8010 processor in EMU10K1 chip */
4969+ SNDRV_HWDEP_IFACE_YSS225, /* Yamaha FX processor */
4970+ SNDRV_HWDEP_IFACE_ICS2115, /* Wavetable synth */
4971+ SNDRV_HWDEP_IFACE_SSCAPE, /* Ensoniq SoundScape ISA card (MC68EC000) */
4972+ SNDRV_HWDEP_IFACE_VX, /* Digigram VX cards */
4973+ SNDRV_HWDEP_IFACE_MIXART, /* Digigram miXart cards */
4974+ SNDRV_HWDEP_IFACE_USX2Y, /* Tascam US122, US224 & US428 usb */
4975+ SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */
4976+ SNDRV_HWDEP_IFACE_BLUETOOTH, /* Bluetooth audio */
4977+ SNDRV_HWDEP_IFACE_USX2Y_PCM, /* Tascam US122, US224 & US428 rawusb pcm */
4978+ SNDRV_HWDEP_IFACE_PCXHR, /* Digigram PCXHR */
4979+ SNDRV_HWDEP_IFACE_SB_RC, /* SB Extigy/Audigy2NX remote control */
4980+ SNDRV_HWDEP_IFACE_HDA, /* HD-audio */
4981+ SNDRV_HWDEP_IFACE_USB_STREAM, /* direct access to usb stream */
4982+ SNDRV_HWDEP_IFACE_FW_DICE, /* TC DICE FireWire device */
4983+ SNDRV_HWDEP_IFACE_FW_FIREWORKS, /* Echo Audio Fireworks based device */
4984+ SNDRV_HWDEP_IFACE_FW_BEBOB, /* BridgeCo BeBoB based device */
4985+ SNDRV_HWDEP_IFACE_FW_OXFW, /* Oxford OXFW970/971 based device */
4986+ SNDRV_HWDEP_IFACE_FW_DIGI00X, /* Digidesign Digi 002/003 family */
4987+ SNDRV_HWDEP_IFACE_FW_TASCAM, /* TASCAM FireWire series */
4988+ SNDRV_HWDEP_IFACE_LINE6, /* Line6 USB processors */
4989+ SNDRV_HWDEP_IFACE_FW_MOTU, /* MOTU FireWire series */
4990+ SNDRV_HWDEP_IFACE_FW_FIREFACE, /* RME Fireface series */
4991+
4992+ /* Don't forget to change the following: */
4993+ SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_FW_FIREFACE
4994+};
4995+
4996+struct snd_hwdep_info {
4997+ unsigned int device; /* WR: device number */
4998+ int card; /* R: card number */
4999+ unsigned char id[64]; /* ID (user selectable) */
5000+ unsigned char name[80]; /* hwdep name */
5001+ int iface; /* hwdep interface */
5002+ unsigned char reserved[64]; /* reserved for future */
5003+};
5004+
5005+/* generic DSP loader */
5006+struct snd_hwdep_dsp_status {
5007+ unsigned int version; /* R: driver-specific version */
5008+ unsigned char id[32]; /* R: driver-specific ID string */
5009+ unsigned int num_dsps; /* R: number of DSP images to transfer */
5010+ unsigned int dsp_loaded; /* R: bit flags indicating the loaded DSPs */
5011+ unsigned int chip_ready; /* R: 1 = initialization finished */
5012+ unsigned char reserved[16]; /* reserved for future use */
5013+};
5014+
5015+struct snd_hwdep_dsp_image {
5016+ unsigned int index; /* W: DSP index */
5017+ unsigned char name[64]; /* W: ID (e.g. file name) */
5018+ unsigned char __user *image; /* W: binary image */
5019+ size_t length; /* W: size of image in bytes */
5020+ unsigned long driver_data; /* W: driver-specific data */
5021+};
5022+
5023+#define SNDRV_HWDEP_IOCTL_PVERSION _IOR ('H', 0x00, int)
5024+#define SNDRV_HWDEP_IOCTL_INFO _IOR ('H', 0x01, struct snd_hwdep_info)
5025+#define SNDRV_HWDEP_IOCTL_DSP_STATUS _IOR('H', 0x02, struct snd_hwdep_dsp_status)
5026+#define SNDRV_HWDEP_IOCTL_DSP_LOAD _IOW('H', 0x03, struct snd_hwdep_dsp_image)
5027+
5028+/*****************************************************************************
5029+ * *
5030+ * Digital Audio (PCM) interface - /dev/snd/pcm?? *
5031+ * *
5032+ *****************************************************************************/
5033+
5034+#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 14)
5035+
5036+typedef unsigned long snd_pcm_uframes_t;
5037+typedef signed long snd_pcm_sframes_t;
5038+
5039+enum {
5040+ SNDRV_PCM_CLASS_GENERIC = 0, /* standard mono or stereo device */
5041+ SNDRV_PCM_CLASS_MULTI, /* multichannel device */
5042+ SNDRV_PCM_CLASS_MODEM, /* software modem class */
5043+ SNDRV_PCM_CLASS_DIGITIZER, /* digitizer class */
5044+ /* Don't forget to change the following: */
5045+ SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
5046+};
5047+
5048+enum {
5049+ SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */
5050+ SNDRV_PCM_SUBCLASS_MULTI_MIX, /* multichannel subdevices are mixed together */
5051+ /* Don't forget to change the following: */
5052+ SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX,
5053+};
5054+
5055+enum {
5056+ SNDRV_PCM_STREAM_PLAYBACK = 0,
5057+ SNDRV_PCM_STREAM_CAPTURE,
5058+ SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
5059+};
5060+
5061+typedef int __bitwise snd_pcm_access_t;
5062+#define SNDRV_PCM_ACCESS_MMAP_INTERLEAVED ((__force snd_pcm_access_t) 0) /* interleaved mmap */
5063+#define SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED ((__force snd_pcm_access_t) 1) /* noninterleaved mmap */
5064+#define SNDRV_PCM_ACCESS_MMAP_COMPLEX ((__force snd_pcm_access_t) 2) /* complex mmap */
5065+#define SNDRV_PCM_ACCESS_RW_INTERLEAVED ((__force snd_pcm_access_t) 3) /* readi/writei */
5066+#define SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ((__force snd_pcm_access_t) 4) /* readn/writen */
5067+#define SNDRV_PCM_ACCESS_LAST SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
5068+
5069+typedef int __bitwise snd_pcm_format_t;
5070+#define SNDRV_PCM_FORMAT_S8 ((__force snd_pcm_format_t) 0)
5071+#define SNDRV_PCM_FORMAT_U8 ((__force snd_pcm_format_t) 1)
5072+#define SNDRV_PCM_FORMAT_S16_LE ((__force snd_pcm_format_t) 2)
5073+#define SNDRV_PCM_FORMAT_S16_BE ((__force snd_pcm_format_t) 3)
5074+#define SNDRV_PCM_FORMAT_U16_LE ((__force snd_pcm_format_t) 4)
5075+#define SNDRV_PCM_FORMAT_U16_BE ((__force snd_pcm_format_t) 5)
5076+#define SNDRV_PCM_FORMAT_S24_LE ((__force snd_pcm_format_t) 6) /* low three bytes */
5077+#define SNDRV_PCM_FORMAT_S24_BE ((__force snd_pcm_format_t) 7) /* low three bytes */
5078+#define SNDRV_PCM_FORMAT_U24_LE ((__force snd_pcm_format_t) 8) /* low three bytes */
5079+#define SNDRV_PCM_FORMAT_U24_BE ((__force snd_pcm_format_t) 9) /* low three bytes */
5080+#define SNDRV_PCM_FORMAT_S32_LE ((__force snd_pcm_format_t) 10)
5081+#define SNDRV_PCM_FORMAT_S32_BE ((__force snd_pcm_format_t) 11)
5082+#define SNDRV_PCM_FORMAT_U32_LE ((__force snd_pcm_format_t) 12)
5083+#define SNDRV_PCM_FORMAT_U32_BE ((__force snd_pcm_format_t) 13)
5084+#define SNDRV_PCM_FORMAT_FLOAT_LE ((__force snd_pcm_format_t) 14) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
5085+#define SNDRV_PCM_FORMAT_FLOAT_BE ((__force snd_pcm_format_t) 15) /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
5086+#define SNDRV_PCM_FORMAT_FLOAT64_LE ((__force snd_pcm_format_t) 16) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
5087+#define SNDRV_PCM_FORMAT_FLOAT64_BE ((__force snd_pcm_format_t) 17) /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
5088+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
5089+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
5090+#define SNDRV_PCM_FORMAT_MU_LAW ((__force snd_pcm_format_t) 20)
5091+#define SNDRV_PCM_FORMAT_A_LAW ((__force snd_pcm_format_t) 21)
5092+#define SNDRV_PCM_FORMAT_IMA_ADPCM ((__force snd_pcm_format_t) 22)
5093+#define SNDRV_PCM_FORMAT_MPEG ((__force snd_pcm_format_t) 23)
5094+#define SNDRV_PCM_FORMAT_GSM ((__force snd_pcm_format_t) 24)
5095+#define SNDRV_PCM_FORMAT_S20_LE ((__force snd_pcm_format_t) 25) /* in four bytes, LSB justified */
5096+#define SNDRV_PCM_FORMAT_S20_BE ((__force snd_pcm_format_t) 26) /* in four bytes, LSB justified */
5097+#define SNDRV_PCM_FORMAT_U20_LE ((__force snd_pcm_format_t) 27) /* in four bytes, LSB justified */
5098+#define SNDRV_PCM_FORMAT_U20_BE ((__force snd_pcm_format_t) 28) /* in four bytes, LSB justified */
5099+/* gap in the numbering for a future standard linear format */
5100+#define SNDRV_PCM_FORMAT_SPECIAL ((__force snd_pcm_format_t) 31)
5101+#define SNDRV_PCM_FORMAT_S24_3LE ((__force snd_pcm_format_t) 32) /* in three bytes */
5102+#define SNDRV_PCM_FORMAT_S24_3BE ((__force snd_pcm_format_t) 33) /* in three bytes */
5103+#define SNDRV_PCM_FORMAT_U24_3LE ((__force snd_pcm_format_t) 34) /* in three bytes */
5104+#define SNDRV_PCM_FORMAT_U24_3BE ((__force snd_pcm_format_t) 35) /* in three bytes */
5105+#define SNDRV_PCM_FORMAT_S20_3LE ((__force snd_pcm_format_t) 36) /* in three bytes */
5106+#define SNDRV_PCM_FORMAT_S20_3BE ((__force snd_pcm_format_t) 37) /* in three bytes */
5107+#define SNDRV_PCM_FORMAT_U20_3LE ((__force snd_pcm_format_t) 38) /* in three bytes */
5108+#define SNDRV_PCM_FORMAT_U20_3BE ((__force snd_pcm_format_t) 39) /* in three bytes */
5109+#define SNDRV_PCM_FORMAT_S18_3LE ((__force snd_pcm_format_t) 40) /* in three bytes */
5110+#define SNDRV_PCM_FORMAT_S18_3BE ((__force snd_pcm_format_t) 41) /* in three bytes */
5111+#define SNDRV_PCM_FORMAT_U18_3LE ((__force snd_pcm_format_t) 42) /* in three bytes */
5112+#define SNDRV_PCM_FORMAT_U18_3BE ((__force snd_pcm_format_t) 43) /* in three bytes */
5113+#define SNDRV_PCM_FORMAT_G723_24 ((__force snd_pcm_format_t) 44) /* 8 samples in 3 bytes */
5114+#define SNDRV_PCM_FORMAT_G723_24_1B ((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */
5115+#define SNDRV_PCM_FORMAT_G723_40 ((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
5116+#define SNDRV_PCM_FORMAT_G723_40_1B ((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */
5117+#define SNDRV_PCM_FORMAT_DSD_U8 ((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
5118+#define SNDRV_PCM_FORMAT_DSD_U16_LE ((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
5119+#define SNDRV_PCM_FORMAT_DSD_U32_LE ((__force snd_pcm_format_t) 50) /* DSD, 4-byte samples DSD (x32), little endian */
5120+#define SNDRV_PCM_FORMAT_DSD_U16_BE ((__force snd_pcm_format_t) 51) /* DSD, 2-byte samples DSD (x16), big endian */
5121+#define SNDRV_PCM_FORMAT_DSD_U32_BE ((__force snd_pcm_format_t) 52) /* DSD, 4-byte samples DSD (x32), big endian */
5122+#define SNDRV_PCM_FORMAT_LAST SNDRV_PCM_FORMAT_DSD_U32_BE
5123+#define SNDRV_PCM_FORMAT_FIRST SNDRV_PCM_FORMAT_S8
5124+
5125+#ifdef SNDRV_LITTLE_ENDIAN
5126+#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_LE
5127+#define SNDRV_PCM_FORMAT_U16 SNDRV_PCM_FORMAT_U16_LE
5128+#define SNDRV_PCM_FORMAT_S24 SNDRV_PCM_FORMAT_S24_LE
5129+#define SNDRV_PCM_FORMAT_U24 SNDRV_PCM_FORMAT_U24_LE
5130+#define SNDRV_PCM_FORMAT_S32 SNDRV_PCM_FORMAT_S32_LE
5131+#define SNDRV_PCM_FORMAT_U32 SNDRV_PCM_FORMAT_U32_LE
5132+#define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_LE
5133+#define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_LE
5134+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE
5135+#define SNDRV_PCM_FORMAT_S20 SNDRV_PCM_FORMAT_S20_LE
5136+#define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_LE
5137+#endif
5138+#ifdef SNDRV_BIG_ENDIAN
5139+#define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_BE
5140+#define SNDRV_PCM_FORMAT_U16 SNDRV_PCM_FORMAT_U16_BE
5141+#define SNDRV_PCM_FORMAT_S24 SNDRV_PCM_FORMAT_S24_BE
5142+#define SNDRV_PCM_FORMAT_U24 SNDRV_PCM_FORMAT_U24_BE
5143+#define SNDRV_PCM_FORMAT_S32 SNDRV_PCM_FORMAT_S32_BE
5144+#define SNDRV_PCM_FORMAT_U32 SNDRV_PCM_FORMAT_U32_BE
5145+#define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_BE
5146+#define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_BE
5147+#define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE
5148+#define SNDRV_PCM_FORMAT_S20 SNDRV_PCM_FORMAT_S20_BE
5149+#define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_BE
5150+#endif
5151+
5152+typedef int __bitwise snd_pcm_subformat_t;
5153+#define SNDRV_PCM_SUBFORMAT_STD ((__force snd_pcm_subformat_t) 0)
5154+#define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_STD
5155+
5156+#define SNDRV_PCM_INFO_MMAP 0x00000001 /* hardware supports mmap */
5157+#define SNDRV_PCM_INFO_MMAP_VALID 0x00000002 /* period data are valid during transfer */
5158+#define SNDRV_PCM_INFO_DOUBLE 0x00000004 /* Double buffering needed for PCM start/stop */
5159+#define SNDRV_PCM_INFO_BATCH 0x00000010 /* double buffering */
5160+#define SNDRV_PCM_INFO_SYNC_APPLPTR 0x00000020 /* need the explicit sync of appl_ptr update */
5161+#define SNDRV_PCM_INFO_INTERLEAVED 0x00000100 /* channels are interleaved */
5162+#define SNDRV_PCM_INFO_NONINTERLEAVED 0x00000200 /* channels are not interleaved */
5163+#define SNDRV_PCM_INFO_COMPLEX 0x00000400 /* complex frame organization (mmap only) */
5164+#define SNDRV_PCM_INFO_BLOCK_TRANSFER 0x00010000 /* hardware transfer block of samples */
5165+#define SNDRV_PCM_INFO_OVERRANGE 0x00020000 /* hardware supports ADC (capture) overrange detection */
5166+#define SNDRV_PCM_INFO_RESUME 0x00040000 /* hardware supports stream resume after suspend */
5167+#define SNDRV_PCM_INFO_PAUSE 0x00080000 /* pause ioctl is supported */
5168+#define SNDRV_PCM_INFO_HALF_DUPLEX 0x00100000 /* only half duplex */
5169+#define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */
5170+#define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */
5171+#define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 0x00800000 /* period wakeup can be disabled */
5172+#define SNDRV_PCM_INFO_HAS_WALL_CLOCK 0x01000000 /* (Deprecated)has audio wall clock for audio/system time sync */
5173+#define SNDRV_PCM_INFO_HAS_LINK_ATIME 0x01000000 /* report hardware link audio time, reset on startup */
5174+#define SNDRV_PCM_INFO_HAS_LINK_ABSOLUTE_ATIME 0x02000000 /* report absolute hardware link audio time, not reset on startup */
5175+#define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME 0x04000000 /* report estimated link audio time */
5176+#define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000 /* report synchronized audio/system time */
5177+
5178+#define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */
5179+#define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */
5180+
5181+
5182+
5183+typedef int __bitwise snd_pcm_state_t;
5184+#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */
5185+#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1) /* stream has a setup */
5186+#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2) /* stream is ready to start */
5187+#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3) /* stream is running */
5188+#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4) /* stream reached an xrun */
5189+#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5) /* stream is draining */
5190+#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6) /* stream is paused */
5191+#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7) /* hardware is suspended */
5192+#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8) /* hardware is disconnected */
5193+#define SNDRV_PCM_STATE_LAST SNDRV_PCM_STATE_DISCONNECTED
5194+
5195+enum {
5196+ SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
5197+ SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
5198+ SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
5199+};
5200+
5201+union snd_pcm_sync_id {
5202+ unsigned char id[16];
5203+ unsigned short id16[8];
5204+ unsigned int id32[4];
5205+};
5206+
5207+struct snd_pcm_info {
5208+ unsigned int device; /* RO/WR (control): device number */
5209+ unsigned int subdevice; /* RO/WR (control): subdevice number */
5210+ int stream; /* RO/WR (control): stream direction */
5211+ int card; /* R: card number */
5212+ unsigned char id[64]; /* ID (user selectable) */
5213+ unsigned char name[80]; /* name of this device */
5214+ unsigned char subname[32]; /* subdevice name */
5215+ int dev_class; /* SNDRV_PCM_CLASS_* */
5216+ int dev_subclass; /* SNDRV_PCM_SUBCLASS_* */
5217+ unsigned int subdevices_count;
5218+ unsigned int subdevices_avail;
5219+ union snd_pcm_sync_id sync; /* hardware synchronization ID */
5220+ unsigned char reserved[64]; /* reserved for future... */
5221+};
5222+
5223+typedef int snd_pcm_hw_param_t;
5224+#define SNDRV_PCM_HW_PARAM_ACCESS 0 /* Access type */
5225+#define SNDRV_PCM_HW_PARAM_FORMAT 1 /* Format */
5226+#define SNDRV_PCM_HW_PARAM_SUBFORMAT 2 /* Subformat */
5227+#define SNDRV_PCM_HW_PARAM_FIRST_MASK SNDRV_PCM_HW_PARAM_ACCESS
5228+#define SNDRV_PCM_HW_PARAM_LAST_MASK SNDRV_PCM_HW_PARAM_SUBFORMAT
5229+
5230+#define SNDRV_PCM_HW_PARAM_SAMPLE_BITS 8 /* Bits per sample */
5231+#define SNDRV_PCM_HW_PARAM_FRAME_BITS 9 /* Bits per frame */
5232+#define SNDRV_PCM_HW_PARAM_CHANNELS 10 /* Channels */
5233+#define SNDRV_PCM_HW_PARAM_RATE 11 /* Approx rate */
5234+#define SNDRV_PCM_HW_PARAM_PERIOD_TIME 12 /* Approx distance between
5235+ * interrupts in us
5236+ */
5237+#define SNDRV_PCM_HW_PARAM_PERIOD_SIZE 13 /* Approx frames between
5238+ * interrupts
5239+ */
5240+#define SNDRV_PCM_HW_PARAM_PERIOD_BYTES 14 /* Approx bytes between
5241+ * interrupts
5242+ */
5243+#define SNDRV_PCM_HW_PARAM_PERIODS 15 /* Approx interrupts per
5244+ * buffer
5245+ */
5246+#define SNDRV_PCM_HW_PARAM_BUFFER_TIME 16 /* Approx duration of buffer
5247+ * in us
5248+ */
5249+#define SNDRV_PCM_HW_PARAM_BUFFER_SIZE 17 /* Size of buffer in frames */
5250+#define SNDRV_PCM_HW_PARAM_BUFFER_BYTES 18 /* Size of buffer in bytes */
5251+#define SNDRV_PCM_HW_PARAM_TICK_TIME 19 /* Approx tick duration in us */
5252+#define SNDRV_PCM_HW_PARAM_FIRST_INTERVAL SNDRV_PCM_HW_PARAM_SAMPLE_BITS
5253+#define SNDRV_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_TICK_TIME
5254+
5255+#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */
5256+#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1<<1) /* export buffer */
5257+#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1<<2) /* disable period wakeups */
5258+
5259+struct snd_interval {
5260+ unsigned int min, max;
5261+ unsigned int openmin:1,
5262+ openmax:1,
5263+ integer:1,
5264+ empty:1;
5265+};
5266+
5267+#define SNDRV_MASK_MAX 256
5268+
5269+struct snd_mask {
5270+ __u32 bits[(SNDRV_MASK_MAX+31)/32];
5271+};
5272+
5273+struct snd_pcm_hw_params {
5274+ unsigned int flags;
5275+ struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
5276+ SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
5277+ struct snd_mask mres[5]; /* reserved masks */
5278+ struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
5279+ SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
5280+ struct snd_interval ires[9]; /* reserved intervals */
5281+ unsigned int rmask; /* W: requested masks */
5282+ unsigned int cmask; /* R: changed masks */
5283+ unsigned int info; /* R: Info flags for returned setup */
5284+ unsigned int msbits; /* R: used most significant bits */
5285+ unsigned int rate_num; /* R: rate numerator */
5286+ unsigned int rate_den; /* R: rate denominator */
5287+ snd_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */
5288+ unsigned char reserved[64]; /* reserved for future */
5289+};
5290+
5291+enum {
5292+ SNDRV_PCM_TSTAMP_NONE = 0,
5293+ SNDRV_PCM_TSTAMP_ENABLE,
5294+ SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_ENABLE,
5295+};
5296+
5297+struct snd_pcm_sw_params {
5298+ int tstamp_mode; /* timestamp mode */
5299+ unsigned int period_step;
5300+ unsigned int sleep_min; /* min ticks to sleep */
5301+ snd_pcm_uframes_t avail_min; /* min avail frames for wakeup */
5302+ snd_pcm_uframes_t xfer_align; /* obsolete: xfer size need to be a multiple */
5303+ snd_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */
5304+ snd_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */
5305+ snd_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */
5306+ snd_pcm_uframes_t silence_size; /* silence block size */
5307+ snd_pcm_uframes_t boundary; /* pointers wrap point */
5308+ unsigned int proto; /* protocol version */
5309+ unsigned int tstamp_type; /* timestamp type (req. proto >= 2.0.12) */
5310+ unsigned char reserved[56]; /* reserved for future */
5311+};
5312+
5313+struct snd_pcm_channel_info {
5314+ unsigned int channel;
5315+ __kernel_off_t offset; /* mmap offset */
5316+ unsigned int first; /* offset to first sample in bits */
5317+ unsigned int step; /* samples distance in bits */
5318+};
5319+
5320+enum {
5321+ /*
5322+ * first definition for backwards compatibility only,
5323+ * maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
5324+ */
5325+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
5326+
5327+ /* timestamp definitions */
5328+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1, /* DMA time, reported as per hw_ptr */
5329+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK = 2, /* link time reported by sample or wallclock counter, reset on startup */
5330+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3, /* link time reported by sample or wallclock counter, not reset on startup */
5331+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4, /* link time estimated indirectly */
5332+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /* link time synchronized with system time */
5333+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
5334+};
5335+
5336+struct snd_pcm_status {
5337+ snd_pcm_state_t state; /* stream state */
5338+ struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */
5339+ struct timespec tstamp; /* reference timestamp */
5340+ snd_pcm_uframes_t appl_ptr; /* appl ptr */
5341+ snd_pcm_uframes_t hw_ptr; /* hw ptr */
5342+ snd_pcm_sframes_t delay; /* current delay in frames */
5343+ snd_pcm_uframes_t avail; /* number of frames available */
5344+ snd_pcm_uframes_t avail_max; /* max frames available on hw since last status */
5345+ snd_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */
5346+ snd_pcm_state_t suspended_state; /* suspended stream state */
5347+ __u32 audio_tstamp_data; /* needed for 64-bit alignment, used for configs/report to/from userspace */
5348+ struct timespec audio_tstamp; /* sample counter, wall clock, PHC or on-demand sync'ed */
5349+ struct timespec driver_tstamp; /* useful in case reference system tstamp is reported with delay */
5350+ __u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */
5351+ unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */
5352+};
5353+
5354+struct snd_pcm_mmap_status {
5355+ snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
5356+ int pad1; /* Needed for 64 bit alignment */
5357+ snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
5358+ struct timespec tstamp; /* Timestamp */
5359+ snd_pcm_state_t suspended_state; /* RO: suspended stream state */
5360+ struct timespec audio_tstamp; /* from sample counter or wall clock */
5361+};
5362+
5363+struct snd_pcm_mmap_control {
5364+ snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */
5365+ snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */
5366+};
5367+
5368+#define SNDRV_PCM_SYNC_PTR_HWSYNC (1<<0) /* execute hwsync */
5369+#define SNDRV_PCM_SYNC_PTR_APPL (1<<1) /* get appl_ptr from driver (r/w op) */
5370+#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN (1<<2) /* get avail_min from driver */
5371+
5372+struct snd_pcm_sync_ptr {
5373+ unsigned int flags;
5374+ union {
5375+ struct snd_pcm_mmap_status status;
5376+ unsigned char reserved[64];
5377+ } s;
5378+ union {
5379+ struct snd_pcm_mmap_control control;
5380+ unsigned char reserved[64];
5381+ } c;
5382+};
5383+
5384+struct snd_xferi {
5385+ snd_pcm_sframes_t result;
5386+ void __user *buf;
5387+ snd_pcm_uframes_t frames;
5388+};
5389+
5390+struct snd_xfern {
5391+ snd_pcm_sframes_t result;
5392+ void __user * __user *bufs;
5393+ snd_pcm_uframes_t frames;
5394+};
5395+
5396+enum {
5397+ SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0, /* gettimeofday equivalent */
5398+ SNDRV_PCM_TSTAMP_TYPE_MONOTONIC, /* posix_clock_monotonic equivalent */
5399+ SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW, /* monotonic_raw (no NTP) */
5400+ SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
5401+};
5402+
5403+/* channel positions */
5404+enum {
5405+ SNDRV_CHMAP_UNKNOWN = 0,
5406+ SNDRV_CHMAP_NA, /* N/A, silent */
5407+ SNDRV_CHMAP_MONO, /* mono stream */
5408+ /* this follows the alsa-lib mixer channel value + 3 */
5409+ SNDRV_CHMAP_FL, /* front left */
5410+ SNDRV_CHMAP_FR, /* front right */
5411+ SNDRV_CHMAP_RL, /* rear left */
5412+ SNDRV_CHMAP_RR, /* rear right */
5413+ SNDRV_CHMAP_FC, /* front center */
5414+ SNDRV_CHMAP_LFE, /* LFE */
5415+ SNDRV_CHMAP_SL, /* side left */
5416+ SNDRV_CHMAP_SR, /* side right */
5417+ SNDRV_CHMAP_RC, /* rear center */
5418+ /* new definitions */
5419+ SNDRV_CHMAP_FLC, /* front left center */
5420+ SNDRV_CHMAP_FRC, /* front right center */
5421+ SNDRV_CHMAP_RLC, /* rear left center */
5422+ SNDRV_CHMAP_RRC, /* rear right center */
5423+ SNDRV_CHMAP_FLW, /* front left wide */
5424+ SNDRV_CHMAP_FRW, /* front right wide */
5425+ SNDRV_CHMAP_FLH, /* front left high */
5426+ SNDRV_CHMAP_FCH, /* front center high */
5427+ SNDRV_CHMAP_FRH, /* front right high */
5428+ SNDRV_CHMAP_TC, /* top center */
5429+ SNDRV_CHMAP_TFL, /* top front left */
5430+ SNDRV_CHMAP_TFR, /* top front right */
5431+ SNDRV_CHMAP_TFC, /* top front center */
5432+ SNDRV_CHMAP_TRL, /* top rear left */
5433+ SNDRV_CHMAP_TRR, /* top rear right */
5434+ SNDRV_CHMAP_TRC, /* top rear center */
5435+ /* new definitions for UAC2 */
5436+ SNDRV_CHMAP_TFLC, /* top front left center */
5437+ SNDRV_CHMAP_TFRC, /* top front right center */
5438+ SNDRV_CHMAP_TSL, /* top side left */
5439+ SNDRV_CHMAP_TSR, /* top side right */
5440+ SNDRV_CHMAP_LLFE, /* left LFE */
5441+ SNDRV_CHMAP_RLFE, /* right LFE */
5442+ SNDRV_CHMAP_BC, /* bottom center */
5443+ SNDRV_CHMAP_BLC, /* bottom left center */
5444+ SNDRV_CHMAP_BRC, /* bottom right center */
5445+ SNDRV_CHMAP_LAST = SNDRV_CHMAP_BRC,
5446+};
5447+
5448+#define SNDRV_CHMAP_POSITION_MASK 0xffff
5449+#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
5450+#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
5451+
5452+#define SNDRV_PCM_IOCTL_PVERSION _IOR('A', 0x00, int)
5453+#define SNDRV_PCM_IOCTL_INFO _IOR('A', 0x01, struct snd_pcm_info)
5454+#define SNDRV_PCM_IOCTL_TSTAMP _IOW('A', 0x02, int)
5455+#define SNDRV_PCM_IOCTL_TTSTAMP _IOW('A', 0x03, int)
5456+#define SNDRV_PCM_IOCTL_USER_PVERSION _IOW('A', 0x04, int)
5457+#define SNDRV_PCM_IOCTL_HW_REFINE _IOWR('A', 0x10, struct snd_pcm_hw_params)
5458+#define SNDRV_PCM_IOCTL_HW_PARAMS _IOWR('A', 0x11, struct snd_pcm_hw_params)
5459+#define SNDRV_PCM_IOCTL_HW_FREE _IO('A', 0x12)
5460+#define SNDRV_PCM_IOCTL_SW_PARAMS _IOWR('A', 0x13, struct snd_pcm_sw_params)
5461+#define SNDRV_PCM_IOCTL_STATUS _IOR('A', 0x20, struct snd_pcm_status)
5462+#define SNDRV_PCM_IOCTL_DELAY _IOR('A', 0x21, snd_pcm_sframes_t)
5463+#define SNDRV_PCM_IOCTL_HWSYNC _IO('A', 0x22)
5464+#define SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct snd_pcm_sync_ptr)
5465+#define SNDRV_PCM_IOCTL_STATUS_EXT _IOWR('A', 0x24, struct snd_pcm_status)
5466+#define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info)
5467+#define SNDRV_PCM_IOCTL_PREPARE _IO('A', 0x40)
5468+#define SNDRV_PCM_IOCTL_RESET _IO('A', 0x41)
5469+#define SNDRV_PCM_IOCTL_START _IO('A', 0x42)
5470+#define SNDRV_PCM_IOCTL_DROP _IO('A', 0x43)
5471+#define SNDRV_PCM_IOCTL_DRAIN _IO('A', 0x44)
5472+#define SNDRV_PCM_IOCTL_PAUSE _IOW('A', 0x45, int)
5473+#define SNDRV_PCM_IOCTL_REWIND _IOW('A', 0x46, snd_pcm_uframes_t)
5474+#define SNDRV_PCM_IOCTL_RESUME _IO('A', 0x47)
5475+#define SNDRV_PCM_IOCTL_XRUN _IO('A', 0x48)
5476+#define SNDRV_PCM_IOCTL_FORWARD _IOW('A', 0x49, snd_pcm_uframes_t)
5477+#define SNDRV_PCM_IOCTL_WRITEI_FRAMES _IOW('A', 0x50, struct snd_xferi)
5478+#define SNDRV_PCM_IOCTL_READI_FRAMES _IOR('A', 0x51, struct snd_xferi)
5479+#define SNDRV_PCM_IOCTL_WRITEN_FRAMES _IOW('A', 0x52, struct snd_xfern)
5480+#define SNDRV_PCM_IOCTL_READN_FRAMES _IOR('A', 0x53, struct snd_xfern)
5481+#define SNDRV_PCM_IOCTL_LINK _IOW('A', 0x60, int)
5482+#define SNDRV_PCM_IOCTL_UNLINK _IO('A', 0x61)
5483+
5484+/*****************************************************************************
5485+ * *
5486+ * MIDI v1.0 interface *
5487+ * *
5488+ *****************************************************************************/
5489+
5490+/*
5491+ * Raw MIDI section - /dev/snd/midi??
5492+ */
5493+
5494+#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0)
5495+
5496+enum {
5497+ SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
5498+ SNDRV_RAWMIDI_STREAM_INPUT,
5499+ SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
5500+};
5501+
5502+#define SNDRV_RAWMIDI_INFO_OUTPUT 0x00000001
5503+#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
5504+#define SNDRV_RAWMIDI_INFO_DUPLEX 0x00000004
5505+
5506+struct snd_rawmidi_info {
5507+ unsigned int device; /* RO/WR (control): device number */
5508+ unsigned int subdevice; /* RO/WR (control): subdevice number */
5509+ int stream; /* WR: stream */
5510+ int card; /* R: card number */
5511+ unsigned int flags; /* SNDRV_RAWMIDI_INFO_XXXX */
5512+ unsigned char id[64]; /* ID (user selectable) */
5513+ unsigned char name[80]; /* name of device */
5514+ unsigned char subname[32]; /* name of active or selected subdevice */
5515+ unsigned int subdevices_count;
5516+ unsigned int subdevices_avail;
5517+ unsigned char reserved[64]; /* reserved for future use */
5518+};
5519+
5520+struct snd_rawmidi_params {
5521+ int stream;
5522+ size_t buffer_size; /* queue size in bytes */
5523+ size_t avail_min; /* minimum avail bytes for wakeup */
5524+ unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
5525+ unsigned char reserved[16]; /* reserved for future use */
5526+};
5527+
5528+struct snd_rawmidi_status {
5529+ int stream;
5530+ struct timespec tstamp; /* Timestamp */
5531+ size_t avail; /* available bytes */
5532+ size_t xruns; /* count of overruns since last status (in bytes) */
5533+ unsigned char reserved[16]; /* reserved for future use */
5534+};
5535+
5536+#define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int)
5537+#define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info)
5538+#define SNDRV_RAWMIDI_IOCTL_PARAMS _IOWR('W', 0x10, struct snd_rawmidi_params)
5539+#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
5540+#define SNDRV_RAWMIDI_IOCTL_DROP _IOW('W', 0x30, int)
5541+#define SNDRV_RAWMIDI_IOCTL_DRAIN _IOW('W', 0x31, int)
5542+
5543+/*
5544+ * Timer section - /dev/snd/timer
5545+ */
5546+
5547+#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 6)
5548+
5549+enum {
5550+ SNDRV_TIMER_CLASS_NONE = -1,
5551+ SNDRV_TIMER_CLASS_SLAVE = 0,
5552+ SNDRV_TIMER_CLASS_GLOBAL,
5553+ SNDRV_TIMER_CLASS_CARD,
5554+ SNDRV_TIMER_CLASS_PCM,
5555+ SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
5556+};
5557+
5558+/* slave timer classes */
5559+enum {
5560+ SNDRV_TIMER_SCLASS_NONE = 0,
5561+ SNDRV_TIMER_SCLASS_APPLICATION,
5562+ SNDRV_TIMER_SCLASS_SEQUENCER, /* alias */
5563+ SNDRV_TIMER_SCLASS_OSS_SEQUENCER, /* alias */
5564+ SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
5565+};
5566+
5567+/* global timers (device member) */
5568+#define SNDRV_TIMER_GLOBAL_SYSTEM 0
5569+#define SNDRV_TIMER_GLOBAL_RTC 1 /* unused */
5570+#define SNDRV_TIMER_GLOBAL_HPET 2
5571+#define SNDRV_TIMER_GLOBAL_HRTIMER 3
5572+
5573+/* info flags */
5574+#define SNDRV_TIMER_FLG_SLAVE (1<<0) /* cannot be controlled */
5575+
5576+struct snd_timer_id {
5577+ int dev_class;
5578+ int dev_sclass;
5579+ int card;
5580+ int device;
5581+ int subdevice;
5582+};
5583+
5584+struct snd_timer_ginfo {
5585+ struct snd_timer_id tid; /* requested timer ID */
5586+ unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
5587+ int card; /* card number */
5588+ unsigned char id[64]; /* timer identification */
5589+ unsigned char name[80]; /* timer name */
5590+ unsigned long reserved0; /* reserved for future use */
5591+ unsigned long resolution; /* average period resolution in ns */
5592+ unsigned long resolution_min; /* minimal period resolution in ns */
5593+ unsigned long resolution_max; /* maximal period resolution in ns */
5594+ unsigned int clients; /* active timer clients */
5595+ unsigned char reserved[32];
5596+};
5597+
5598+struct snd_timer_gparams {
5599+ struct snd_timer_id tid; /* requested timer ID */
5600+ unsigned long period_num; /* requested precise period duration (in seconds) - numerator */
5601+ unsigned long period_den; /* requested precise period duration (in seconds) - denominator */
5602+ unsigned char reserved[32];
5603+};
5604+
5605+struct snd_timer_gstatus {
5606+ struct snd_timer_id tid; /* requested timer ID */
5607+ unsigned long resolution; /* current period resolution in ns */
5608+ unsigned long resolution_num; /* precise current period resolution (in seconds) - numerator */
5609+ unsigned long resolution_den; /* precise current period resolution (in seconds) - denominator */
5610+ unsigned char reserved[32];
5611+};
5612+
5613+struct snd_timer_select {
5614+ struct snd_timer_id id; /* bind to timer ID */
5615+ unsigned char reserved[32]; /* reserved */
5616+};
5617+
5618+struct snd_timer_info {
5619+ unsigned int flags; /* timer flags - SNDRV_TIMER_FLG_* */
5620+ int card; /* card number */
5621+ unsigned char id[64]; /* timer identificator */
5622+ unsigned char name[80]; /* timer name */
5623+ unsigned long reserved0; /* reserved for future use */
5624+ unsigned long resolution; /* average period resolution in ns */
5625+ unsigned char reserved[64]; /* reserved */
5626+};
5627+
5628+#define SNDRV_TIMER_PSFLG_AUTO (1<<0) /* auto start, otherwise one-shot */
5629+#define SNDRV_TIMER_PSFLG_EXCLUSIVE (1<<1) /* exclusive use, precise start/stop/pause/continue */
5630+#define SNDRV_TIMER_PSFLG_EARLY_EVENT (1<<2) /* write early event to the poll queue */
5631+
5632+struct snd_timer_params {
5633+ unsigned int flags; /* flags - SNDRV_TIMER_PSFLG_* */
5634+ unsigned int ticks; /* requested resolution in ticks */
5635+ unsigned int queue_size; /* total size of queue (32-1024) */
5636+ unsigned int reserved0; /* reserved, was: failure locations */
5637+ unsigned int filter; /* event filter (bitmask of SNDRV_TIMER_EVENT_*) */
5638+ unsigned char reserved[60]; /* reserved */
5639+};
5640+
5641+struct snd_timer_status {
5642+ struct timespec tstamp; /* Timestamp - last update */
5643+ unsigned int resolution; /* current period resolution in ns */
5644+ unsigned int lost; /* counter of master tick lost */
5645+ unsigned int overrun; /* count of read queue overruns */
5646+ unsigned int queue; /* used queue size */
5647+ unsigned char reserved[64]; /* reserved */
5648+};
5649+
5650+#define SNDRV_TIMER_IOCTL_PVERSION _IOR('T', 0x00, int)
5651+#define SNDRV_TIMER_IOCTL_NEXT_DEVICE _IOWR('T', 0x01, struct snd_timer_id)
5652+#define SNDRV_TIMER_IOCTL_TREAD _IOW('T', 0x02, int)
5653+#define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo)
5654+#define SNDRV_TIMER_IOCTL_GPARAMS _IOW('T', 0x04, struct snd_timer_gparams)
5655+#define SNDRV_TIMER_IOCTL_GSTATUS _IOWR('T', 0x05, struct snd_timer_gstatus)
5656+#define SNDRV_TIMER_IOCTL_SELECT _IOW('T', 0x10, struct snd_timer_select)
5657+#define SNDRV_TIMER_IOCTL_INFO _IOR('T', 0x11, struct snd_timer_info)
5658+#define SNDRV_TIMER_IOCTL_PARAMS _IOW('T', 0x12, struct snd_timer_params)
5659+#define SNDRV_TIMER_IOCTL_STATUS _IOR('T', 0x14, struct snd_timer_status)
5660+/* The following four ioctls are changed since 1.0.9 due to confliction */
5661+#define SNDRV_TIMER_IOCTL_START _IO('T', 0xa0)
5662+#define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1)
5663+#define SNDRV_TIMER_IOCTL_CONTINUE _IO('T', 0xa2)
5664+#define SNDRV_TIMER_IOCTL_PAUSE _IO('T', 0xa3)
5665+
5666+struct snd_timer_read {
5667+ unsigned int resolution;
5668+ unsigned int ticks;
5669+};
5670+
5671+enum {
5672+ SNDRV_TIMER_EVENT_RESOLUTION = 0, /* val = resolution in ns */
5673+ SNDRV_TIMER_EVENT_TICK, /* val = ticks */
5674+ SNDRV_TIMER_EVENT_START, /* val = resolution in ns */
5675+ SNDRV_TIMER_EVENT_STOP, /* val = 0 */
5676+ SNDRV_TIMER_EVENT_CONTINUE, /* val = resolution in ns */
5677+ SNDRV_TIMER_EVENT_PAUSE, /* val = 0 */
5678+ SNDRV_TIMER_EVENT_EARLY, /* val = 0, early event */
5679+ SNDRV_TIMER_EVENT_SUSPEND, /* val = 0 */
5680+ SNDRV_TIMER_EVENT_RESUME, /* val = resolution in ns */
5681+ /* master timer events for slave timer instances */
5682+ SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
5683+ SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
5684+ SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
5685+ SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
5686+ SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
5687+ SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
5688+};
5689+
5690+struct snd_timer_tread {
5691+ int event;
5692+ struct timespec tstamp;
5693+ unsigned int val;
5694+};
5695+
5696+/****************************************************************************
5697+ * *
5698+ * Section for driver control interface - /dev/snd/control? *
5699+ * *
5700+ ****************************************************************************/
5701+
5702+#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7)
5703+
5704+struct snd_ctl_card_info {
5705+ int card; /* card number */
5706+ int pad; /* reserved for future (was type) */
5707+ unsigned char id[16]; /* ID of card (user selectable) */
5708+ unsigned char driver[16]; /* Driver name */
5709+ unsigned char name[32]; /* Short name of soundcard */
5710+ unsigned char longname[80]; /* name + info text about soundcard */
5711+ unsigned char reserved_[16]; /* reserved for future (was ID of mixer) */
5712+ unsigned char mixername[80]; /* visual mixer identification */
5713+ unsigned char components[128]; /* card components / fine identification, delimited with one space (AC97 etc..) */
5714+};
5715+
5716+typedef int __bitwise snd_ctl_elem_type_t;
5717+#define SNDRV_CTL_ELEM_TYPE_NONE ((__force snd_ctl_elem_type_t) 0) /* invalid */
5718+#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((__force snd_ctl_elem_type_t) 1) /* boolean type */
5719+#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2) /* integer type */
5720+#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((__force snd_ctl_elem_type_t) 3) /* enumerated type */
5721+#define SNDRV_CTL_ELEM_TYPE_BYTES ((__force snd_ctl_elem_type_t) 4) /* byte array */
5722+#define SNDRV_CTL_ELEM_TYPE_IEC958 ((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
5723+#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */
5724+#define SNDRV_CTL_ELEM_TYPE_LAST SNDRV_CTL_ELEM_TYPE_INTEGER64
5725+
5726+typedef int __bitwise snd_ctl_elem_iface_t;
5727+#define SNDRV_CTL_ELEM_IFACE_CARD ((__force snd_ctl_elem_iface_t) 0) /* global control */
5728+#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */
5729+#define SNDRV_CTL_ELEM_IFACE_MIXER ((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */
5730+#define SNDRV_CTL_ELEM_IFACE_PCM ((__force snd_ctl_elem_iface_t) 3) /* PCM device */
5731+#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */
5732+#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5) /* timer device */
5733+#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((__force snd_ctl_elem_iface_t) 6) /* sequencer client */
5734+#define SNDRV_CTL_ELEM_IFACE_LAST SNDRV_CTL_ELEM_IFACE_SEQUENCER
5735+
5736+#define SNDRV_CTL_ELEM_ACCESS_READ (1<<0)
5737+#define SNDRV_CTL_ELEM_ACCESS_WRITE (1<<1)
5738+#define SNDRV_CTL_ELEM_ACCESS_READWRITE (SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
5739+#define SNDRV_CTL_ELEM_ACCESS_VOLATILE (1<<2) /* control value may be changed without a notification */
5740+#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP (1<<3) /* when was control changed */
5741+#define SNDRV_CTL_ELEM_ACCESS_TLV_READ (1<<4) /* TLV read is possible */
5742+#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE (1<<5) /* TLV write is possible */
5743+#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE (SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
5744+#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND (1<<6) /* TLV command is possible */
5745+#define SNDRV_CTL_ELEM_ACCESS_INACTIVE (1<<8) /* control does actually nothing, but may be updated */
5746+#define SNDRV_CTL_ELEM_ACCESS_LOCK (1<<9) /* write lock */
5747+#define SNDRV_CTL_ELEM_ACCESS_OWNER (1<<10) /* write lock owner */
5748+#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK (1<<28) /* kernel use a TLV callback */
5749+#define SNDRV_CTL_ELEM_ACCESS_USER (1<<29) /* user space element */
5750+/* bits 30 and 31 are obsoleted (for indirect access) */
5751+
5752+/* for further details see the ACPI and PCI power management specification */
5753+#define SNDRV_CTL_POWER_D0 0x0000 /* full On */
5754+#define SNDRV_CTL_POWER_D1 0x0100 /* partial On */
5755+#define SNDRV_CTL_POWER_D2 0x0200 /* partial On */
5756+#define SNDRV_CTL_POWER_D3 0x0300 /* Off */
5757+#define SNDRV_CTL_POWER_D3hot (SNDRV_CTL_POWER_D3|0x0000) /* Off, with power */
5758+#define SNDRV_CTL_POWER_D3cold (SNDRV_CTL_POWER_D3|0x0001) /* Off, without power */
5759+
5760+#define SNDRV_CTL_ELEM_ID_NAME_MAXLEN 44
5761+
5762+struct snd_ctl_elem_id {
5763+ unsigned int numid; /* numeric identifier, zero = invalid */
5764+ snd_ctl_elem_iface_t iface; /* interface identifier */
5765+ unsigned int device; /* device/client number */
5766+ unsigned int subdevice; /* subdevice (substream) number */
5767+ unsigned char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* ASCII name of item */
5768+ unsigned int index; /* index of item */
5769+};
5770+
5771+struct snd_ctl_elem_list {
5772+ unsigned int offset; /* W: first element ID to get */
5773+ unsigned int space; /* W: count of element IDs to get */
5774+ unsigned int used; /* R: count of element IDs set */
5775+ unsigned int count; /* R: count of all elements */
5776+ struct snd_ctl_elem_id __user *pids; /* R: IDs */
5777+ unsigned char reserved[50];
5778+};
5779+
5780+struct snd_ctl_elem_info {
5781+ struct snd_ctl_elem_id id; /* W: element ID */
5782+ snd_ctl_elem_type_t type; /* R: value type - SNDRV_CTL_ELEM_TYPE_* */
5783+ unsigned int access; /* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */
5784+ unsigned int count; /* count of values */
5785+ __kernel_pid_t owner; /* owner's PID of this control */
5786+ union {
5787+ struct {
5788+ long min; /* R: minimum value */
5789+ long max; /* R: maximum value */
5790+ long step; /* R: step (0 variable) */
5791+ } integer;
5792+ struct {
5793+ long long min; /* R: minimum value */
5794+ long long max; /* R: maximum value */
5795+ long long step; /* R: step (0 variable) */
5796+ } integer64;
5797+ struct {
5798+ unsigned int items; /* R: number of items */
5799+ unsigned int item; /* W: item number */
5800+ char name[64]; /* R: value name */
5801+ __u64 names_ptr; /* W: names list (ELEM_ADD only) */
5802+ unsigned int names_length;
5803+ } enumerated;
5804+ unsigned char reserved[128];
5805+ } value;
5806+ union {
5807+ unsigned short d[4]; /* dimensions */
5808+ unsigned short *d_ptr; /* indirect - obsoleted */
5809+ } dimen;
5810+ unsigned char reserved[64-4*sizeof(unsigned short)];
5811+};
5812+
5813+struct snd_ctl_elem_value {
5814+ struct snd_ctl_elem_id id; /* W: element ID */
5815+ unsigned int indirect: 1; /* W: indirect access - obsoleted */
5816+ union {
5817+ union {
5818+ long value[128];
5819+ long *value_ptr; /* obsoleted */
5820+ } integer;
5821+ union {
5822+ long long value[64];
5823+ long long *value_ptr; /* obsoleted */
5824+ } integer64;
5825+ union {
5826+ unsigned int item[128];
5827+ unsigned int *item_ptr; /* obsoleted */
5828+ } enumerated;
5829+ union {
5830+ unsigned char data[512];
5831+ unsigned char *data_ptr; /* obsoleted */
5832+ } bytes;
5833+ struct snd_aes_iec958 iec958;
5834+ } value; /* RO */
5835+ struct timespec tstamp;
5836+ unsigned char reserved[128-sizeof(struct timespec)];
5837+};
5838+
5839+struct snd_ctl_tlv {
5840+ unsigned int numid; /* control element numeric identification */
5841+ unsigned int length; /* in bytes aligned to 4 */
5842+ unsigned int tlv[0]; /* first TLV */
5843+};
5844+
5845+#define SNDRV_CTL_IOCTL_PVERSION _IOR('U', 0x00, int)
5846+#define SNDRV_CTL_IOCTL_CARD_INFO _IOR('U', 0x01, struct snd_ctl_card_info)
5847+#define SNDRV_CTL_IOCTL_ELEM_LIST _IOWR('U', 0x10, struct snd_ctl_elem_list)
5848+#define SNDRV_CTL_IOCTL_ELEM_INFO _IOWR('U', 0x11, struct snd_ctl_elem_info)
5849+#define SNDRV_CTL_IOCTL_ELEM_READ _IOWR('U', 0x12, struct snd_ctl_elem_value)
5850+#define SNDRV_CTL_IOCTL_ELEM_WRITE _IOWR('U', 0x13, struct snd_ctl_elem_value)
5851+#define SNDRV_CTL_IOCTL_ELEM_LOCK _IOW('U', 0x14, struct snd_ctl_elem_id)
5852+#define SNDRV_CTL_IOCTL_ELEM_UNLOCK _IOW('U', 0x15, struct snd_ctl_elem_id)
5853+#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int)
5854+#define SNDRV_CTL_IOCTL_ELEM_ADD _IOWR('U', 0x17, struct snd_ctl_elem_info)
5855+#define SNDRV_CTL_IOCTL_ELEM_REPLACE _IOWR('U', 0x18, struct snd_ctl_elem_info)
5856+#define SNDRV_CTL_IOCTL_ELEM_REMOVE _IOWR('U', 0x19, struct snd_ctl_elem_id)
5857+#define SNDRV_CTL_IOCTL_TLV_READ _IOWR('U', 0x1a, struct snd_ctl_tlv)
5858+#define SNDRV_CTL_IOCTL_TLV_WRITE _IOWR('U', 0x1b, struct snd_ctl_tlv)
5859+#define SNDRV_CTL_IOCTL_TLV_COMMAND _IOWR('U', 0x1c, struct snd_ctl_tlv)
5860+#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int)
5861+#define SNDRV_CTL_IOCTL_HWDEP_INFO _IOR('U', 0x21, struct snd_hwdep_info)
5862+#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE _IOR('U', 0x30, int)
5863+#define SNDRV_CTL_IOCTL_PCM_INFO _IOWR('U', 0x31, struct snd_pcm_info)
5864+#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int)
5865+#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
5866+#define SNDRV_CTL_IOCTL_RAWMIDI_INFO _IOWR('U', 0x41, struct snd_rawmidi_info)
5867+#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
5868+#define SNDRV_CTL_IOCTL_POWER _IOWR('U', 0xd0, int)
5869+#define SNDRV_CTL_IOCTL_POWER_STATE _IOR('U', 0xd1, int)
5870+
5871+/*
5872+ * Read interface.
5873+ */
5874+
5875+enum sndrv_ctl_event_type {
5876+ SNDRV_CTL_EVENT_ELEM = 0,
5877+ SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
5878+};
5879+
5880+#define SNDRV_CTL_EVENT_MASK_VALUE (1<<0) /* element value was changed */
5881+#define SNDRV_CTL_EVENT_MASK_INFO (1<<1) /* element info was changed */
5882+#define SNDRV_CTL_EVENT_MASK_ADD (1<<2) /* element was added */
5883+#define SNDRV_CTL_EVENT_MASK_TLV (1<<3) /* element TLV tree was changed */
5884+#define SNDRV_CTL_EVENT_MASK_REMOVE (~0U) /* element was removed */
5885+
5886+struct snd_ctl_event {
5887+ int type; /* event type - SNDRV_CTL_EVENT_* */
5888+ union {
5889+ struct {
5890+ unsigned int mask;
5891+ struct snd_ctl_elem_id id;
5892+ } elem;
5893+ unsigned char data8[60];
5894+ } data;
5895+};
5896+
5897+/*
5898+ * Control names
5899+ */
5900+
5901+#define SNDRV_CTL_NAME_NONE ""
5902+#define SNDRV_CTL_NAME_PLAYBACK "Playback "
5903+#define SNDRV_CTL_NAME_CAPTURE "Capture "
5904+
5905+#define SNDRV_CTL_NAME_IEC958_NONE ""
5906+#define SNDRV_CTL_NAME_IEC958_SWITCH "Switch"
5907+#define SNDRV_CTL_NAME_IEC958_VOLUME "Volume"
5908+#define SNDRV_CTL_NAME_IEC958_DEFAULT "Default"
5909+#define SNDRV_CTL_NAME_IEC958_MASK "Mask"
5910+#define SNDRV_CTL_NAME_IEC958_CON_MASK "Con Mask"
5911+#define SNDRV_CTL_NAME_IEC958_PRO_MASK "Pro Mask"
5912+#define SNDRV_CTL_NAME_IEC958_PCM_STREAM "PCM Stream"
5913+#define SNDRV_CTL_NAME_IEC958(expl,direction,what) "IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
5914+
5915+#endif /* _UAPI__SOUND_ASOUND_H */
5916diff --git a/include/sound/uapi/asound_fm.h b/include/sound/uapi/asound_fm.h
5917new file mode 100644
5918index 00000000..8471f404
5919--- /dev/null
5920+++ b/include/sound/uapi/asound_fm.h
5921@@ -0,0 +1,135 @@
5922+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
5923+#ifndef __SOUND_ASOUND_FM_H
5924+#define __SOUND_ASOUND_FM_H
5925+
5926+/*
5927+ * Advanced Linux Sound Architecture - ALSA
5928+ *
5929+ * Interface file between ALSA driver & user space
5930+ * Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>,
5931+ * 4Front Technologies
5932+ *
5933+ * Direct FM control
5934+ *
5935+ * This program is free software; you can redistribute it and/or modify
5936+ * it under the terms of the GNU General Public License as published by
5937+ * the Free Software Foundation; either version 2 of the License, or
5938+ * (at your option) any later version.
5939+ *
5940+ * This program is distributed in the hope that it will be useful,
5941+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5942+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5943+ * GNU General Public License for more details.
5944+ *
5945+ * You should have received a copy of the GNU General Public License
5946+ * along with this program; if not, write to the Free Software
5947+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5948+ *
5949+ */
5950+
5951+#define SNDRV_DM_FM_MODE_OPL2 0x00
5952+#define SNDRV_DM_FM_MODE_OPL3 0x01
5953+
5954+struct snd_dm_fm_info {
5955+ unsigned char fm_mode; /* OPL mode, see SNDRV_DM_FM_MODE_XXX */
5956+ unsigned char rhythm; /* percussion mode flag */
5957+};
5958+
5959+/*
5960+ * Data structure composing an FM "note" or sound event.
5961+ */
5962+
5963+struct snd_dm_fm_voice {
5964+ unsigned char op; /* operator cell (0 or 1) */
5965+ unsigned char voice; /* FM voice (0 to 17) */
5966+
5967+ unsigned char am; /* amplitude modulation */
5968+ unsigned char vibrato; /* vibrato effect */
5969+ unsigned char do_sustain; /* sustain phase */
5970+ unsigned char kbd_scale; /* keyboard scaling */
5971+ unsigned char harmonic; /* 4 bits: harmonic and multiplier */
5972+ unsigned char scale_level; /* 2 bits: decrease output freq rises */
5973+ unsigned char volume; /* 6 bits: volume */
5974+
5975+ unsigned char attack; /* 4 bits: attack rate */
5976+ unsigned char decay; /* 4 bits: decay rate */
5977+ unsigned char sustain; /* 4 bits: sustain level */
5978+ unsigned char release; /* 4 bits: release rate */
5979+
5980+ unsigned char feedback; /* 3 bits: feedback for op0 */
5981+ unsigned char connection; /* 0 for serial, 1 for parallel */
5982+ unsigned char left; /* stereo left */
5983+ unsigned char right; /* stereo right */
5984+ unsigned char waveform; /* 3 bits: waveform shape */
5985+};
5986+
5987+/*
5988+ * This describes an FM note by its voice, octave, frequency number (10bit)
5989+ * and key on/off.
5990+ */
5991+
5992+struct snd_dm_fm_note {
5993+ unsigned char voice; /* 0-17 voice channel */
5994+ unsigned char octave; /* 3 bits: what octave to play */
5995+ unsigned int fnum; /* 10 bits: frequency number */
5996+ unsigned char key_on; /* set for active, clear for silent */
5997+};
5998+
5999+/*
6000+ * FM parameters that apply globally to all voices, and thus are not "notes"
6001+ */
6002+
6003+struct snd_dm_fm_params {
6004+ unsigned char am_depth; /* amplitude modulation depth (1=hi) */
6005+ unsigned char vib_depth; /* vibrato depth (1=hi) */
6006+ unsigned char kbd_split; /* keyboard split */
6007+ unsigned char rhythm; /* percussion mode select */
6008+
6009+ /* This block is the percussion instrument data */
6010+ unsigned char bass;
6011+ unsigned char snare;
6012+ unsigned char tomtom;
6013+ unsigned char cymbal;
6014+ unsigned char hihat;
6015+};
6016+
6017+/*
6018+ * FM mode ioctl settings
6019+ */
6020+
6021+#define SNDRV_DM_FM_IOCTL_INFO _IOR('H', 0x20, struct snd_dm_fm_info)
6022+#define SNDRV_DM_FM_IOCTL_RESET _IO ('H', 0x21)
6023+#define SNDRV_DM_FM_IOCTL_PLAY_NOTE _IOW('H', 0x22, struct snd_dm_fm_note)
6024+#define SNDRV_DM_FM_IOCTL_SET_VOICE _IOW('H', 0x23, struct snd_dm_fm_voice)
6025+#define SNDRV_DM_FM_IOCTL_SET_PARAMS _IOW('H', 0x24, struct snd_dm_fm_params)
6026+#define SNDRV_DM_FM_IOCTL_SET_MODE _IOW('H', 0x25, int)
6027+/* for OPL3 only */
6028+#define SNDRV_DM_FM_IOCTL_SET_CONNECTION _IOW('H', 0x26, int)
6029+/* SBI patch management */
6030+#define SNDRV_DM_FM_IOCTL_CLEAR_PATCHES _IO ('H', 0x40)
6031+
6032+#define SNDRV_DM_FM_OSS_IOCTL_RESET 0x20
6033+#define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE 0x21
6034+#define SNDRV_DM_FM_OSS_IOCTL_SET_VOICE 0x22
6035+#define SNDRV_DM_FM_OSS_IOCTL_SET_PARAMS 0x23
6036+#define SNDRV_DM_FM_OSS_IOCTL_SET_MODE 0x24
6037+#define SNDRV_DM_FM_OSS_IOCTL_SET_OPL 0x25
6038+
6039+/*
6040+ * Patch Record - fixed size for write
6041+ */
6042+
6043+#define FM_KEY_SBI "SBI\032"
6044+#define FM_KEY_2OP "2OP\032"
6045+#define FM_KEY_4OP "4OP\032"
6046+
6047+struct sbi_patch {
6048+ unsigned char prog;
6049+ unsigned char bank;
6050+ char key[4];
6051+ char name[25];
6052+ char extension[7];
6053+ unsigned char data[32];
6054+};
6055+
6056+#endif /* __SOUND_ASOUND_FM_H */
6057diff --git a/include/sound/uapi/emu10k1.h b/include/sound/uapi/emu10k1.h
6058new file mode 100644
6059index 00000000..c1150e4d
6060--- /dev/null
6061+++ b/include/sound/uapi/emu10k1.h
6062@@ -0,0 +1,395 @@
6063+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
6064+/*
6065+ * Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
6066+ * Creative Labs, Inc.
6067+ * Definitions for EMU10K1 (SB Live!) chips
6068+ *
6069+ *
6070+ * This program is free software; you can redistribute it and/or modify
6071+ * it under the terms of the GNU General Public License as published by
6072+ * the Free Software Foundation; either version 2 of the License, or
6073+ * (at your option) any later version.
6074+ *
6075+ * This program is distributed in the hope that it will be useful,
6076+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6077+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6078+ * GNU General Public License for more details.
6079+ *
6080+ * You should have received a copy of the GNU General Public License
6081+ * along with this program; if not, write to the Free Software
6082+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6083+ *
6084+ */
6085+#ifndef _UAPI__SOUND_EMU10K1_H
6086+#define _UAPI__SOUND_EMU10K1_H
6087+
6088+/*
6089+ * ---- FX8010 ----
6090+ */
6091+
6092+#define EMU10K1_CARD_CREATIVE 0x00000000
6093+#define EMU10K1_CARD_EMUAPS 0x00000001
6094+
6095+#define EMU10K1_FX8010_PCM_COUNT 8
6096+
6097+/*
6098+ * Following definition is copied from linux/types.h to support compiling
6099+ * this header file in userspace since they are not generally available for
6100+ * uapi headers.
6101+ */
6102+#define __EMU10K1_DECLARE_BITMAP(name,bits) \
6103+ unsigned long name[(bits) / (sizeof(unsigned long) * 8)]
6104+
6105+/* instruction set */
6106+#define iMAC0 0x00 /* R = A + (X * Y >> 31) ; saturation */
6107+#define iMAC1 0x01 /* R = A + (-X * Y >> 31) ; saturation */
6108+#define iMAC2 0x02 /* R = A + (X * Y >> 31) ; wraparound */
6109+#define iMAC3 0x03 /* R = A + (-X * Y >> 31) ; wraparound */
6110+#define iMACINT0 0x04 /* R = A + X * Y ; saturation */
6111+#define iMACINT1 0x05 /* R = A + X * Y ; wraparound (31-bit) */
6112+#define iACC3 0x06 /* R = A + X + Y ; saturation */
6113+#define iMACMV 0x07 /* R = A, acc += X * Y >> 31 */
6114+#define iANDXOR 0x08 /* R = (A & X) ^ Y */
6115+#define iTSTNEG 0x09 /* R = (A >= Y) ? X : ~X */
6116+#define iLIMITGE 0x0a /* R = (A >= Y) ? X : Y */
6117+#define iLIMITLT 0x0b /* R = (A < Y) ? X : Y */
6118+#define iLOG 0x0c /* R = linear_data, A (log_data), X (max_exp), Y (format_word) */
6119+#define iEXP 0x0d /* R = log_data, A (linear_data), X (max_exp), Y (format_word) */
6120+#define iINTERP 0x0e /* R = A + (X * (Y - A) >> 31) ; saturation */
6121+#define iSKIP 0x0f /* R = A (cc_reg), X (count), Y (cc_test) */
6122+
6123+/* GPRs */
6124+#define FXBUS(x) (0x00 + (x)) /* x = 0x00 - 0x0f */
6125+#define EXTIN(x) (0x10 + (x)) /* x = 0x00 - 0x0f */
6126+#define EXTOUT(x) (0x20 + (x)) /* x = 0x00 - 0x0f physical outs -> FXWC low 16 bits */
6127+#define FXBUS2(x) (0x30 + (x)) /* x = 0x00 - 0x0f copies of fx buses for capture -> FXWC high 16 bits */
6128+ /* NB: 0x31 and 0x32 are shared with Center/LFE on SB live 5.1 */
6129+
6130+#define C_00000000 0x40
6131+#define C_00000001 0x41
6132+#define C_00000002 0x42
6133+#define C_00000003 0x43
6134+#define C_00000004 0x44
6135+#define C_00000008 0x45
6136+#define C_00000010 0x46
6137+#define C_00000020 0x47
6138+#define C_00000100 0x48
6139+#define C_00010000 0x49
6140+#define C_00080000 0x4a
6141+#define C_10000000 0x4b
6142+#define C_20000000 0x4c
6143+#define C_40000000 0x4d
6144+#define C_80000000 0x4e
6145+#define C_7fffffff 0x4f
6146+#define C_ffffffff 0x50
6147+#define C_fffffffe 0x51
6148+#define C_c0000000 0x52
6149+#define C_4f1bbcdc 0x53
6150+#define C_5a7ef9db 0x54
6151+#define C_00100000 0x55 /* ?? */
6152+#define GPR_ACCU 0x56 /* ACCUM, accumulator */
6153+#define GPR_COND 0x57 /* CCR, condition register */
6154+#define GPR_NOISE0 0x58 /* noise source */
6155+#define GPR_NOISE1 0x59 /* noise source */
6156+#define GPR_IRQ 0x5a /* IRQ register */
6157+#define GPR_DBAC 0x5b /* TRAM Delay Base Address Counter */
6158+#define GPR(x) (FXGPREGBASE + (x)) /* free GPRs: x = 0x00 - 0xff */
6159+#define ITRAM_DATA(x) (TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
6160+#define ETRAM_DATA(x) (TANKMEMDATAREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
6161+#define ITRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
6162+#define ETRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
6163+
6164+#define A_ITRAM_DATA(x) (TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
6165+#define A_ETRAM_DATA(x) (TANKMEMDATAREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
6166+#define A_ITRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
6167+#define A_ETRAM_ADDR(x) (TANKMEMADDRREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
6168+#define A_ITRAM_CTL(x) (A_TANKMEMCTLREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
6169+#define A_ETRAM_CTL(x) (A_TANKMEMCTLREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
6170+
6171+#define A_FXBUS(x) (0x00 + (x)) /* x = 0x00 - 0x3f FX buses */
6172+#define A_EXTIN(x) (0x40 + (x)) /* x = 0x00 - 0x0f physical ins */
6173+#define A_P16VIN(x) (0x50 + (x)) /* x = 0x00 - 0x0f p16v ins (A2 only) "EMU32 inputs" */
6174+#define A_EXTOUT(x) (0x60 + (x)) /* x = 0x00 - 0x1f physical outs -> A_FXWC1 0x79-7f unknown */
6175+#define A_FXBUS2(x) (0x80 + (x)) /* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
6176+#define A_EMU32OUTH(x) (0xa0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
6177+#define A_EMU32OUTL(x) (0xb0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
6178+#define A3_EMU32IN(x) (0x160 + (x)) /* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */
6179+#define A3_EMU32OUT(x) (0x1E0 + (x)) /* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */
6180+#define A_GPR(x) (A_FXGPREGBASE + (x))
6181+
6182+/* cc_reg constants */
6183+#define CC_REG_NORMALIZED C_00000001
6184+#define CC_REG_BORROW C_00000002
6185+#define CC_REG_MINUS C_00000004
6186+#define CC_REG_ZERO C_00000008
6187+#define CC_REG_SATURATE C_00000010
6188+#define CC_REG_NONZERO C_00000100
6189+
6190+/* FX buses */
6191+#define FXBUS_PCM_LEFT 0x00
6192+#define FXBUS_PCM_RIGHT 0x01
6193+#define FXBUS_PCM_LEFT_REAR 0x02
6194+#define FXBUS_PCM_RIGHT_REAR 0x03
6195+#define FXBUS_MIDI_LEFT 0x04
6196+#define FXBUS_MIDI_RIGHT 0x05
6197+#define FXBUS_PCM_CENTER 0x06
6198+#define FXBUS_PCM_LFE 0x07
6199+#define FXBUS_PCM_LEFT_FRONT 0x08
6200+#define FXBUS_PCM_RIGHT_FRONT 0x09
6201+#define FXBUS_MIDI_REVERB 0x0c
6202+#define FXBUS_MIDI_CHORUS 0x0d
6203+#define FXBUS_PCM_LEFT_SIDE 0x0e
6204+#define FXBUS_PCM_RIGHT_SIDE 0x0f
6205+#define FXBUS_PT_LEFT 0x14
6206+#define FXBUS_PT_RIGHT 0x15
6207+
6208+/* Inputs */
6209+#define EXTIN_AC97_L 0x00 /* AC'97 capture channel - left */
6210+#define EXTIN_AC97_R 0x01 /* AC'97 capture channel - right */
6211+#define EXTIN_SPDIF_CD_L 0x02 /* internal S/PDIF CD - onboard - left */
6212+#define EXTIN_SPDIF_CD_R 0x03 /* internal S/PDIF CD - onboard - right */
6213+#define EXTIN_ZOOM_L 0x04 /* Zoom Video I2S - left */
6214+#define EXTIN_ZOOM_R 0x05 /* Zoom Video I2S - right */
6215+#define EXTIN_TOSLINK_L 0x06 /* LiveDrive - TOSLink Optical - left */
6216+#define EXTIN_TOSLINK_R 0x07 /* LiveDrive - TOSLink Optical - right */
6217+#define EXTIN_LINE1_L 0x08 /* LiveDrive - Line/Mic 1 - left */
6218+#define EXTIN_LINE1_R 0x09 /* LiveDrive - Line/Mic 1 - right */
6219+#define EXTIN_COAX_SPDIF_L 0x0a /* LiveDrive - Coaxial S/PDIF - left */
6220+#define EXTIN_COAX_SPDIF_R 0x0b /* LiveDrive - Coaxial S/PDIF - right */
6221+#define EXTIN_LINE2_L 0x0c /* LiveDrive - Line/Mic 2 - left */
6222+#define EXTIN_LINE2_R 0x0d /* LiveDrive - Line/Mic 2 - right */
6223+
6224+/* Outputs */
6225+#define EXTOUT_AC97_L 0x00 /* AC'97 playback channel - left */
6226+#define EXTOUT_AC97_R 0x01 /* AC'97 playback channel - right */
6227+#define EXTOUT_TOSLINK_L 0x02 /* LiveDrive - TOSLink Optical - left */
6228+#define EXTOUT_TOSLINK_R 0x03 /* LiveDrive - TOSLink Optical - right */
6229+#define EXTOUT_AC97_CENTER 0x04 /* SB Live 5.1 - center */
6230+#define EXTOUT_AC97_LFE 0x05 /* SB Live 5.1 - LFE */
6231+#define EXTOUT_HEADPHONE_L 0x06 /* LiveDrive - Headphone - left */
6232+#define EXTOUT_HEADPHONE_R 0x07 /* LiveDrive - Headphone - right */
6233+#define EXTOUT_REAR_L 0x08 /* Rear channel - left */
6234+#define EXTOUT_REAR_R 0x09 /* Rear channel - right */
6235+#define EXTOUT_ADC_CAP_L 0x0a /* ADC Capture buffer - left */
6236+#define EXTOUT_ADC_CAP_R 0x0b /* ADC Capture buffer - right */
6237+#define EXTOUT_MIC_CAP 0x0c /* MIC Capture buffer */
6238+#define EXTOUT_AC97_REAR_L 0x0d /* SB Live 5.1 (c) 2003 - Rear Left */
6239+#define EXTOUT_AC97_REAR_R 0x0e /* SB Live 5.1 (c) 2003 - Rear Right */
6240+#define EXTOUT_ACENTER 0x11 /* Analog Center */
6241+#define EXTOUT_ALFE 0x12 /* Analog LFE */
6242+
6243+/* Audigy Inputs */
6244+#define A_EXTIN_AC97_L 0x00 /* AC'97 capture channel - left */
6245+#define A_EXTIN_AC97_R 0x01 /* AC'97 capture channel - right */
6246+#define A_EXTIN_SPDIF_CD_L 0x02 /* digital CD left */
6247+#define A_EXTIN_SPDIF_CD_R 0x03 /* digital CD left */
6248+#define A_EXTIN_OPT_SPDIF_L 0x04 /* audigy drive Optical SPDIF - left */
6249+#define A_EXTIN_OPT_SPDIF_R 0x05 /* right */
6250+#define A_EXTIN_LINE2_L 0x08 /* audigy drive line2/mic2 - left */
6251+#define A_EXTIN_LINE2_R 0x09 /* right */
6252+#define A_EXTIN_ADC_L 0x0a /* Philips ADC - left */
6253+#define A_EXTIN_ADC_R 0x0b /* right */
6254+#define A_EXTIN_AUX2_L 0x0c /* audigy drive aux2 - left */
6255+#define A_EXTIN_AUX2_R 0x0d /* - right */
6256+
6257+/* Audigiy Outputs */
6258+#define A_EXTOUT_FRONT_L 0x00 /* digital front left */
6259+#define A_EXTOUT_FRONT_R 0x01 /* right */
6260+#define A_EXTOUT_CENTER 0x02 /* digital front center */
6261+#define A_EXTOUT_LFE 0x03 /* digital front lfe */
6262+#define A_EXTOUT_HEADPHONE_L 0x04 /* headphone audigy drive left */
6263+#define A_EXTOUT_HEADPHONE_R 0x05 /* right */
6264+#define A_EXTOUT_REAR_L 0x06 /* digital rear left */
6265+#define A_EXTOUT_REAR_R 0x07 /* right */
6266+#define A_EXTOUT_AFRONT_L 0x08 /* analog front left */
6267+#define A_EXTOUT_AFRONT_R 0x09 /* right */
6268+#define A_EXTOUT_ACENTER 0x0a /* analog center */
6269+#define A_EXTOUT_ALFE 0x0b /* analog LFE */
6270+#define A_EXTOUT_ASIDE_L 0x0c /* analog side left - Audigy 2 ZS */
6271+#define A_EXTOUT_ASIDE_R 0x0d /* right - Audigy 2 ZS */
6272+#define A_EXTOUT_AREAR_L 0x0e /* analog rear left */
6273+#define A_EXTOUT_AREAR_R 0x0f /* right */
6274+#define A_EXTOUT_AC97_L 0x10 /* AC97 left (front) */
6275+#define A_EXTOUT_AC97_R 0x11 /* right */
6276+#define A_EXTOUT_ADC_CAP_L 0x16 /* ADC capture buffer left */
6277+#define A_EXTOUT_ADC_CAP_R 0x17 /* right */
6278+#define A_EXTOUT_MIC_CAP 0x18 /* Mic capture buffer */
6279+
6280+/* Audigy constants */
6281+#define A_C_00000000 0xc0
6282+#define A_C_00000001 0xc1
6283+#define A_C_00000002 0xc2
6284+#define A_C_00000003 0xc3
6285+#define A_C_00000004 0xc4
6286+#define A_C_00000008 0xc5
6287+#define A_C_00000010 0xc6
6288+#define A_C_00000020 0xc7
6289+#define A_C_00000100 0xc8
6290+#define A_C_00010000 0xc9
6291+#define A_C_00000800 0xca
6292+#define A_C_10000000 0xcb
6293+#define A_C_20000000 0xcc
6294+#define A_C_40000000 0xcd
6295+#define A_C_80000000 0xce
6296+#define A_C_7fffffff 0xcf
6297+#define A_C_ffffffff 0xd0
6298+#define A_C_fffffffe 0xd1
6299+#define A_C_c0000000 0xd2
6300+#define A_C_4f1bbcdc 0xd3
6301+#define A_C_5a7ef9db 0xd4
6302+#define A_C_00100000 0xd5
6303+#define A_GPR_ACCU 0xd6 /* ACCUM, accumulator */
6304+#define A_GPR_COND 0xd7 /* CCR, condition register */
6305+#define A_GPR_NOISE0 0xd8 /* noise source */
6306+#define A_GPR_NOISE1 0xd9 /* noise source */
6307+#define A_GPR_IRQ 0xda /* IRQ register */
6308+#define A_GPR_DBAC 0xdb /* TRAM Delay Base Address Counter - internal */
6309+#define A_GPR_DBACE 0xde /* TRAM Delay Base Address Counter - external */
6310+
6311+/* definitions for debug register */
6312+#define EMU10K1_DBG_ZC 0x80000000 /* zero tram counter */
6313+#define EMU10K1_DBG_SATURATION_OCCURED 0x02000000 /* saturation control */
6314+#define EMU10K1_DBG_SATURATION_ADDR 0x01ff0000 /* saturation address */
6315+#define EMU10K1_DBG_SINGLE_STEP 0x00008000 /* single step mode */
6316+#define EMU10K1_DBG_STEP 0x00004000 /* start single step */
6317+#define EMU10K1_DBG_CONDITION_CODE 0x00003e00 /* condition code */
6318+#define EMU10K1_DBG_SINGLE_STEP_ADDR 0x000001ff /* single step address */
6319+
6320+/* tank memory address line */
6321+#ifndef __KERNEL__
6322+#define TANKMEMADDRREG_ADDR_MASK 0x000fffff /* 20 bit tank address field */
6323+#define TANKMEMADDRREG_CLEAR 0x00800000 /* Clear tank memory */
6324+#define TANKMEMADDRREG_ALIGN 0x00400000 /* Align read or write relative to tank access */
6325+#define TANKMEMADDRREG_WRITE 0x00200000 /* Write to tank memory */
6326+#define TANKMEMADDRREG_READ 0x00100000 /* Read from tank memory */
6327+#endif
6328+
6329+struct snd_emu10k1_fx8010_info {
6330+ unsigned int internal_tram_size; /* in samples */
6331+ unsigned int external_tram_size; /* in samples */
6332+ char fxbus_names[16][32]; /* names of FXBUSes */
6333+ char extin_names[16][32]; /* names of external inputs */
6334+ char extout_names[32][32]; /* names of external outputs */
6335+ unsigned int gpr_controls; /* count of GPR controls */
6336+};
6337+
6338+#define EMU10K1_GPR_TRANSLATION_NONE 0
6339+#define EMU10K1_GPR_TRANSLATION_TABLE100 1
6340+#define EMU10K1_GPR_TRANSLATION_BASS 2
6341+#define EMU10K1_GPR_TRANSLATION_TREBLE 3
6342+#define EMU10K1_GPR_TRANSLATION_ONOFF 4
6343+
6344+enum emu10k1_ctl_elem_iface {
6345+ EMU10K1_CTL_ELEM_IFACE_MIXER = 2, /* virtual mixer device */
6346+ EMU10K1_CTL_ELEM_IFACE_PCM = 3, /* PCM device */
6347+};
6348+
6349+struct emu10k1_ctl_elem_id {
6350+ unsigned int pad; /* don't use */
6351+ int iface; /* interface identifier */
6352+ unsigned int device; /* device/client number */
6353+ unsigned int subdevice; /* subdevice (substream) number */
6354+ unsigned char name[44]; /* ASCII name of item */
6355+ unsigned int index; /* index of item */
6356+};
6357+
6358+struct snd_emu10k1_fx8010_control_gpr {
6359+ struct emu10k1_ctl_elem_id id; /* full control ID definition */
6360+ unsigned int vcount; /* visible count */
6361+ unsigned int count; /* count of GPR (1..16) */
6362+ unsigned short gpr[32]; /* GPR number(s) */
6363+ unsigned int value[32]; /* initial values */
6364+ unsigned int min; /* minimum range */
6365+ unsigned int max; /* maximum range */
6366+ unsigned int translation; /* translation type (EMU10K1_GPR_TRANSLATION*) */
6367+ const unsigned int *tlv;
6368+};
6369+
6370+/* old ABI without TLV support */
6371+struct snd_emu10k1_fx8010_control_old_gpr {
6372+ struct emu10k1_ctl_elem_id id;
6373+ unsigned int vcount;
6374+ unsigned int count;
6375+ unsigned short gpr[32];
6376+ unsigned int value[32];
6377+ unsigned int min;
6378+ unsigned int max;
6379+ unsigned int translation;
6380+};
6381+
6382+struct snd_emu10k1_fx8010_code {
6383+ char name[128];
6384+
6385+ __EMU10K1_DECLARE_BITMAP(gpr_valid, 0x200); /* bitmask of valid initializers */
6386+ __u32 *gpr_map; /* initializers */
6387+
6388+ unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */
6389+ struct snd_emu10k1_fx8010_control_gpr *gpr_add_controls; /* GPR controls to add/replace */
6390+
6391+ unsigned int gpr_del_control_count; /* count of GPR controls to remove */
6392+ struct emu10k1_ctl_elem_id *gpr_del_controls; /* IDs of GPR controls to remove */
6393+
6394+ unsigned int gpr_list_control_count; /* count of GPR controls to list */
6395+ unsigned int gpr_list_control_total; /* total count of GPR controls */
6396+ struct snd_emu10k1_fx8010_control_gpr *gpr_list_controls; /* listed GPR controls */
6397+
6398+ __EMU10K1_DECLARE_BITMAP(tram_valid, 0x100); /* bitmask of valid initializers */
6399+ __u32 *tram_data_map; /* data initializers */
6400+ __u32 *tram_addr_map; /* map initializers */
6401+
6402+ __EMU10K1_DECLARE_BITMAP(code_valid, 1024); /* bitmask of valid instructions */
6403+ __u32 *code; /* one instruction - 64 bits */
6404+};
6405+
6406+struct snd_emu10k1_fx8010_tram {
6407+ unsigned int address; /* 31.bit == 1 -> external TRAM */
6408+ unsigned int size; /* size in samples (4 bytes) */
6409+ unsigned int *samples; /* pointer to samples (20-bit) */
6410+ /* NULL->clear memory */
6411+};
6412+
6413+struct snd_emu10k1_fx8010_pcm_rec {
6414+ unsigned int substream; /* substream number */
6415+ unsigned int res1; /* reserved */
6416+ unsigned int channels; /* 16-bit channels count, zero = remove this substream */
6417+ unsigned int tram_start; /* ring buffer position in TRAM (in samples) */
6418+ unsigned int buffer_size; /* count of buffered samples */
6419+ unsigned short gpr_size; /* GPR containing size of ringbuffer in samples (host) */
6420+ unsigned short gpr_ptr; /* GPR containing current pointer in the ring buffer (host = reset, FX8010) */
6421+ unsigned short gpr_count; /* GPR containing count of samples between two interrupts (host) */
6422+ unsigned short gpr_tmpcount; /* GPR containing current count of samples to interrupt (host = set, FX8010) */
6423+ unsigned short gpr_trigger; /* GPR containing trigger (activate) information (host) */
6424+ unsigned short gpr_running; /* GPR containing info if PCM is running (FX8010) */
6425+ unsigned char pad; /* reserved */
6426+ unsigned char etram[32]; /* external TRAM address & data (one per channel) */
6427+ unsigned int res2; /* reserved */
6428+};
6429+
6430+#define SNDRV_EMU10K1_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
6431+
6432+#define SNDRV_EMU10K1_IOCTL_INFO _IOR ('H', 0x10, struct snd_emu10k1_fx8010_info)
6433+#define SNDRV_EMU10K1_IOCTL_CODE_POKE _IOW ('H', 0x11, struct snd_emu10k1_fx8010_code)
6434+#define SNDRV_EMU10K1_IOCTL_CODE_PEEK _IOWR('H', 0x12, struct snd_emu10k1_fx8010_code)
6435+#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP _IOW ('H', 0x20, int)
6436+#define SNDRV_EMU10K1_IOCTL_TRAM_POKE _IOW ('H', 0x21, struct snd_emu10k1_fx8010_tram)
6437+#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK _IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram)
6438+#define SNDRV_EMU10K1_IOCTL_PCM_POKE _IOW ('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec)
6439+#define SNDRV_EMU10K1_IOCTL_PCM_PEEK _IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec)
6440+#define SNDRV_EMU10K1_IOCTL_PVERSION _IOR ('H', 0x40, int)
6441+#define SNDRV_EMU10K1_IOCTL_STOP _IO ('H', 0x80)
6442+#define SNDRV_EMU10K1_IOCTL_CONTINUE _IO ('H', 0x81)
6443+#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO ('H', 0x82)
6444+#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW ('H', 0x83, int)
6445+#define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR ('H', 0x84, int)
6446+
6447+#ifndef __KERNEL__
6448+/* typedefs for compatibility to user-space */
6449+typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
6450+typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
6451+typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
6452+typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
6453+typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
6454+typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
6455+#endif
6456+
6457+#endif /* _UAPI__SOUND_EMU10K1_H */
6458diff --git a/include/sound/uapi/hdsp.h b/include/sound/uapi/hdsp.h
6459new file mode 100644
6460index 00000000..88c92a3f
6461--- /dev/null
6462+++ b/include/sound/uapi/hdsp.h
6463@@ -0,0 +1,109 @@
6464+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
6465+#ifndef __SOUND_HDSP_H
6466+#define __SOUND_HDSP_H
6467+
6468+/*
6469+ * Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
6470+ *
6471+ * This program is free software; you can redistribute it and/or modify
6472+ * it under the terms of the GNU General Public License as published by
6473+ * the Free Software Foundation; either version 2 of the License, or
6474+ * (at your option) any later version.
6475+ *
6476+ * This program is distributed in the hope that it will be useful,
6477+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6478+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6479+ * GNU General Public License for more details.
6480+ *
6481+ * You should have received a copy of the GNU General Public License
6482+ * along with this program; if not, write to the Free Software
6483+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
6484+ */
6485+
6486+#define HDSP_MATRIX_MIXER_SIZE 2048
6487+
6488+enum HDSP_IO_Type {
6489+ Digiface,
6490+ Multiface,
6491+ H9652,
6492+ H9632,
6493+ RPM,
6494+ Undefined,
6495+};
6496+
6497+struct hdsp_peak_rms {
6498+ __u32 input_peaks[26];
6499+ __u32 playback_peaks[26];
6500+ __u32 output_peaks[28];
6501+ __u64 input_rms[26];
6502+ __u64 playback_rms[26];
6503+ /* These are only used for H96xx cards */
6504+ __u64 output_rms[26];
6505+};
6506+
6507+#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms)
6508+
6509+struct hdsp_config_info {
6510+ unsigned char pref_sync_ref;
6511+ unsigned char wordclock_sync_check;
6512+ unsigned char spdif_sync_check;
6513+ unsigned char adatsync_sync_check;
6514+ unsigned char adat_sync_check[3];
6515+ unsigned char spdif_in;
6516+ unsigned char spdif_out;
6517+ unsigned char spdif_professional;
6518+ unsigned char spdif_emphasis;
6519+ unsigned char spdif_nonaudio;
6520+ unsigned int spdif_sample_rate;
6521+ unsigned int system_sample_rate;
6522+ unsigned int autosync_sample_rate;
6523+ unsigned char system_clock_mode;
6524+ unsigned char clock_source;
6525+ unsigned char autosync_ref;
6526+ unsigned char line_out;
6527+ unsigned char passthru;
6528+ unsigned char da_gain;
6529+ unsigned char ad_gain;
6530+ unsigned char phone_gain;
6531+ unsigned char xlr_breakout_cable;
6532+ unsigned char analog_extension_board;
6533+};
6534+
6535+#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info)
6536+
6537+struct hdsp_firmware {
6538+ void *firmware_data; /* 24413 x 4 bytes */
6539+};
6540+
6541+#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware)
6542+
6543+struct hdsp_version {
6544+ enum HDSP_IO_Type io_type;
6545+ unsigned short firmware_rev;
6546+};
6547+
6548+#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version)
6549+
6550+struct hdsp_mixer {
6551+ unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
6552+};
6553+
6554+#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer)
6555+
6556+struct hdsp_9632_aeb {
6557+ int aebi;
6558+ int aebo;
6559+};
6560+
6561+#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
6562+
6563+/* typedefs for compatibility to user-space */
6564+typedef enum HDSP_IO_Type HDSP_IO_Type;
6565+typedef struct hdsp_peak_rms hdsp_peak_rms_t;
6566+typedef struct hdsp_config_info hdsp_config_info_t;
6567+typedef struct hdsp_firmware hdsp_firmware_t;
6568+typedef struct hdsp_version hdsp_version_t;
6569+typedef struct hdsp_mixer hdsp_mixer_t;
6570+typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
6571+
6572+#endif /* __SOUND_HDSP_H */
6573diff --git a/include/sound/uapi/hdspm.h b/include/sound/uapi/hdspm.h
6574new file mode 100644
6575index 00000000..2d91f90e
6576--- /dev/null
6577+++ b/include/sound/uapi/hdspm.h
6578@@ -0,0 +1,230 @@
6579+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
6580+#ifndef __SOUND_HDSPM_H
6581+#define __SOUND_HDSPM_H
6582+/*
6583+ * Copyright (C) 2003 Winfried Ritsch (IEM)
6584+ * based on hdsp.h from Thomas Charbonnel (thomas@undata.org)
6585+ *
6586+ *
6587+ * This program is free software; you can redistribute it and/or modify
6588+ * it under the terms of the GNU General Public License as published by
6589+ * the Free Software Foundation; either version 2 of the License, or
6590+ * (at your option) any later version.
6591+ *
6592+ * This program is distributed in the hope that it will be useful,
6593+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6594+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6595+ * GNU General Public License for more details.
6596+ *
6597+ * You should have received a copy of the GNU General Public License
6598+ * along with this program; if not, write to the Free Software
6599+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
6600+ */
6601+
6602+/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
6603+#define HDSPM_MAX_CHANNELS 64
6604+
6605+enum hdspm_io_type {
6606+ MADI,
6607+ MADIface,
6608+ AIO,
6609+ AES32,
6610+ RayDAT
6611+};
6612+
6613+enum hdspm_speed {
6614+ ss,
6615+ ds,
6616+ qs
6617+};
6618+
6619+/* -------------------- IOCTL Peak/RMS Meters -------------------- */
6620+
6621+struct hdspm_peak_rms {
6622+ __u32 input_peaks[64];
6623+ __u32 playback_peaks[64];
6624+ __u32 output_peaks[64];
6625+
6626+ __u64 input_rms[64];
6627+ __u64 playback_rms[64];
6628+ __u64 output_rms[64];
6629+
6630+ __u8 speed; /* enum {ss, ds, qs} */
6631+ int status2;
6632+};
6633+
6634+#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
6635+ _IOR('H', 0x42, struct hdspm_peak_rms)
6636+
6637+/* ------------ CONFIG block IOCTL ---------------------- */
6638+
6639+struct hdspm_config {
6640+ unsigned char pref_sync_ref;
6641+ unsigned char wordclock_sync_check;
6642+ unsigned char madi_sync_check;
6643+ unsigned int system_sample_rate;
6644+ unsigned int autosync_sample_rate;
6645+ unsigned char system_clock_mode;
6646+ unsigned char clock_source;
6647+ unsigned char autosync_ref;
6648+ unsigned char line_out;
6649+ unsigned int passthru;
6650+ unsigned int analog_out;
6651+};
6652+
6653+#define SNDRV_HDSPM_IOCTL_GET_CONFIG \
6654+ _IOR('H', 0x41, struct hdspm_config)
6655+
6656+/*
6657+ * If there's a TCO (TimeCode Option) board installed,
6658+ * there are further options and status data available.
6659+ * The hdspm_ltc structure contains the current SMPTE
6660+ * timecode and some status information and can be
6661+ * obtained via SNDRV_HDSPM_IOCTL_GET_LTC or in the
6662+ * hdspm_status struct.
6663+ */
6664+
6665+enum hdspm_ltc_format {
6666+ format_invalid,
6667+ fps_24,
6668+ fps_25,
6669+ fps_2997,
6670+ fps_30
6671+};
6672+
6673+enum hdspm_ltc_frame {
6674+ frame_invalid,
6675+ drop_frame,
6676+ full_frame
6677+};
6678+
6679+enum hdspm_ltc_input_format {
6680+ ntsc,
6681+ pal,
6682+ no_video
6683+};
6684+
6685+struct hdspm_ltc {
6686+ unsigned int ltc;
6687+
6688+ enum hdspm_ltc_format format;
6689+ enum hdspm_ltc_frame frame;
6690+ enum hdspm_ltc_input_format input_format;
6691+};
6692+
6693+#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
6694+
6695+/*
6696+ * The status data reflects the device's current state
6697+ * as determined by the card's configuration and
6698+ * connection status.
6699+ */
6700+
6701+enum hdspm_sync {
6702+ hdspm_sync_no_lock = 0,
6703+ hdspm_sync_lock = 1,
6704+ hdspm_sync_sync = 2
6705+};
6706+
6707+enum hdspm_madi_input {
6708+ hdspm_input_optical = 0,
6709+ hdspm_input_coax = 1
6710+};
6711+
6712+enum hdspm_madi_channel_format {
6713+ hdspm_format_ch_64 = 0,
6714+ hdspm_format_ch_56 = 1
6715+};
6716+
6717+enum hdspm_madi_frame_format {
6718+ hdspm_frame_48 = 0,
6719+ hdspm_frame_96 = 1
6720+};
6721+
6722+enum hdspm_syncsource {
6723+ syncsource_wc = 0,
6724+ syncsource_madi = 1,
6725+ syncsource_tco = 2,
6726+ syncsource_sync = 3,
6727+ syncsource_none = 4
6728+};
6729+
6730+struct hdspm_status {
6731+ __u8 card_type; /* enum hdspm_io_type */
6732+ enum hdspm_syncsource autosync_source;
6733+
6734+ __u64 card_clock;
6735+ __u32 master_period;
6736+
6737+ union {
6738+ struct {
6739+ __u8 sync_wc; /* enum hdspm_sync */
6740+ __u8 sync_madi; /* enum hdspm_sync */
6741+ __u8 sync_tco; /* enum hdspm_sync */
6742+ __u8 sync_in; /* enum hdspm_sync */
6743+ __u8 madi_input; /* enum hdspm_madi_input */
6744+ __u8 channel_format; /* enum hdspm_madi_channel_format */
6745+ __u8 frame_format; /* enum hdspm_madi_frame_format */
6746+ } madi;
6747+ } card_specific;
6748+};
6749+
6750+#define SNDRV_HDSPM_IOCTL_GET_STATUS \
6751+ _IOR('H', 0x47, struct hdspm_status)
6752+
6753+/*
6754+ * Get information about the card and its add-ons.
6755+ */
6756+
6757+#define HDSPM_ADDON_TCO 1
6758+
6759+struct hdspm_version {
6760+ __u8 card_type; /* enum hdspm_io_type */
6761+ char cardname[20];
6762+ unsigned int serial;
6763+ unsigned short firmware_rev;
6764+ int addons;
6765+};
6766+
6767+#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version)
6768+
6769+/* ------------- get Matrix Mixer IOCTL --------------- */
6770+
6771+/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
6772+ * 32768 Bytes
6773+ */
6774+
6775+/* organisation is 64 channelfader in a continuous memory block */
6776+/* equivalent to hardware definition, maybe for future feature of mmap of
6777+ * them
6778+ */
6779+/* each of 64 outputs has 64 infader and 64 outfader:
6780+ Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
6781+
6782+#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
6783+
6784+struct hdspm_channelfader {
6785+ unsigned int in[HDSPM_MIXER_CHANNELS];
6786+ unsigned int pb[HDSPM_MIXER_CHANNELS];
6787+};
6788+
6789+struct hdspm_mixer {
6790+ struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
6791+};
6792+
6793+struct hdspm_mixer_ioctl {
6794+ struct hdspm_mixer *mixer;
6795+};
6796+
6797+/* use indirect access due to the limit of ioctl bit size */
6798+#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
6799+
6800+/* typedefs for compatibility to user-space */
6801+typedef struct hdspm_peak_rms hdspm_peak_rms_t;
6802+typedef struct hdspm_config_info hdspm_config_info_t;
6803+typedef struct hdspm_version hdspm_version_t;
6804+typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
6805+typedef struct hdspm_mixer hdspm_mixer_t;
6806+
6807+
6808+#endif
6809diff --git a/include/sound/uapi/sb16_csp.h b/include/sound/uapi/sb16_csp.h
6810new file mode 100644
6811index 00000000..e6485148
6812--- /dev/null
6813+++ b/include/sound/uapi/sb16_csp.h
6814@@ -0,0 +1,123 @@
6815+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
6816+/*
6817+ * Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
6818+ * Takashi Iwai <tiwai@suse.de>
6819+ *
6820+ * SB16ASP/AWE32 CSP control
6821+ *
6822+ * This program is free software; you can redistribute it and/or modify
6823+ * it under the terms of the GNU General Public License as published by
6824+ * the Free Software Foundation; either version 2 of the License, or
6825+ * (at your option) any later version.
6826+ *
6827+ * This program is distributed in the hope that it will be useful,
6828+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6829+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6830+ * GNU General Public License for more details.
6831+ *
6832+ * You should have received a copy of the GNU General Public License
6833+ * along with this program; if not, write to the Free Software
6834+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6835+ *
6836+ */
6837+#ifndef _UAPI__SOUND_SB16_CSP_H
6838+#define _UAPI__SOUND_SB16_CSP_H
6839+
6840+
6841+/* CSP modes */
6842+#define SNDRV_SB_CSP_MODE_NONE 0x00
6843+#define SNDRV_SB_CSP_MODE_DSP_READ 0x01 /* Record from DSP */
6844+#define SNDRV_SB_CSP_MODE_DSP_WRITE 0x02 /* Play to DSP */
6845+#define SNDRV_SB_CSP_MODE_QSOUND 0x04 /* QSound */
6846+
6847+/* CSP load flags */
6848+#define SNDRV_SB_CSP_LOAD_FROMUSER 0x01
6849+#define SNDRV_SB_CSP_LOAD_INITBLOCK 0x02
6850+
6851+/* CSP sample width */
6852+#define SNDRV_SB_CSP_SAMPLE_8BIT 0x01
6853+#define SNDRV_SB_CSP_SAMPLE_16BIT 0x02
6854+
6855+/* CSP channels */
6856+#define SNDRV_SB_CSP_MONO 0x01
6857+#define SNDRV_SB_CSP_STEREO 0x02
6858+
6859+/* CSP rates */
6860+#define SNDRV_SB_CSP_RATE_8000 0x01
6861+#define SNDRV_SB_CSP_RATE_11025 0x02
6862+#define SNDRV_SB_CSP_RATE_22050 0x04
6863+#define SNDRV_SB_CSP_RATE_44100 0x08
6864+#define SNDRV_SB_CSP_RATE_ALL 0x0f
6865+
6866+/* CSP running state */
6867+#define SNDRV_SB_CSP_ST_IDLE 0x00
6868+#define SNDRV_SB_CSP_ST_LOADED 0x01
6869+#define SNDRV_SB_CSP_ST_RUNNING 0x02
6870+#define SNDRV_SB_CSP_ST_PAUSED 0x04
6871+#define SNDRV_SB_CSP_ST_AUTO 0x08
6872+#define SNDRV_SB_CSP_ST_QSOUND 0x10
6873+
6874+/* maximum QSound value (180 degrees right) */
6875+#define SNDRV_SB_CSP_QSOUND_MAX_RIGHT 0x20
6876+
6877+/* maximum microcode RIFF file size */
6878+#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE 0x3000
6879+
6880+/* microcode header */
6881+struct snd_sb_csp_mc_header {
6882+ char codec_name[16]; /* id name of codec */
6883+ unsigned short func_req; /* requested function */
6884+};
6885+
6886+/* microcode to be loaded */
6887+struct snd_sb_csp_microcode {
6888+ struct snd_sb_csp_mc_header info;
6889+ unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE];
6890+};
6891+
6892+/* start CSP with sample_width in mono/stereo */
6893+struct snd_sb_csp_start {
6894+ int sample_width; /* sample width, look above */
6895+ int channels; /* channels, look above */
6896+};
6897+
6898+/* CSP information */
6899+struct snd_sb_csp_info {
6900+ char codec_name[16]; /* id name of codec */
6901+ unsigned short func_nr; /* function number */
6902+ unsigned int acc_format; /* accepted PCM formats */
6903+ unsigned short acc_channels; /* accepted channels */
6904+ unsigned short acc_width; /* accepted sample width */
6905+ unsigned short acc_rates; /* accepted sample rates */
6906+ unsigned short csp_mode; /* CSP mode, see above */
6907+ unsigned short run_channels; /* current channels */
6908+ unsigned short run_width; /* current sample width */
6909+ unsigned short version; /* version id: 0x10 - 0x1f */
6910+ unsigned short state; /* state bits */
6911+};
6912+
6913+/* HWDEP controls */
6914+/* get CSP information */
6915+#define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, struct snd_sb_csp_info)
6916+/* load microcode to CSP */
6917+/* NOTE: struct snd_sb_csp_microcode overflows the max size (13 bits)
6918+ * defined for some architectures like MIPS, and it leads to build errors.
6919+ * (x86 and co have 14-bit size, thus it's valid, though.)
6920+ * As a workaround for skipping the size-limit check, here we don't use the
6921+ * normal _IOW() macro but _IOC() with the manual argument.
6922+ */
6923+#define SNDRV_SB_CSP_IOCTL_LOAD_CODE \
6924+ _IOC(_IOC_WRITE, 'H', 0x11, sizeof(struct snd_sb_csp_microcode))
6925+/* unload microcode from CSP */
6926+#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE _IO('H', 0x12)
6927+/* start CSP */
6928+#define SNDRV_SB_CSP_IOCTL_START _IOW('H', 0x13, struct snd_sb_csp_start)
6929+/* stop CSP */
6930+#define SNDRV_SB_CSP_IOCTL_STOP _IO('H', 0x14)
6931+/* pause CSP and DMA transfer */
6932+#define SNDRV_SB_CSP_IOCTL_PAUSE _IO('H', 0x15)
6933+/* restart CSP and DMA transfer */
6934+#define SNDRV_SB_CSP_IOCTL_RESTART _IO('H', 0x16)
6935+
6936+
6937+#endif /* _UAPI__SOUND_SB16_CSP_H */
6938diff --git a/include/sound/uapi/sscape_ioctl.h b/include/sound/uapi/sscape_ioctl.h
6939new file mode 100644
6940index 00000000..c6653ebf
6941--- /dev/null
6942+++ b/include/sound/uapi/sscape_ioctl.h
6943@@ -0,0 +1,21 @@
6944+#ifndef SSCAPE_IOCTL_H
6945+#define SSCAPE_IOCTL_H
6946+
6947+
6948+struct sscape_bootblock
6949+{
6950+ unsigned char code[256];
6951+ unsigned version;
6952+};
6953+
6954+#define SSCAPE_MICROCODE_SIZE 65536
6955+
6956+struct sscape_microcode
6957+{
6958+ unsigned char *code;
6959+};
6960+
6961+#define SND_SSCAPE_LOAD_BOOTB _IOWR('P', 100, struct sscape_bootblock)
6962+#define SND_SSCAPE_LOAD_MCODE _IOW ('P', 101, struct sscape_microcode)
6963+
6964+#endif
6965diff --git a/include/sound/uapi/tlv.h b/include/sound/uapi/tlv.h
6966new file mode 100644
6967index 00000000..7d6d65f6
6968--- /dev/null
6969+++ b/include/sound/uapi/tlv.h
6970@@ -0,0 +1,117 @@
6971+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
6972+/*
6973+ * This program is free software; you can redistribute it and/or modify
6974+ * it under the terms of the GNU General Public License as published by
6975+ * the Free Software Foundation; either version 2 of the License, or
6976+ * (at your option) any later version.
6977+ *
6978+ * This program is distributed in the hope that it will be useful,
6979+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6980+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6981+ * GNU General Public License for more details.
6982+ */
6983+
6984+#ifndef __UAPI_SOUND_TLV_H
6985+#define __UAPI_SOUND_TLV_H
6986+
6987+#define SNDRV_CTL_TLVT_CONTAINER 0 /* one level down - group of TLVs */
6988+#define SNDRV_CTL_TLVT_DB_SCALE 1 /* dB scale */
6989+#define SNDRV_CTL_TLVT_DB_LINEAR 2 /* linear volume */
6990+#define SNDRV_CTL_TLVT_DB_RANGE 3 /* dB range container */
6991+#define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */
6992+#define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */
6993+
6994+/*
6995+ * channel-mapping TLV items
6996+ * TLV length must match with num_channels
6997+ */
6998+#define SNDRV_CTL_TLVT_CHMAP_FIXED 0x101 /* fixed channel position */
6999+#define SNDRV_CTL_TLVT_CHMAP_VAR 0x102 /* channels freely swappable */
7000+#define SNDRV_CTL_TLVT_CHMAP_PAIRED 0x103 /* pair-wise swappable */
7001+
7002+/*
7003+ * TLV structure is right behind the struct snd_ctl_tlv:
7004+ * unsigned int type - see SNDRV_CTL_TLVT_*
7005+ * unsigned int length
7006+ * .... data aligned to sizeof(unsigned int), use
7007+ * block_length = (length + (sizeof(unsigned int) - 1)) &
7008+ * ~(sizeof(unsigned int) - 1)) ....
7009+ */
7010+#define SNDRV_CTL_TLVD_ITEM(type, ...) \
7011+ (type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__
7012+#define SNDRV_CTL_TLVD_LENGTH(...) \
7013+ ((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
7014+
7015+/* Accessor offsets for TLV data items */
7016+#define SNDRV_CTL_TLVO_TYPE 0
7017+#define SNDRV_CTL_TLVO_LEN 1
7018+
7019+#define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \
7020+ SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
7021+#define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \
7022+ unsigned int name[] = { \
7023+ SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \
7024+ }
7025+
7026+#define SNDRV_CTL_TLVD_DB_SCALE_MASK 0xffff
7027+#define SNDRV_CTL_TLVD_DB_SCALE_MUTE 0x10000
7028+#define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
7029+ SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \
7030+ (min), \
7031+ ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \
7032+ ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0))
7033+#define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \
7034+ unsigned int name[] = { \
7035+ SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
7036+ }
7037+
7038+/* Accessor offsets for min, mute and step items in dB scale type TLV */
7039+#define SNDRV_CTL_TLVO_DB_SCALE_MIN 2
7040+#define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP 3
7041+
7042+/* dB scale specified with min/max values instead of step */
7043+#define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
7044+ SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
7045+#define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
7046+ SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
7047+#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \
7048+ unsigned int name[] = { \
7049+ SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
7050+ }
7051+#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \
7052+ unsigned int name[] = { \
7053+ SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
7054+ }
7055+
7056+/* Accessor offsets for min, max items in db-minmax types of TLV. */
7057+#define SNDRV_CTL_TLVO_DB_MINMAX_MIN 2
7058+#define SNDRV_CTL_TLVO_DB_MINMAX_MAX 3
7059+
7060+/* linear volume between min_dB and max_dB (.01dB unit) */
7061+#define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
7062+ SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
7063+#define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \
7064+ unsigned int name[] = { \
7065+ SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
7066+ }
7067+
7068+/* Accessor offsets for min, max items in db-linear type of TLV. */
7069+#define SNDRV_CTL_TLVO_DB_LINEAR_MIN 2
7070+#define SNDRV_CTL_TLVO_DB_LINEAR_MAX 3
7071+
7072+/* dB range container:
7073+ * Items in dB range container must be ordered by their values and by their
7074+ * dB values. This implies that larger values must correspond with larger
7075+ * dB values (which is also required for all other mixer controls).
7076+ */
7077+/* Each item is: <min> <max> <TLV> */
7078+#define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \
7079+ SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
7080+#define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \
7081+ unsigned int name[] = { \
7082+ SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \
7083+ }
7084+
7085+#define SNDRV_CTL_TLVD_DB_GAIN_MUTE -9999999
7086+
7087+#endif
7088diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
7089index 11efce6d..101491a4 100644
7090--- a/src/topology/tplg_local.h
7091+++ b/src/topology/tplg_local.h
7092@@ -18,8 +18,7 @@
7093 #include "list.h"
7094 #include "topology.h"
7095
7096-#define __packed __attribute__((__packed__))
7097-
7098+#include <sound/type_compat.h>
7099 #include <sound/asound.h>
7100 #include <sound/asoc.h>
7101 #include <sound/tlv.h>
7102--
71032.20.1
7104
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch b/meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch
new file mode 100644
index 0000000000..4db4934fdc
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch
@@ -0,0 +1,50 @@
1From 01cd8cb6d594d7a12c67d21d689ebe0e347469c0 Mon Sep 17 00:00:00 2001
2From: Tanu Kaskinen <tanuk@iki.fi>
3Date: Fri, 20 Dec 2019 09:26:12 +0200
4Subject: [PATCH] configure.ac: remove an unnecessary libtool fix
5
6This code was added in commit 75d393a563efb578c79364a277087c6326267f52
7without explaining why. I assume it was a mistake, since it looks like
8the libtool problem should have gone away a long time ago. The referenced
9wiki page https://wiki.debian.org/RpathIssue says:
10
11 Since libtool 1.5.2 (released 2004-01-25), on Linux libtool no
12 longer sets RPATH for any directories in the dynamic linker search
13 path, so this should no longer be an issue unless upstream used a
14 really old version of libtool when creating their distribution
15 tarball.
16
17This code caused problems in OpenEmbedded, where the libtool script is
18named "x86_64-oe-linux-libtool" or similar rather than just "libtool",
19so the sed command failed with a file not found error. Rather than
20adapting the code to OpenEmbedded's peculiarities, it seems best to just
21remove the unnecessary code altogether.
22
23Upstream-Status: Submitted [https://github.com/alsa-project/alsa-lib/pull/19]
24Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
25---
26 configure.ac | 11 -----------
27 1 file changed, 11 deletions(-)
28
29diff --git a/configure.ac b/configure.ac
30index 119ef600..22a4a885 100644
31--- a/configure.ac
32+++ b/configure.ac
33@@ -764,14 +764,3 @@ test "$build_seq" = "yes" && echo "#include <alsa/seq.h>" >> include/asoundlib.h
34 test "$build_seq" = "yes" && echo "#include <alsa/seqmid.h>" >> include/asoundlib.h
35 test "$build_seq" = "yes" && echo "#include <alsa/seq_midi_event.h>" >> include/asoundlib.h
36 cat "$srcdir"/include/asoundlib-tail.h >> include/asoundlib.h
37-
38-dnl Taken from https://wiki.debian.org/RpathIssue
39-case $host in
40- *-*-linux-gnu)
41- AC_MSG_RESULT([Fixing libtool for -rpath problems.])
42- sed < libtool > libtool-2 \
43- 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/'
44- mv libtool-2 libtool
45- chmod 755 libtool
46- ;;
47-esac
48--
492.20.1
50
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch b/meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch
new file mode 100644
index 0000000000..c35a2c9d7c
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch
@@ -0,0 +1,137 @@
1From 59792f467b38d6a4c4dffdb30528f7fb03d23d96 Mon Sep 17 00:00:00 2001
2From: Takashi Iwai <tiwai@suse.de>
3Date: Fri, 20 Dec 2019 17:12:37 +0100
4Subject: [PATCH] uapi: Move typedefs from uapi to sound/*
5
6For keeping uapi/*.h cleaner.
7
8Signed-off-by: Takashi Iwai <tiwai@suse.de>
9
10Upstream-Status: Backport
11
12Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
13---
14 include/sound/emu10k1.h | 9 +++++++++
15 include/sound/hdsp.h | 10 ++++++++++
16 include/sound/hdspm.h | 8 ++++++++
17 include/sound/sb16_csp.h | 4 ++++
18 include/sound/uapi/emu10k1.h | 10 ----------
19 include/sound/uapi/hdsp.h | 9 ---------
20 include/sound/uapi/hdspm.h | 8 --------
21 7 files changed, 31 insertions(+), 27 deletions(-)
22
23diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
24index f06ecee5..0832f95b 100644
25--- a/include/sound/emu10k1.h
26+++ b/include/sound/emu10k1.h
27@@ -1,2 +1,11 @@
28 #include <alsa/sound/type_compat.h>
29 #include <alsa/sound/uapi/emu10k1.h>
30+#ifndef __emu10k1_type_defined
31+#define __emu10k1_type_defined
32+typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
33+typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
34+typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
35+typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
36+typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
37+typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
38+#endif
39diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h
40index 78fb745b..e8f93156 100644
41--- a/include/sound/hdsp.h
42+++ b/include/sound/hdsp.h
43@@ -1,2 +1,12 @@
44 #include <alsa/sound/type_compat.h>
45 #include <alsa/sound/uapi/hdsp.h>
46+#ifndef __hdsp_type_defined
47+#define __hdsp_type_defined
48+typedef enum HDSP_IO_Type HDSP_IO_Type;
49+typedef struct hdsp_peak_rms hdsp_peak_rms_t;
50+typedef struct hdsp_config_info hdsp_config_info_t;
51+typedef struct hdsp_firmware hdsp_firmware_t;
52+typedef struct hdsp_version hdsp_version_t;
53+typedef struct hdsp_mixer hdsp_mixer_t;
54+typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
55+#endif
56diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h
57index af6d19ed..d9095d9f 100644
58--- a/include/sound/hdspm.h
59+++ b/include/sound/hdspm.h
60@@ -1,2 +1,10 @@
61 #include <alsa/sound/type_compat.h>
62 #include <alsa/sound/uapi/hdspm.h>
63+#ifndef __hdspm_type_defined
64+#define __hdspm_type_defined
65+typedef struct hdspm_peak_rms hdspm_peak_rms_t;
66+typedef struct hdspm_config_info hdspm_config_info_t;
67+typedef struct hdspm_version hdspm_version_t;
68+typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
69+typedef struct hdspm_mixer hdspm_mixer_t;
70+#endif
71diff --git a/include/sound/sb16_csp.h b/include/sound/sb16_csp.h
72index 24121fcb..fd02bc56 100644
73--- a/include/sound/sb16_csp.h
74+++ b/include/sound/sb16_csp.h
75@@ -1 +1,5 @@
76 #include <alsa/sound/uapi/sb16_csp.h>
77+#ifndef __sb16_csp_type_defined
78+#define __sb16_csp_type_defined
79+typedef struct snd_sb_csp_microcode snd_sb_csp_microcode_t;
80+#endif
81diff --git a/include/sound/uapi/emu10k1.h b/include/sound/uapi/emu10k1.h
82index c1150e4d..6bcd76f6 100644
83--- a/include/sound/uapi/emu10k1.h
84+++ b/include/sound/uapi/emu10k1.h
85@@ -382,14 +382,4 @@ struct snd_emu10k1_fx8010_pcm_rec {
86 #define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW ('H', 0x83, int)
87 #define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR ('H', 0x84, int)
88
89-#ifndef __KERNEL__
90-/* typedefs for compatibility to user-space */
91-typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
92-typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
93-typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
94-typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
95-typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
96-typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
97-#endif
98-
99 #endif /* _UAPI__SOUND_EMU10K1_H */
100diff --git a/include/sound/uapi/hdsp.h b/include/sound/uapi/hdsp.h
101index 88c92a3f..7ac2d3f2 100644
102--- a/include/sound/uapi/hdsp.h
103+++ b/include/sound/uapi/hdsp.h
104@@ -97,13 +97,4 @@ struct hdsp_9632_aeb {
105
106 #define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
107
108-/* typedefs for compatibility to user-space */
109-typedef enum HDSP_IO_Type HDSP_IO_Type;
110-typedef struct hdsp_peak_rms hdsp_peak_rms_t;
111-typedef struct hdsp_config_info hdsp_config_info_t;
112-typedef struct hdsp_firmware hdsp_firmware_t;
113-typedef struct hdsp_version hdsp_version_t;
114-typedef struct hdsp_mixer hdsp_mixer_t;
115-typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
116-
117 #endif /* __SOUND_HDSP_H */
118diff --git a/include/sound/uapi/hdspm.h b/include/sound/uapi/hdspm.h
119index 2d91f90e..3fbfd9dc 100644
120--- a/include/sound/uapi/hdspm.h
121+++ b/include/sound/uapi/hdspm.h
122@@ -219,12 +219,4 @@ struct hdspm_mixer_ioctl {
123 /* use indirect access due to the limit of ioctl bit size */
124 #define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
125
126-/* typedefs for compatibility to user-space */
127-typedef struct hdspm_peak_rms hdspm_peak_rms_t;
128-typedef struct hdspm_config_info hdspm_config_info_t;
129-typedef struct hdspm_version hdspm_version_t;
130-typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
131-typedef struct hdspm_mixer hdspm_mixer_t;
132-
133-
134 #endif
135--
1362.20.1
137
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch b/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch
new file mode 100644
index 0000000000..96dcd8abac
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch
@@ -0,0 +1,41 @@
1From 4b6fe372c68d1ff50e7c161cffadeb298734f49c Mon Sep 17 00:00:00 2001
2From: paulhsia <paulhsia@chromium.org>
3Date: Sat, 30 Nov 2019 03:35:30 +0800
4Subject: [PATCH 1/5] ucm: Use strncmp to avoid access-out-of-boundary
5
6If the length of the identifier is less than the length of the prefix,
7access-out-of-boundary will occur in memcmp().
8
9Signed-off-by: paulhsia <paulhsia@chromium.org>
10Signed-off-by: Jaroslav Kysela <perex@perex.cz>
11
12Upstream-Status: Backport
13Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
14---
15 src/ucm/main.c | 8 +++++---
16 1 file changed, 5 insertions(+), 3 deletions(-)
17
18diff --git a/src/ucm/main.c b/src/ucm/main.c
19index b0b6ffb3..252e50d9 100644
20--- a/src/ucm/main.c
21+++ b/src/ucm/main.c
22@@ -61,11 +61,13 @@ static int check_identifier(const char *identifier, const char *prefix)
23 {
24 int len;
25
26- if (strcmp(identifier, prefix) == 0)
27- return 1;
28 len = strlen(prefix);
29- if (memcmp(identifier, prefix, len) == 0 && identifier[len] == '/')
30+ if (strncmp(identifier, prefix, len) != 0)
31+ return 0;
32+
33+ if (identifier[len] == 0 || identifier[len] == '/')
34 return 1;
35+
36 return 0;
37 }
38
39--
402.20.1
41
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch b/meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch
new file mode 100644
index 0000000000..42973fb6d0
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch
@@ -0,0 +1,45 @@
1From 58f9dc9bd12a51efa12dbc67e200f4d85cd3da07 Mon Sep 17 00:00:00 2001
2From: Jaroslav Kysela <perex@perex.cz>
3Date: Fri, 29 Nov 2019 22:28:26 +0100
4Subject: [PATCH 2/5] ucm: return always at least NULL if no list is available
5 in snd_use_case_get_list()
6
7Signed-off-by: Jaroslav Kysela <perex@perex.cz>
8
9Upstream-Status: Backport
10Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
11---
12 src/ucm/main.c | 8 ++++++--
13 1 file changed, 6 insertions(+), 2 deletions(-)
14
15diff --git a/src/ucm/main.c b/src/ucm/main.c
16index 252e50d9..b80db65f 100644
17--- a/src/ucm/main.c
18+++ b/src/ucm/main.c
19@@ -1160,8 +1160,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
20
21 modifier = find_modifier(uc_mgr, verb, name, 0);
22 if (modifier) {
23- if (modifier->dev_list.type != type)
24+ if (modifier->dev_list.type != type) {
25+ *list = NULL;
26 return 0;
27+ }
28 return get_list(&modifier->dev_list.list, list,
29 struct dev_list_node, list,
30 name);
31@@ -1169,8 +1171,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
32
33 device = find_device(uc_mgr, verb, name, 0);
34 if (device) {
35- if (device->dev_list.type != type)
36+ if (device->dev_list.type != type) {
37+ *list = NULL;
38 return 0;
39+ }
40 return get_list(&device->dev_list.list, list,
41 struct dev_list_node, list,
42 name);
43--
442.20.1
45
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch b/meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch
new file mode 100644
index 0000000000..82f8b2bd2a
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch
@@ -0,0 +1,34 @@
1From 10f3401ce356a675e2440993457ee7c8c7e9fcf8 Mon Sep 17 00:00:00 2001
2From: Jaroslav Kysela <perex@perex.cz>
3Date: Sun, 1 Dec 2019 14:26:40 +0100
4Subject: [PATCH 3/5] namehint: correct the @args check
5
6BugLink: https://github.com/alsa-project/alsa-plugins/issues/3
7Signed-off-by: Jaroslav Kysela <perex@perex.cz>
8
9Upstream-Status: Backport
10Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
11---
12 src/control/namehint.c | 6 ++++++
13 1 file changed, 6 insertions(+)
14
15diff --git a/src/control/namehint.c b/src/control/namehint.c
16index 808df6b5..4927ef97 100644
17--- a/src/control/namehint.c
18+++ b/src/control/namehint.c
19@@ -348,6 +348,12 @@ static int try_config(snd_config_t *config,
20 goto __cleanup;
21 if (snd_config_search(res, "@args", &cfg) >= 0) {
22 snd_config_for_each(i, next, cfg) {
23+ /* skip the argument list */
24+ snd_config_get_id(snd_config_iterator_entry(i), &str);
25+ while (*str && *str >= '0' && *str <= '9') str++;
26+ if (*str == '\0')
27+ continue;
28+ /* the argument definition must have the default */
29 if (snd_config_search(snd_config_iterator_entry(i),
30 "default", NULL) < 0) {
31 err = -EINVAL;
32--
332.20.1
34
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch b/meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch
new file mode 100644
index 0000000000..98192f6e53
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch
@@ -0,0 +1,31 @@
1From 1fa6664d5f0cc7d21edceba6695a4c28543c2cab Mon Sep 17 00:00:00 2001
2From: Jaroslav Kysela <perex@perex.cz>
3Date: Sun, 1 Dec 2019 14:30:54 +0100
4Subject: [PATCH 4/5] namehint: improve the previous patch (check the returned
5 value)
6
7Signed-off-by: Jaroslav Kysela <perex@perex.cz>
8
9Upstream-Status: Backport
10Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
11---
12 src/control/namehint.c | 3 ++-
13 1 file changed, 2 insertions(+), 1 deletion(-)
14
15diff --git a/src/control/namehint.c b/src/control/namehint.c
16index 4927ef97..60c48ae3 100644
17--- a/src/control/namehint.c
18+++ b/src/control/namehint.c
19@@ -349,7 +349,8 @@ static int try_config(snd_config_t *config,
20 if (snd_config_search(res, "@args", &cfg) >= 0) {
21 snd_config_for_each(i, next, cfg) {
22 /* skip the argument list */
23- snd_config_get_id(snd_config_iterator_entry(i), &str);
24+ if (snd_config_get_id(snd_config_iterator_entry(i), &str) < 0)
25+ continue;
26 while (*str && *str >= '0' && *str <= '9') str++;
27 if (*str == '\0')
28 continue;
29--
302.20.1
31
diff --git a/meta/recipes-multimedia/alsa/alsa-lib/0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch b/meta/recipes-multimedia/alsa/alsa-lib/0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch
new file mode 100644
index 0000000000..cbc0a4ceab
--- /dev/null
+++ b/meta/recipes-multimedia/alsa/alsa-lib/0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch
@@ -0,0 +1,86 @@
1From 976f8f62238f0d837584adc7c31035bdb29b6d6f Mon Sep 17 00:00:00 2001
2From: Hans de Goede <hdegoede@redhat.com>
3Date: Tue, 3 Dec 2019 18:27:39 +0100
4Subject: [PATCH 5/5] ucm: Do not fail to parse configs on cards with an empty
5 CardComponents lists
6
7Since the UCM profiles for all Bay- and Cherry-Trail SST cards have been
8moved over to UCM2, parsing them fails with:
9
10ALSA lib ucm_subs.c:220:(uc_mgr_get_substituted_value) variable '${CardComponents}' is not defined in this context!
11
12This completely breaks audio support on all Bay- and Cherry-Trail devices.
13
14This is caused by these non-SOF ASoC using cards having an empty
15CardComponents list. Which in itself is fine, but is rejected by
16the ucm_subs.c code. This commit changes the ucm_subs code to accept
17an empty string as a valid value for CardComponents restoring audio
18functionality on these boards.
19
20Signed-off-by: Hans de Goede <hdegoede@redhat.com>
21Signed-off-by: Jaroslav Kysela <perex@perex.cz>
22
23Upstream-Status: Backport
24Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
25---
26 src/ucm/ucm_subs.c | 20 ++++++++++++--------
27 1 file changed, 12 insertions(+), 8 deletions(-)
28
29diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
30index 00afa9e3..90e395f0 100644
31--- a/src/ucm/ucm_subs.c
32+++ b/src/ucm/ucm_subs.c
33@@ -25,6 +25,7 @@
34 */
35
36 #include "ucm_local.h"
37+#include <stdbool.h>
38 #include <sys/stat.h>
39 #include <limits.h>
40
41@@ -145,10 +146,11 @@ static char *rval_sysfs(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char
42 return strdup(path);
43 }
44
45-#define MATCH_VARIABLE(name, id, fcn) \
46+#define MATCH_VARIABLE(name, id, fcn, empty_ok) \
47 if (strncmp((name), (id), sizeof(id) - 1) == 0) { \
48 rval = fcn(uc_mgr); \
49 idsize = sizeof(id) - 1; \
50+ allow_empty = (empty_ok); \
51 goto __rval; \
52 }
53
54@@ -189,12 +191,14 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
55
56 while (*value) {
57 if (*value == '$' && *(value+1) == '{') {
58- MATCH_VARIABLE(value, "${ConfName}", rval_conf_name);
59- MATCH_VARIABLE(value, "${CardId}", rval_card_id);
60- MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver);
61- MATCH_VARIABLE(value, "${CardName}", rval_card_name);
62- MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname);
63- MATCH_VARIABLE(value, "${CardComponents}", rval_card_components);
64+ bool allow_empty = false;
65+
66+ MATCH_VARIABLE(value, "${ConfName}", rval_conf_name, false);
67+ MATCH_VARIABLE(value, "${CardId}", rval_card_id, false);
68+ MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver, false);
69+ MATCH_VARIABLE(value, "${CardName}", rval_card_name, false);
70+ MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname, false);
71+ MATCH_VARIABLE(value, "${CardComponents}", rval_card_components, true);
72 MATCH_VARIABLE2(value, "${env:", rval_env);
73 MATCH_VARIABLE2(value, "${sys:", rval_sysfs);
74 err = -EINVAL;
75@@ -208,7 +212,7 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
76 }
77 goto __error;
78 __rval:
79- if (rval == NULL || rval[0] == '\0') {
80+ if (rval == NULL || (!allow_empty && rval[0] == '\0')) {
81 free(rval);
82 strncpy(r, value, idsize);
83 r[idsize] = '\0';
84--
852.20.1
86
diff --git a/meta/recipes-multimedia/alsa/alsa-lib_1.1.9.bb b/meta/recipes-multimedia/alsa/alsa-lib_1.2.1.2.bb
index ba7e978dbe..9565ad1b20 100644
--- a/meta/recipes-multimedia/alsa/alsa-lib_1.1.9.bb
+++ b/meta/recipes-multimedia/alsa/alsa-lib_1.2.1.2.bb
@@ -7,9 +7,18 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7 \
7 file://src/socket.c;md5=285675b45e83f571c6a957fe4ab79c93;beginline=9;endline=24 \ 7 file://src/socket.c;md5=285675b45e83f571c6a957fe4ab79c93;beginline=9;endline=24 \
8 " 8 "
9 9
10SRC_URI = "https://www.alsa-project.org/files/pub/lib/${BP}.tar.bz2" 10SRC_URI = "https://www.alsa-project.org/files/pub/lib/${BP}.tar.bz2 \
11SRC_URI[md5sum] = "e6d429dbdcfaa0f034d907fa6dc3735e" 11 file://0001-configure.ac-remove-an-unnecessary-libtool-fix.patch \
12SRC_URI[sha256sum] = "488373aef5396682f3a411a6d064ae0ad196b9c96269d0bb912fbdeec94b994b" 12 file://0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch \
13 file://0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch \
14 file://0003-namehint-correct-the-args-check.patch \
15 file://0004-namehint-improve-the-previous-patch-check-the-return.patch \
16 file://0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch \
17 file://0001-Fix-alsa-sound-.h-for-external-programs.patch \
18 file://0001-uapi-Move-typedefs-from-uapi-to-sound.patch \
19 "
20SRC_URI[md5sum] = "82ddd3698469beec147e4f4a67134ea0"
21SRC_URI[sha256sum] = "958e260e3673f1f6ff6b2d2c0df3fc2e469bea5b2957163ce96ce17f23e87943"
13 22
14inherit autotools pkgconfig 23inherit autotools pkgconfig
15 24
@@ -18,10 +27,11 @@ EXTRA_OECONF += " \
18 --disable-python \ 27 --disable-python \
19" 28"
20 29
21PACKAGES =+ "alsa-server alsa-conf alsa-doc" 30PACKAGES =+ "alsa-server alsa-conf libatopology"
22 31
23FILES_alsa-server = "${bindir}/*" 32FILES_alsa-server = "${bindir}/*"
24FILES_alsa-conf = "${datadir}/alsa/" 33FILES_alsa-conf = "${datadir}/alsa/"
34FILES_libatopology = "${libdir}/libatopology.so.*"
25 35
26RDEPENDS_${PN}_class-target = "alsa-conf" 36RDEPENDS_${PN}_class-target = "alsa-conf"
27 37