meta-openembedded and poky: subtree updates

Squash of the following due to dependencies among them
and OpenBMC changes:

meta-openembedded: subtree update:d0748372d2..9201611135
meta-openembedded: subtree update:9201611135..17fd382f34
poky: subtree update:9052e5b32a..2e11d97b6c
poky: subtree update:2e11d97b6c..a8544811d7

The change log was too large for the jenkins plugin
to handle therefore it has been removed. Here is
the first and last commit of each subtree:

meta-openembedded:d0748372d2
      cppzmq: bump to version 4.6.0
meta-openembedded:17fd382f34
      mpv: Remove X11 dependency
poky:9052e5b32a
      package_ipk: Remove pointless comment to trigger rebuild
poky:a8544811d7
      pbzip2: Fix license warning

Change-Id: If0fc6c37629642ee207a4ca2f7aa501a2c673cd6
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch
new file mode 100644
index 0000000..890650a
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-Fix-alsa-sound-.h-for-external-programs.patch
@@ -0,0 +1,7104 @@
+From ae564665ec261cf104de499b1cdda3564070fc65 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Fri, 20 Dec 2019 15:46:48 +0100
+Subject: [PATCH] Fix alsa/sound/*.h for external programs
+
+The recent update of sound/*.h to sync with the latest Linus uapi
+files broke the build of alsa-tools programs.  These files used to be
+a modified version of Linux sound/* header files, so that they could
+be built without Linux headers.  The special prefix like __user and
+other things were worked around there.
+
+We may do that again, but a better approach is to fix those things in
+Linux kernel uapi side, while we keep the minimal workaround in
+alsa-lib such as the __u16 and co type definitions.
+
+This patch is such an attempt, namely:
+- Keep the original $LINUX/uapi/sound/*.h in include/sound/uapi
+  directory
+- The "fixes" are applied to some uapi headers, so that they don't
+  contain Linux-specific prefix and use of opaque struct like
+  snd_ctl_elem_id
+- The uapi headers are included indirectly from include/sound/*.h
+- Some headers have inclusion of type_compat.h for the Linux variable
+  types and prefixes
+- type_compat.h tries to use <linux/types.h> when __linux__ is
+  defined, instead of the own conflicting definitions
+
+The last type might need a bit more adjustment depending on the
+compiler, but it can be fixed locally without disturbing else.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+Upstream-Status: Backport
+
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+
+---
+ configure.ac                      |    3 +-
+ include/sound/Makefile.am         |    6 +-
+ include/sound/asequencer.h        |  613 +----------------
+ include/sound/asoc.h              |  634 +-----------------
+ include/sound/asound.h            | 1039 +----------------------------
+ include/sound/asound_fm.h         |  136 +---
+ include/sound/emu10k1.h           |  383 +----------
+ include/sound/hdsp.h              |  113 +---
+ include/sound/hdspm.h             |  234 +------
+ include/sound/sb16_csp.h          |  124 +---
+ include/sound/sscape_ioctl.h      |   22 +-
+ include/sound/tlv.h               |  118 +---
+ include/sound/type_compat.h       |   13 +
+ include/sound/uapi/Makefile.am    |    6 +
+ include/sound/uapi/asequencer.h   |  612 +++++++++++++++++
+ include/sound/uapi/asoc.h         |  633 ++++++++++++++++++
+ include/sound/uapi/asound.h       | 1038 ++++++++++++++++++++++++++++
+ include/sound/uapi/asound_fm.h    |  135 ++++
+ include/sound/uapi/emu10k1.h      |  395 +++++++++++
+ include/sound/uapi/hdsp.h         |  109 +++
+ include/sound/uapi/hdspm.h        |  230 +++++++
+ include/sound/uapi/sb16_csp.h     |  123 ++++
+ include/sound/uapi/sscape_ioctl.h |   21 +
+ include/sound/uapi/tlv.h          |  117 ++++
+ src/topology/tplg_local.h         |    3 +-
+ 25 files changed, 3452 insertions(+), 3408 deletions(-)
+ create mode 100644 include/sound/uapi/Makefile.am
+ create mode 100644 include/sound/uapi/asequencer.h
+ create mode 100644 include/sound/uapi/asoc.h
+ create mode 100644 include/sound/uapi/asound.h
+ create mode 100644 include/sound/uapi/asound_fm.h
+ create mode 100644 include/sound/uapi/emu10k1.h
+ create mode 100644 include/sound/uapi/hdsp.h
+ create mode 100644 include/sound/uapi/hdspm.h
+ create mode 100644 include/sound/uapi/sb16_csp.h
+ create mode 100644 include/sound/uapi/sscape_ioctl.h
+ create mode 100644 include/sound/uapi/tlv.h
+
+diff --git a/configure.ac b/configure.ac
+index 119ef600..886f87bc 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -707,7 +707,8 @@ if test ! -L "$srcdir"/include/alsa ; then
+ fi
+ 
+ AC_OUTPUT(Makefile doc/Makefile doc/pictures/Makefile doc/doxygen.cfg \
+-	  include/Makefile include/sound/Makefile src/Versions src/Makefile \
++	  include/Makefile include/sound/Makefile include/sound/uapi/Makefile \
++	  src/Versions src/Makefile \
+           src/control/Makefile src/mixer/Makefile \
+ 	  src/pcm/Makefile src/pcm/scopes/Makefile \
+ 	  src/rawmidi/Makefile src/timer/Makefile \
+diff --git a/include/sound/Makefile.am b/include/sound/Makefile.am
+index 99c42211..ccc7d273 100644
+--- a/include/sound/Makefile.am
++++ b/include/sound/Makefile.am
+@@ -1,7 +1,9 @@
++SUBDIRS = uapi
++
+ alsasoundincludedir = ${includedir}/alsa/sound
+ 
+ alsasoundinclude_HEADERS = asound_fm.h hdsp.h hdspm.h sb16_csp.h \
+-			   sscape_ioctl.h emu10k1.h type_compat.h \
+-			   asoc.h tlv.h
++			   sscape_ioctl.h emu10k1.h  asoc.h tlv.h \
++			   type_compat.h
+ 
+ noinst_HEADERS = asound.h asequencer.h
+diff --git a/include/sound/asequencer.h b/include/sound/asequencer.h
+index a75e14ed..e539a77e 100644
+--- a/include/sound/asequencer.h
++++ b/include/sound/asequencer.h
+@@ -1,612 +1 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-/*
+- *  Main header file for the ALSA sequencer
+- *  Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
+- *            (c) 1998-1999 by Jaroslav Kysela <perex@perex.cz>
+- *
+- *
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+- *
+- */
+-#ifndef _UAPI__SOUND_ASEQUENCER_H
+-#define _UAPI__SOUND_ASEQUENCER_H
+-
+-#include <sound/asound.h>
+-
+-/** version of the sequencer */
+-#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 2)
+-
+-/**
+- * definition of sequencer event types
+- */
+-
+-/** system messages
+- * event data type = #snd_seq_result
+- */
+-#define SNDRV_SEQ_EVENT_SYSTEM		0
+-#define SNDRV_SEQ_EVENT_RESULT		1
+-
+-/** note messages (channel specific)
+- * event data type = #snd_seq_ev_note
+- */
+-#define SNDRV_SEQ_EVENT_NOTE		5
+-#define SNDRV_SEQ_EVENT_NOTEON		6
+-#define SNDRV_SEQ_EVENT_NOTEOFF		7
+-#define SNDRV_SEQ_EVENT_KEYPRESS	8
+-	
+-/** control messages (channel specific)
+- * event data type = #snd_seq_ev_ctrl
+- */
+-#define SNDRV_SEQ_EVENT_CONTROLLER	10
+-#define SNDRV_SEQ_EVENT_PGMCHANGE	11
+-#define SNDRV_SEQ_EVENT_CHANPRESS	12
+-#define SNDRV_SEQ_EVENT_PITCHBEND	13	/**< from -8192 to 8191 */
+-#define SNDRV_SEQ_EVENT_CONTROL14	14	/**< 14 bit controller value */
+-#define SNDRV_SEQ_EVENT_NONREGPARAM	15	/**< 14 bit NRPN address + 14 bit unsigned value */
+-#define SNDRV_SEQ_EVENT_REGPARAM	16	/**< 14 bit RPN address + 14 bit unsigned value */
+-
+-/** synchronisation messages
+- * event data type = #snd_seq_ev_ctrl
+- */
+-#define SNDRV_SEQ_EVENT_SONGPOS		20	/* Song Position Pointer with LSB and MSB values */
+-#define SNDRV_SEQ_EVENT_SONGSEL		21	/* Song Select with song ID number */
+-#define SNDRV_SEQ_EVENT_QFRAME		22	/* midi time code quarter frame */
+-#define SNDRV_SEQ_EVENT_TIMESIGN	23	/* SMF Time Signature event */
+-#define SNDRV_SEQ_EVENT_KEYSIGN		24	/* SMF Key Signature event */
+-	        
+-/** timer messages
+- * event data type = snd_seq_ev_queue_control
+- */
+-#define SNDRV_SEQ_EVENT_START		30	/* midi Real Time Start message */
+-#define SNDRV_SEQ_EVENT_CONTINUE	31	/* midi Real Time Continue message */
+-#define SNDRV_SEQ_EVENT_STOP		32	/* midi Real Time Stop message */	
+-#define	SNDRV_SEQ_EVENT_SETPOS_TICK	33	/* set tick queue position */
+-#define SNDRV_SEQ_EVENT_SETPOS_TIME	34	/* set realtime queue position */
+-#define SNDRV_SEQ_EVENT_TEMPO		35	/* (SMF) Tempo event */
+-#define SNDRV_SEQ_EVENT_CLOCK		36	/* midi Real Time Clock message */
+-#define SNDRV_SEQ_EVENT_TICK		37	/* midi Real Time Tick message */
+-#define SNDRV_SEQ_EVENT_QUEUE_SKEW	38	/* skew queue tempo */
+-
+-/** others
+- * event data type = none
+- */
+-#define SNDRV_SEQ_EVENT_TUNE_REQUEST	40	/* tune request */
+-#define SNDRV_SEQ_EVENT_RESET		41	/* reset to power-on state */
+-#define SNDRV_SEQ_EVENT_SENSING		42	/* "active sensing" event */
+-
+-/** echo back, kernel private messages
+- * event data type = any type
+- */
+-#define SNDRV_SEQ_EVENT_ECHO		50	/* echo event */
+-#define SNDRV_SEQ_EVENT_OSS		51	/* OSS raw event */
+-
+-/** system status messages (broadcast for subscribers)
+- * event data type = snd_seq_addr
+- */
+-#define SNDRV_SEQ_EVENT_CLIENT_START	60	/* new client has connected */
+-#define SNDRV_SEQ_EVENT_CLIENT_EXIT	61	/* client has left the system */
+-#define SNDRV_SEQ_EVENT_CLIENT_CHANGE	62	/* client status/info has changed */
+-#define SNDRV_SEQ_EVENT_PORT_START	63	/* new port was created */
+-#define SNDRV_SEQ_EVENT_PORT_EXIT	64	/* port was deleted from system */
+-#define SNDRV_SEQ_EVENT_PORT_CHANGE	65	/* port status/info has changed */
+-
+-/** port connection changes
+- * event data type = snd_seq_connect
+- */
+-#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED	66	/* ports connected */
+-#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67	/* ports disconnected */
+-
+-/* 70-89:  synthesizer events - obsoleted */
+-
+-/** user-defined events with fixed length
+- * event data type = any
+- */
+-#define SNDRV_SEQ_EVENT_USR0		90
+-#define SNDRV_SEQ_EVENT_USR1		91
+-#define SNDRV_SEQ_EVENT_USR2		92
+-#define SNDRV_SEQ_EVENT_USR3		93
+-#define SNDRV_SEQ_EVENT_USR4		94
+-#define SNDRV_SEQ_EVENT_USR5		95
+-#define SNDRV_SEQ_EVENT_USR6		96
+-#define SNDRV_SEQ_EVENT_USR7		97
+-#define SNDRV_SEQ_EVENT_USR8		98
+-#define SNDRV_SEQ_EVENT_USR9		99
+-
+-/* 100-118: instrument layer - obsoleted */
+-/* 119-129: reserved */
+-
+-/* 130-139: variable length events
+- * event data type = snd_seq_ev_ext
+- * (SNDRV_SEQ_EVENT_LENGTH_VARIABLE must be set)
+- */
+-#define SNDRV_SEQ_EVENT_SYSEX		130	/* system exclusive data (variable length) */
+-#define SNDRV_SEQ_EVENT_BOUNCE		131	/* error event */
+-/* 132-134: reserved */
+-#define SNDRV_SEQ_EVENT_USR_VAR0	135
+-#define SNDRV_SEQ_EVENT_USR_VAR1	136
+-#define SNDRV_SEQ_EVENT_USR_VAR2	137
+-#define SNDRV_SEQ_EVENT_USR_VAR3	138
+-#define SNDRV_SEQ_EVENT_USR_VAR4	139
+-
+-/* 150-151: kernel events with quote - DO NOT use in user clients */
+-#define SNDRV_SEQ_EVENT_KERNEL_ERROR	150
+-#define SNDRV_SEQ_EVENT_KERNEL_QUOTE	151	/* obsolete */
+-
+-/* 152-191: reserved */
+-
+-/* 192-254: hardware specific events */
+-
+-/* 255: special event */
+-#define SNDRV_SEQ_EVENT_NONE		255
+-
+-
+-typedef unsigned char snd_seq_event_type_t;
+-
+-/** event address */
+-struct snd_seq_addr {
+-	unsigned char client;	/**< Client number:         0..255, 255 = broadcast to all clients */
+-	unsigned char port;	/**< Port within client:    0..255, 255 = broadcast to all ports */
+-};
+-
+-/** port connection */
+-struct snd_seq_connect {
+-	struct snd_seq_addr sender;
+-	struct snd_seq_addr dest;
+-};
+-
+-
+-#define SNDRV_SEQ_ADDRESS_UNKNOWN	253	/* unknown source */
+-#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS	254	/* send event to all subscribed ports */
+-#define SNDRV_SEQ_ADDRESS_BROADCAST	255	/* send event to all queues/clients/ports/channels */
+-#define SNDRV_SEQ_QUEUE_DIRECT		253	/* direct dispatch */
+-
+-	/* event mode flag - NOTE: only 8 bits available! */
+-#define SNDRV_SEQ_TIME_STAMP_TICK	(0<<0) /* timestamp in clock ticks */
+-#define SNDRV_SEQ_TIME_STAMP_REAL	(1<<0) /* timestamp in real time */
+-#define SNDRV_SEQ_TIME_STAMP_MASK	(1<<0)
+-
+-#define SNDRV_SEQ_TIME_MODE_ABS		(0<<1)	/* absolute timestamp */
+-#define SNDRV_SEQ_TIME_MODE_REL		(1<<1)	/* relative to current time */
+-#define SNDRV_SEQ_TIME_MODE_MASK	(1<<1)
+-
+-#define SNDRV_SEQ_EVENT_LENGTH_FIXED	(0<<2)	/* fixed event size */
+-#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE	(1<<2)	/* variable event size */
+-#define SNDRV_SEQ_EVENT_LENGTH_VARUSR	(2<<2)	/* variable event size - user memory space */
+-#define SNDRV_SEQ_EVENT_LENGTH_MASK	(3<<2)
+-
+-#define SNDRV_SEQ_PRIORITY_NORMAL	(0<<4)	/* normal priority */
+-#define SNDRV_SEQ_PRIORITY_HIGH		(1<<4)	/* event should be processed before others */
+-#define SNDRV_SEQ_PRIORITY_MASK		(1<<4)
+-
+-
+-	/* note event */
+-struct snd_seq_ev_note {
+-	unsigned char channel;
+-	unsigned char note;
+-	unsigned char velocity;
+-	unsigned char off_velocity;	/* only for SNDRV_SEQ_EVENT_NOTE */
+-	unsigned int duration;		/* only for SNDRV_SEQ_EVENT_NOTE */
+-};
+-
+-	/* controller event */
+-struct snd_seq_ev_ctrl {
+-	unsigned char channel;
+-	unsigned char unused1, unused2, unused3;	/* pad */
+-	unsigned int param;
+-	signed int value;
+-};
+-
+-	/* generic set of bytes (12x8 bit) */
+-struct snd_seq_ev_raw8 {
+-	unsigned char d[12];	/* 8 bit value */
+-};
+-
+-	/* generic set of integers (3x32 bit) */
+-struct snd_seq_ev_raw32 {
+-	unsigned int d[3];	/* 32 bit value */
+-};
+-
+-	/* external stored data */
+-struct snd_seq_ev_ext {
+-	unsigned int len;	/* length of data */
+-	void *ptr;		/* pointer to data (note: maybe 64-bit) */
+-} __attribute__((packed));
+-
+-struct snd_seq_result {
+-	int event;		/* processed event type */
+-	int result;
+-};
+-
+-
+-struct snd_seq_real_time {
+-	unsigned int tv_sec;	/* seconds */
+-	unsigned int tv_nsec;	/* nanoseconds */
+-};
+-
+-typedef unsigned int snd_seq_tick_time_t;	/* midi ticks */
+-
+-union snd_seq_timestamp {
+-	snd_seq_tick_time_t tick;
+-	struct snd_seq_real_time time;
+-};
+-
+-struct snd_seq_queue_skew {
+-	unsigned int value;
+-	unsigned int base;
+-};
+-
+-	/* queue timer control */
+-struct snd_seq_ev_queue_control {
+-	unsigned char queue;			/* affected queue */
+-	unsigned char pad[3];			/* reserved */
+-	union {
+-		signed int value;		/* affected value (e.g. tempo) */
+-		union snd_seq_timestamp time;	/* time */
+-		unsigned int position;		/* sync position */
+-		struct snd_seq_queue_skew skew;
+-		unsigned int d32[2];
+-		unsigned char d8[8];
+-	} param;
+-};
+-
+-	/* quoted event - inside the kernel only */
+-struct snd_seq_ev_quote {
+-	struct snd_seq_addr origin;		/* original sender */
+-	unsigned short value;		/* optional data */
+-	struct snd_seq_event *event;		/* quoted event */
+-} __attribute__((packed));
+-
+-
+-	/* sequencer event */
+-struct snd_seq_event {
+-	snd_seq_event_type_t type;	/* event type */
+-	unsigned char flags;		/* event flags */
+-	char tag;
+-	
+-	unsigned char queue;		/* schedule queue */
+-	union snd_seq_timestamp time;	/* schedule time */
+-
+-
+-	struct snd_seq_addr source;	/* source address */
+-	struct snd_seq_addr dest;	/* destination address */
+-
+-	union {				/* event data... */
+-		struct snd_seq_ev_note note;
+-		struct snd_seq_ev_ctrl control;
+-		struct snd_seq_ev_raw8 raw8;
+-		struct snd_seq_ev_raw32 raw32;
+-		struct snd_seq_ev_ext ext;
+-		struct snd_seq_ev_queue_control queue;
+-		union snd_seq_timestamp time;
+-		struct snd_seq_addr addr;
+-		struct snd_seq_connect connect;
+-		struct snd_seq_result result;
+-		struct snd_seq_ev_quote quote;
+-	} data;
+-};
+-
+-
+-/*
+- * bounce event - stored as variable size data
+- */
+-struct snd_seq_event_bounce {
+-	int err;
+-	struct snd_seq_event event;
+-	/* external data follows here. */
+-};
+-
+-
+-	/* system information */
+-struct snd_seq_system_info {
+-	int queues;			/* maximum queues count */
+-	int clients;			/* maximum clients count */
+-	int ports;			/* maximum ports per client */
+-	int channels;			/* maximum channels per port */
+-	int cur_clients;		/* current clients */
+-	int cur_queues;			/* current queues */
+-	char reserved[24];
+-};
+-
+-
+-	/* system running information */
+-struct snd_seq_running_info {
+-	unsigned char client;		/* client id */
+-	unsigned char big_endian;	/* 1 = big-endian */
+-	unsigned char cpu_mode;		/* 4 = 32bit, 8 = 64bit */
+-	unsigned char pad;		/* reserved */
+-	unsigned char reserved[12];
+-};
+-
+-
+-	/* known client numbers */
+-#define SNDRV_SEQ_CLIENT_SYSTEM		0
+-	/* internal client numbers */
+-#define SNDRV_SEQ_CLIENT_DUMMY		14	/* midi through */
+-#define SNDRV_SEQ_CLIENT_OSS		15	/* oss sequencer emulator */
+-
+-
+-	/* client types */
+-typedef int __bitwise snd_seq_client_type_t;
+-#define	NO_CLIENT	((__force snd_seq_client_type_t) 0)
+-#define	USER_CLIENT	((__force snd_seq_client_type_t) 1)
+-#define	KERNEL_CLIENT	((__force snd_seq_client_type_t) 2)
+-                        
+-	/* event filter flags */
+-#define SNDRV_SEQ_FILTER_BROADCAST	(1<<0)	/* accept broadcast messages */
+-#define SNDRV_SEQ_FILTER_MULTICAST	(1<<1)	/* accept multicast messages */
+-#define SNDRV_SEQ_FILTER_BOUNCE		(1<<2)	/* accept bounce event in error */
+-#define SNDRV_SEQ_FILTER_USE_EVENT	(1<<31)	/* use event filter */
+-
+-struct snd_seq_client_info {
+-	int client;			/* client number to inquire */
+-	snd_seq_client_type_t type;	/* client type */
+-	char name[64];			/* client name */
+-	unsigned int filter;		/* filter flags */
+-	unsigned char multicast_filter[8]; /* multicast filter bitmap */
+-	unsigned char event_filter[32];	/* event filter bitmap */
+-	int num_ports;			/* RO: number of ports */
+-	int event_lost;			/* number of lost events */
+-	int card;			/* RO: card number[kernel] */
+-	int pid;			/* RO: pid[user] */
+-	char reserved[56];		/* for future use */
+-};
+-
+-
+-/* client pool size */
+-struct snd_seq_client_pool {
+-	int client;			/* client number to inquire */
+-	int output_pool;		/* outgoing (write) pool size */
+-	int input_pool;			/* incoming (read) pool size */
+-	int output_room;		/* minimum free pool size for select/blocking mode */
+-	int output_free;		/* unused size */
+-	int input_free;			/* unused size */
+-	char reserved[64];
+-};
+-
+-
+-/* Remove events by specified criteria */
+-
+-#define SNDRV_SEQ_REMOVE_INPUT		(1<<0)	/* Flush input queues */
+-#define SNDRV_SEQ_REMOVE_OUTPUT		(1<<1)	/* Flush output queues */
+-#define SNDRV_SEQ_REMOVE_DEST		(1<<2)	/* Restrict by destination q:client:port */
+-#define SNDRV_SEQ_REMOVE_DEST_CHANNEL	(1<<3)	/* Restrict by channel */
+-#define SNDRV_SEQ_REMOVE_TIME_BEFORE	(1<<4)	/* Restrict to before time */
+-#define SNDRV_SEQ_REMOVE_TIME_AFTER	(1<<5)	/* Restrict to time or after */
+-#define SNDRV_SEQ_REMOVE_TIME_TICK	(1<<6)	/* Time is in ticks */
+-#define SNDRV_SEQ_REMOVE_EVENT_TYPE	(1<<7)	/* Restrict to event type */
+-#define SNDRV_SEQ_REMOVE_IGNORE_OFF 	(1<<8)	/* Do not flush off events */
+-#define SNDRV_SEQ_REMOVE_TAG_MATCH 	(1<<9)	/* Restrict to events with given tag */
+-
+-struct snd_seq_remove_events {
+-	unsigned int  remove_mode;	/* Flags that determine what gets removed */
+-
+-	union snd_seq_timestamp time;
+-
+-	unsigned char queue;	/* Queue for REMOVE_DEST */
+-	struct snd_seq_addr dest;	/* Address for REMOVE_DEST */
+-	unsigned char channel;	/* Channel for REMOVE_DEST */
+-
+-	int  type;	/* For REMOVE_EVENT_TYPE */
+-	char  tag;	/* Tag for REMOVE_TAG */
+-
+-	int  reserved[10];	/* To allow for future binary compatibility */
+-
+-};
+-
+-
+-	/* known port numbers */
+-#define SNDRV_SEQ_PORT_SYSTEM_TIMER	0
+-#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE	1
+-
+-	/* port capabilities (32 bits) */
+-#define SNDRV_SEQ_PORT_CAP_READ		(1<<0)	/* readable from this port */
+-#define SNDRV_SEQ_PORT_CAP_WRITE	(1<<1)	/* writable to this port */
+-
+-#define SNDRV_SEQ_PORT_CAP_SYNC_READ	(1<<2)
+-#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE	(1<<3)
+-
+-#define SNDRV_SEQ_PORT_CAP_DUPLEX	(1<<4)
+-
+-#define SNDRV_SEQ_PORT_CAP_SUBS_READ	(1<<5)	/* allow read subscription */
+-#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE	(1<<6)	/* allow write subscription */
+-#define SNDRV_SEQ_PORT_CAP_NO_EXPORT	(1<<7)	/* routing not allowed */
+-
+-	/* port type */
+-#define SNDRV_SEQ_PORT_TYPE_SPECIFIC	(1<<0)	/* hardware specific */
+-#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1)	/* generic MIDI device */
+-#define SNDRV_SEQ_PORT_TYPE_MIDI_GM	(1<<2)	/* General MIDI compatible device */
+-#define SNDRV_SEQ_PORT_TYPE_MIDI_GS	(1<<3)	/* GS compatible device */
+-#define SNDRV_SEQ_PORT_TYPE_MIDI_XG	(1<<4)	/* XG compatible device */
+-#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32	(1<<5)	/* MT-32 compatible device */
+-#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2	(1<<6)	/* General MIDI 2 compatible device */
+-
+-/* other standards...*/
+-#define SNDRV_SEQ_PORT_TYPE_SYNTH	(1<<10)	/* Synth device (no MIDI compatible - direct wavetable) */
+-#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11)	/* Sampling device (support sample download) */
+-#define SNDRV_SEQ_PORT_TYPE_SAMPLE	(1<<12)	/* Sampling device (sample can be downloaded at any time) */
+-/*...*/
+-#define SNDRV_SEQ_PORT_TYPE_HARDWARE	(1<<16)	/* driver for a hardware device */
+-#define SNDRV_SEQ_PORT_TYPE_SOFTWARE	(1<<17)	/* implemented in software */
+-#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER	(1<<18)	/* generates sound */
+-#define SNDRV_SEQ_PORT_TYPE_PORT	(1<<19)	/* connects to other device(s) */
+-#define SNDRV_SEQ_PORT_TYPE_APPLICATION	(1<<20)	/* application (sequencer/editor) */
+-
+-/* misc. conditioning flags */
+-#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT	(1<<0)
+-#define SNDRV_SEQ_PORT_FLG_TIMESTAMP	(1<<1)
+-#define SNDRV_SEQ_PORT_FLG_TIME_REAL	(1<<2)
+-
+-struct snd_seq_port_info {
+-	struct snd_seq_addr addr;	/* client/port numbers */
+-	char name[64];			/* port name */
+-
+-	unsigned int capability;	/* port capability bits */
+-	unsigned int type;		/* port type bits */
+-	int midi_channels;		/* channels per MIDI port */
+-	int midi_voices;		/* voices per MIDI port */
+-	int synth_voices;		/* voices per SYNTH port */
+-
+-	int read_use;			/* R/O: subscribers for output (from this port) */
+-	int write_use;			/* R/O: subscribers for input (to this port) */
+-
+-	void *kernel;			/* reserved for kernel use (must be NULL) */
+-	unsigned int flags;		/* misc. conditioning */
+-	unsigned char time_queue;	/* queue # for timestamping */
+-	char reserved[59];		/* for future use */
+-};
+-
+-
+-/* queue flags */
+-#define SNDRV_SEQ_QUEUE_FLG_SYNC	(1<<0)	/* sync enabled */
+-
+-/* queue information */
+-struct snd_seq_queue_info {
+-	int queue;		/* queue id */
+-
+-	/*
+-	 *  security settings, only owner of this queue can start/stop timer
+-	 *  etc. if the queue is locked for other clients
+-	 */
+-	int owner;		/* client id for owner of the queue */
+-	unsigned locked:1;	/* timing queue locked for other queues */
+-	char name[64];		/* name of this queue */
+-	unsigned int flags;	/* flags */
+-	char reserved[60];	/* for future use */
+-
+-};
+-
+-/* queue info/status */
+-struct snd_seq_queue_status {
+-	int queue;			/* queue id */
+-	int events;			/* read-only - queue size */
+-	snd_seq_tick_time_t tick;	/* current tick */
+-	struct snd_seq_real_time time;	/* current time */
+-	int running;			/* running state of queue */
+-	int flags;			/* various flags */
+-	char reserved[64];		/* for the future */
+-};
+-
+-
+-/* queue tempo */
+-struct snd_seq_queue_tempo {
+-	int queue;			/* sequencer queue */
+-	unsigned int tempo;		/* current tempo, us/tick */
+-	int ppq;			/* time resolution, ticks/quarter */
+-	unsigned int skew_value;	/* queue skew */
+-	unsigned int skew_base;		/* queue skew base */
+-	char reserved[24];		/* for the future */
+-};
+-
+-
+-/* sequencer timer sources */
+-#define SNDRV_SEQ_TIMER_ALSA		0	/* ALSA timer */
+-#define SNDRV_SEQ_TIMER_MIDI_CLOCK	1	/* Midi Clock (CLOCK event) */
+-#define SNDRV_SEQ_TIMER_MIDI_TICK	2	/* Midi Timer Tick (TICK event) */
+-
+-/* queue timer info */
+-struct snd_seq_queue_timer {
+-	int queue;			/* sequencer queue */
+-	int type;			/* source timer type */
+-	union {
+-		struct {
+-			struct snd_timer_id id;	/* ALSA's timer ID */
+-			unsigned int resolution;	/* resolution in Hz */
+-		} alsa;
+-	} u;
+-	char reserved[64];		/* for the future use */
+-};
+-
+-
+-struct snd_seq_queue_client {
+-	int queue;		/* sequencer queue */
+-	int client;		/* sequencer client */
+-	int used;		/* queue is used with this client
+-				   (must be set for accepting events) */
+-	/* per client watermarks */
+-	char reserved[64];	/* for future use */
+-};
+-
+-
+-#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE	(1<<0)	/* exclusive connection */
+-#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP	(1<<1)
+-#define SNDRV_SEQ_PORT_SUBS_TIME_REAL	(1<<2)
+-
+-struct snd_seq_port_subscribe {
+-	struct snd_seq_addr sender;	/* sender address */
+-	struct snd_seq_addr dest;	/* destination address */
+-	unsigned int voices;		/* number of voices to be allocated (0 = don't care) */
+-	unsigned int flags;		/* modes */
+-	unsigned char queue;		/* input time-stamp queue (optional) */
+-	unsigned char pad[3];		/* reserved */
+-	char reserved[64];
+-};
+-
+-/* type of query subscription */
+-#define SNDRV_SEQ_QUERY_SUBS_READ	0
+-#define SNDRV_SEQ_QUERY_SUBS_WRITE	1
+-
+-struct snd_seq_query_subs {
+-	struct snd_seq_addr root;	/* client/port id to be searched */
+-	int type;		/* READ or WRITE */
+-	int index;		/* 0..N-1 */
+-	int num_subs;		/* R/O: number of subscriptions on this port */
+-	struct snd_seq_addr addr;	/* R/O: result */
+-	unsigned char queue;	/* R/O: result */
+-	unsigned int flags;	/* R/O: result */
+-	char reserved[64];	/* for future use */
+-};
+-
+-
+-/*
+- *  IOCTL commands
+- */
+-
+-#define SNDRV_SEQ_IOCTL_PVERSION	_IOR ('S', 0x00, int)
+-#define SNDRV_SEQ_IOCTL_CLIENT_ID	_IOR ('S', 0x01, int)
+-#define SNDRV_SEQ_IOCTL_SYSTEM_INFO	_IOWR('S', 0x02, struct snd_seq_system_info)
+-#define SNDRV_SEQ_IOCTL_RUNNING_MODE	_IOWR('S', 0x03, struct snd_seq_running_info)
+-
+-#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO	_IOWR('S', 0x10, struct snd_seq_client_info)
+-#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO	_IOW ('S', 0x11, struct snd_seq_client_info)
+-
+-#define SNDRV_SEQ_IOCTL_CREATE_PORT	_IOWR('S', 0x20, struct snd_seq_port_info)
+-#define SNDRV_SEQ_IOCTL_DELETE_PORT	_IOW ('S', 0x21, struct snd_seq_port_info)
+-#define SNDRV_SEQ_IOCTL_GET_PORT_INFO	_IOWR('S', 0x22, struct snd_seq_port_info)
+-#define SNDRV_SEQ_IOCTL_SET_PORT_INFO	_IOW ('S', 0x23, struct snd_seq_port_info)
+-
+-#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT	_IOW ('S', 0x30, struct snd_seq_port_subscribe)
+-#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct snd_seq_port_subscribe)
+-
+-#define SNDRV_SEQ_IOCTL_CREATE_QUEUE	_IOWR('S', 0x32, struct snd_seq_queue_info)
+-#define SNDRV_SEQ_IOCTL_DELETE_QUEUE	_IOW ('S', 0x33, struct snd_seq_queue_info)
+-#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO	_IOWR('S', 0x34, struct snd_seq_queue_info)
+-#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO	_IOWR('S', 0x35, struct snd_seq_queue_info)
+-#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE	_IOWR('S', 0x36, struct snd_seq_queue_info)
+-#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status)
+-#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO	_IOWR('S', 0x41, struct snd_seq_queue_tempo)
+-#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO	_IOW ('S', 0x42, struct snd_seq_queue_tempo)
+-#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER	_IOWR('S', 0x45, struct snd_seq_queue_timer)
+-#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER	_IOW ('S', 0x46, struct snd_seq_queue_timer)
+-#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT	_IOWR('S', 0x49, struct snd_seq_queue_client)
+-#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT	_IOW ('S', 0x4a, struct snd_seq_queue_client)
+-#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL	_IOWR('S', 0x4b, struct snd_seq_client_pool)
+-#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL	_IOW ('S', 0x4c, struct snd_seq_client_pool)
+-#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS	_IOW ('S', 0x4e, struct snd_seq_remove_events)
+-#define SNDRV_SEQ_IOCTL_QUERY_SUBS	_IOWR('S', 0x4f, struct snd_seq_query_subs)
+-#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION	_IOWR('S', 0x50, struct snd_seq_port_subscribe)
+-#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT	_IOWR('S', 0x51, struct snd_seq_client_info)
+-#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT	_IOWR('S', 0x52, struct snd_seq_port_info)
+-
+-#endif /* _UAPI__SOUND_ASEQUENCER_H */
++#include <alsa/sound/uapi/asequencer.h>
+diff --git a/include/sound/asoc.h b/include/sound/asoc.h
+index a74ca232..185bba81 100644
+--- a/include/sound/asoc.h
++++ b/include/sound/asoc.h
+@@ -1,633 +1 @@
+-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+-/*
+- * uapi/sound/asoc.h -- ALSA SoC Firmware Controls and DAPM
+- *
+- * Copyright (C) 2012 Texas Instruments Inc.
+- * Copyright (C) 2015 Intel Corporation.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- * Simple file API to load FW that includes mixers, coefficients, DAPM graphs,
+- * algorithms, equalisers, DAIs, widgets etc.
+-*/
+-
+-#ifndef __LINUX_UAPI_SND_ASOC_H
+-#define __LINUX_UAPI_SND_ASOC_H
+-
+-#include <linux/types.h>
+-#include <sound/asound.h>
+-
+-/*
+- * Maximum number of channels topology kcontrol can represent.
+- */
+-#define SND_SOC_TPLG_MAX_CHAN		8
+-
+-/*
+- * Maximum number of PCM formats capability
+- */
+-#define SND_SOC_TPLG_MAX_FORMATS	16
+-
+-/*
+- * Maximum number of PCM stream configs
+- */
+-#define SND_SOC_TPLG_STREAM_CONFIG_MAX  8
+-
+-/*
+- * Maximum number of physical link's hardware configs
+- */
+-#define SND_SOC_TPLG_HW_CONFIG_MAX	8
+-
+-/* individual kcontrol info types - can be mixed with other types */
+-#define SND_SOC_TPLG_CTL_VOLSW		1
+-#define SND_SOC_TPLG_CTL_VOLSW_SX	2
+-#define SND_SOC_TPLG_CTL_VOLSW_XR_SX	3
+-#define SND_SOC_TPLG_CTL_ENUM		4
+-#define SND_SOC_TPLG_CTL_BYTES		5
+-#define SND_SOC_TPLG_CTL_ENUM_VALUE	6
+-#define SND_SOC_TPLG_CTL_RANGE		7
+-#define SND_SOC_TPLG_CTL_STROBE		8
+-
+-
+-/* individual widget kcontrol info types - can be mixed with other types */
+-#define SND_SOC_TPLG_DAPM_CTL_VOLSW		64
+-#define SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE	65
+-#define SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT		66
+-#define SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE	67
+-#define SND_SOC_TPLG_DAPM_CTL_PIN		68
+-
+-/* DAPM widget types - add new items to the end */
+-#define SND_SOC_TPLG_DAPM_INPUT		0
+-#define SND_SOC_TPLG_DAPM_OUTPUT	1
+-#define SND_SOC_TPLG_DAPM_MUX		2
+-#define SND_SOC_TPLG_DAPM_MIXER		3
+-#define SND_SOC_TPLG_DAPM_PGA		4
+-#define SND_SOC_TPLG_DAPM_OUT_DRV	5
+-#define SND_SOC_TPLG_DAPM_ADC		6
+-#define SND_SOC_TPLG_DAPM_DAC		7
+-#define SND_SOC_TPLG_DAPM_SWITCH	8
+-#define SND_SOC_TPLG_DAPM_PRE		9
+-#define SND_SOC_TPLG_DAPM_POST		10
+-#define SND_SOC_TPLG_DAPM_AIF_IN	11
+-#define SND_SOC_TPLG_DAPM_AIF_OUT	12
+-#define SND_SOC_TPLG_DAPM_DAI_IN	13
+-#define SND_SOC_TPLG_DAPM_DAI_OUT	14
+-#define SND_SOC_TPLG_DAPM_DAI_LINK	15
+-#define SND_SOC_TPLG_DAPM_BUFFER	16
+-#define SND_SOC_TPLG_DAPM_SCHEDULER	17
+-#define SND_SOC_TPLG_DAPM_EFFECT	18
+-#define SND_SOC_TPLG_DAPM_SIGGEN	19
+-#define SND_SOC_TPLG_DAPM_SRC		20
+-#define SND_SOC_TPLG_DAPM_ASRC		21
+-#define SND_SOC_TPLG_DAPM_ENCODER	22
+-#define SND_SOC_TPLG_DAPM_DECODER	23
+-#define SND_SOC_TPLG_DAPM_LAST		SND_SOC_TPLG_DAPM_DECODER
+-
+-/* Header magic number and string sizes */
+-#define SND_SOC_TPLG_MAGIC		0x41536F43 /* ASoC */
+-
+-/* string sizes */
+-#define SND_SOC_TPLG_NUM_TEXTS		16
+-
+-/* ABI version */
+-#define SND_SOC_TPLG_ABI_VERSION	0x5	/* current version */
+-#define SND_SOC_TPLG_ABI_VERSION_MIN	0x4	/* oldest version supported */
+-
+-/* Max size of TLV data */
+-#define SND_SOC_TPLG_TLV_SIZE		32
+-
+-/*
+- * File and Block header data types.
+- * Add new generic and vendor types to end of list.
+- * Generic types are handled by the core whilst vendors types are passed
+- * to the component drivers for handling.
+- */
+-#define SND_SOC_TPLG_TYPE_MIXER		1
+-#define SND_SOC_TPLG_TYPE_BYTES		2
+-#define SND_SOC_TPLG_TYPE_ENUM		3
+-#define SND_SOC_TPLG_TYPE_DAPM_GRAPH	4
+-#define SND_SOC_TPLG_TYPE_DAPM_WIDGET	5
+-#define SND_SOC_TPLG_TYPE_DAI_LINK	6
+-#define SND_SOC_TPLG_TYPE_PCM		7
+-#define SND_SOC_TPLG_TYPE_MANIFEST	8
+-#define SND_SOC_TPLG_TYPE_CODEC_LINK	9
+-#define SND_SOC_TPLG_TYPE_BACKEND_LINK	10
+-#define SND_SOC_TPLG_TYPE_PDATA		11
+-#define SND_SOC_TPLG_TYPE_DAI		12
+-#define SND_SOC_TPLG_TYPE_MAX		SND_SOC_TPLG_TYPE_DAI
+-
+-/* vendor block IDs - please add new vendor types to end */
+-#define SND_SOC_TPLG_TYPE_VENDOR_FW	1000
+-#define SND_SOC_TPLG_TYPE_VENDOR_CONFIG	1001
+-#define SND_SOC_TPLG_TYPE_VENDOR_COEFF	1002
+-#define SND_SOC_TPLG_TYPEVENDOR_CODEC	1003
+-
+-#define SND_SOC_TPLG_STREAM_PLAYBACK	0
+-#define SND_SOC_TPLG_STREAM_CAPTURE	1
+-
+-/* vendor tuple types */
+-#define SND_SOC_TPLG_TUPLE_TYPE_UUID	0
+-#define SND_SOC_TPLG_TUPLE_TYPE_STRING	1
+-#define SND_SOC_TPLG_TUPLE_TYPE_BOOL	2
+-#define SND_SOC_TPLG_TUPLE_TYPE_BYTE	3
+-#define SND_SOC_TPLG_TUPLE_TYPE_WORD	4
+-#define SND_SOC_TPLG_TUPLE_TYPE_SHORT	5
+-
+-/* DAI flags */
+-#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES         (1 << 0)
+-#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS      (1 << 1)
+-#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS    (1 << 2)
+-
+-/* DAI clock gating */
+-#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED	0
+-#define SND_SOC_TPLG_DAI_CLK_GATE_GATED	1
+-#define SND_SOC_TPLG_DAI_CLK_GATE_CONT		2
+-
+-/* DAI mclk_direction */
+-#define SND_SOC_TPLG_MCLK_CO            0 /* for codec, mclk is output */
+-#define SND_SOC_TPLG_MCLK_CI            1 /* for codec, mclk is input */
+-
+-/* DAI physical PCM data formats.
+- * Add new formats to the end of the list.
+- */
+-#define SND_SOC_DAI_FORMAT_I2S          1 /* I2S mode */
+-#define SND_SOC_DAI_FORMAT_RIGHT_J      2 /* Right Justified mode */
+-#define SND_SOC_DAI_FORMAT_LEFT_J       3 /* Left Justified mode */
+-#define SND_SOC_DAI_FORMAT_DSP_A        4 /* L data MSB after FRM LRC */
+-#define SND_SOC_DAI_FORMAT_DSP_B        5 /* L data MSB during FRM LRC */
+-#define SND_SOC_DAI_FORMAT_AC97         6 /* AC97 */
+-#define SND_SOC_DAI_FORMAT_PDM          7 /* Pulse density modulation */
+-
+-/* left and right justified also known as MSB and LSB respectively */
+-#define SND_SOC_DAI_FORMAT_MSB          SND_SOC_DAI_FORMAT_LEFT_J
+-#define SND_SOC_DAI_FORMAT_LSB          SND_SOC_DAI_FORMAT_RIGHT_J
+-
+-/* DAI link flags */
+-#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES         (1 << 0)
+-#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS      (1 << 1)
+-#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS    (1 << 2)
+-#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP            (1 << 3)
+-
+-/* DAI topology BCLK parameter
+- * For the backwards capability, by default codec is bclk master
+- */
+-#define SND_SOC_TPLG_BCLK_CM         0 /* codec is bclk master */
+-#define SND_SOC_TPLG_BCLK_CS         1 /* codec is bclk slave */
+-
+-/* DAI topology FSYNC parameter
+- * For the backwards capability, by default codec is fsync master
+- */
+-#define SND_SOC_TPLG_FSYNC_CM         0 /* codec is fsync master */
+-#define SND_SOC_TPLG_FSYNC_CS         1 /* codec is fsync slave */
+-
+-/*
+- * Block Header.
+- * This header precedes all object and object arrays below.
+- */
+-struct snd_soc_tplg_hdr {
+-	__le32 magic;		/* magic number */
+-	__le32 abi;		/* ABI version */
+-	__le32 version;		/* optional vendor specific version details */
+-	__le32 type;		/* SND_SOC_TPLG_TYPE_ */
+-	__le32 size;		/* size of this structure */
+-	__le32 vendor_type;	/* optional vendor specific type info */
+-	__le32 payload_size;	/* data bytes, excluding this header */
+-	__le32 index;		/* identifier for block */
+-	__le32 count;		/* number of elements in block */
+-} __attribute__((packed));
+-
+-/* vendor tuple for uuid */
+-struct snd_soc_tplg_vendor_uuid_elem {
+-	__le32 token;
+-	char uuid[16];
+-} __attribute__((packed));
+-
+-/* vendor tuple for a bool/byte/short/word value */
+-struct snd_soc_tplg_vendor_value_elem {
+-	__le32 token;
+-	__le32 value;
+-} __attribute__((packed));
+-
+-/* vendor tuple for string */
+-struct snd_soc_tplg_vendor_string_elem {
+-	__le32 token;
+-	char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-} __attribute__((packed));
+-
+-struct snd_soc_tplg_vendor_array {
+-	__le32 size;	/* size in bytes of the array, including all elements */
+-	__le32 type;	/* SND_SOC_TPLG_TUPLE_TYPE_ */
+-	__le32 num_elems;	/* number of elements in array */
+-	union {
+-		struct snd_soc_tplg_vendor_uuid_elem uuid[0];
+-		struct snd_soc_tplg_vendor_value_elem value[0];
+-		struct snd_soc_tplg_vendor_string_elem string[0];
+-	};
+-} __attribute__((packed));
+-
+-/*
+- * Private data.
+- * All topology objects may have private data that can be used by the driver or
+- * firmware. Core will ignore this data.
+- */
+-struct snd_soc_tplg_private {
+-	__le32 size;	/* in bytes of private data */
+-	union {
+-		char data[0];
+-		struct snd_soc_tplg_vendor_array array[0];
+-	};
+-} __attribute__((packed));
+-
+-/*
+- * Kcontrol TLV data.
+- */
+-struct snd_soc_tplg_tlv_dbscale {
+-	__le32 min;
+-	__le32 step;
+-	__le32 mute;
+-} __attribute__((packed));
+-
+-struct snd_soc_tplg_ctl_tlv {
+-	__le32 size;	/* in bytes of this structure */
+-	__le32 type;	/* SNDRV_CTL_TLVT_*, type of TLV */
+-	union {
+-		__le32 data[SND_SOC_TPLG_TLV_SIZE];
+-		struct snd_soc_tplg_tlv_dbscale scale;
+-	};
+-} __attribute__((packed));
+-
+-/*
+- * Kcontrol channel data
+- */
+-struct snd_soc_tplg_channel {
+-	__le32 size;	/* in bytes of this structure */
+-	__le32 reg;
+-	__le32 shift;
+-	__le32 id;	/* ID maps to Left, Right, LFE etc */
+-} __attribute__((packed));
+-
+-/*
+- * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
+- * Kcontrol ops need get/put/info.
+- * Bytes ext ops need get/put.
+- */
+-struct snd_soc_tplg_io_ops {
+-	__le32 get;
+-	__le32 put;
+-	__le32 info;
+-} __attribute__((packed));
+-
+-/*
+- * kcontrol header
+- */
+-struct snd_soc_tplg_ctl_hdr {
+-	__le32 size;	/* in bytes of this structure */
+-	__le32 type;
+-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	__le32 access;
+-	struct snd_soc_tplg_io_ops ops;
+-	struct snd_soc_tplg_ctl_tlv tlv;
+-} __attribute__((packed));
+-
+-/*
+- * Stream Capabilities
+- */
+-struct snd_soc_tplg_stream_caps {
+-	__le32 size;		/* in bytes of this structure */
+-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
+-	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
+-	__le32 rate_min;	/* min rate */
+-	__le32 rate_max;	/* max rate */
+-	__le32 channels_min;	/* min channels */
+-	__le32 channels_max;	/* max channels */
+-	__le32 periods_min;	/* min number of periods */
+-	__le32 periods_max;	/* max number of periods */
+-	__le32 period_size_min;	/* min period size bytes */
+-	__le32 period_size_max;	/* max period size bytes */
+-	__le32 buffer_size_min;	/* min buffer size bytes */
+-	__le32 buffer_size_max;	/* max buffer size bytes */
+-	__le32 sig_bits;        /* number of bits of content */
+-} __attribute__((packed));
+-
+-/*
+- * FE or BE Stream configuration supported by SW/FW
+- */
+-struct snd_soc_tplg_stream {
+-	__le32 size;		/* in bytes of this structure */
+-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */
+-	__le64 format;		/* SNDRV_PCM_FMTBIT_* */
+-	__le32 rate;		/* SNDRV_PCM_RATE_* */
+-	__le32 period_bytes;	/* size of period in bytes */
+-	__le32 buffer_bytes;	/* size of buffer in bytes */
+-	__le32 channels;	/* channels */
+-} __attribute__((packed));
+-
+-
+-/*
+- * Describes a physical link's runtime supported hardware config,
+- * i.e. hardware audio formats.
+- */
+-struct snd_soc_tplg_hw_config {
+-	__le32 size;            /* in bytes of this structure */
+-	__le32 id;		/* unique ID - - used to match */
+-	__le32 fmt;		/* SND_SOC_DAI_FORMAT_ format value */
+-	__u8 clock_gated;	/* SND_SOC_TPLG_DAI_CLK_GATE_ value */
+-	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
+-	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
+-	__u8 bclk_master;	/* SND_SOC_TPLG_BCLK_ value */
+-	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
+-	__u8 mclk_direction;    /* SND_SOC_TPLG_MCLK_ value */
+-	__le16 reserved;	/* for 32bit alignment */
+-	__le32 mclk_rate;	/* MCLK or SYSCLK freqency in Hz */
+-	__le32 bclk_rate;	/* BCLK freqency in Hz */
+-	__le32 fsync_rate;	/* frame clock in Hz */
+-	__le32 tdm_slots;	/* number of TDM slots in use */
+-	__le32 tdm_slot_width;	/* width in bits for each slot */
+-	__le32 tx_slots;	/* bit mask for active Tx slots */
+-	__le32 rx_slots;	/* bit mask for active Rx slots */
+-	__le32 tx_channels;	/* number of Tx channels */
+-	__le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
+-	__le32 rx_channels;	/* number of Rx channels */
+-	__le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
+-} __attribute__((packed));
+-
+-/*
+- * Manifest. List totals for each payload type. Not used in parsing, but will
+- * be passed to the component driver before any other objects in order for any
+- * global component resource allocations.
+- *
+- * File block representation for manifest :-
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_hdr           |  1 |
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_manifest      |  1 |
+- * +-----------------------------------+----+
+- */
+-struct snd_soc_tplg_manifest {
+-	__le32 size;		/* in bytes of this structure */
+-	__le32 control_elems;	/* number of control elements */
+-	__le32 widget_elems;	/* number of widget elements */
+-	__le32 graph_elems;	/* number of graph elements */
+-	__le32 pcm_elems;	/* number of PCM elements */
+-	__le32 dai_link_elems;	/* number of DAI link elements */
+-	__le32 dai_elems;	/* number of physical DAI elements */
+-	__le32 reserved[20];	/* reserved for new ABI element types */
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-/*
+- * Mixer kcontrol.
+- *
+- * File block representation for mixer kcontrol :-
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_hdr           |  1 |
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_mixer_control |  N |
+- * +-----------------------------------+----+
+- */
+-struct snd_soc_tplg_mixer_control {
+-	struct snd_soc_tplg_ctl_hdr hdr;
+-	__le32 size;	/* in bytes of this structure */
+-	__le32 min;
+-	__le32 max;
+-	__le32 platform_max;
+-	__le32 invert;
+-	__le32 num_channels;
+-	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-/*
+- * Enumerated kcontrol
+- *
+- * File block representation for enum kcontrol :-
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_hdr           |  1 |
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_enum_control  |  N |
+- * +-----------------------------------+----+
+- */
+-struct snd_soc_tplg_enum_control {
+-	struct snd_soc_tplg_ctl_hdr hdr;
+-	__le32 size;	/* in bytes of this structure */
+-	__le32 num_channels;
+-	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
+-	__le32 items;
+-	__le32 mask;
+-	__le32 count;
+-	char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	__le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-/*
+- * Bytes kcontrol
+- *
+- * File block representation for bytes kcontrol :-
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_hdr           |  1 |
+- * +-----------------------------------+----+
+- * | struct snd_soc_tplg_bytes_control |  N |
+- * +-----------------------------------+----+
+- */
+-struct snd_soc_tplg_bytes_control {
+-	struct snd_soc_tplg_ctl_hdr hdr;
+-	__le32 size;	/* in bytes of this structure */
+-	__le32 max;
+-	__le32 mask;
+-	__le32 base;
+-	__le32 num_regs;
+-	struct snd_soc_tplg_io_ops ext_ops;
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-/*
+- * DAPM Graph Element
+- *
+- * File block representation for DAPM graph elements :-
+- * +-------------------------------------+----+
+- * | struct snd_soc_tplg_hdr             |  1 |
+- * +-------------------------------------+----+
+- * | struct snd_soc_tplg_dapm_graph_elem |  N |
+- * +-------------------------------------+----+
+- */
+-struct snd_soc_tplg_dapm_graph_elem {
+-	char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-} __attribute__((packed));
+-
+-/*
+- * DAPM Widget.
+- *
+- * File block representation for DAPM widget :-
+- * +-------------------------------------+-----+
+- * | struct snd_soc_tplg_hdr             |  1  |
+- * +-------------------------------------+-----+
+- * | struct snd_soc_tplg_dapm_widget     |  N  |
+- * +-------------------------------------+-----+
+- * |   struct snd_soc_tplg_enum_control  | 0|1 |
+- * |   struct snd_soc_tplg_mixer_control | 0|N |
+- * +-------------------------------------+-----+
+- *
+- * Optional enum or mixer control can be appended to the end of each widget
+- * in the block.
+- */
+-struct snd_soc_tplg_dapm_widget {
+-	__le32 size;		/* in bytes of this structure */
+-	__le32 id;		/* SND_SOC_DAPM_CTL */
+-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-
+-	__le32 reg;		/* negative reg = no direct dapm */
+-	__le32 shift;		/* bits to shift */
+-	__le32 mask;		/* non-shifted mask */
+-	__le32 subseq;		/* sort within widget type */
+-	__le32 invert;		/* invert the power bit */
+-	__le32 ignore_suspend;	/* kept enabled over suspend */
+-	__le16 event_flags;
+-	__le16 event_type;
+-	__le32 num_kcontrols;
+-	struct snd_soc_tplg_private priv;
+-	/*
+-	 * kcontrols that relate to this widget
+-	 * follow here after widget private data
+-	 */
+-} __attribute__((packed));
+-
+-
+-/*
+- * Describes SW/FW specific features of PCM (FE DAI & DAI link).
+- *
+- * File block representation for PCM :-
+- * +-----------------------------------+-----+
+- * | struct snd_soc_tplg_hdr           |  1  |
+- * +-----------------------------------+-----+
+- * | struct snd_soc_tplg_pcm           |  N  |
+- * +-----------------------------------+-----+
+- */
+-struct snd_soc_tplg_pcm {
+-	__le32 size;		/* in bytes of this structure */
+-	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	__le32 pcm_id;		/* unique ID - used to match with DAI link */
+-	__le32 dai_id;		/* unique ID - used to match */
+-	__le32 playback;	/* supports playback mode */
+-	__le32 capture;		/* supports capture mode */
+-	__le32 compress;	/* 1 = compressed; 0 = PCM */
+-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+-	__le32 num_streams;	/* number of streams */
+-	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
+-	__le32 flag_mask;       /* bitmask of flags to configure */
+-	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-
+-/*
+- * Describes the physical link runtime supported configs or params
+- *
+- * File block representation for physical link config :-
+- * +-----------------------------------+-----+
+- * | struct snd_soc_tplg_hdr           |  1  |
+- * +-----------------------------------+-----+
+- * | struct snd_soc_tplg_link_config   |  N  |
+- * +-----------------------------------+-----+
+- */
+-struct snd_soc_tplg_link_config {
+-	__le32 size;            /* in bytes of this structure */
+-	__le32 id;              /* unique ID - used to match */
+-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
+-	char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
+-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+-	__le32 num_streams;     /* number of streams */
+-	struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
+-	__le32 num_hw_configs;         /* number of hw configs */
+-	__le32 default_hw_config_id;   /* default hw config ID for init */
+-	__le32 flag_mask;       /* bitmask of flags to configure */
+-	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-/*
+- * Describes SW/FW specific features of physical DAI.
+- * It can be used to configure backend DAIs for DPCM.
+- *
+- * File block representation for physical DAI :-
+- * +-----------------------------------+-----+
+- * | struct snd_soc_tplg_hdr           |  1  |
+- * +-----------------------------------+-----+
+- * | struct snd_soc_tplg_dai           |  N  |
+- * +-----------------------------------+-----+
+- */
+-struct snd_soc_tplg_dai {
+-	__le32 size;            /* in bytes of this structure */
+-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
+-	__le32 dai_id;          /* unique ID - used to match */
+-	__le32 playback;        /* supports playback mode */
+-	__le32 capture;         /* supports capture mode */
+-	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
+-	__le32 flag_mask;       /* bitmask of flags to configure */
+-	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
+-	struct snd_soc_tplg_private priv;
+-} __attribute__((packed));
+-
+-/*
+- * Old version of ABI structs, supported for backward compatibility.
+- */
+-
+-/* Manifest v4 */
+-struct snd_soc_tplg_manifest_v4 {
+-	__le32 size;		/* in bytes of this structure */
+-	__le32 control_elems;	/* number of control elements */
+-	__le32 widget_elems;	/* number of widget elements */
+-	__le32 graph_elems;	/* number of graph elements */
+-	__le32 pcm_elems;	/* number of PCM elements */
+-	__le32 dai_link_elems;	/* number of DAI link elements */
+-	struct snd_soc_tplg_private priv;
+-} __packed;
+-
+-/* Stream Capabilities v4 */
+-struct snd_soc_tplg_stream_caps_v4 {
+-	__le32 size;		/* in bytes of this structure */
+-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
+-	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
+-	__le32 rate_min;	/* min rate */
+-	__le32 rate_max;	/* max rate */
+-	__le32 channels_min;	/* min channels */
+-	__le32 channels_max;	/* max channels */
+-	__le32 periods_min;	/* min number of periods */
+-	__le32 periods_max;	/* max number of periods */
+-	__le32 period_size_min;	/* min period size bytes */
+-	__le32 period_size_max;	/* max period size bytes */
+-	__le32 buffer_size_min;	/* min buffer size bytes */
+-	__le32 buffer_size_max;	/* max buffer size bytes */
+-} __packed;
+-
+-/* PCM v4 */
+-struct snd_soc_tplg_pcm_v4 {
+-	__le32 size;		/* in bytes of this structure */
+-	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+-	__le32 pcm_id;		/* unique ID - used to match with DAI link */
+-	__le32 dai_id;		/* unique ID - used to match */
+-	__le32 playback;	/* supports playback mode */
+-	__le32 capture;		/* supports capture mode */
+-	__le32 compress;	/* 1 = compressed; 0 = PCM */
+-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+-	__le32 num_streams;	/* number of streams */
+-	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+-} __packed;
+-
+-/* Physical link config v4 */
+-struct snd_soc_tplg_link_config_v4 {
+-	__le32 size;            /* in bytes of this structure */
+-	__le32 id;              /* unique ID - used to match */
+-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+-	__le32 num_streams;     /* number of streams */
+-} __packed;
+-
+-#endif
++#include <alsa/sound/uapi/asoc.h>
+diff --git a/include/sound/asound.h b/include/sound/asound.h
+index df1153ce..3be4d850 100644
+--- a/include/sound/asound.h
++++ b/include/sound/asound.h
+@@ -1,1038 +1 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-/*
+- *  Advanced Linux Sound Architecture - ALSA - Driver
+- *  Copyright (c) 1994-2003 by Jaroslav Kysela <perex@perex.cz>,
+- *                             Abramo Bagnara <abramo@alsa-project.org>
+- *
+- *
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+- *
+- */
+-
+-#ifndef _UAPI__SOUND_ASOUND_H
+-#define _UAPI__SOUND_ASOUND_H
+-
+-#if defined(__KERNEL__) || defined(__linux__)
+-#include <linux/types.h>
+-#else
+-#include <sys/ioctl.h>
+-#endif
+-
+-#ifndef __KERNEL__
+-#include <stdlib.h>
+-#include <time.h>
+-#endif
+-
+-/*
+- *  protocol version
+- */
+-
+-#define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor))
+-#define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff)
+-#define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff)
+-#define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff)
+-#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \
+-	(SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \
+-	 (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \
+-	   SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
+-
+-/****************************************************************************
+- *                                                                          *
+- *        Digital audio interface					    *
+- *                                                                          *
+- ****************************************************************************/
+-
+-struct snd_aes_iec958 {
+-	unsigned char status[24];	/* AES/IEC958 channel status bits */
+-	unsigned char subcode[147];	/* AES/IEC958 subcode bits */
+-	unsigned char pad;		/* nothing */
+-	unsigned char dig_subframe[4];	/* AES/IEC958 subframe bits */
+-};
+-
+-/****************************************************************************
+- *                                                                          *
+- *        CEA-861 Audio InfoFrame. Used in HDMI and DisplayPort		    *
+- *                                                                          *
+- ****************************************************************************/
+-
+-struct snd_cea_861_aud_if {
+-	unsigned char db1_ct_cc; /* coding type and channel count */
+-	unsigned char db2_sf_ss; /* sample frequency and size */
+-	unsigned char db3; /* not used, all zeros */
+-	unsigned char db4_ca; /* channel allocation code */
+-	unsigned char db5_dminh_lsv; /* downmix inhibit & level-shit values */
+-};
+-
+-/****************************************************************************
+- *                                                                          *
+- *      Section for driver hardware dependent interface - /dev/snd/hw?      *
+- *                                                                          *
+- ****************************************************************************/
+-
+-#define SNDRV_HWDEP_VERSION		SNDRV_PROTOCOL_VERSION(1, 0, 1)
+-
+-enum {
+-	SNDRV_HWDEP_IFACE_OPL2 = 0,
+-	SNDRV_HWDEP_IFACE_OPL3,
+-	SNDRV_HWDEP_IFACE_OPL4,
+-	SNDRV_HWDEP_IFACE_SB16CSP,	/* Creative Signal Processor */
+-	SNDRV_HWDEP_IFACE_EMU10K1,	/* FX8010 processor in EMU10K1 chip */
+-	SNDRV_HWDEP_IFACE_YSS225,	/* Yamaha FX processor */
+-	SNDRV_HWDEP_IFACE_ICS2115,	/* Wavetable synth */
+-	SNDRV_HWDEP_IFACE_SSCAPE,	/* Ensoniq SoundScape ISA card (MC68EC000) */
+-	SNDRV_HWDEP_IFACE_VX,		/* Digigram VX cards */
+-	SNDRV_HWDEP_IFACE_MIXART,	/* Digigram miXart cards */
+-	SNDRV_HWDEP_IFACE_USX2Y,	/* Tascam US122, US224 & US428 usb */
+-	SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */
+-	SNDRV_HWDEP_IFACE_BLUETOOTH,	/* Bluetooth audio */
+-	SNDRV_HWDEP_IFACE_USX2Y_PCM,	/* Tascam US122, US224 & US428 rawusb pcm */
+-	SNDRV_HWDEP_IFACE_PCXHR,	/* Digigram PCXHR */
+-	SNDRV_HWDEP_IFACE_SB_RC,	/* SB Extigy/Audigy2NX remote control */
+-	SNDRV_HWDEP_IFACE_HDA,		/* HD-audio */
+-	SNDRV_HWDEP_IFACE_USB_STREAM,	/* direct access to usb stream */
+-	SNDRV_HWDEP_IFACE_FW_DICE,	/* TC DICE FireWire device */
+-	SNDRV_HWDEP_IFACE_FW_FIREWORKS,	/* Echo Audio Fireworks based device */
+-	SNDRV_HWDEP_IFACE_FW_BEBOB,	/* BridgeCo BeBoB based device */
+-	SNDRV_HWDEP_IFACE_FW_OXFW,	/* Oxford OXFW970/971 based device */
+-	SNDRV_HWDEP_IFACE_FW_DIGI00X,	/* Digidesign Digi 002/003 family */
+-	SNDRV_HWDEP_IFACE_FW_TASCAM,	/* TASCAM FireWire series */
+-	SNDRV_HWDEP_IFACE_LINE6,	/* Line6 USB processors */
+-	SNDRV_HWDEP_IFACE_FW_MOTU,	/* MOTU FireWire series */
+-	SNDRV_HWDEP_IFACE_FW_FIREFACE,	/* RME Fireface series */
+-
+-	/* Don't forget to change the following: */
+-	SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_FW_FIREFACE
+-};
+-
+-struct snd_hwdep_info {
+-	unsigned int device;		/* WR: device number */
+-	int card;			/* R: card number */
+-	unsigned char id[64];		/* ID (user selectable) */
+-	unsigned char name[80];		/* hwdep name */
+-	int iface;			/* hwdep interface */
+-	unsigned char reserved[64];	/* reserved for future */
+-};
+-
+-/* generic DSP loader */
+-struct snd_hwdep_dsp_status {
+-	unsigned int version;		/* R: driver-specific version */
+-	unsigned char id[32];		/* R: driver-specific ID string */
+-	unsigned int num_dsps;		/* R: number of DSP images to transfer */
+-	unsigned int dsp_loaded;	/* R: bit flags indicating the loaded DSPs */
+-	unsigned int chip_ready;	/* R: 1 = initialization finished */
+-	unsigned char reserved[16];	/* reserved for future use */
+-};
+-
+-struct snd_hwdep_dsp_image {
+-	unsigned int index;		/* W: DSP index */
+-	unsigned char name[64];		/* W: ID (e.g. file name) */
+-	unsigned char __user *image;	/* W: binary image */
+-	size_t length;			/* W: size of image in bytes */
+-	unsigned long driver_data;	/* W: driver-specific data */
+-};
+-
+-#define SNDRV_HWDEP_IOCTL_PVERSION	_IOR ('H', 0x00, int)
+-#define SNDRV_HWDEP_IOCTL_INFO		_IOR ('H', 0x01, struct snd_hwdep_info)
+-#define SNDRV_HWDEP_IOCTL_DSP_STATUS	_IOR('H', 0x02, struct snd_hwdep_dsp_status)
+-#define SNDRV_HWDEP_IOCTL_DSP_LOAD	_IOW('H', 0x03, struct snd_hwdep_dsp_image)
+-
+-/*****************************************************************************
+- *                                                                           *
+- *             Digital Audio (PCM) interface - /dev/snd/pcm??                *
+- *                                                                           *
+- *****************************************************************************/
+-
+-#define SNDRV_PCM_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 14)
+-
+-typedef unsigned long snd_pcm_uframes_t;
+-typedef signed long snd_pcm_sframes_t;
+-
+-enum {
+-	SNDRV_PCM_CLASS_GENERIC = 0,	/* standard mono or stereo device */
+-	SNDRV_PCM_CLASS_MULTI,		/* multichannel device */
+-	SNDRV_PCM_CLASS_MODEM,		/* software modem class */
+-	SNDRV_PCM_CLASS_DIGITIZER,	/* digitizer class */
+-	/* Don't forget to change the following: */
+-	SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
+-};
+-
+-enum {
+-	SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */
+-	SNDRV_PCM_SUBCLASS_MULTI_MIX,	/* multichannel subdevices are mixed together */
+-	/* Don't forget to change the following: */
+-	SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX,
+-};
+-
+-enum {
+-	SNDRV_PCM_STREAM_PLAYBACK = 0,
+-	SNDRV_PCM_STREAM_CAPTURE,
+-	SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
+-};
+-
+-typedef int __bitwise snd_pcm_access_t;
+-#define	SNDRV_PCM_ACCESS_MMAP_INTERLEAVED	((__force snd_pcm_access_t) 0) /* interleaved mmap */
+-#define	SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED	((__force snd_pcm_access_t) 1) /* noninterleaved mmap */
+-#define	SNDRV_PCM_ACCESS_MMAP_COMPLEX		((__force snd_pcm_access_t) 2) /* complex mmap */
+-#define	SNDRV_PCM_ACCESS_RW_INTERLEAVED		((__force snd_pcm_access_t) 3) /* readi/writei */
+-#define	SNDRV_PCM_ACCESS_RW_NONINTERLEAVED	((__force snd_pcm_access_t) 4) /* readn/writen */
+-#define	SNDRV_PCM_ACCESS_LAST		SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
+-
+-typedef int __bitwise snd_pcm_format_t;
+-#define	SNDRV_PCM_FORMAT_S8	((__force snd_pcm_format_t) 0)
+-#define	SNDRV_PCM_FORMAT_U8	((__force snd_pcm_format_t) 1)
+-#define	SNDRV_PCM_FORMAT_S16_LE	((__force snd_pcm_format_t) 2)
+-#define	SNDRV_PCM_FORMAT_S16_BE	((__force snd_pcm_format_t) 3)
+-#define	SNDRV_PCM_FORMAT_U16_LE	((__force snd_pcm_format_t) 4)
+-#define	SNDRV_PCM_FORMAT_U16_BE	((__force snd_pcm_format_t) 5)
+-#define	SNDRV_PCM_FORMAT_S24_LE	((__force snd_pcm_format_t) 6) /* low three bytes */
+-#define	SNDRV_PCM_FORMAT_S24_BE	((__force snd_pcm_format_t) 7) /* low three bytes */
+-#define	SNDRV_PCM_FORMAT_U24_LE	((__force snd_pcm_format_t) 8) /* low three bytes */
+-#define	SNDRV_PCM_FORMAT_U24_BE	((__force snd_pcm_format_t) 9) /* low three bytes */
+-#define	SNDRV_PCM_FORMAT_S32_LE	((__force snd_pcm_format_t) 10)
+-#define	SNDRV_PCM_FORMAT_S32_BE	((__force snd_pcm_format_t) 11)
+-#define	SNDRV_PCM_FORMAT_U32_LE	((__force snd_pcm_format_t) 12)
+-#define	SNDRV_PCM_FORMAT_U32_BE	((__force snd_pcm_format_t) 13)
+-#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 */
+-#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 */
+-#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 */
+-#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 */
+-#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
+-#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
+-#define	SNDRV_PCM_FORMAT_MU_LAW		((__force snd_pcm_format_t) 20)
+-#define	SNDRV_PCM_FORMAT_A_LAW		((__force snd_pcm_format_t) 21)
+-#define	SNDRV_PCM_FORMAT_IMA_ADPCM	((__force snd_pcm_format_t) 22)
+-#define	SNDRV_PCM_FORMAT_MPEG		((__force snd_pcm_format_t) 23)
+-#define	SNDRV_PCM_FORMAT_GSM		((__force snd_pcm_format_t) 24)
+-#define	SNDRV_PCM_FORMAT_S20_LE	((__force snd_pcm_format_t) 25) /* in four bytes, LSB justified */
+-#define	SNDRV_PCM_FORMAT_S20_BE	((__force snd_pcm_format_t) 26) /* in four bytes, LSB justified */
+-#define	SNDRV_PCM_FORMAT_U20_LE	((__force snd_pcm_format_t) 27) /* in four bytes, LSB justified */
+-#define	SNDRV_PCM_FORMAT_U20_BE	((__force snd_pcm_format_t) 28) /* in four bytes, LSB justified */
+-/* gap in the numbering for a future standard linear format */
+-#define	SNDRV_PCM_FORMAT_SPECIAL	((__force snd_pcm_format_t) 31)
+-#define	SNDRV_PCM_FORMAT_S24_3LE	((__force snd_pcm_format_t) 32)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_S24_3BE	((__force snd_pcm_format_t) 33)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_U24_3LE	((__force snd_pcm_format_t) 34)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_U24_3BE	((__force snd_pcm_format_t) 35)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_S20_3LE	((__force snd_pcm_format_t) 36)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_S20_3BE	((__force snd_pcm_format_t) 37)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_U20_3LE	((__force snd_pcm_format_t) 38)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_U20_3BE	((__force snd_pcm_format_t) 39)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_S18_3LE	((__force snd_pcm_format_t) 40)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_S18_3BE	((__force snd_pcm_format_t) 41)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_U18_3LE	((__force snd_pcm_format_t) 42)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_U18_3BE	((__force snd_pcm_format_t) 43)	/* in three bytes */
+-#define	SNDRV_PCM_FORMAT_G723_24	((__force snd_pcm_format_t) 44) /* 8 samples in 3 bytes */
+-#define	SNDRV_PCM_FORMAT_G723_24_1B	((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */
+-#define	SNDRV_PCM_FORMAT_G723_40	((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
+-#define	SNDRV_PCM_FORMAT_G723_40_1B	((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */
+-#define	SNDRV_PCM_FORMAT_DSD_U8		((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
+-#define	SNDRV_PCM_FORMAT_DSD_U16_LE	((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
+-#define	SNDRV_PCM_FORMAT_DSD_U32_LE	((__force snd_pcm_format_t) 50) /* DSD, 4-byte samples DSD (x32), little endian */
+-#define	SNDRV_PCM_FORMAT_DSD_U16_BE	((__force snd_pcm_format_t) 51) /* DSD, 2-byte samples DSD (x16), big endian */
+-#define	SNDRV_PCM_FORMAT_DSD_U32_BE	((__force snd_pcm_format_t) 52) /* DSD, 4-byte samples DSD (x32), big endian */
+-#define	SNDRV_PCM_FORMAT_LAST		SNDRV_PCM_FORMAT_DSD_U32_BE
+-#define	SNDRV_PCM_FORMAT_FIRST		SNDRV_PCM_FORMAT_S8
+-
+-#ifdef SNDRV_LITTLE_ENDIAN
+-#define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_LE
+-#define	SNDRV_PCM_FORMAT_U16		SNDRV_PCM_FORMAT_U16_LE
+-#define	SNDRV_PCM_FORMAT_S24		SNDRV_PCM_FORMAT_S24_LE
+-#define	SNDRV_PCM_FORMAT_U24		SNDRV_PCM_FORMAT_U24_LE
+-#define	SNDRV_PCM_FORMAT_S32		SNDRV_PCM_FORMAT_S32_LE
+-#define	SNDRV_PCM_FORMAT_U32		SNDRV_PCM_FORMAT_U32_LE
+-#define	SNDRV_PCM_FORMAT_FLOAT		SNDRV_PCM_FORMAT_FLOAT_LE
+-#define	SNDRV_PCM_FORMAT_FLOAT64	SNDRV_PCM_FORMAT_FLOAT64_LE
+-#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE
+-#define	SNDRV_PCM_FORMAT_S20		SNDRV_PCM_FORMAT_S20_LE
+-#define	SNDRV_PCM_FORMAT_U20		SNDRV_PCM_FORMAT_U20_LE
+-#endif
+-#ifdef SNDRV_BIG_ENDIAN
+-#define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_BE
+-#define	SNDRV_PCM_FORMAT_U16		SNDRV_PCM_FORMAT_U16_BE
+-#define	SNDRV_PCM_FORMAT_S24		SNDRV_PCM_FORMAT_S24_BE
+-#define	SNDRV_PCM_FORMAT_U24		SNDRV_PCM_FORMAT_U24_BE
+-#define	SNDRV_PCM_FORMAT_S32		SNDRV_PCM_FORMAT_S32_BE
+-#define	SNDRV_PCM_FORMAT_U32		SNDRV_PCM_FORMAT_U32_BE
+-#define	SNDRV_PCM_FORMAT_FLOAT		SNDRV_PCM_FORMAT_FLOAT_BE
+-#define	SNDRV_PCM_FORMAT_FLOAT64	SNDRV_PCM_FORMAT_FLOAT64_BE
+-#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE
+-#define	SNDRV_PCM_FORMAT_S20		SNDRV_PCM_FORMAT_S20_BE
+-#define	SNDRV_PCM_FORMAT_U20		SNDRV_PCM_FORMAT_U20_BE
+-#endif
+-
+-typedef int __bitwise snd_pcm_subformat_t;
+-#define	SNDRV_PCM_SUBFORMAT_STD		((__force snd_pcm_subformat_t) 0)
+-#define	SNDRV_PCM_SUBFORMAT_LAST	SNDRV_PCM_SUBFORMAT_STD
+-
+-#define SNDRV_PCM_INFO_MMAP		0x00000001	/* hardware supports mmap */
+-#define SNDRV_PCM_INFO_MMAP_VALID	0x00000002	/* period data are valid during transfer */
+-#define SNDRV_PCM_INFO_DOUBLE		0x00000004	/* Double buffering needed for PCM start/stop */
+-#define SNDRV_PCM_INFO_BATCH		0x00000010	/* double buffering */
+-#define SNDRV_PCM_INFO_SYNC_APPLPTR	0x00000020	/* need the explicit sync of appl_ptr update */
+-#define SNDRV_PCM_INFO_INTERLEAVED	0x00000100	/* channels are interleaved */
+-#define SNDRV_PCM_INFO_NONINTERLEAVED	0x00000200	/* channels are not interleaved */
+-#define SNDRV_PCM_INFO_COMPLEX		0x00000400	/* complex frame organization (mmap only) */
+-#define SNDRV_PCM_INFO_BLOCK_TRANSFER	0x00010000	/* hardware transfer block of samples */
+-#define SNDRV_PCM_INFO_OVERRANGE	0x00020000	/* hardware supports ADC (capture) overrange detection */
+-#define SNDRV_PCM_INFO_RESUME		0x00040000	/* hardware supports stream resume after suspend */
+-#define SNDRV_PCM_INFO_PAUSE		0x00080000	/* pause ioctl is supported */
+-#define SNDRV_PCM_INFO_HALF_DUPLEX	0x00100000	/* only half duplex */
+-#define SNDRV_PCM_INFO_JOINT_DUPLEX	0x00200000	/* playback and capture stream are somewhat correlated */
+-#define SNDRV_PCM_INFO_SYNC_START	0x00400000	/* pcm support some kind of sync go */
+-#define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP	0x00800000	/* period wakeup can be disabled */
+-#define SNDRV_PCM_INFO_HAS_WALL_CLOCK   0x01000000      /* (Deprecated)has audio wall clock for audio/system time sync */
+-#define SNDRV_PCM_INFO_HAS_LINK_ATIME              0x01000000  /* report hardware link audio time, reset on startup */
+-#define SNDRV_PCM_INFO_HAS_LINK_ABSOLUTE_ATIME     0x02000000  /* report absolute hardware link audio time, not reset on startup */
+-#define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME    0x04000000  /* report estimated link audio time */
+-#define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000  /* report synchronized audio/system time */
+-
+-#define SNDRV_PCM_INFO_DRAIN_TRIGGER	0x40000000		/* internal kernel flag - trigger in drain */
+-#define SNDRV_PCM_INFO_FIFO_IN_FRAMES	0x80000000	/* internal kernel flag - FIFO size is in frames */
+-
+-
+-
+-typedef int __bitwise snd_pcm_state_t;
+-#define	SNDRV_PCM_STATE_OPEN		((__force snd_pcm_state_t) 0) /* stream is open */
+-#define	SNDRV_PCM_STATE_SETUP		((__force snd_pcm_state_t) 1) /* stream has a setup */
+-#define	SNDRV_PCM_STATE_PREPARED	((__force snd_pcm_state_t) 2) /* stream is ready to start */
+-#define	SNDRV_PCM_STATE_RUNNING		((__force snd_pcm_state_t) 3) /* stream is running */
+-#define	SNDRV_PCM_STATE_XRUN		((__force snd_pcm_state_t) 4) /* stream reached an xrun */
+-#define	SNDRV_PCM_STATE_DRAINING	((__force snd_pcm_state_t) 5) /* stream is draining */
+-#define	SNDRV_PCM_STATE_PAUSED		((__force snd_pcm_state_t) 6) /* stream is paused */
+-#define	SNDRV_PCM_STATE_SUSPENDED	((__force snd_pcm_state_t) 7) /* hardware is suspended */
+-#define	SNDRV_PCM_STATE_DISCONNECTED	((__force snd_pcm_state_t) 8) /* hardware is disconnected */
+-#define	SNDRV_PCM_STATE_LAST		SNDRV_PCM_STATE_DISCONNECTED
+-
+-enum {
+-	SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
+-	SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
+-	SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
+-};
+-
+-union snd_pcm_sync_id {
+-	unsigned char id[16];
+-	unsigned short id16[8];
+-	unsigned int id32[4];
+-};
+-
+-struct snd_pcm_info {
+-	unsigned int device;		/* RO/WR (control): device number */
+-	unsigned int subdevice;		/* RO/WR (control): subdevice number */
+-	int stream;			/* RO/WR (control): stream direction */
+-	int card;			/* R: card number */
+-	unsigned char id[64];		/* ID (user selectable) */
+-	unsigned char name[80];		/* name of this device */
+-	unsigned char subname[32];	/* subdevice name */
+-	int dev_class;			/* SNDRV_PCM_CLASS_* */
+-	int dev_subclass;		/* SNDRV_PCM_SUBCLASS_* */
+-	unsigned int subdevices_count;
+-	unsigned int subdevices_avail;
+-	union snd_pcm_sync_id sync;	/* hardware synchronization ID */
+-	unsigned char reserved[64];	/* reserved for future... */
+-};
+-
+-typedef int snd_pcm_hw_param_t;
+-#define	SNDRV_PCM_HW_PARAM_ACCESS	0	/* Access type */
+-#define	SNDRV_PCM_HW_PARAM_FORMAT	1	/* Format */
+-#define	SNDRV_PCM_HW_PARAM_SUBFORMAT	2	/* Subformat */
+-#define	SNDRV_PCM_HW_PARAM_FIRST_MASK	SNDRV_PCM_HW_PARAM_ACCESS
+-#define	SNDRV_PCM_HW_PARAM_LAST_MASK	SNDRV_PCM_HW_PARAM_SUBFORMAT
+-
+-#define	SNDRV_PCM_HW_PARAM_SAMPLE_BITS	8	/* Bits per sample */
+-#define	SNDRV_PCM_HW_PARAM_FRAME_BITS	9	/* Bits per frame */
+-#define	SNDRV_PCM_HW_PARAM_CHANNELS	10	/* Channels */
+-#define	SNDRV_PCM_HW_PARAM_RATE		11	/* Approx rate */
+-#define	SNDRV_PCM_HW_PARAM_PERIOD_TIME	12	/* Approx distance between
+-						 * interrupts in us
+-						 */
+-#define	SNDRV_PCM_HW_PARAM_PERIOD_SIZE	13	/* Approx frames between
+-						 * interrupts
+-						 */
+-#define	SNDRV_PCM_HW_PARAM_PERIOD_BYTES	14	/* Approx bytes between
+-						 * interrupts
+-						 */
+-#define	SNDRV_PCM_HW_PARAM_PERIODS	15	/* Approx interrupts per
+-						 * buffer
+-						 */
+-#define	SNDRV_PCM_HW_PARAM_BUFFER_TIME	16	/* Approx duration of buffer
+-						 * in us
+-						 */
+-#define	SNDRV_PCM_HW_PARAM_BUFFER_SIZE	17	/* Size of buffer in frames */
+-#define	SNDRV_PCM_HW_PARAM_BUFFER_BYTES	18	/* Size of buffer in bytes */
+-#define	SNDRV_PCM_HW_PARAM_TICK_TIME	19	/* Approx tick duration in us */
+-#define	SNDRV_PCM_HW_PARAM_FIRST_INTERVAL	SNDRV_PCM_HW_PARAM_SAMPLE_BITS
+-#define	SNDRV_PCM_HW_PARAM_LAST_INTERVAL	SNDRV_PCM_HW_PARAM_TICK_TIME
+-
+-#define SNDRV_PCM_HW_PARAMS_NORESAMPLE	(1<<0)	/* avoid rate resampling */
+-#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER	(1<<1)	/* export buffer */
+-#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP	(1<<2)	/* disable period wakeups */
+-
+-struct snd_interval {
+-	unsigned int min, max;
+-	unsigned int openmin:1,
+-		     openmax:1,
+-		     integer:1,
+-		     empty:1;
+-};
+-
+-#define SNDRV_MASK_MAX	256
+-
+-struct snd_mask {
+-	__u32 bits[(SNDRV_MASK_MAX+31)/32];
+-};
+-
+-struct snd_pcm_hw_params {
+-	unsigned int flags;
+-	struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
+-			       SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
+-	struct snd_mask mres[5];	/* reserved masks */
+-	struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
+-				        SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
+-	struct snd_interval ires[9];	/* reserved intervals */
+-	unsigned int rmask;		/* W: requested masks */
+-	unsigned int cmask;		/* R: changed masks */
+-	unsigned int info;		/* R: Info flags for returned setup */
+-	unsigned int msbits;		/* R: used most significant bits */
+-	unsigned int rate_num;		/* R: rate numerator */
+-	unsigned int rate_den;		/* R: rate denominator */
+-	snd_pcm_uframes_t fifo_size;	/* R: chip FIFO size in frames */
+-	unsigned char reserved[64];	/* reserved for future */
+-};
+-
+-enum {
+-	SNDRV_PCM_TSTAMP_NONE = 0,
+-	SNDRV_PCM_TSTAMP_ENABLE,
+-	SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_ENABLE,
+-};
+-
+-struct snd_pcm_sw_params {
+-	int tstamp_mode;			/* timestamp mode */
+-	unsigned int period_step;
+-	unsigned int sleep_min;			/* min ticks to sleep */
+-	snd_pcm_uframes_t avail_min;		/* min avail frames for wakeup */
+-	snd_pcm_uframes_t xfer_align;		/* obsolete: xfer size need to be a multiple */
+-	snd_pcm_uframes_t start_threshold;	/* min hw_avail frames for automatic start */
+-	snd_pcm_uframes_t stop_threshold;	/* min avail frames for automatic stop */
+-	snd_pcm_uframes_t silence_threshold;	/* min distance from noise for silence filling */
+-	snd_pcm_uframes_t silence_size;		/* silence block size */
+-	snd_pcm_uframes_t boundary;		/* pointers wrap point */
+-	unsigned int proto;			/* protocol version */
+-	unsigned int tstamp_type;		/* timestamp type (req. proto >= 2.0.12) */
+-	unsigned char reserved[56];		/* reserved for future */
+-};
+-
+-struct snd_pcm_channel_info {
+-	unsigned int channel;
+-	__kernel_off_t offset;		/* mmap offset */
+-	unsigned int first;		/* offset to first sample in bits */
+-	unsigned int step;		/* samples distance in bits */
+-};
+-
+-enum {
+-	/*
+-	 *  first definition for backwards compatibility only,
+-	 *  maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
+-	 */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
+-
+-	/* timestamp definitions */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1,           /* DMA time, reported as per hw_ptr */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK = 2,	           /* link time reported by sample or wallclock counter, reset on startup */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,	   /* link time reported by sample or wallclock counter, not reset on startup */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,    /* link time estimated indirectly */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /* link time synchronized with system time */
+-	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
+-};
+-
+-struct snd_pcm_status {
+-	snd_pcm_state_t state;		/* stream state */
+-	struct timespec trigger_tstamp;	/* time when stream was started/stopped/paused */
+-	struct timespec tstamp;		/* reference timestamp */
+-	snd_pcm_uframes_t appl_ptr;	/* appl ptr */
+-	snd_pcm_uframes_t hw_ptr;	/* hw ptr */
+-	snd_pcm_sframes_t delay;	/* current delay in frames */
+-	snd_pcm_uframes_t avail;	/* number of frames available */
+-	snd_pcm_uframes_t avail_max;	/* max frames available on hw since last status */
+-	snd_pcm_uframes_t overrange;	/* count of ADC (capture) overrange detections from last status */
+-	snd_pcm_state_t suspended_state; /* suspended stream state */
+-	__u32 audio_tstamp_data;	 /* needed for 64-bit alignment, used for configs/report to/from userspace */
+-	struct timespec audio_tstamp;	/* sample counter, wall clock, PHC or on-demand sync'ed */
+-	struct timespec driver_tstamp;	/* useful in case reference system tstamp is reported with delay */
+-	__u32 audio_tstamp_accuracy;	/* in ns units, only valid if indicated in audio_tstamp_data */
+-	unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */
+-};
+-
+-struct snd_pcm_mmap_status {
+-	snd_pcm_state_t state;		/* RO: state - SNDRV_PCM_STATE_XXXX */
+-	int pad1;			/* Needed for 64 bit alignment */
+-	snd_pcm_uframes_t hw_ptr;	/* RO: hw ptr (0...boundary-1) */
+-	struct timespec tstamp;		/* Timestamp */
+-	snd_pcm_state_t suspended_state; /* RO: suspended stream state */
+-	struct timespec audio_tstamp;	/* from sample counter or wall clock */
+-};
+-
+-struct snd_pcm_mmap_control {
+-	snd_pcm_uframes_t appl_ptr;	/* RW: appl ptr (0...boundary-1) */
+-	snd_pcm_uframes_t avail_min;	/* RW: min available frames for wakeup */
+-};
+-
+-#define SNDRV_PCM_SYNC_PTR_HWSYNC	(1<<0)	/* execute hwsync */
+-#define SNDRV_PCM_SYNC_PTR_APPL		(1<<1)	/* get appl_ptr from driver (r/w op) */
+-#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN	(1<<2)	/* get avail_min from driver */
+-
+-struct snd_pcm_sync_ptr {
+-	unsigned int flags;
+-	union {
+-		struct snd_pcm_mmap_status status;
+-		unsigned char reserved[64];
+-	} s;
+-	union {
+-		struct snd_pcm_mmap_control control;
+-		unsigned char reserved[64];
+-	} c;
+-};
+-
+-struct snd_xferi {
+-	snd_pcm_sframes_t result;
+-	void __user *buf;
+-	snd_pcm_uframes_t frames;
+-};
+-
+-struct snd_xfern {
+-	snd_pcm_sframes_t result;
+-	void __user * __user *bufs;
+-	snd_pcm_uframes_t frames;
+-};
+-
+-enum {
+-	SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0,	/* gettimeofday equivalent */
+-	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,	/* posix_clock_monotonic equivalent */
+-	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,    /* monotonic_raw (no NTP) */
+-	SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
+-};
+-
+-/* channel positions */
+-enum {
+-	SNDRV_CHMAP_UNKNOWN = 0,
+-	SNDRV_CHMAP_NA,		/* N/A, silent */
+-	SNDRV_CHMAP_MONO,	/* mono stream */
+-	/* this follows the alsa-lib mixer channel value + 3 */
+-	SNDRV_CHMAP_FL,		/* front left */
+-	SNDRV_CHMAP_FR,		/* front right */
+-	SNDRV_CHMAP_RL,		/* rear left */
+-	SNDRV_CHMAP_RR,		/* rear right */
+-	SNDRV_CHMAP_FC,		/* front center */
+-	SNDRV_CHMAP_LFE,	/* LFE */
+-	SNDRV_CHMAP_SL,		/* side left */
+-	SNDRV_CHMAP_SR,		/* side right */
+-	SNDRV_CHMAP_RC,		/* rear center */
+-	/* new definitions */
+-	SNDRV_CHMAP_FLC,	/* front left center */
+-	SNDRV_CHMAP_FRC,	/* front right center */
+-	SNDRV_CHMAP_RLC,	/* rear left center */
+-	SNDRV_CHMAP_RRC,	/* rear right center */
+-	SNDRV_CHMAP_FLW,	/* front left wide */
+-	SNDRV_CHMAP_FRW,	/* front right wide */
+-	SNDRV_CHMAP_FLH,	/* front left high */
+-	SNDRV_CHMAP_FCH,	/* front center high */
+-	SNDRV_CHMAP_FRH,	/* front right high */
+-	SNDRV_CHMAP_TC,		/* top center */
+-	SNDRV_CHMAP_TFL,	/* top front left */
+-	SNDRV_CHMAP_TFR,	/* top front right */
+-	SNDRV_CHMAP_TFC,	/* top front center */
+-	SNDRV_CHMAP_TRL,	/* top rear left */
+-	SNDRV_CHMAP_TRR,	/* top rear right */
+-	SNDRV_CHMAP_TRC,	/* top rear center */
+-	/* new definitions for UAC2 */
+-	SNDRV_CHMAP_TFLC,	/* top front left center */
+-	SNDRV_CHMAP_TFRC,	/* top front right center */
+-	SNDRV_CHMAP_TSL,	/* top side left */
+-	SNDRV_CHMAP_TSR,	/* top side right */
+-	SNDRV_CHMAP_LLFE,	/* left LFE */
+-	SNDRV_CHMAP_RLFE,	/* right LFE */
+-	SNDRV_CHMAP_BC,		/* bottom center */
+-	SNDRV_CHMAP_BLC,	/* bottom left center */
+-	SNDRV_CHMAP_BRC,	/* bottom right center */
+-	SNDRV_CHMAP_LAST = SNDRV_CHMAP_BRC,
+-};
+-
+-#define SNDRV_CHMAP_POSITION_MASK	0xffff
+-#define SNDRV_CHMAP_PHASE_INVERSE	(0x01 << 16)
+-#define SNDRV_CHMAP_DRIVER_SPEC		(0x02 << 16)
+-
+-#define SNDRV_PCM_IOCTL_PVERSION	_IOR('A', 0x00, int)
+-#define SNDRV_PCM_IOCTL_INFO		_IOR('A', 0x01, struct snd_pcm_info)
+-#define SNDRV_PCM_IOCTL_TSTAMP		_IOW('A', 0x02, int)
+-#define SNDRV_PCM_IOCTL_TTSTAMP		_IOW('A', 0x03, int)
+-#define SNDRV_PCM_IOCTL_USER_PVERSION	_IOW('A', 0x04, int)
+-#define SNDRV_PCM_IOCTL_HW_REFINE	_IOWR('A', 0x10, struct snd_pcm_hw_params)
+-#define SNDRV_PCM_IOCTL_HW_PARAMS	_IOWR('A', 0x11, struct snd_pcm_hw_params)
+-#define SNDRV_PCM_IOCTL_HW_FREE		_IO('A', 0x12)
+-#define SNDRV_PCM_IOCTL_SW_PARAMS	_IOWR('A', 0x13, struct snd_pcm_sw_params)
+-#define SNDRV_PCM_IOCTL_STATUS		_IOR('A', 0x20, struct snd_pcm_status)
+-#define SNDRV_PCM_IOCTL_DELAY		_IOR('A', 0x21, snd_pcm_sframes_t)
+-#define SNDRV_PCM_IOCTL_HWSYNC		_IO('A', 0x22)
+-#define SNDRV_PCM_IOCTL_SYNC_PTR	_IOWR('A', 0x23, struct snd_pcm_sync_ptr)
+-#define SNDRV_PCM_IOCTL_STATUS_EXT	_IOWR('A', 0x24, struct snd_pcm_status)
+-#define SNDRV_PCM_IOCTL_CHANNEL_INFO	_IOR('A', 0x32, struct snd_pcm_channel_info)
+-#define SNDRV_PCM_IOCTL_PREPARE		_IO('A', 0x40)
+-#define SNDRV_PCM_IOCTL_RESET		_IO('A', 0x41)
+-#define SNDRV_PCM_IOCTL_START		_IO('A', 0x42)
+-#define SNDRV_PCM_IOCTL_DROP		_IO('A', 0x43)
+-#define SNDRV_PCM_IOCTL_DRAIN		_IO('A', 0x44)
+-#define SNDRV_PCM_IOCTL_PAUSE		_IOW('A', 0x45, int)
+-#define SNDRV_PCM_IOCTL_REWIND		_IOW('A', 0x46, snd_pcm_uframes_t)
+-#define SNDRV_PCM_IOCTL_RESUME		_IO('A', 0x47)
+-#define SNDRV_PCM_IOCTL_XRUN		_IO('A', 0x48)
+-#define SNDRV_PCM_IOCTL_FORWARD		_IOW('A', 0x49, snd_pcm_uframes_t)
+-#define SNDRV_PCM_IOCTL_WRITEI_FRAMES	_IOW('A', 0x50, struct snd_xferi)
+-#define SNDRV_PCM_IOCTL_READI_FRAMES	_IOR('A', 0x51, struct snd_xferi)
+-#define SNDRV_PCM_IOCTL_WRITEN_FRAMES	_IOW('A', 0x52, struct snd_xfern)
+-#define SNDRV_PCM_IOCTL_READN_FRAMES	_IOR('A', 0x53, struct snd_xfern)
+-#define SNDRV_PCM_IOCTL_LINK		_IOW('A', 0x60, int)
+-#define SNDRV_PCM_IOCTL_UNLINK		_IO('A', 0x61)
+-
+-/*****************************************************************************
+- *                                                                           *
+- *                            MIDI v1.0 interface                            *
+- *                                                                           *
+- *****************************************************************************/
+-
+-/*
+- *  Raw MIDI section - /dev/snd/midi??
+- */
+-
+-#define SNDRV_RAWMIDI_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 0)
+-
+-enum {
+-	SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
+-	SNDRV_RAWMIDI_STREAM_INPUT,
+-	SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
+-};
+-
+-#define SNDRV_RAWMIDI_INFO_OUTPUT		0x00000001
+-#define SNDRV_RAWMIDI_INFO_INPUT		0x00000002
+-#define SNDRV_RAWMIDI_INFO_DUPLEX		0x00000004
+-
+-struct snd_rawmidi_info {
+-	unsigned int device;		/* RO/WR (control): device number */
+-	unsigned int subdevice;		/* RO/WR (control): subdevice number */
+-	int stream;			/* WR: stream */
+-	int card;			/* R: card number */
+-	unsigned int flags;		/* SNDRV_RAWMIDI_INFO_XXXX */
+-	unsigned char id[64];		/* ID (user selectable) */
+-	unsigned char name[80];		/* name of device */
+-	unsigned char subname[32];	/* name of active or selected subdevice */
+-	unsigned int subdevices_count;
+-	unsigned int subdevices_avail;
+-	unsigned char reserved[64];	/* reserved for future use */
+-};
+-
+-struct snd_rawmidi_params {
+-	int stream;
+-	size_t buffer_size;		/* queue size in bytes */
+-	size_t avail_min;		/* minimum avail bytes for wakeup */
+-	unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
+-	unsigned char reserved[16];	/* reserved for future use */
+-};
+-
+-struct snd_rawmidi_status {
+-	int stream;
+-	struct timespec tstamp;		/* Timestamp */
+-	size_t avail;			/* available bytes */
+-	size_t xruns;			/* count of overruns since last status (in bytes) */
+-	unsigned char reserved[16];	/* reserved for future use */
+-};
+-
+-#define SNDRV_RAWMIDI_IOCTL_PVERSION	_IOR('W', 0x00, int)
+-#define SNDRV_RAWMIDI_IOCTL_INFO	_IOR('W', 0x01, struct snd_rawmidi_info)
+-#define SNDRV_RAWMIDI_IOCTL_PARAMS	_IOWR('W', 0x10, struct snd_rawmidi_params)
+-#define SNDRV_RAWMIDI_IOCTL_STATUS	_IOWR('W', 0x20, struct snd_rawmidi_status)
+-#define SNDRV_RAWMIDI_IOCTL_DROP	_IOW('W', 0x30, int)
+-#define SNDRV_RAWMIDI_IOCTL_DRAIN	_IOW('W', 0x31, int)
+-
+-/*
+- *  Timer section - /dev/snd/timer
+- */
+-
+-#define SNDRV_TIMER_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 6)
+-
+-enum {
+-	SNDRV_TIMER_CLASS_NONE = -1,
+-	SNDRV_TIMER_CLASS_SLAVE = 0,
+-	SNDRV_TIMER_CLASS_GLOBAL,
+-	SNDRV_TIMER_CLASS_CARD,
+-	SNDRV_TIMER_CLASS_PCM,
+-	SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
+-};
+-
+-/* slave timer classes */
+-enum {
+-	SNDRV_TIMER_SCLASS_NONE = 0,
+-	SNDRV_TIMER_SCLASS_APPLICATION,
+-	SNDRV_TIMER_SCLASS_SEQUENCER,		/* alias */
+-	SNDRV_TIMER_SCLASS_OSS_SEQUENCER,	/* alias */
+-	SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
+-};
+-
+-/* global timers (device member) */
+-#define SNDRV_TIMER_GLOBAL_SYSTEM	0
+-#define SNDRV_TIMER_GLOBAL_RTC		1	/* unused */
+-#define SNDRV_TIMER_GLOBAL_HPET		2
+-#define SNDRV_TIMER_GLOBAL_HRTIMER	3
+-
+-/* info flags */
+-#define SNDRV_TIMER_FLG_SLAVE		(1<<0)	/* cannot be controlled */
+-
+-struct snd_timer_id {
+-	int dev_class;
+-	int dev_sclass;
+-	int card;
+-	int device;
+-	int subdevice;
+-};
+-
+-struct snd_timer_ginfo {
+-	struct snd_timer_id tid;	/* requested timer ID */
+-	unsigned int flags;		/* timer flags - SNDRV_TIMER_FLG_* */
+-	int card;			/* card number */
+-	unsigned char id[64];		/* timer identification */
+-	unsigned char name[80];		/* timer name */
+-	unsigned long reserved0;	/* reserved for future use */
+-	unsigned long resolution;	/* average period resolution in ns */
+-	unsigned long resolution_min;	/* minimal period resolution in ns */
+-	unsigned long resolution_max;	/* maximal period resolution in ns */
+-	unsigned int clients;		/* active timer clients */
+-	unsigned char reserved[32];
+-};
+-
+-struct snd_timer_gparams {
+-	struct snd_timer_id tid;	/* requested timer ID */
+-	unsigned long period_num;	/* requested precise period duration (in seconds) - numerator */
+-	unsigned long period_den;	/* requested precise period duration (in seconds) - denominator */
+-	unsigned char reserved[32];
+-};
+-
+-struct snd_timer_gstatus {
+-	struct snd_timer_id tid;	/* requested timer ID */
+-	unsigned long resolution;	/* current period resolution in ns */
+-	unsigned long resolution_num;	/* precise current period resolution (in seconds) - numerator */
+-	unsigned long resolution_den;	/* precise current period resolution (in seconds) - denominator */
+-	unsigned char reserved[32];
+-};
+-
+-struct snd_timer_select {
+-	struct snd_timer_id id;	/* bind to timer ID */
+-	unsigned char reserved[32];	/* reserved */
+-};
+-
+-struct snd_timer_info {
+-	unsigned int flags;		/* timer flags - SNDRV_TIMER_FLG_* */
+-	int card;			/* card number */
+-	unsigned char id[64];		/* timer identificator */
+-	unsigned char name[80];		/* timer name */
+-	unsigned long reserved0;	/* reserved for future use */
+-	unsigned long resolution;	/* average period resolution in ns */
+-	unsigned char reserved[64];	/* reserved */
+-};
+-
+-#define SNDRV_TIMER_PSFLG_AUTO		(1<<0)	/* auto start, otherwise one-shot */
+-#define SNDRV_TIMER_PSFLG_EXCLUSIVE	(1<<1)	/* exclusive use, precise start/stop/pause/continue */
+-#define SNDRV_TIMER_PSFLG_EARLY_EVENT	(1<<2)	/* write early event to the poll queue */
+-
+-struct snd_timer_params {
+-	unsigned int flags;		/* flags - SNDRV_TIMER_PSFLG_* */
+-	unsigned int ticks;		/* requested resolution in ticks */
+-	unsigned int queue_size;	/* total size of queue (32-1024) */
+-	unsigned int reserved0;		/* reserved, was: failure locations */
+-	unsigned int filter;		/* event filter (bitmask of SNDRV_TIMER_EVENT_*) */
+-	unsigned char reserved[60];	/* reserved */
+-};
+-
+-struct snd_timer_status {
+-	struct timespec tstamp;		/* Timestamp - last update */
+-	unsigned int resolution;	/* current period resolution in ns */
+-	unsigned int lost;		/* counter of master tick lost */
+-	unsigned int overrun;		/* count of read queue overruns */
+-	unsigned int queue;		/* used queue size */
+-	unsigned char reserved[64];	/* reserved */
+-};
+-
+-#define SNDRV_TIMER_IOCTL_PVERSION	_IOR('T', 0x00, int)
+-#define SNDRV_TIMER_IOCTL_NEXT_DEVICE	_IOWR('T', 0x01, struct snd_timer_id)
+-#define SNDRV_TIMER_IOCTL_TREAD		_IOW('T', 0x02, int)
+-#define SNDRV_TIMER_IOCTL_GINFO		_IOWR('T', 0x03, struct snd_timer_ginfo)
+-#define SNDRV_TIMER_IOCTL_GPARAMS	_IOW('T', 0x04, struct snd_timer_gparams)
+-#define SNDRV_TIMER_IOCTL_GSTATUS	_IOWR('T', 0x05, struct snd_timer_gstatus)
+-#define SNDRV_TIMER_IOCTL_SELECT	_IOW('T', 0x10, struct snd_timer_select)
+-#define SNDRV_TIMER_IOCTL_INFO		_IOR('T', 0x11, struct snd_timer_info)
+-#define SNDRV_TIMER_IOCTL_PARAMS	_IOW('T', 0x12, struct snd_timer_params)
+-#define SNDRV_TIMER_IOCTL_STATUS	_IOR('T', 0x14, struct snd_timer_status)
+-/* The following four ioctls are changed since 1.0.9 due to confliction */
+-#define SNDRV_TIMER_IOCTL_START		_IO('T', 0xa0)
+-#define SNDRV_TIMER_IOCTL_STOP		_IO('T', 0xa1)
+-#define SNDRV_TIMER_IOCTL_CONTINUE	_IO('T', 0xa2)
+-#define SNDRV_TIMER_IOCTL_PAUSE		_IO('T', 0xa3)
+-
+-struct snd_timer_read {
+-	unsigned int resolution;
+-	unsigned int ticks;
+-};
+-
+-enum {
+-	SNDRV_TIMER_EVENT_RESOLUTION = 0,	/* val = resolution in ns */
+-	SNDRV_TIMER_EVENT_TICK,			/* val = ticks */
+-	SNDRV_TIMER_EVENT_START,		/* val = resolution in ns */
+-	SNDRV_TIMER_EVENT_STOP,			/* val = 0 */
+-	SNDRV_TIMER_EVENT_CONTINUE,		/* val = resolution in ns */
+-	SNDRV_TIMER_EVENT_PAUSE,		/* val = 0 */
+-	SNDRV_TIMER_EVENT_EARLY,		/* val = 0, early event */
+-	SNDRV_TIMER_EVENT_SUSPEND,		/* val = 0 */
+-	SNDRV_TIMER_EVENT_RESUME,		/* val = resolution in ns */
+-	/* master timer events for slave timer instances */
+-	SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
+-	SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
+-	SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
+-	SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
+-	SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
+-	SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
+-};
+-
+-struct snd_timer_tread {
+-	int event;
+-	struct timespec tstamp;
+-	unsigned int val;
+-};
+-
+-/****************************************************************************
+- *                                                                          *
+- *        Section for driver control interface - /dev/snd/control?          *
+- *                                                                          *
+- ****************************************************************************/
+-
+-#define SNDRV_CTL_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 7)
+-
+-struct snd_ctl_card_info {
+-	int card;			/* card number */
+-	int pad;			/* reserved for future (was type) */
+-	unsigned char id[16];		/* ID of card (user selectable) */
+-	unsigned char driver[16];	/* Driver name */
+-	unsigned char name[32];		/* Short name of soundcard */
+-	unsigned char longname[80];	/* name + info text about soundcard */
+-	unsigned char reserved_[16];	/* reserved for future (was ID of mixer) */
+-	unsigned char mixername[80];	/* visual mixer identification */
+-	unsigned char components[128];	/* card components / fine identification, delimited with one space (AC97 etc..) */
+-};
+-
+-typedef int __bitwise snd_ctl_elem_type_t;
+-#define	SNDRV_CTL_ELEM_TYPE_NONE	((__force snd_ctl_elem_type_t) 0) /* invalid */
+-#define	SNDRV_CTL_ELEM_TYPE_BOOLEAN	((__force snd_ctl_elem_type_t) 1) /* boolean type */
+-#define	SNDRV_CTL_ELEM_TYPE_INTEGER	((__force snd_ctl_elem_type_t) 2) /* integer type */
+-#define	SNDRV_CTL_ELEM_TYPE_ENUMERATED	((__force snd_ctl_elem_type_t) 3) /* enumerated type */
+-#define	SNDRV_CTL_ELEM_TYPE_BYTES	((__force snd_ctl_elem_type_t) 4) /* byte array */
+-#define	SNDRV_CTL_ELEM_TYPE_IEC958	((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
+-#define	SNDRV_CTL_ELEM_TYPE_INTEGER64	((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */
+-#define	SNDRV_CTL_ELEM_TYPE_LAST	SNDRV_CTL_ELEM_TYPE_INTEGER64
+-
+-typedef int __bitwise snd_ctl_elem_iface_t;
+-#define	SNDRV_CTL_ELEM_IFACE_CARD	((__force snd_ctl_elem_iface_t) 0) /* global control */
+-#define	SNDRV_CTL_ELEM_IFACE_HWDEP	((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */
+-#define	SNDRV_CTL_ELEM_IFACE_MIXER	((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */
+-#define	SNDRV_CTL_ELEM_IFACE_PCM	((__force snd_ctl_elem_iface_t) 3) /* PCM device */
+-#define	SNDRV_CTL_ELEM_IFACE_RAWMIDI	((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */
+-#define	SNDRV_CTL_ELEM_IFACE_TIMER	((__force snd_ctl_elem_iface_t) 5) /* timer device */
+-#define	SNDRV_CTL_ELEM_IFACE_SEQUENCER	((__force snd_ctl_elem_iface_t) 6) /* sequencer client */
+-#define	SNDRV_CTL_ELEM_IFACE_LAST	SNDRV_CTL_ELEM_IFACE_SEQUENCER
+-
+-#define SNDRV_CTL_ELEM_ACCESS_READ		(1<<0)
+-#define SNDRV_CTL_ELEM_ACCESS_WRITE		(1<<1)
+-#define SNDRV_CTL_ELEM_ACCESS_READWRITE		(SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
+-#define SNDRV_CTL_ELEM_ACCESS_VOLATILE		(1<<2)	/* control value may be changed without a notification */
+-#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP		(1<<3)	/* when was control changed */
+-#define SNDRV_CTL_ELEM_ACCESS_TLV_READ		(1<<4)	/* TLV read is possible */
+-#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE		(1<<5)	/* TLV write is possible */
+-#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE	(SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
+-#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND	(1<<6)	/* TLV command is possible */
+-#define SNDRV_CTL_ELEM_ACCESS_INACTIVE		(1<<8)	/* control does actually nothing, but may be updated */
+-#define SNDRV_CTL_ELEM_ACCESS_LOCK		(1<<9)	/* write lock */
+-#define SNDRV_CTL_ELEM_ACCESS_OWNER		(1<<10)	/* write lock owner */
+-#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK	(1<<28)	/* kernel use a TLV callback */
+-#define SNDRV_CTL_ELEM_ACCESS_USER		(1<<29) /* user space element */
+-/* bits 30 and 31 are obsoleted (for indirect access) */
+-
+-/* for further details see the ACPI and PCI power management specification */
+-#define SNDRV_CTL_POWER_D0		0x0000	/* full On */
+-#define SNDRV_CTL_POWER_D1		0x0100	/* partial On */
+-#define SNDRV_CTL_POWER_D2		0x0200	/* partial On */
+-#define SNDRV_CTL_POWER_D3		0x0300	/* Off */
+-#define SNDRV_CTL_POWER_D3hot		(SNDRV_CTL_POWER_D3|0x0000)	/* Off, with power */
+-#define SNDRV_CTL_POWER_D3cold		(SNDRV_CTL_POWER_D3|0x0001)	/* Off, without power */
+-
+-#define SNDRV_CTL_ELEM_ID_NAME_MAXLEN	44
+-
+-struct snd_ctl_elem_id {
+-	unsigned int numid;		/* numeric identifier, zero = invalid */
+-	snd_ctl_elem_iface_t iface;	/* interface identifier */
+-	unsigned int device;		/* device/client number */
+-	unsigned int subdevice;		/* subdevice (substream) number */
+-	unsigned char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];		/* ASCII name of item */
+-	unsigned int index;		/* index of item */
+-};
+-
+-struct snd_ctl_elem_list {
+-	unsigned int offset;		/* W: first element ID to get */
+-	unsigned int space;		/* W: count of element IDs to get */
+-	unsigned int used;		/* R: count of element IDs set */
+-	unsigned int count;		/* R: count of all elements */
+-	struct snd_ctl_elem_id __user *pids; /* R: IDs */
+-	unsigned char reserved[50];
+-};
+-
+-struct snd_ctl_elem_info {
+-	struct snd_ctl_elem_id id;	/* W: element ID */
+-	snd_ctl_elem_type_t type;	/* R: value type - SNDRV_CTL_ELEM_TYPE_* */
+-	unsigned int access;		/* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */
+-	unsigned int count;		/* count of values */
+-	__kernel_pid_t owner;		/* owner's PID of this control */
+-	union {
+-		struct {
+-			long min;		/* R: minimum value */
+-			long max;		/* R: maximum value */
+-			long step;		/* R: step (0 variable) */
+-		} integer;
+-		struct {
+-			long long min;		/* R: minimum value */
+-			long long max;		/* R: maximum value */
+-			long long step;		/* R: step (0 variable) */
+-		} integer64;
+-		struct {
+-			unsigned int items;	/* R: number of items */
+-			unsigned int item;	/* W: item number */
+-			char name[64];		/* R: value name */
+-			__u64 names_ptr;	/* W: names list (ELEM_ADD only) */
+-			unsigned int names_length;
+-		} enumerated;
+-		unsigned char reserved[128];
+-	} value;
+-	union {
+-		unsigned short d[4];		/* dimensions */
+-		unsigned short *d_ptr;		/* indirect - obsoleted */
+-	} dimen;
+-	unsigned char reserved[64-4*sizeof(unsigned short)];
+-};
+-
+-struct snd_ctl_elem_value {
+-	struct snd_ctl_elem_id id;	/* W: element ID */
+-	unsigned int indirect: 1;	/* W: indirect access - obsoleted */
+-	union {
+-		union {
+-			long value[128];
+-			long *value_ptr;	/* obsoleted */
+-		} integer;
+-		union {
+-			long long value[64];
+-			long long *value_ptr;	/* obsoleted */
+-		} integer64;
+-		union {
+-			unsigned int item[128];
+-			unsigned int *item_ptr;	/* obsoleted */
+-		} enumerated;
+-		union {
+-			unsigned char data[512];
+-			unsigned char *data_ptr;	/* obsoleted */
+-		} bytes;
+-		struct snd_aes_iec958 iec958;
+-	} value;		/* RO */
+-	struct timespec tstamp;
+-	unsigned char reserved[128-sizeof(struct timespec)];
+-};
+-
+-struct snd_ctl_tlv {
+-	unsigned int numid;	/* control element numeric identification */
+-	unsigned int length;	/* in bytes aligned to 4 */
+-	unsigned int tlv[0];	/* first TLV */
+-};
+-
+-#define SNDRV_CTL_IOCTL_PVERSION	_IOR('U', 0x00, int)
+-#define SNDRV_CTL_IOCTL_CARD_INFO	_IOR('U', 0x01, struct snd_ctl_card_info)
+-#define SNDRV_CTL_IOCTL_ELEM_LIST	_IOWR('U', 0x10, struct snd_ctl_elem_list)
+-#define SNDRV_CTL_IOCTL_ELEM_INFO	_IOWR('U', 0x11, struct snd_ctl_elem_info)
+-#define SNDRV_CTL_IOCTL_ELEM_READ	_IOWR('U', 0x12, struct snd_ctl_elem_value)
+-#define SNDRV_CTL_IOCTL_ELEM_WRITE	_IOWR('U', 0x13, struct snd_ctl_elem_value)
+-#define SNDRV_CTL_IOCTL_ELEM_LOCK	_IOW('U', 0x14, struct snd_ctl_elem_id)
+-#define SNDRV_CTL_IOCTL_ELEM_UNLOCK	_IOW('U', 0x15, struct snd_ctl_elem_id)
+-#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int)
+-#define SNDRV_CTL_IOCTL_ELEM_ADD	_IOWR('U', 0x17, struct snd_ctl_elem_info)
+-#define SNDRV_CTL_IOCTL_ELEM_REPLACE	_IOWR('U', 0x18, struct snd_ctl_elem_info)
+-#define SNDRV_CTL_IOCTL_ELEM_REMOVE	_IOWR('U', 0x19, struct snd_ctl_elem_id)
+-#define SNDRV_CTL_IOCTL_TLV_READ	_IOWR('U', 0x1a, struct snd_ctl_tlv)
+-#define SNDRV_CTL_IOCTL_TLV_WRITE	_IOWR('U', 0x1b, struct snd_ctl_tlv)
+-#define SNDRV_CTL_IOCTL_TLV_COMMAND	_IOWR('U', 0x1c, struct snd_ctl_tlv)
+-#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int)
+-#define SNDRV_CTL_IOCTL_HWDEP_INFO	_IOR('U', 0x21, struct snd_hwdep_info)
+-#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE	_IOR('U', 0x30, int)
+-#define SNDRV_CTL_IOCTL_PCM_INFO	_IOWR('U', 0x31, struct snd_pcm_info)
+-#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int)
+-#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
+-#define SNDRV_CTL_IOCTL_RAWMIDI_INFO	_IOWR('U', 0x41, struct snd_rawmidi_info)
+-#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
+-#define SNDRV_CTL_IOCTL_POWER		_IOWR('U', 0xd0, int)
+-#define SNDRV_CTL_IOCTL_POWER_STATE	_IOR('U', 0xd1, int)
+-
+-/*
+- *  Read interface.
+- */
+-
+-enum sndrv_ctl_event_type {
+-	SNDRV_CTL_EVENT_ELEM = 0,
+-	SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
+-};
+-
+-#define SNDRV_CTL_EVENT_MASK_VALUE	(1<<0)	/* element value was changed */
+-#define SNDRV_CTL_EVENT_MASK_INFO	(1<<1)	/* element info was changed */
+-#define SNDRV_CTL_EVENT_MASK_ADD	(1<<2)	/* element was added */
+-#define SNDRV_CTL_EVENT_MASK_TLV	(1<<3)	/* element TLV tree was changed */
+-#define SNDRV_CTL_EVENT_MASK_REMOVE	(~0U)	/* element was removed */
+-
+-struct snd_ctl_event {
+-	int type;	/* event type - SNDRV_CTL_EVENT_* */
+-	union {
+-		struct {
+-			unsigned int mask;
+-			struct snd_ctl_elem_id id;
+-		} elem;
+-		unsigned char data8[60];
+-	} data;
+-};
+-
+-/*
+- *  Control names
+- */
+-
+-#define SNDRV_CTL_NAME_NONE				""
+-#define SNDRV_CTL_NAME_PLAYBACK				"Playback "
+-#define SNDRV_CTL_NAME_CAPTURE				"Capture "
+-
+-#define SNDRV_CTL_NAME_IEC958_NONE			""
+-#define SNDRV_CTL_NAME_IEC958_SWITCH			"Switch"
+-#define SNDRV_CTL_NAME_IEC958_VOLUME			"Volume"
+-#define SNDRV_CTL_NAME_IEC958_DEFAULT			"Default"
+-#define SNDRV_CTL_NAME_IEC958_MASK			"Mask"
+-#define SNDRV_CTL_NAME_IEC958_CON_MASK			"Con Mask"
+-#define SNDRV_CTL_NAME_IEC958_PRO_MASK			"Pro Mask"
+-#define SNDRV_CTL_NAME_IEC958_PCM_STREAM		"PCM Stream"
+-#define SNDRV_CTL_NAME_IEC958(expl,direction,what)	"IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
+-
+-#endif /* _UAPI__SOUND_ASOUND_H */
++#include <alsa/sound/uapi/asound.h>
+diff --git a/include/sound/asound_fm.h b/include/sound/asound_fm.h
+index 8471f404..3e5da4d0 100644
+--- a/include/sound/asound_fm.h
++++ b/include/sound/asound_fm.h
+@@ -1,135 +1 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-#ifndef __SOUND_ASOUND_FM_H
+-#define __SOUND_ASOUND_FM_H
+-
+-/*
+- *  Advanced Linux Sound Architecture - ALSA
+- *
+- *  Interface file between ALSA driver & user space
+- *  Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>,
+- *                           4Front Technologies
+- *
+- *  Direct FM control
+- *
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+- *
+- */
+-
+-#define SNDRV_DM_FM_MODE_OPL2	0x00
+-#define SNDRV_DM_FM_MODE_OPL3	0x01
+-
+-struct snd_dm_fm_info {
+-	unsigned char fm_mode;		/* OPL mode, see SNDRV_DM_FM_MODE_XXX */
+-	unsigned char rhythm;		/* percussion mode flag */
+-};
+-
+-/*
+- *  Data structure composing an FM "note" or sound event.
+- */
+-
+-struct snd_dm_fm_voice {
+-	unsigned char op;		/* operator cell (0 or 1) */
+-	unsigned char voice;		/* FM voice (0 to 17) */
+-
+-	unsigned char am;		/* amplitude modulation */
+-	unsigned char vibrato;		/* vibrato effect */
+-	unsigned char do_sustain;	/* sustain phase */
+-	unsigned char kbd_scale;	/* keyboard scaling */
+-	unsigned char harmonic;		/* 4 bits: harmonic and multiplier */
+-	unsigned char scale_level;	/* 2 bits: decrease output freq rises */
+-	unsigned char volume;		/* 6 bits: volume */
+-
+-	unsigned char attack;		/* 4 bits: attack rate */
+-	unsigned char decay;		/* 4 bits: decay rate */
+-	unsigned char sustain;		/* 4 bits: sustain level */
+-	unsigned char release;		/* 4 bits: release rate */
+-
+-	unsigned char feedback;		/* 3 bits: feedback for op0 */
+-	unsigned char connection;	/* 0 for serial, 1 for parallel */
+-	unsigned char left;		/* stereo left */
+-	unsigned char right;		/* stereo right */
+-	unsigned char waveform;		/* 3 bits: waveform shape */
+-};
+-
+-/*
+- *  This describes an FM note by its voice, octave, frequency number (10bit)
+- *  and key on/off.
+- */
+-
+-struct snd_dm_fm_note {
+-	unsigned char voice;	/* 0-17 voice channel */
+-	unsigned char octave;	/* 3 bits: what octave to play */
+-	unsigned int fnum;	/* 10 bits: frequency number */
+-	unsigned char key_on;	/* set for active, clear for silent */
+-};
+-
+-/*
+- *  FM parameters that apply globally to all voices, and thus are not "notes"
+- */
+-
+-struct snd_dm_fm_params {
+-	unsigned char am_depth;		/* amplitude modulation depth (1=hi) */
+-	unsigned char vib_depth;	/* vibrato depth (1=hi) */
+-	unsigned char kbd_split;	/* keyboard split */
+-	unsigned char rhythm;		/* percussion mode select */
+-
+-	/* This block is the percussion instrument data */
+-	unsigned char bass;
+-	unsigned char snare;
+-	unsigned char tomtom;
+-	unsigned char cymbal;
+-	unsigned char hihat;
+-};
+-
+-/*
+- *  FM mode ioctl settings
+- */
+-
+-#define SNDRV_DM_FM_IOCTL_INFO		_IOR('H', 0x20, struct snd_dm_fm_info)
+-#define SNDRV_DM_FM_IOCTL_RESET		_IO ('H', 0x21)
+-#define SNDRV_DM_FM_IOCTL_PLAY_NOTE	_IOW('H', 0x22, struct snd_dm_fm_note)
+-#define SNDRV_DM_FM_IOCTL_SET_VOICE	_IOW('H', 0x23, struct snd_dm_fm_voice)
+-#define SNDRV_DM_FM_IOCTL_SET_PARAMS	_IOW('H', 0x24, struct snd_dm_fm_params)
+-#define SNDRV_DM_FM_IOCTL_SET_MODE	_IOW('H', 0x25, int)
+-/* for OPL3 only */
+-#define SNDRV_DM_FM_IOCTL_SET_CONNECTION	_IOW('H', 0x26, int)
+-/* SBI patch management */
+-#define SNDRV_DM_FM_IOCTL_CLEAR_PATCHES	_IO ('H', 0x40)
+-
+-#define SNDRV_DM_FM_OSS_IOCTL_RESET		0x20
+-#define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE		0x21
+-#define SNDRV_DM_FM_OSS_IOCTL_SET_VOICE		0x22
+-#define SNDRV_DM_FM_OSS_IOCTL_SET_PARAMS	0x23
+-#define SNDRV_DM_FM_OSS_IOCTL_SET_MODE		0x24
+-#define SNDRV_DM_FM_OSS_IOCTL_SET_OPL		0x25
+-
+-/*
+- * Patch Record - fixed size for write
+- */
+-
+-#define FM_KEY_SBI	"SBI\032"
+-#define FM_KEY_2OP	"2OP\032"
+-#define FM_KEY_4OP	"4OP\032"
+-
+-struct sbi_patch {
+-	unsigned char prog;
+-	unsigned char bank;
+-	char key[4];
+-	char name[25];
+-	char extension[7];
+-	unsigned char data[32];
+-};
+-
+-#endif /* __SOUND_ASOUND_FM_H */
++#include <alsa/sound/uapi/asound_fm.h>
+diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
+index 042c5a6f..f06ecee5 100644
+--- a/include/sound/emu10k1.h
++++ b/include/sound/emu10k1.h
+@@ -1,381 +1,2 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-/*
+- *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
+- *		     Creative Labs, Inc.
+- *  Definitions for EMU10K1 (SB Live!) chips
+- *
+- *
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+- *
+- */
+-#ifndef _UAPI__SOUND_EMU10K1_H
+-#define _UAPI__SOUND_EMU10K1_H
+-
+-#include <linux/types.h>
+-#include <sound/asound.h>
+-
+-/*
+- * ---- FX8010 ----
+- */
+-
+-#define EMU10K1_CARD_CREATIVE			0x00000000
+-#define EMU10K1_CARD_EMUAPS			0x00000001
+-
+-#define EMU10K1_FX8010_PCM_COUNT		8
+-
+-/*
+- * Following definition is copied from linux/types.h to support compiling
+- * this header file in userspace since they are not generally available for
+- * uapi headers.
+- */
+-#define __EMU10K1_DECLARE_BITMAP(name,bits) \
+-	unsigned long name[(bits) / (sizeof(unsigned long) * 8)]
+-
+-/* instruction set */
+-#define iMAC0	 0x00	/* R = A + (X * Y >> 31)   ; saturation */
+-#define iMAC1	 0x01	/* R = A + (-X * Y >> 31)  ; saturation */
+-#define iMAC2	 0x02	/* R = A + (X * Y >> 31)   ; wraparound */
+-#define iMAC3	 0x03	/* R = A + (-X * Y >> 31)  ; wraparound */
+-#define iMACINT0 0x04	/* R = A + X * Y	   ; saturation */
+-#define iMACINT1 0x05	/* R = A + X * Y	   ; wraparound (31-bit) */
+-#define iACC3	 0x06	/* R = A + X + Y	   ; saturation */
+-#define iMACMV   0x07	/* R = A, acc += X * Y >> 31 */
+-#define iANDXOR  0x08	/* R = (A & X) ^ Y */
+-#define iTSTNEG  0x09	/* R = (A >= Y) ? X : ~X */
+-#define iLIMITGE 0x0a	/* R = (A >= Y) ? X : Y */
+-#define iLIMITLT 0x0b	/* R = (A < Y) ? X : Y */
+-#define iLOG	 0x0c	/* R = linear_data, A (log_data), X (max_exp), Y (format_word) */
+-#define iEXP	 0x0d	/* R = log_data, A (linear_data), X (max_exp), Y (format_word) */
+-#define iINTERP  0x0e	/* R = A + (X * (Y - A) >> 31)  ; saturation */
+-#define iSKIP    0x0f	/* R = A (cc_reg), X (count), Y (cc_test) */
+-
+-/* GPRs */
+-#define FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x0f */
+-#define EXTIN(x)	(0x10 + (x))	/* x = 0x00 - 0x0f */
+-#define EXTOUT(x)	(0x20 + (x))	/* x = 0x00 - 0x0f physical outs -> FXWC low 16 bits */
+-#define FXBUS2(x)	(0x30 + (x))	/* x = 0x00 - 0x0f copies of fx buses for capture -> FXWC high 16 bits */
+-					/* NB: 0x31 and 0x32 are shared with Center/LFE on SB live 5.1 */
+-
+-#define C_00000000	0x40
+-#define C_00000001	0x41
+-#define C_00000002	0x42
+-#define C_00000003	0x43
+-#define C_00000004	0x44
+-#define C_00000008	0x45
+-#define C_00000010	0x46
+-#define C_00000020	0x47
+-#define C_00000100	0x48
+-#define C_00010000	0x49
+-#define C_00080000	0x4a
+-#define C_10000000	0x4b
+-#define C_20000000	0x4c
+-#define C_40000000	0x4d
+-#define C_80000000	0x4e
+-#define C_7fffffff	0x4f
+-#define C_ffffffff	0x50
+-#define C_fffffffe	0x51
+-#define C_c0000000	0x52
+-#define C_4f1bbcdc	0x53
+-#define C_5a7ef9db	0x54
+-#define C_00100000	0x55		/* ?? */
+-#define GPR_ACCU	0x56		/* ACCUM, accumulator */
+-#define GPR_COND	0x57		/* CCR, condition register */
+-#define GPR_NOISE0	0x58		/* noise source */
+-#define GPR_NOISE1	0x59		/* noise source */
+-#define GPR_IRQ		0x5a		/* IRQ register */
+-#define GPR_DBAC	0x5b		/* TRAM Delay Base Address Counter */
+-#define GPR(x)		(FXGPREGBASE + (x)) /* free GPRs: x = 0x00 - 0xff */
+-#define ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
+-#define ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
+-#define ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
+-#define ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
+-
+-#define A_ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
+-#define A_ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
+-#define A_ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
+-#define A_ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
+-#define A_ITRAM_CTL(x)	(A_TANKMEMCTLREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
+-#define A_ETRAM_CTL(x)	(A_TANKMEMCTLREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
+-
+-#define A_FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x3f FX buses */
+-#define A_EXTIN(x)	(0x40 + (x))	/* x = 0x00 - 0x0f physical ins */
+-#define A_P16VIN(x)	(0x50 + (x))	/* x = 0x00 - 0x0f p16v ins (A2 only) "EMU32 inputs" */
+-#define A_EXTOUT(x)	(0x60 + (x))	/* x = 0x00 - 0x1f physical outs -> A_FXWC1 0x79-7f unknown   */
+-#define A_FXBUS2(x)	(0x80 + (x))	/* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
+-#define A_EMU32OUTH(x)	(0xa0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
+-#define A_EMU32OUTL(x)	(0xb0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
+-#define A3_EMU32IN(x)	(0x160 + (x))	/* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */
+-#define A3_EMU32OUT(x)	(0x1E0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */
+-#define A_GPR(x)	(A_FXGPREGBASE + (x))
+-
+-/* cc_reg constants */
+-#define CC_REG_NORMALIZED C_00000001
+-#define CC_REG_BORROW	C_00000002
+-#define CC_REG_MINUS	C_00000004
+-#define CC_REG_ZERO	C_00000008
+-#define CC_REG_SATURATE	C_00000010
+-#define CC_REG_NONZERO	C_00000100
+-
+-/* FX buses */
+-#define FXBUS_PCM_LEFT		0x00
+-#define FXBUS_PCM_RIGHT		0x01
+-#define FXBUS_PCM_LEFT_REAR	0x02
+-#define FXBUS_PCM_RIGHT_REAR	0x03
+-#define FXBUS_MIDI_LEFT		0x04
+-#define FXBUS_MIDI_RIGHT	0x05
+-#define FXBUS_PCM_CENTER	0x06
+-#define FXBUS_PCM_LFE		0x07
+-#define FXBUS_PCM_LEFT_FRONT	0x08
+-#define FXBUS_PCM_RIGHT_FRONT	0x09
+-#define FXBUS_MIDI_REVERB	0x0c
+-#define FXBUS_MIDI_CHORUS	0x0d
+-#define FXBUS_PCM_LEFT_SIDE	0x0e
+-#define FXBUS_PCM_RIGHT_SIDE	0x0f
+-#define FXBUS_PT_LEFT		0x14
+-#define FXBUS_PT_RIGHT		0x15
+-
+-/* Inputs */
+-#define EXTIN_AC97_L	   0x00	/* AC'97 capture channel - left */
+-#define EXTIN_AC97_R	   0x01	/* AC'97 capture channel - right */
+-#define EXTIN_SPDIF_CD_L   0x02	/* internal S/PDIF CD - onboard - left */
+-#define EXTIN_SPDIF_CD_R   0x03	/* internal S/PDIF CD - onboard - right */
+-#define EXTIN_ZOOM_L	   0x04	/* Zoom Video I2S - left */
+-#define EXTIN_ZOOM_R	   0x05	/* Zoom Video I2S - right */
+-#define EXTIN_TOSLINK_L	   0x06	/* LiveDrive - TOSLink Optical - left */
+-#define EXTIN_TOSLINK_R    0x07	/* LiveDrive - TOSLink Optical - right */
+-#define EXTIN_LINE1_L	   0x08	/* LiveDrive - Line/Mic 1 - left */
+-#define EXTIN_LINE1_R	   0x09	/* LiveDrive - Line/Mic 1 - right */
+-#define EXTIN_COAX_SPDIF_L 0x0a	/* LiveDrive - Coaxial S/PDIF - left */
+-#define EXTIN_COAX_SPDIF_R 0x0b /* LiveDrive - Coaxial S/PDIF - right */
+-#define EXTIN_LINE2_L	   0x0c	/* LiveDrive - Line/Mic 2 - left */
+-#define EXTIN_LINE2_R	   0x0d	/* LiveDrive - Line/Mic 2 - right */
+-
+-/* Outputs */
+-#define EXTOUT_AC97_L	   0x00	/* AC'97 playback channel - left */
+-#define EXTOUT_AC97_R	   0x01	/* AC'97 playback channel - right */
+-#define EXTOUT_TOSLINK_L   0x02	/* LiveDrive - TOSLink Optical - left */
+-#define EXTOUT_TOSLINK_R   0x03	/* LiveDrive - TOSLink Optical - right */
+-#define EXTOUT_AC97_CENTER 0x04	/* SB Live 5.1 - center */
+-#define EXTOUT_AC97_LFE	   0x05 /* SB Live 5.1 - LFE */
+-#define EXTOUT_HEADPHONE_L 0x06	/* LiveDrive - Headphone - left */
+-#define EXTOUT_HEADPHONE_R 0x07	/* LiveDrive - Headphone - right */
+-#define EXTOUT_REAR_L	   0x08	/* Rear channel - left */
+-#define EXTOUT_REAR_R	   0x09	/* Rear channel - right */
+-#define EXTOUT_ADC_CAP_L   0x0a	/* ADC Capture buffer - left */
+-#define EXTOUT_ADC_CAP_R   0x0b	/* ADC Capture buffer - right */
+-#define EXTOUT_MIC_CAP	   0x0c	/* MIC Capture buffer */
+-#define EXTOUT_AC97_REAR_L 0x0d	/* SB Live 5.1 (c) 2003 - Rear Left */
+-#define EXTOUT_AC97_REAR_R 0x0e	/* SB Live 5.1 (c) 2003 - Rear Right */
+-#define EXTOUT_ACENTER	   0x11 /* Analog Center */
+-#define EXTOUT_ALFE	   0x12 /* Analog LFE */
+-
+-/* Audigy Inputs */
+-#define A_EXTIN_AC97_L		0x00	/* AC'97 capture channel - left */
+-#define A_EXTIN_AC97_R		0x01	/* AC'97 capture channel - right */
+-#define A_EXTIN_SPDIF_CD_L	0x02	/* digital CD left */
+-#define A_EXTIN_SPDIF_CD_R	0x03	/* digital CD left */
+-#define A_EXTIN_OPT_SPDIF_L     0x04    /* audigy drive Optical SPDIF - left */
+-#define A_EXTIN_OPT_SPDIF_R     0x05    /*                              right */ 
+-#define A_EXTIN_LINE2_L		0x08	/* audigy drive line2/mic2 - left */
+-#define A_EXTIN_LINE2_R		0x09	/*                           right */
+-#define A_EXTIN_ADC_L		0x0a    /* Philips ADC - left */
+-#define A_EXTIN_ADC_R		0x0b    /*               right */
+-#define A_EXTIN_AUX2_L		0x0c	/* audigy drive aux2 - left */
+-#define A_EXTIN_AUX2_R		0x0d	/*                   - right */
+-
+-/* Audigiy Outputs */
+-#define A_EXTOUT_FRONT_L	0x00	/* digital front left */
+-#define A_EXTOUT_FRONT_R	0x01	/*               right */
+-#define A_EXTOUT_CENTER		0x02	/* digital front center */
+-#define A_EXTOUT_LFE		0x03	/* digital front lfe */
+-#define A_EXTOUT_HEADPHONE_L	0x04	/* headphone audigy drive left */
+-#define A_EXTOUT_HEADPHONE_R	0x05	/*                        right */
+-#define A_EXTOUT_REAR_L		0x06	/* digital rear left */
+-#define A_EXTOUT_REAR_R		0x07	/*              right */
+-#define A_EXTOUT_AFRONT_L	0x08	/* analog front left */
+-#define A_EXTOUT_AFRONT_R	0x09	/*              right */
+-#define A_EXTOUT_ACENTER	0x0a	/* analog center */
+-#define A_EXTOUT_ALFE		0x0b	/* analog LFE */
+-#define A_EXTOUT_ASIDE_L	0x0c	/* analog side left  - Audigy 2 ZS */
+-#define A_EXTOUT_ASIDE_R	0x0d	/*             right - Audigy 2 ZS */
+-#define A_EXTOUT_AREAR_L	0x0e	/* analog rear left */
+-#define A_EXTOUT_AREAR_R	0x0f	/*             right */
+-#define A_EXTOUT_AC97_L		0x10	/* AC97 left (front) */
+-#define A_EXTOUT_AC97_R		0x11	/*      right */
+-#define A_EXTOUT_ADC_CAP_L	0x16	/* ADC capture buffer left */
+-#define A_EXTOUT_ADC_CAP_R	0x17	/*                    right */
+-#define A_EXTOUT_MIC_CAP	0x18	/* Mic capture buffer */
+-
+-/* Audigy constants */
+-#define A_C_00000000	0xc0
+-#define A_C_00000001	0xc1
+-#define A_C_00000002	0xc2
+-#define A_C_00000003	0xc3
+-#define A_C_00000004	0xc4
+-#define A_C_00000008	0xc5
+-#define A_C_00000010	0xc6
+-#define A_C_00000020	0xc7
+-#define A_C_00000100	0xc8
+-#define A_C_00010000	0xc9
+-#define A_C_00000800	0xca
+-#define A_C_10000000	0xcb
+-#define A_C_20000000	0xcc
+-#define A_C_40000000	0xcd
+-#define A_C_80000000	0xce
+-#define A_C_7fffffff	0xcf
+-#define A_C_ffffffff	0xd0
+-#define A_C_fffffffe	0xd1
+-#define A_C_c0000000	0xd2
+-#define A_C_4f1bbcdc	0xd3
+-#define A_C_5a7ef9db	0xd4
+-#define A_C_00100000	0xd5
+-#define A_GPR_ACCU	0xd6		/* ACCUM, accumulator */
+-#define A_GPR_COND	0xd7		/* CCR, condition register */
+-#define A_GPR_NOISE0	0xd8		/* noise source */
+-#define A_GPR_NOISE1	0xd9		/* noise source */
+-#define A_GPR_IRQ	0xda		/* IRQ register */
+-#define A_GPR_DBAC	0xdb		/* TRAM Delay Base Address Counter - internal */
+-#define A_GPR_DBACE	0xde		/* TRAM Delay Base Address Counter - external */
+-
+-/* definitions for debug register */
+-#define EMU10K1_DBG_ZC			0x80000000	/* zero tram counter */
+-#define EMU10K1_DBG_SATURATION_OCCURED	0x02000000	/* saturation control */
+-#define EMU10K1_DBG_SATURATION_ADDR	0x01ff0000	/* saturation address */
+-#define EMU10K1_DBG_SINGLE_STEP		0x00008000	/* single step mode */
+-#define EMU10K1_DBG_STEP		0x00004000	/* start single step */
+-#define EMU10K1_DBG_CONDITION_CODE	0x00003e00	/* condition code */
+-#define EMU10K1_DBG_SINGLE_STEP_ADDR	0x000001ff	/* single step address */
+-
+-/* tank memory address line */
+-#ifndef __KERNEL__
+-#define TANKMEMADDRREG_ADDR_MASK 0x000fffff	/* 20 bit tank address field			*/
+-#define TANKMEMADDRREG_CLEAR	 0x00800000	/* Clear tank memory				*/
+-#define TANKMEMADDRREG_ALIGN	 0x00400000	/* Align read or write relative to tank access	*/
+-#define TANKMEMADDRREG_WRITE	 0x00200000	/* Write to tank memory				*/
+-#define TANKMEMADDRREG_READ	 0x00100000	/* Read from tank memory			*/
+-#endif
+-
+-struct snd_emu10k1_fx8010_info {
+-	unsigned int internal_tram_size;	/* in samples */
+-	unsigned int external_tram_size;	/* in samples */
+-	char fxbus_names[16][32];		/* names of FXBUSes */
+-	char extin_names[16][32];		/* names of external inputs */
+-	char extout_names[32][32];		/* names of external outputs */
+-	unsigned int gpr_controls;		/* count of GPR controls */
+-};
+-
+-#define EMU10K1_GPR_TRANSLATION_NONE		0
+-#define EMU10K1_GPR_TRANSLATION_TABLE100	1
+-#define EMU10K1_GPR_TRANSLATION_BASS		2
+-#define EMU10K1_GPR_TRANSLATION_TREBLE		3
+-#define EMU10K1_GPR_TRANSLATION_ONOFF		4
+-
+-struct snd_emu10k1_fx8010_control_gpr {
+-	struct snd_ctl_elem_id id;		/* full control ID definition */
+-	unsigned int vcount;		/* visible count */
+-	unsigned int count;		/* count of GPR (1..16) */
+-	unsigned short gpr[32];		/* GPR number(s) */
+-	unsigned int value[32];		/* initial values */
+-	unsigned int min;		/* minimum range */
+-	unsigned int max;		/* maximum range */
+-	unsigned int translation;	/* translation type (EMU10K1_GPR_TRANSLATION*) */
+-	const unsigned int *tlv;
+-};
+-
+-/* old ABI without TLV support */
+-struct snd_emu10k1_fx8010_control_old_gpr {
+-	struct snd_ctl_elem_id id;
+-	unsigned int vcount;
+-	unsigned int count;
+-	unsigned short gpr[32];
+-	unsigned int value[32];
+-	unsigned int min;
+-	unsigned int max;
+-	unsigned int translation;
+-};
+-
+-struct snd_emu10k1_fx8010_code {
+-	char name[128];
+-
+-	__EMU10K1_DECLARE_BITMAP(gpr_valid, 0x200); /* bitmask of valid initializers */
+-	__u32 __user *gpr_map;		/* initializers */
+-
+-	unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */
+-	struct snd_emu10k1_fx8010_control_gpr __user *gpr_add_controls; /* GPR controls to add/replace */
+-
+-	unsigned int gpr_del_control_count; /* count of GPR controls to remove */
+-	struct snd_ctl_elem_id __user *gpr_del_controls; /* IDs of GPR controls to remove */
+-
+-	unsigned int gpr_list_control_count; /* count of GPR controls to list */
+-	unsigned int gpr_list_control_total; /* total count of GPR controls */
+-	struct snd_emu10k1_fx8010_control_gpr __user *gpr_list_controls; /* listed GPR controls */
+-
+-	__EMU10K1_DECLARE_BITMAP(tram_valid, 0x100); /* bitmask of valid initializers */
+-	__u32 __user *tram_data_map;	  /* data initializers */
+-	__u32 __user *tram_addr_map;	  /* map initializers */
+-
+-	__EMU10K1_DECLARE_BITMAP(code_valid, 1024); /* bitmask of valid instructions */
+-	__u32 __user *code;		  /* one instruction - 64 bits */
+-};
+-
+-struct snd_emu10k1_fx8010_tram {
+-	unsigned int address;		/* 31.bit == 1 -> external TRAM */
+-	unsigned int size;		/* size in samples (4 bytes) */
+-	unsigned int *samples;		/* pointer to samples (20-bit) */
+-					/* NULL->clear memory */
+-};
+-
+-struct snd_emu10k1_fx8010_pcm_rec {
+-	unsigned int substream;		/* substream number */
+-	unsigned int res1;		/* reserved */
+-	unsigned int channels;		/* 16-bit channels count, zero = remove this substream */
+-	unsigned int tram_start;	/* ring buffer position in TRAM (in samples) */
+-	unsigned int buffer_size;	/* count of buffered samples */
+-	unsigned short gpr_size;		/* GPR containing size of ringbuffer in samples (host) */
+-	unsigned short gpr_ptr;		/* GPR containing current pointer in the ring buffer (host = reset, FX8010) */
+-	unsigned short gpr_count;	/* GPR containing count of samples between two interrupts (host) */
+-	unsigned short gpr_tmpcount;	/* GPR containing current count of samples to interrupt (host = set, FX8010) */
+-	unsigned short gpr_trigger;	/* GPR containing trigger (activate) information (host) */
+-	unsigned short gpr_running;	/* GPR containing info if PCM is running (FX8010) */
+-	unsigned char pad;		/* reserved */
+-	unsigned char etram[32];	/* external TRAM address & data (one per channel) */
+-	unsigned int res2;		/* reserved */
+-};
+-
+-#define SNDRV_EMU10K1_VERSION		SNDRV_PROTOCOL_VERSION(1, 0, 1)
+-
+-#define SNDRV_EMU10K1_IOCTL_INFO	_IOR ('H', 0x10, struct snd_emu10k1_fx8010_info)
+-#define SNDRV_EMU10K1_IOCTL_CODE_POKE	_IOW ('H', 0x11, struct snd_emu10k1_fx8010_code)
+-#define SNDRV_EMU10K1_IOCTL_CODE_PEEK	_IOWR('H', 0x12, struct snd_emu10k1_fx8010_code)
+-#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP	_IOW ('H', 0x20, int)
+-#define SNDRV_EMU10K1_IOCTL_TRAM_POKE	_IOW ('H', 0x21, struct snd_emu10k1_fx8010_tram)
+-#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK	_IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram)
+-#define SNDRV_EMU10K1_IOCTL_PCM_POKE	_IOW ('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec)
+-#define SNDRV_EMU10K1_IOCTL_PCM_PEEK	_IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec)
+-#define SNDRV_EMU10K1_IOCTL_PVERSION	_IOR ('H', 0x40, int)
+-#define SNDRV_EMU10K1_IOCTL_STOP	_IO  ('H', 0x80)
+-#define SNDRV_EMU10K1_IOCTL_CONTINUE	_IO  ('H', 0x81)
+-#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO ('H', 0x82)
+-#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP	_IOW ('H', 0x83, int)
+-#define SNDRV_EMU10K1_IOCTL_DBG_READ	_IOR ('H', 0x84, int)
+-
+-/* typedefs for compatibility to user-space */
+-typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
+-typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
+-typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
+-typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
+-typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
+-
+-#endif /* _UAPI__SOUND_EMU10K1_H */
++#include <alsa/sound/type_compat.h>
++#include <alsa/sound/uapi/emu10k1.h>
+diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h
+index 5dc0c3db..78fb745b 100644
+--- a/include/sound/hdsp.h
++++ b/include/sound/hdsp.h
+@@ -1,111 +1,2 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-#ifndef __SOUND_HDSP_H
+-#define __SOUND_HDSP_H
+-
+-/*
+- *   Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
+- *    
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+- */
+-
+-#include <linux/types.h>
+-
+-#define HDSP_MATRIX_MIXER_SIZE 2048
+-
+-enum HDSP_IO_Type {
+-	Digiface,
+-	Multiface,
+-	H9652,
+-	H9632,
+-	RPM,
+-	Undefined,
+-};
+-
+-struct hdsp_peak_rms {
+-	__u32 input_peaks[26];
+-	__u32 playback_peaks[26];
+-	__u32 output_peaks[28];
+-	__u64 input_rms[26];
+-	__u64 playback_rms[26];
+-	/* These are only used for H96xx cards */
+-	__u64 output_rms[26];
+-};
+-
+-#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms)
+-
+-struct hdsp_config_info {
+-	unsigned char pref_sync_ref;
+-	unsigned char wordclock_sync_check;
+-	unsigned char spdif_sync_check;
+-	unsigned char adatsync_sync_check;
+-	unsigned char adat_sync_check[3];
+-	unsigned char spdif_in;
+-	unsigned char spdif_out;
+-	unsigned char spdif_professional;
+-	unsigned char spdif_emphasis;
+-	unsigned char spdif_nonaudio;
+-	unsigned int spdif_sample_rate;
+-	unsigned int system_sample_rate;
+-	unsigned int autosync_sample_rate;
+-	unsigned char system_clock_mode;
+-	unsigned char clock_source;
+-	unsigned char autosync_ref;
+-	unsigned char line_out;
+-	unsigned char passthru; 
+-	unsigned char da_gain;
+-	unsigned char ad_gain;
+-	unsigned char phone_gain;
+-	unsigned char xlr_breakout_cable;
+-	unsigned char analog_extension_board;
+-};
+-
+-#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info)
+-
+-struct hdsp_firmware {
+-	void __user *firmware_data;	/* 24413 x 4 bytes */
+-};
+-
+-#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware)
+-
+-struct hdsp_version {
+-	enum HDSP_IO_Type io_type;
+-	unsigned short firmware_rev;
+-};
+-
+-#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version)
+-
+-struct hdsp_mixer {
+-	unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
+-};
+-
+-#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer)
+-
+-struct hdsp_9632_aeb {
+-	int aebi;
+-	int aebo;
+-};
+-
+-#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
+-
+-/* typedefs for compatibility to user-space */
+-typedef enum HDSP_IO_Type HDSP_IO_Type;
+-typedef struct hdsp_peak_rms hdsp_peak_rms_t;
+-typedef struct hdsp_config_info hdsp_config_info_t;
+-typedef struct hdsp_firmware hdsp_firmware_t;
+-typedef struct hdsp_version hdsp_version_t;
+-typedef struct hdsp_mixer hdsp_mixer_t;
+-typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
+-
+-#endif /* __SOUND_HDSP_H */
++#include <alsa/sound/type_compat.h>
++#include <alsa/sound/uapi/hdsp.h>
+diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h
+index a38f3f79..af6d19ed 100644
+--- a/include/sound/hdspm.h
++++ b/include/sound/hdspm.h
+@@ -1,232 +1,2 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-#ifndef __SOUND_HDSPM_H
+-#define __SOUND_HDSPM_H
+-/*
+- *   Copyright (C) 2003 Winfried Ritsch (IEM)
+- *   based on hdsp.h from Thomas Charbonnel (thomas@undata.org)
+- *
+- *
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+- */
+-
+-#include <linux/types.h>
+-
+-/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
+-#define HDSPM_MAX_CHANNELS      64
+-
+-enum hdspm_io_type {
+-	MADI,
+-	MADIface,
+-	AIO,
+-	AES32,
+-	RayDAT
+-};
+-
+-enum hdspm_speed {
+-	ss,
+-	ds,
+-	qs
+-};
+-
+-/* -------------------- IOCTL Peak/RMS Meters -------------------- */
+-
+-struct hdspm_peak_rms {
+-	__u32 input_peaks[64];
+-	__u32 playback_peaks[64];
+-	__u32 output_peaks[64];
+-
+-	__u64 input_rms[64];
+-	__u64 playback_rms[64];
+-	__u64 output_rms[64];
+-
+-	__u8 speed; /* enum {ss, ds, qs} */
+-	int status2;
+-};
+-
+-#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
+-	_IOR('H', 0x42, struct hdspm_peak_rms)
+-
+-/* ------------ CONFIG block IOCTL ---------------------- */
+-
+-struct hdspm_config {
+-	unsigned char pref_sync_ref;
+-	unsigned char wordclock_sync_check;
+-	unsigned char madi_sync_check;
+-	unsigned int system_sample_rate;
+-	unsigned int autosync_sample_rate;
+-	unsigned char system_clock_mode;
+-	unsigned char clock_source;
+-	unsigned char autosync_ref;
+-	unsigned char line_out;
+-	unsigned int passthru;
+-	unsigned int analog_out;
+-};
+-
+-#define SNDRV_HDSPM_IOCTL_GET_CONFIG \
+-	_IOR('H', 0x41, struct hdspm_config)
+-
+-/*
+- * If there's a TCO (TimeCode Option) board installed,
+- * there are further options and status data available.
+- * The hdspm_ltc structure contains the current SMPTE
+- * timecode and some status information and can be
+- * obtained via SNDRV_HDSPM_IOCTL_GET_LTC or in the
+- * hdspm_status struct.
+- */
+-
+-enum hdspm_ltc_format {
+-	format_invalid,
+-	fps_24,
+-	fps_25,
+-	fps_2997,
+-	fps_30
+-};
+-
+-enum hdspm_ltc_frame {
+-	frame_invalid,
+-	drop_frame,
+-	full_frame
+-};
+-
+-enum hdspm_ltc_input_format {
+-	ntsc,
+-	pal,
+-	no_video
+-};
+-
+-struct hdspm_ltc {
+-	unsigned int ltc;
+-
+-	enum hdspm_ltc_format format;
+-	enum hdspm_ltc_frame frame;
+-	enum hdspm_ltc_input_format input_format;
+-};
+-
+-#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
+-
+-/*
+- * The status data reflects the device's current state
+- * as determined by the card's configuration and
+- * connection status.
+- */
+-
+-enum hdspm_sync {
+-	hdspm_sync_no_lock = 0,
+-	hdspm_sync_lock = 1,
+-	hdspm_sync_sync = 2
+-};
+-
+-enum hdspm_madi_input {
+-	hdspm_input_optical = 0,
+-	hdspm_input_coax = 1
+-};
+-
+-enum hdspm_madi_channel_format {
+-	hdspm_format_ch_64 = 0,
+-	hdspm_format_ch_56 = 1
+-};
+-
+-enum hdspm_madi_frame_format {
+-	hdspm_frame_48 = 0,
+-	hdspm_frame_96 = 1
+-};
+-
+-enum hdspm_syncsource {
+-	syncsource_wc = 0,
+-	syncsource_madi = 1,
+-	syncsource_tco = 2,
+-	syncsource_sync = 3,
+-	syncsource_none = 4
+-};
+-
+-struct hdspm_status {
+-	__u8 card_type; /* enum hdspm_io_type */
+-	enum hdspm_syncsource autosync_source;
+-
+-	__u64 card_clock;
+-	__u32 master_period;
+-
+-	union {
+-		struct {
+-			__u8 sync_wc; /* enum hdspm_sync */
+-			__u8 sync_madi; /* enum hdspm_sync */
+-			__u8 sync_tco; /* enum hdspm_sync */
+-			__u8 sync_in; /* enum hdspm_sync */
+-			__u8 madi_input; /* enum hdspm_madi_input */
+-			__u8 channel_format; /* enum hdspm_madi_channel_format */
+-			__u8 frame_format; /* enum hdspm_madi_frame_format */
+-		} madi;
+-	} card_specific;
+-};
+-
+-#define SNDRV_HDSPM_IOCTL_GET_STATUS \
+-	_IOR('H', 0x47, struct hdspm_status)
+-
+-/*
+- * Get information about the card and its add-ons.
+- */
+-
+-#define HDSPM_ADDON_TCO 1
+-
+-struct hdspm_version {
+-	__u8 card_type; /* enum hdspm_io_type */
+-	char cardname[20];
+-	unsigned int serial;
+-	unsigned short firmware_rev;
+-	int addons;
+-};
+-
+-#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version)
+-
+-/* ------------- get Matrix Mixer IOCTL --------------- */
+-
+-/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
+- * 32768 Bytes
+- */
+-
+-/* organisation is 64 channelfader in a continuous memory block */
+-/* equivalent to hardware definition, maybe for future feature of mmap of
+- * them
+- */
+-/* each of 64 outputs has 64 infader and 64 outfader:
+-   Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
+-
+-#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
+-
+-struct hdspm_channelfader {
+-	unsigned int in[HDSPM_MIXER_CHANNELS];
+-	unsigned int pb[HDSPM_MIXER_CHANNELS];
+-};
+-
+-struct hdspm_mixer {
+-	struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
+-};
+-
+-struct hdspm_mixer_ioctl {
+-	struct hdspm_mixer *mixer;
+-};
+-
+-/* use indirect access due to the limit of ioctl bit size */
+-#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
+-
+-/* typedefs for compatibility to user-space */
+-typedef struct hdspm_peak_rms hdspm_peak_rms_t;
+-typedef struct hdspm_config_info hdspm_config_info_t;
+-typedef struct hdspm_version hdspm_version_t;
+-typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
+-typedef struct hdspm_mixer hdspm_mixer_t;
+-
+-
+-#endif
++#include <alsa/sound/type_compat.h>
++#include <alsa/sound/uapi/hdspm.h>
+diff --git a/include/sound/sb16_csp.h b/include/sound/sb16_csp.h
+index e6485148..24121fcb 100644
+--- a/include/sound/sb16_csp.h
++++ b/include/sound/sb16_csp.h
+@@ -1,123 +1 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-/*
+- *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
+- *                        Takashi Iwai <tiwai@suse.de>
+- *
+- *  SB16ASP/AWE32 CSP control
+- *
+- *   This program is free software; you can redistribute it and/or modify 
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- *
+- *   You should have received a copy of the GNU General Public License
+- *   along with this program; if not, write to the Free Software
+- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+- *
+- */
+-#ifndef _UAPI__SOUND_SB16_CSP_H
+-#define _UAPI__SOUND_SB16_CSP_H
+-
+-
+-/* CSP modes */
+-#define SNDRV_SB_CSP_MODE_NONE		0x00
+-#define SNDRV_SB_CSP_MODE_DSP_READ	0x01	/* Record from DSP */
+-#define SNDRV_SB_CSP_MODE_DSP_WRITE	0x02	/* Play to DSP */
+-#define SNDRV_SB_CSP_MODE_QSOUND		0x04	/* QSound */
+-
+-/* CSP load flags */
+-#define SNDRV_SB_CSP_LOAD_FROMUSER	0x01
+-#define SNDRV_SB_CSP_LOAD_INITBLOCK	0x02
+-
+-/* CSP sample width */
+-#define SNDRV_SB_CSP_SAMPLE_8BIT		0x01
+-#define SNDRV_SB_CSP_SAMPLE_16BIT		0x02
+-
+-/* CSP channels */
+-#define SNDRV_SB_CSP_MONO			0x01
+-#define SNDRV_SB_CSP_STEREO		0x02
+-
+-/* CSP rates */
+-#define SNDRV_SB_CSP_RATE_8000		0x01
+-#define SNDRV_SB_CSP_RATE_11025		0x02
+-#define SNDRV_SB_CSP_RATE_22050		0x04
+-#define SNDRV_SB_CSP_RATE_44100		0x08
+-#define SNDRV_SB_CSP_RATE_ALL		0x0f
+-
+-/* CSP running state */
+-#define SNDRV_SB_CSP_ST_IDLE		0x00
+-#define SNDRV_SB_CSP_ST_LOADED		0x01
+-#define SNDRV_SB_CSP_ST_RUNNING		0x02
+-#define SNDRV_SB_CSP_ST_PAUSED		0x04
+-#define SNDRV_SB_CSP_ST_AUTO		0x08
+-#define SNDRV_SB_CSP_ST_QSOUND		0x10
+-
+-/* maximum QSound value (180 degrees right) */
+-#define SNDRV_SB_CSP_QSOUND_MAX_RIGHT	0x20
+-
+-/* maximum microcode RIFF file size */
+-#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE	0x3000
+-
+-/* microcode header */
+-struct snd_sb_csp_mc_header {
+-	char codec_name[16];		/* id name of codec */
+-	unsigned short func_req;	/* requested function */
+-};
+-
+-/* microcode to be loaded */
+-struct snd_sb_csp_microcode {
+-	struct snd_sb_csp_mc_header info;
+-	unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE];
+-};
+-
+-/* start CSP with sample_width in mono/stereo */
+-struct snd_sb_csp_start {
+-	int sample_width;	/* sample width, look above */
+-	int channels;		/* channels, look above */
+-};
+-
+-/* CSP information */
+-struct snd_sb_csp_info {
+-	char codec_name[16];		/* id name of codec */
+-	unsigned short func_nr;		/* function number */
+-	unsigned int acc_format;	/* accepted PCM formats */
+-	unsigned short acc_channels;	/* accepted channels */
+-	unsigned short acc_width;	/* accepted sample width */
+-	unsigned short acc_rates;	/* accepted sample rates */
+-	unsigned short csp_mode;	/* CSP mode, see above */
+-	unsigned short run_channels;	/* current channels  */
+-	unsigned short run_width;	/* current sample width */
+-	unsigned short version;		/* version id: 0x10 - 0x1f */
+-	unsigned short state;		/* state bits */
+-};
+-
+-/* HWDEP controls */
+-/* get CSP information */
+-#define SNDRV_SB_CSP_IOCTL_INFO		_IOR('H', 0x10, struct snd_sb_csp_info)
+-/* load microcode to CSP */
+-/* NOTE: struct snd_sb_csp_microcode overflows the max size (13 bits)
+- * defined for some architectures like MIPS, and it leads to build errors.
+- * (x86 and co have 14-bit size, thus it's valid, though.)
+- * As a workaround for skipping the size-limit check, here we don't use the
+- * normal _IOW() macro but _IOC() with the manual argument.
+- */
+-#define SNDRV_SB_CSP_IOCTL_LOAD_CODE	\
+-	_IOC(_IOC_WRITE, 'H', 0x11, sizeof(struct snd_sb_csp_microcode))
+-/* unload microcode from CSP */
+-#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE	_IO('H', 0x12)
+-/* start CSP */
+-#define SNDRV_SB_CSP_IOCTL_START		_IOW('H', 0x13, struct snd_sb_csp_start)
+-/* stop CSP */
+-#define SNDRV_SB_CSP_IOCTL_STOP		_IO('H', 0x14)
+-/* pause CSP and DMA transfer */
+-#define SNDRV_SB_CSP_IOCTL_PAUSE		_IO('H', 0x15)
+-/* restart CSP and DMA transfer */
+-#define SNDRV_SB_CSP_IOCTL_RESTART	_IO('H', 0x16)
+-
+-
+-#endif /* _UAPI__SOUND_SB16_CSP_H */
++#include <alsa/sound/uapi/sb16_csp.h>
+diff --git a/include/sound/sscape_ioctl.h b/include/sound/sscape_ioctl.h
+index c6653ebf..23b48d33 100644
+--- a/include/sound/sscape_ioctl.h
++++ b/include/sound/sscape_ioctl.h
+@@ -1,21 +1 @@
+-#ifndef SSCAPE_IOCTL_H
+-#define SSCAPE_IOCTL_H
+-
+-
+-struct sscape_bootblock
+-{
+-  unsigned char code[256];
+-  unsigned version;
+-};
+-
+-#define SSCAPE_MICROCODE_SIZE  65536
+-
+-struct sscape_microcode
+-{
+-  unsigned char *code;
+-};
+-
+-#define SND_SSCAPE_LOAD_BOOTB  _IOWR('P', 100, struct sscape_bootblock)
+-#define SND_SSCAPE_LOAD_MCODE  _IOW ('P', 101, struct sscape_microcode)
+-
+-#endif
++#include <alsa/sound/uapi/sscape_ioctl.h>
+diff --git a/include/sound/tlv.h b/include/sound/tlv.h
+index 7d6d65f6..e435a5fc 100644
+--- a/include/sound/tlv.h
++++ b/include/sound/tlv.h
+@@ -1,117 +1 @@
+-/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+-/*
+- *   This program is free software; you can redistribute it and/or modify
+- *   it under the terms of the GNU General Public License as published by
+- *   the Free Software Foundation; either version 2 of the License, or
+- *   (at your option) any later version.
+- *
+- *   This program is distributed in the hope that it will be useful,
+- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- *   GNU General Public License for more details.
+- */
+-
+-#ifndef __UAPI_SOUND_TLV_H
+-#define __UAPI_SOUND_TLV_H
+-
+-#define SNDRV_CTL_TLVT_CONTAINER 0	/* one level down - group of TLVs */
+-#define SNDRV_CTL_TLVT_DB_SCALE	1       /* dB scale */
+-#define SNDRV_CTL_TLVT_DB_LINEAR 2	/* linear volume */
+-#define SNDRV_CTL_TLVT_DB_RANGE 3	/* dB range container */
+-#define SNDRV_CTL_TLVT_DB_MINMAX 4	/* dB scale with min/max */
+-#define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5	/* dB scale with min/max with mute */
+-
+-/*
+- * channel-mapping TLV items
+- *  TLV length must match with num_channels
+- */
+-#define SNDRV_CTL_TLVT_CHMAP_FIXED	0x101	/* fixed channel position */
+-#define SNDRV_CTL_TLVT_CHMAP_VAR	0x102	/* channels freely swappable */
+-#define SNDRV_CTL_TLVT_CHMAP_PAIRED	0x103	/* pair-wise swappable */
+-
+-/*
+- * TLV structure is right behind the struct snd_ctl_tlv:
+- *   unsigned int type  	- see SNDRV_CTL_TLVT_*
+- *   unsigned int length
+- *   .... data aligned to sizeof(unsigned int), use
+- *        block_length = (length + (sizeof(unsigned int) - 1)) &
+- *                       ~(sizeof(unsigned int) - 1)) ....
+- */
+-#define SNDRV_CTL_TLVD_ITEM(type, ...) \
+-	(type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__
+-#define SNDRV_CTL_TLVD_LENGTH(...) \
+-	((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
+-
+-/* Accessor offsets for TLV data items */
+-#define SNDRV_CTL_TLVO_TYPE		0
+-#define SNDRV_CTL_TLVO_LEN		1
+-
+-#define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \
+-	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
+-#define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \
+-	unsigned int name[] = { \
+-		SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \
+-	}
+-
+-#define SNDRV_CTL_TLVD_DB_SCALE_MASK	0xffff
+-#define SNDRV_CTL_TLVD_DB_SCALE_MUTE	0x10000
+-#define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
+-	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \
+-			    (min), \
+-			    ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \
+-			     ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0))
+-#define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \
+-	unsigned int name[] = { \
+-		SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
+-	}
+-
+-/* Accessor offsets for min, mute and step items in dB scale type TLV */
+-#define SNDRV_CTL_TLVO_DB_SCALE_MIN		2
+-#define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP	3
+-
+-/* dB scale specified with min/max values instead of step */
+-#define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
+-	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
+-#define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
+-	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
+-#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \
+-	unsigned int name[] = { \
+-		SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
+-	}
+-#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \
+-	unsigned int name[] = { \
+-		SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
+-	}
+-
+-/* Accessor offsets for min, max items in db-minmax types of TLV. */
+-#define SNDRV_CTL_TLVO_DB_MINMAX_MIN	2
+-#define SNDRV_CTL_TLVO_DB_MINMAX_MAX	3
+-
+-/* linear volume between min_dB and max_dB (.01dB unit) */
+-#define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
+-	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
+-#define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \
+-	unsigned int name[] = { \
+-		SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
+-	}
+-
+-/* Accessor offsets for min, max items in db-linear type of TLV. */
+-#define SNDRV_CTL_TLVO_DB_LINEAR_MIN	2
+-#define SNDRV_CTL_TLVO_DB_LINEAR_MAX	3
+-
+-/* dB range container:
+- * Items in dB range container must be ordered by their values and by their
+- * dB values. This implies that larger values must correspond with larger
+- * dB values (which is also required for all other mixer controls).
+- */
+-/* Each item is: <min> <max> <TLV> */
+-#define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \
+-	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
+-#define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \
+-	unsigned int name[] = { \
+-		SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \
+-	}
+-
+-#define SNDRV_CTL_TLVD_DB_GAIN_MUTE	-9999999
+-
+-#endif
++#include <alsa/sound/uapi/tlv.h>
+diff --git a/include/sound/type_compat.h b/include/sound/type_compat.h
+index e973ff31..d4790c1f 100644
+--- a/include/sound/type_compat.h
++++ b/include/sound/type_compat.h
+@@ -3,6 +3,9 @@
+ 
+ #ifndef DOC_HIDDEN
+ #include <stdint.h>
++#ifdef __linux__
++#include <linux/types.h>
++#else
+ typedef uint8_t __u8;
+ typedef uint16_t __u16;
+ typedef uint32_t __u32;
+@@ -37,6 +40,16 @@ typedef int32_t __s32;
+ #define __be32 __u32
+ #define __be16 __u16
+ #define __be8  __u8
++#endif
++
++#ifndef __user
++#define __user
++#endif
++
++#ifndef __packed
++#define __packed __attribute__((__packed__))
++#endif
++
+ #endif /* DOC_HIDDEN */
+ 
+ #endif /* __TYPE_COMPAT_H */
+diff --git a/include/sound/uapi/Makefile.am b/include/sound/uapi/Makefile.am
+new file mode 100644
+index 00000000..99197108
+--- /dev/null
++++ b/include/sound/uapi/Makefile.am
+@@ -0,0 +1,6 @@
++alsasounduapiincludedir = ${includedir}/alsa/sound/uapi
++
++alsasounduapiinclude_HEADERS = asound_fm.h hdsp.h hdspm.h sb16_csp.h \
++			   sscape_ioctl.h emu10k1.h asoc.h tlv.h
++
++noinst_HEADERS = asound.h asequencer.h
+diff --git a/include/sound/uapi/asequencer.h b/include/sound/uapi/asequencer.h
+new file mode 100644
+index 00000000..a75e14ed
+--- /dev/null
++++ b/include/sound/uapi/asequencer.h
+@@ -0,0 +1,612 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++/*
++ *  Main header file for the ALSA sequencer
++ *  Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
++ *            (c) 1998-1999 by Jaroslav Kysela <perex@perex.cz>
++ *
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ */
++#ifndef _UAPI__SOUND_ASEQUENCER_H
++#define _UAPI__SOUND_ASEQUENCER_H
++
++#include <sound/asound.h>
++
++/** version of the sequencer */
++#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 2)
++
++/**
++ * definition of sequencer event types
++ */
++
++/** system messages
++ * event data type = #snd_seq_result
++ */
++#define SNDRV_SEQ_EVENT_SYSTEM		0
++#define SNDRV_SEQ_EVENT_RESULT		1
++
++/** note messages (channel specific)
++ * event data type = #snd_seq_ev_note
++ */
++#define SNDRV_SEQ_EVENT_NOTE		5
++#define SNDRV_SEQ_EVENT_NOTEON		6
++#define SNDRV_SEQ_EVENT_NOTEOFF		7
++#define SNDRV_SEQ_EVENT_KEYPRESS	8
++	
++/** control messages (channel specific)
++ * event data type = #snd_seq_ev_ctrl
++ */
++#define SNDRV_SEQ_EVENT_CONTROLLER	10
++#define SNDRV_SEQ_EVENT_PGMCHANGE	11
++#define SNDRV_SEQ_EVENT_CHANPRESS	12
++#define SNDRV_SEQ_EVENT_PITCHBEND	13	/**< from -8192 to 8191 */
++#define SNDRV_SEQ_EVENT_CONTROL14	14	/**< 14 bit controller value */
++#define SNDRV_SEQ_EVENT_NONREGPARAM	15	/**< 14 bit NRPN address + 14 bit unsigned value */
++#define SNDRV_SEQ_EVENT_REGPARAM	16	/**< 14 bit RPN address + 14 bit unsigned value */
++
++/** synchronisation messages
++ * event data type = #snd_seq_ev_ctrl
++ */
++#define SNDRV_SEQ_EVENT_SONGPOS		20	/* Song Position Pointer with LSB and MSB values */
++#define SNDRV_SEQ_EVENT_SONGSEL		21	/* Song Select with song ID number */
++#define SNDRV_SEQ_EVENT_QFRAME		22	/* midi time code quarter frame */
++#define SNDRV_SEQ_EVENT_TIMESIGN	23	/* SMF Time Signature event */
++#define SNDRV_SEQ_EVENT_KEYSIGN		24	/* SMF Key Signature event */
++	        
++/** timer messages
++ * event data type = snd_seq_ev_queue_control
++ */
++#define SNDRV_SEQ_EVENT_START		30	/* midi Real Time Start message */
++#define SNDRV_SEQ_EVENT_CONTINUE	31	/* midi Real Time Continue message */
++#define SNDRV_SEQ_EVENT_STOP		32	/* midi Real Time Stop message */	
++#define	SNDRV_SEQ_EVENT_SETPOS_TICK	33	/* set tick queue position */
++#define SNDRV_SEQ_EVENT_SETPOS_TIME	34	/* set realtime queue position */
++#define SNDRV_SEQ_EVENT_TEMPO		35	/* (SMF) Tempo event */
++#define SNDRV_SEQ_EVENT_CLOCK		36	/* midi Real Time Clock message */
++#define SNDRV_SEQ_EVENT_TICK		37	/* midi Real Time Tick message */
++#define SNDRV_SEQ_EVENT_QUEUE_SKEW	38	/* skew queue tempo */
++
++/** others
++ * event data type = none
++ */
++#define SNDRV_SEQ_EVENT_TUNE_REQUEST	40	/* tune request */
++#define SNDRV_SEQ_EVENT_RESET		41	/* reset to power-on state */
++#define SNDRV_SEQ_EVENT_SENSING		42	/* "active sensing" event */
++
++/** echo back, kernel private messages
++ * event data type = any type
++ */
++#define SNDRV_SEQ_EVENT_ECHO		50	/* echo event */
++#define SNDRV_SEQ_EVENT_OSS		51	/* OSS raw event */
++
++/** system status messages (broadcast for subscribers)
++ * event data type = snd_seq_addr
++ */
++#define SNDRV_SEQ_EVENT_CLIENT_START	60	/* new client has connected */
++#define SNDRV_SEQ_EVENT_CLIENT_EXIT	61	/* client has left the system */
++#define SNDRV_SEQ_EVENT_CLIENT_CHANGE	62	/* client status/info has changed */
++#define SNDRV_SEQ_EVENT_PORT_START	63	/* new port was created */
++#define SNDRV_SEQ_EVENT_PORT_EXIT	64	/* port was deleted from system */
++#define SNDRV_SEQ_EVENT_PORT_CHANGE	65	/* port status/info has changed */
++
++/** port connection changes
++ * event data type = snd_seq_connect
++ */
++#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED	66	/* ports connected */
++#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67	/* ports disconnected */
++
++/* 70-89:  synthesizer events - obsoleted */
++
++/** user-defined events with fixed length
++ * event data type = any
++ */
++#define SNDRV_SEQ_EVENT_USR0		90
++#define SNDRV_SEQ_EVENT_USR1		91
++#define SNDRV_SEQ_EVENT_USR2		92
++#define SNDRV_SEQ_EVENT_USR3		93
++#define SNDRV_SEQ_EVENT_USR4		94
++#define SNDRV_SEQ_EVENT_USR5		95
++#define SNDRV_SEQ_EVENT_USR6		96
++#define SNDRV_SEQ_EVENT_USR7		97
++#define SNDRV_SEQ_EVENT_USR8		98
++#define SNDRV_SEQ_EVENT_USR9		99
++
++/* 100-118: instrument layer - obsoleted */
++/* 119-129: reserved */
++
++/* 130-139: variable length events
++ * event data type = snd_seq_ev_ext
++ * (SNDRV_SEQ_EVENT_LENGTH_VARIABLE must be set)
++ */
++#define SNDRV_SEQ_EVENT_SYSEX		130	/* system exclusive data (variable length) */
++#define SNDRV_SEQ_EVENT_BOUNCE		131	/* error event */
++/* 132-134: reserved */
++#define SNDRV_SEQ_EVENT_USR_VAR0	135
++#define SNDRV_SEQ_EVENT_USR_VAR1	136
++#define SNDRV_SEQ_EVENT_USR_VAR2	137
++#define SNDRV_SEQ_EVENT_USR_VAR3	138
++#define SNDRV_SEQ_EVENT_USR_VAR4	139
++
++/* 150-151: kernel events with quote - DO NOT use in user clients */
++#define SNDRV_SEQ_EVENT_KERNEL_ERROR	150
++#define SNDRV_SEQ_EVENT_KERNEL_QUOTE	151	/* obsolete */
++
++/* 152-191: reserved */
++
++/* 192-254: hardware specific events */
++
++/* 255: special event */
++#define SNDRV_SEQ_EVENT_NONE		255
++
++
++typedef unsigned char snd_seq_event_type_t;
++
++/** event address */
++struct snd_seq_addr {
++	unsigned char client;	/**< Client number:         0..255, 255 = broadcast to all clients */
++	unsigned char port;	/**< Port within client:    0..255, 255 = broadcast to all ports */
++};
++
++/** port connection */
++struct snd_seq_connect {
++	struct snd_seq_addr sender;
++	struct snd_seq_addr dest;
++};
++
++
++#define SNDRV_SEQ_ADDRESS_UNKNOWN	253	/* unknown source */
++#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS	254	/* send event to all subscribed ports */
++#define SNDRV_SEQ_ADDRESS_BROADCAST	255	/* send event to all queues/clients/ports/channels */
++#define SNDRV_SEQ_QUEUE_DIRECT		253	/* direct dispatch */
++
++	/* event mode flag - NOTE: only 8 bits available! */
++#define SNDRV_SEQ_TIME_STAMP_TICK	(0<<0) /* timestamp in clock ticks */
++#define SNDRV_SEQ_TIME_STAMP_REAL	(1<<0) /* timestamp in real time */
++#define SNDRV_SEQ_TIME_STAMP_MASK	(1<<0)
++
++#define SNDRV_SEQ_TIME_MODE_ABS		(0<<1)	/* absolute timestamp */
++#define SNDRV_SEQ_TIME_MODE_REL		(1<<1)	/* relative to current time */
++#define SNDRV_SEQ_TIME_MODE_MASK	(1<<1)
++
++#define SNDRV_SEQ_EVENT_LENGTH_FIXED	(0<<2)	/* fixed event size */
++#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE	(1<<2)	/* variable event size */
++#define SNDRV_SEQ_EVENT_LENGTH_VARUSR	(2<<2)	/* variable event size - user memory space */
++#define SNDRV_SEQ_EVENT_LENGTH_MASK	(3<<2)
++
++#define SNDRV_SEQ_PRIORITY_NORMAL	(0<<4)	/* normal priority */
++#define SNDRV_SEQ_PRIORITY_HIGH		(1<<4)	/* event should be processed before others */
++#define SNDRV_SEQ_PRIORITY_MASK		(1<<4)
++
++
++	/* note event */
++struct snd_seq_ev_note {
++	unsigned char channel;
++	unsigned char note;
++	unsigned char velocity;
++	unsigned char off_velocity;	/* only for SNDRV_SEQ_EVENT_NOTE */
++	unsigned int duration;		/* only for SNDRV_SEQ_EVENT_NOTE */
++};
++
++	/* controller event */
++struct snd_seq_ev_ctrl {
++	unsigned char channel;
++	unsigned char unused1, unused2, unused3;	/* pad */
++	unsigned int param;
++	signed int value;
++};
++
++	/* generic set of bytes (12x8 bit) */
++struct snd_seq_ev_raw8 {
++	unsigned char d[12];	/* 8 bit value */
++};
++
++	/* generic set of integers (3x32 bit) */
++struct snd_seq_ev_raw32 {
++	unsigned int d[3];	/* 32 bit value */
++};
++
++	/* external stored data */
++struct snd_seq_ev_ext {
++	unsigned int len;	/* length of data */
++	void *ptr;		/* pointer to data (note: maybe 64-bit) */
++} __attribute__((packed));
++
++struct snd_seq_result {
++	int event;		/* processed event type */
++	int result;
++};
++
++
++struct snd_seq_real_time {
++	unsigned int tv_sec;	/* seconds */
++	unsigned int tv_nsec;	/* nanoseconds */
++};
++
++typedef unsigned int snd_seq_tick_time_t;	/* midi ticks */
++
++union snd_seq_timestamp {
++	snd_seq_tick_time_t tick;
++	struct snd_seq_real_time time;
++};
++
++struct snd_seq_queue_skew {
++	unsigned int value;
++	unsigned int base;
++};
++
++	/* queue timer control */
++struct snd_seq_ev_queue_control {
++	unsigned char queue;			/* affected queue */
++	unsigned char pad[3];			/* reserved */
++	union {
++		signed int value;		/* affected value (e.g. tempo) */
++		union snd_seq_timestamp time;	/* time */
++		unsigned int position;		/* sync position */
++		struct snd_seq_queue_skew skew;
++		unsigned int d32[2];
++		unsigned char d8[8];
++	} param;
++};
++
++	/* quoted event - inside the kernel only */
++struct snd_seq_ev_quote {
++	struct snd_seq_addr origin;		/* original sender */
++	unsigned short value;		/* optional data */
++	struct snd_seq_event *event;		/* quoted event */
++} __attribute__((packed));
++
++
++	/* sequencer event */
++struct snd_seq_event {
++	snd_seq_event_type_t type;	/* event type */
++	unsigned char flags;		/* event flags */
++	char tag;
++	
++	unsigned char queue;		/* schedule queue */
++	union snd_seq_timestamp time;	/* schedule time */
++
++
++	struct snd_seq_addr source;	/* source address */
++	struct snd_seq_addr dest;	/* destination address */
++
++	union {				/* event data... */
++		struct snd_seq_ev_note note;
++		struct snd_seq_ev_ctrl control;
++		struct snd_seq_ev_raw8 raw8;
++		struct snd_seq_ev_raw32 raw32;
++		struct snd_seq_ev_ext ext;
++		struct snd_seq_ev_queue_control queue;
++		union snd_seq_timestamp time;
++		struct snd_seq_addr addr;
++		struct snd_seq_connect connect;
++		struct snd_seq_result result;
++		struct snd_seq_ev_quote quote;
++	} data;
++};
++
++
++/*
++ * bounce event - stored as variable size data
++ */
++struct snd_seq_event_bounce {
++	int err;
++	struct snd_seq_event event;
++	/* external data follows here. */
++};
++
++
++	/* system information */
++struct snd_seq_system_info {
++	int queues;			/* maximum queues count */
++	int clients;			/* maximum clients count */
++	int ports;			/* maximum ports per client */
++	int channels;			/* maximum channels per port */
++	int cur_clients;		/* current clients */
++	int cur_queues;			/* current queues */
++	char reserved[24];
++};
++
++
++	/* system running information */
++struct snd_seq_running_info {
++	unsigned char client;		/* client id */
++	unsigned char big_endian;	/* 1 = big-endian */
++	unsigned char cpu_mode;		/* 4 = 32bit, 8 = 64bit */
++	unsigned char pad;		/* reserved */
++	unsigned char reserved[12];
++};
++
++
++	/* known client numbers */
++#define SNDRV_SEQ_CLIENT_SYSTEM		0
++	/* internal client numbers */
++#define SNDRV_SEQ_CLIENT_DUMMY		14	/* midi through */
++#define SNDRV_SEQ_CLIENT_OSS		15	/* oss sequencer emulator */
++
++
++	/* client types */
++typedef int __bitwise snd_seq_client_type_t;
++#define	NO_CLIENT	((__force snd_seq_client_type_t) 0)
++#define	USER_CLIENT	((__force snd_seq_client_type_t) 1)
++#define	KERNEL_CLIENT	((__force snd_seq_client_type_t) 2)
++                        
++	/* event filter flags */
++#define SNDRV_SEQ_FILTER_BROADCAST	(1<<0)	/* accept broadcast messages */
++#define SNDRV_SEQ_FILTER_MULTICAST	(1<<1)	/* accept multicast messages */
++#define SNDRV_SEQ_FILTER_BOUNCE		(1<<2)	/* accept bounce event in error */
++#define SNDRV_SEQ_FILTER_USE_EVENT	(1<<31)	/* use event filter */
++
++struct snd_seq_client_info {
++	int client;			/* client number to inquire */
++	snd_seq_client_type_t type;	/* client type */
++	char name[64];			/* client name */
++	unsigned int filter;		/* filter flags */
++	unsigned char multicast_filter[8]; /* multicast filter bitmap */
++	unsigned char event_filter[32];	/* event filter bitmap */
++	int num_ports;			/* RO: number of ports */
++	int event_lost;			/* number of lost events */
++	int card;			/* RO: card number[kernel] */
++	int pid;			/* RO: pid[user] */
++	char reserved[56];		/* for future use */
++};
++
++
++/* client pool size */
++struct snd_seq_client_pool {
++	int client;			/* client number to inquire */
++	int output_pool;		/* outgoing (write) pool size */
++	int input_pool;			/* incoming (read) pool size */
++	int output_room;		/* minimum free pool size for select/blocking mode */
++	int output_free;		/* unused size */
++	int input_free;			/* unused size */
++	char reserved[64];
++};
++
++
++/* Remove events by specified criteria */
++
++#define SNDRV_SEQ_REMOVE_INPUT		(1<<0)	/* Flush input queues */
++#define SNDRV_SEQ_REMOVE_OUTPUT		(1<<1)	/* Flush output queues */
++#define SNDRV_SEQ_REMOVE_DEST		(1<<2)	/* Restrict by destination q:client:port */
++#define SNDRV_SEQ_REMOVE_DEST_CHANNEL	(1<<3)	/* Restrict by channel */
++#define SNDRV_SEQ_REMOVE_TIME_BEFORE	(1<<4)	/* Restrict to before time */
++#define SNDRV_SEQ_REMOVE_TIME_AFTER	(1<<5)	/* Restrict to time or after */
++#define SNDRV_SEQ_REMOVE_TIME_TICK	(1<<6)	/* Time is in ticks */
++#define SNDRV_SEQ_REMOVE_EVENT_TYPE	(1<<7)	/* Restrict to event type */
++#define SNDRV_SEQ_REMOVE_IGNORE_OFF 	(1<<8)	/* Do not flush off events */
++#define SNDRV_SEQ_REMOVE_TAG_MATCH 	(1<<9)	/* Restrict to events with given tag */
++
++struct snd_seq_remove_events {
++	unsigned int  remove_mode;	/* Flags that determine what gets removed */
++
++	union snd_seq_timestamp time;
++
++	unsigned char queue;	/* Queue for REMOVE_DEST */
++	struct snd_seq_addr dest;	/* Address for REMOVE_DEST */
++	unsigned char channel;	/* Channel for REMOVE_DEST */
++
++	int  type;	/* For REMOVE_EVENT_TYPE */
++	char  tag;	/* Tag for REMOVE_TAG */
++
++	int  reserved[10];	/* To allow for future binary compatibility */
++
++};
++
++
++	/* known port numbers */
++#define SNDRV_SEQ_PORT_SYSTEM_TIMER	0
++#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE	1
++
++	/* port capabilities (32 bits) */
++#define SNDRV_SEQ_PORT_CAP_READ		(1<<0)	/* readable from this port */
++#define SNDRV_SEQ_PORT_CAP_WRITE	(1<<1)	/* writable to this port */
++
++#define SNDRV_SEQ_PORT_CAP_SYNC_READ	(1<<2)
++#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE	(1<<3)
++
++#define SNDRV_SEQ_PORT_CAP_DUPLEX	(1<<4)
++
++#define SNDRV_SEQ_PORT_CAP_SUBS_READ	(1<<5)	/* allow read subscription */
++#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE	(1<<6)	/* allow write subscription */
++#define SNDRV_SEQ_PORT_CAP_NO_EXPORT	(1<<7)	/* routing not allowed */
++
++	/* port type */
++#define SNDRV_SEQ_PORT_TYPE_SPECIFIC	(1<<0)	/* hardware specific */
++#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1)	/* generic MIDI device */
++#define SNDRV_SEQ_PORT_TYPE_MIDI_GM	(1<<2)	/* General MIDI compatible device */
++#define SNDRV_SEQ_PORT_TYPE_MIDI_GS	(1<<3)	/* GS compatible device */
++#define SNDRV_SEQ_PORT_TYPE_MIDI_XG	(1<<4)	/* XG compatible device */
++#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32	(1<<5)	/* MT-32 compatible device */
++#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2	(1<<6)	/* General MIDI 2 compatible device */
++
++/* other standards...*/
++#define SNDRV_SEQ_PORT_TYPE_SYNTH	(1<<10)	/* Synth device (no MIDI compatible - direct wavetable) */
++#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11)	/* Sampling device (support sample download) */
++#define SNDRV_SEQ_PORT_TYPE_SAMPLE	(1<<12)	/* Sampling device (sample can be downloaded at any time) */
++/*...*/
++#define SNDRV_SEQ_PORT_TYPE_HARDWARE	(1<<16)	/* driver for a hardware device */
++#define SNDRV_SEQ_PORT_TYPE_SOFTWARE	(1<<17)	/* implemented in software */
++#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER	(1<<18)	/* generates sound */
++#define SNDRV_SEQ_PORT_TYPE_PORT	(1<<19)	/* connects to other device(s) */
++#define SNDRV_SEQ_PORT_TYPE_APPLICATION	(1<<20)	/* application (sequencer/editor) */
++
++/* misc. conditioning flags */
++#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT	(1<<0)
++#define SNDRV_SEQ_PORT_FLG_TIMESTAMP	(1<<1)
++#define SNDRV_SEQ_PORT_FLG_TIME_REAL	(1<<2)
++
++struct snd_seq_port_info {
++	struct snd_seq_addr addr;	/* client/port numbers */
++	char name[64];			/* port name */
++
++	unsigned int capability;	/* port capability bits */
++	unsigned int type;		/* port type bits */
++	int midi_channels;		/* channels per MIDI port */
++	int midi_voices;		/* voices per MIDI port */
++	int synth_voices;		/* voices per SYNTH port */
++
++	int read_use;			/* R/O: subscribers for output (from this port) */
++	int write_use;			/* R/O: subscribers for input (to this port) */
++
++	void *kernel;			/* reserved for kernel use (must be NULL) */
++	unsigned int flags;		/* misc. conditioning */
++	unsigned char time_queue;	/* queue # for timestamping */
++	char reserved[59];		/* for future use */
++};
++
++
++/* queue flags */
++#define SNDRV_SEQ_QUEUE_FLG_SYNC	(1<<0)	/* sync enabled */
++
++/* queue information */
++struct snd_seq_queue_info {
++	int queue;		/* queue id */
++
++	/*
++	 *  security settings, only owner of this queue can start/stop timer
++	 *  etc. if the queue is locked for other clients
++	 */
++	int owner;		/* client id for owner of the queue */
++	unsigned locked:1;	/* timing queue locked for other queues */
++	char name[64];		/* name of this queue */
++	unsigned int flags;	/* flags */
++	char reserved[60];	/* for future use */
++
++};
++
++/* queue info/status */
++struct snd_seq_queue_status {
++	int queue;			/* queue id */
++	int events;			/* read-only - queue size */
++	snd_seq_tick_time_t tick;	/* current tick */
++	struct snd_seq_real_time time;	/* current time */
++	int running;			/* running state of queue */
++	int flags;			/* various flags */
++	char reserved[64];		/* for the future */
++};
++
++
++/* queue tempo */
++struct snd_seq_queue_tempo {
++	int queue;			/* sequencer queue */
++	unsigned int tempo;		/* current tempo, us/tick */
++	int ppq;			/* time resolution, ticks/quarter */
++	unsigned int skew_value;	/* queue skew */
++	unsigned int skew_base;		/* queue skew base */
++	char reserved[24];		/* for the future */
++};
++
++
++/* sequencer timer sources */
++#define SNDRV_SEQ_TIMER_ALSA		0	/* ALSA timer */
++#define SNDRV_SEQ_TIMER_MIDI_CLOCK	1	/* Midi Clock (CLOCK event) */
++#define SNDRV_SEQ_TIMER_MIDI_TICK	2	/* Midi Timer Tick (TICK event) */
++
++/* queue timer info */
++struct snd_seq_queue_timer {
++	int queue;			/* sequencer queue */
++	int type;			/* source timer type */
++	union {
++		struct {
++			struct snd_timer_id id;	/* ALSA's timer ID */
++			unsigned int resolution;	/* resolution in Hz */
++		} alsa;
++	} u;
++	char reserved[64];		/* for the future use */
++};
++
++
++struct snd_seq_queue_client {
++	int queue;		/* sequencer queue */
++	int client;		/* sequencer client */
++	int used;		/* queue is used with this client
++				   (must be set for accepting events) */
++	/* per client watermarks */
++	char reserved[64];	/* for future use */
++};
++
++
++#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE	(1<<0)	/* exclusive connection */
++#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP	(1<<1)
++#define SNDRV_SEQ_PORT_SUBS_TIME_REAL	(1<<2)
++
++struct snd_seq_port_subscribe {
++	struct snd_seq_addr sender;	/* sender address */
++	struct snd_seq_addr dest;	/* destination address */
++	unsigned int voices;		/* number of voices to be allocated (0 = don't care) */
++	unsigned int flags;		/* modes */
++	unsigned char queue;		/* input time-stamp queue (optional) */
++	unsigned char pad[3];		/* reserved */
++	char reserved[64];
++};
++
++/* type of query subscription */
++#define SNDRV_SEQ_QUERY_SUBS_READ	0
++#define SNDRV_SEQ_QUERY_SUBS_WRITE	1
++
++struct snd_seq_query_subs {
++	struct snd_seq_addr root;	/* client/port id to be searched */
++	int type;		/* READ or WRITE */
++	int index;		/* 0..N-1 */
++	int num_subs;		/* R/O: number of subscriptions on this port */
++	struct snd_seq_addr addr;	/* R/O: result */
++	unsigned char queue;	/* R/O: result */
++	unsigned int flags;	/* R/O: result */
++	char reserved[64];	/* for future use */
++};
++
++
++/*
++ *  IOCTL commands
++ */
++
++#define SNDRV_SEQ_IOCTL_PVERSION	_IOR ('S', 0x00, int)
++#define SNDRV_SEQ_IOCTL_CLIENT_ID	_IOR ('S', 0x01, int)
++#define SNDRV_SEQ_IOCTL_SYSTEM_INFO	_IOWR('S', 0x02, struct snd_seq_system_info)
++#define SNDRV_SEQ_IOCTL_RUNNING_MODE	_IOWR('S', 0x03, struct snd_seq_running_info)
++
++#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO	_IOWR('S', 0x10, struct snd_seq_client_info)
++#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO	_IOW ('S', 0x11, struct snd_seq_client_info)
++
++#define SNDRV_SEQ_IOCTL_CREATE_PORT	_IOWR('S', 0x20, struct snd_seq_port_info)
++#define SNDRV_SEQ_IOCTL_DELETE_PORT	_IOW ('S', 0x21, struct snd_seq_port_info)
++#define SNDRV_SEQ_IOCTL_GET_PORT_INFO	_IOWR('S', 0x22, struct snd_seq_port_info)
++#define SNDRV_SEQ_IOCTL_SET_PORT_INFO	_IOW ('S', 0x23, struct snd_seq_port_info)
++
++#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT	_IOW ('S', 0x30, struct snd_seq_port_subscribe)
++#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW ('S', 0x31, struct snd_seq_port_subscribe)
++
++#define SNDRV_SEQ_IOCTL_CREATE_QUEUE	_IOWR('S', 0x32, struct snd_seq_queue_info)
++#define SNDRV_SEQ_IOCTL_DELETE_QUEUE	_IOW ('S', 0x33, struct snd_seq_queue_info)
++#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO	_IOWR('S', 0x34, struct snd_seq_queue_info)
++#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO	_IOWR('S', 0x35, struct snd_seq_queue_info)
++#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE	_IOWR('S', 0x36, struct snd_seq_queue_info)
++#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status)
++#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO	_IOWR('S', 0x41, struct snd_seq_queue_tempo)
++#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO	_IOW ('S', 0x42, struct snd_seq_queue_tempo)
++#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER	_IOWR('S', 0x45, struct snd_seq_queue_timer)
++#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER	_IOW ('S', 0x46, struct snd_seq_queue_timer)
++#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT	_IOWR('S', 0x49, struct snd_seq_queue_client)
++#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT	_IOW ('S', 0x4a, struct snd_seq_queue_client)
++#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL	_IOWR('S', 0x4b, struct snd_seq_client_pool)
++#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL	_IOW ('S', 0x4c, struct snd_seq_client_pool)
++#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS	_IOW ('S', 0x4e, struct snd_seq_remove_events)
++#define SNDRV_SEQ_IOCTL_QUERY_SUBS	_IOWR('S', 0x4f, struct snd_seq_query_subs)
++#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION	_IOWR('S', 0x50, struct snd_seq_port_subscribe)
++#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT	_IOWR('S', 0x51, struct snd_seq_client_info)
++#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT	_IOWR('S', 0x52, struct snd_seq_port_info)
++
++#endif /* _UAPI__SOUND_ASEQUENCER_H */
+diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
+new file mode 100644
+index 00000000..a74ca232
+--- /dev/null
++++ b/include/sound/uapi/asoc.h
+@@ -0,0 +1,633 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++/*
++ * uapi/sound/asoc.h -- ALSA SoC Firmware Controls and DAPM
++ *
++ * Copyright (C) 2012 Texas Instruments Inc.
++ * Copyright (C) 2015 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ *
++ * Simple file API to load FW that includes mixers, coefficients, DAPM graphs,
++ * algorithms, equalisers, DAIs, widgets etc.
++*/
++
++#ifndef __LINUX_UAPI_SND_ASOC_H
++#define __LINUX_UAPI_SND_ASOC_H
++
++#include <linux/types.h>
++#include <sound/asound.h>
++
++/*
++ * Maximum number of channels topology kcontrol can represent.
++ */
++#define SND_SOC_TPLG_MAX_CHAN		8
++
++/*
++ * Maximum number of PCM formats capability
++ */
++#define SND_SOC_TPLG_MAX_FORMATS	16
++
++/*
++ * Maximum number of PCM stream configs
++ */
++#define SND_SOC_TPLG_STREAM_CONFIG_MAX  8
++
++/*
++ * Maximum number of physical link's hardware configs
++ */
++#define SND_SOC_TPLG_HW_CONFIG_MAX	8
++
++/* individual kcontrol info types - can be mixed with other types */
++#define SND_SOC_TPLG_CTL_VOLSW		1
++#define SND_SOC_TPLG_CTL_VOLSW_SX	2
++#define SND_SOC_TPLG_CTL_VOLSW_XR_SX	3
++#define SND_SOC_TPLG_CTL_ENUM		4
++#define SND_SOC_TPLG_CTL_BYTES		5
++#define SND_SOC_TPLG_CTL_ENUM_VALUE	6
++#define SND_SOC_TPLG_CTL_RANGE		7
++#define SND_SOC_TPLG_CTL_STROBE		8
++
++
++/* individual widget kcontrol info types - can be mixed with other types */
++#define SND_SOC_TPLG_DAPM_CTL_VOLSW		64
++#define SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE	65
++#define SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT		66
++#define SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE	67
++#define SND_SOC_TPLG_DAPM_CTL_PIN		68
++
++/* DAPM widget types - add new items to the end */
++#define SND_SOC_TPLG_DAPM_INPUT		0
++#define SND_SOC_TPLG_DAPM_OUTPUT	1
++#define SND_SOC_TPLG_DAPM_MUX		2
++#define SND_SOC_TPLG_DAPM_MIXER		3
++#define SND_SOC_TPLG_DAPM_PGA		4
++#define SND_SOC_TPLG_DAPM_OUT_DRV	5
++#define SND_SOC_TPLG_DAPM_ADC		6
++#define SND_SOC_TPLG_DAPM_DAC		7
++#define SND_SOC_TPLG_DAPM_SWITCH	8
++#define SND_SOC_TPLG_DAPM_PRE		9
++#define SND_SOC_TPLG_DAPM_POST		10
++#define SND_SOC_TPLG_DAPM_AIF_IN	11
++#define SND_SOC_TPLG_DAPM_AIF_OUT	12
++#define SND_SOC_TPLG_DAPM_DAI_IN	13
++#define SND_SOC_TPLG_DAPM_DAI_OUT	14
++#define SND_SOC_TPLG_DAPM_DAI_LINK	15
++#define SND_SOC_TPLG_DAPM_BUFFER	16
++#define SND_SOC_TPLG_DAPM_SCHEDULER	17
++#define SND_SOC_TPLG_DAPM_EFFECT	18
++#define SND_SOC_TPLG_DAPM_SIGGEN	19
++#define SND_SOC_TPLG_DAPM_SRC		20
++#define SND_SOC_TPLG_DAPM_ASRC		21
++#define SND_SOC_TPLG_DAPM_ENCODER	22
++#define SND_SOC_TPLG_DAPM_DECODER	23
++#define SND_SOC_TPLG_DAPM_LAST		SND_SOC_TPLG_DAPM_DECODER
++
++/* Header magic number and string sizes */
++#define SND_SOC_TPLG_MAGIC		0x41536F43 /* ASoC */
++
++/* string sizes */
++#define SND_SOC_TPLG_NUM_TEXTS		16
++
++/* ABI version */
++#define SND_SOC_TPLG_ABI_VERSION	0x5	/* current version */
++#define SND_SOC_TPLG_ABI_VERSION_MIN	0x4	/* oldest version supported */
++
++/* Max size of TLV data */
++#define SND_SOC_TPLG_TLV_SIZE		32
++
++/*
++ * File and Block header data types.
++ * Add new generic and vendor types to end of list.
++ * Generic types are handled by the core whilst vendors types are passed
++ * to the component drivers for handling.
++ */
++#define SND_SOC_TPLG_TYPE_MIXER		1
++#define SND_SOC_TPLG_TYPE_BYTES		2
++#define SND_SOC_TPLG_TYPE_ENUM		3
++#define SND_SOC_TPLG_TYPE_DAPM_GRAPH	4
++#define SND_SOC_TPLG_TYPE_DAPM_WIDGET	5
++#define SND_SOC_TPLG_TYPE_DAI_LINK	6
++#define SND_SOC_TPLG_TYPE_PCM		7
++#define SND_SOC_TPLG_TYPE_MANIFEST	8
++#define SND_SOC_TPLG_TYPE_CODEC_LINK	9
++#define SND_SOC_TPLG_TYPE_BACKEND_LINK	10
++#define SND_SOC_TPLG_TYPE_PDATA		11
++#define SND_SOC_TPLG_TYPE_DAI		12
++#define SND_SOC_TPLG_TYPE_MAX		SND_SOC_TPLG_TYPE_DAI
++
++/* vendor block IDs - please add new vendor types to end */
++#define SND_SOC_TPLG_TYPE_VENDOR_FW	1000
++#define SND_SOC_TPLG_TYPE_VENDOR_CONFIG	1001
++#define SND_SOC_TPLG_TYPE_VENDOR_COEFF	1002
++#define SND_SOC_TPLG_TYPEVENDOR_CODEC	1003
++
++#define SND_SOC_TPLG_STREAM_PLAYBACK	0
++#define SND_SOC_TPLG_STREAM_CAPTURE	1
++
++/* vendor tuple types */
++#define SND_SOC_TPLG_TUPLE_TYPE_UUID	0
++#define SND_SOC_TPLG_TUPLE_TYPE_STRING	1
++#define SND_SOC_TPLG_TUPLE_TYPE_BOOL	2
++#define SND_SOC_TPLG_TUPLE_TYPE_BYTE	3
++#define SND_SOC_TPLG_TUPLE_TYPE_WORD	4
++#define SND_SOC_TPLG_TUPLE_TYPE_SHORT	5
++
++/* DAI flags */
++#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES         (1 << 0)
++#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS      (1 << 1)
++#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS    (1 << 2)
++
++/* DAI clock gating */
++#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED	0
++#define SND_SOC_TPLG_DAI_CLK_GATE_GATED	1
++#define SND_SOC_TPLG_DAI_CLK_GATE_CONT		2
++
++/* DAI mclk_direction */
++#define SND_SOC_TPLG_MCLK_CO            0 /* for codec, mclk is output */
++#define SND_SOC_TPLG_MCLK_CI            1 /* for codec, mclk is input */
++
++/* DAI physical PCM data formats.
++ * Add new formats to the end of the list.
++ */
++#define SND_SOC_DAI_FORMAT_I2S          1 /* I2S mode */
++#define SND_SOC_DAI_FORMAT_RIGHT_J      2 /* Right Justified mode */
++#define SND_SOC_DAI_FORMAT_LEFT_J       3 /* Left Justified mode */
++#define SND_SOC_DAI_FORMAT_DSP_A        4 /* L data MSB after FRM LRC */
++#define SND_SOC_DAI_FORMAT_DSP_B        5 /* L data MSB during FRM LRC */
++#define SND_SOC_DAI_FORMAT_AC97         6 /* AC97 */
++#define SND_SOC_DAI_FORMAT_PDM          7 /* Pulse density modulation */
++
++/* left and right justified also known as MSB and LSB respectively */
++#define SND_SOC_DAI_FORMAT_MSB          SND_SOC_DAI_FORMAT_LEFT_J
++#define SND_SOC_DAI_FORMAT_LSB          SND_SOC_DAI_FORMAT_RIGHT_J
++
++/* DAI link flags */
++#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES         (1 << 0)
++#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS      (1 << 1)
++#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS    (1 << 2)
++#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP            (1 << 3)
++
++/* DAI topology BCLK parameter
++ * For the backwards capability, by default codec is bclk master
++ */
++#define SND_SOC_TPLG_BCLK_CM         0 /* codec is bclk master */
++#define SND_SOC_TPLG_BCLK_CS         1 /* codec is bclk slave */
++
++/* DAI topology FSYNC parameter
++ * For the backwards capability, by default codec is fsync master
++ */
++#define SND_SOC_TPLG_FSYNC_CM         0 /* codec is fsync master */
++#define SND_SOC_TPLG_FSYNC_CS         1 /* codec is fsync slave */
++
++/*
++ * Block Header.
++ * This header precedes all object and object arrays below.
++ */
++struct snd_soc_tplg_hdr {
++	__le32 magic;		/* magic number */
++	__le32 abi;		/* ABI version */
++	__le32 version;		/* optional vendor specific version details */
++	__le32 type;		/* SND_SOC_TPLG_TYPE_ */
++	__le32 size;		/* size of this structure */
++	__le32 vendor_type;	/* optional vendor specific type info */
++	__le32 payload_size;	/* data bytes, excluding this header */
++	__le32 index;		/* identifier for block */
++	__le32 count;		/* number of elements in block */
++} __attribute__((packed));
++
++/* vendor tuple for uuid */
++struct snd_soc_tplg_vendor_uuid_elem {
++	__le32 token;
++	char uuid[16];
++} __attribute__((packed));
++
++/* vendor tuple for a bool/byte/short/word value */
++struct snd_soc_tplg_vendor_value_elem {
++	__le32 token;
++	__le32 value;
++} __attribute__((packed));
++
++/* vendor tuple for string */
++struct snd_soc_tplg_vendor_string_elem {
++	__le32 token;
++	char string[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++} __attribute__((packed));
++
++struct snd_soc_tplg_vendor_array {
++	__le32 size;	/* size in bytes of the array, including all elements */
++	__le32 type;	/* SND_SOC_TPLG_TUPLE_TYPE_ */
++	__le32 num_elems;	/* number of elements in array */
++	union {
++		struct snd_soc_tplg_vendor_uuid_elem uuid[0];
++		struct snd_soc_tplg_vendor_value_elem value[0];
++		struct snd_soc_tplg_vendor_string_elem string[0];
++	};
++} __attribute__((packed));
++
++/*
++ * Private data.
++ * All topology objects may have private data that can be used by the driver or
++ * firmware. Core will ignore this data.
++ */
++struct snd_soc_tplg_private {
++	__le32 size;	/* in bytes of private data */
++	union {
++		char data[0];
++		struct snd_soc_tplg_vendor_array array[0];
++	};
++} __attribute__((packed));
++
++/*
++ * Kcontrol TLV data.
++ */
++struct snd_soc_tplg_tlv_dbscale {
++	__le32 min;
++	__le32 step;
++	__le32 mute;
++} __attribute__((packed));
++
++struct snd_soc_tplg_ctl_tlv {
++	__le32 size;	/* in bytes of this structure */
++	__le32 type;	/* SNDRV_CTL_TLVT_*, type of TLV */
++	union {
++		__le32 data[SND_SOC_TPLG_TLV_SIZE];
++		struct snd_soc_tplg_tlv_dbscale scale;
++	};
++} __attribute__((packed));
++
++/*
++ * Kcontrol channel data
++ */
++struct snd_soc_tplg_channel {
++	__le32 size;	/* in bytes of this structure */
++	__le32 reg;
++	__le32 shift;
++	__le32 id;	/* ID maps to Left, Right, LFE etc */
++} __attribute__((packed));
++
++/*
++ * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
++ * Kcontrol ops need get/put/info.
++ * Bytes ext ops need get/put.
++ */
++struct snd_soc_tplg_io_ops {
++	__le32 get;
++	__le32 put;
++	__le32 info;
++} __attribute__((packed));
++
++/*
++ * kcontrol header
++ */
++struct snd_soc_tplg_ctl_hdr {
++	__le32 size;	/* in bytes of this structure */
++	__le32 type;
++	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	__le32 access;
++	struct snd_soc_tplg_io_ops ops;
++	struct snd_soc_tplg_ctl_tlv tlv;
++} __attribute__((packed));
++
++/*
++ * Stream Capabilities
++ */
++struct snd_soc_tplg_stream_caps {
++	__le32 size;		/* in bytes of this structure */
++	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
++	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
++	__le32 rate_min;	/* min rate */
++	__le32 rate_max;	/* max rate */
++	__le32 channels_min;	/* min channels */
++	__le32 channels_max;	/* max channels */
++	__le32 periods_min;	/* min number of periods */
++	__le32 periods_max;	/* max number of periods */
++	__le32 period_size_min;	/* min period size bytes */
++	__le32 period_size_max;	/* max period size bytes */
++	__le32 buffer_size_min;	/* min buffer size bytes */
++	__le32 buffer_size_max;	/* max buffer size bytes */
++	__le32 sig_bits;        /* number of bits of content */
++} __attribute__((packed));
++
++/*
++ * FE or BE Stream configuration supported by SW/FW
++ */
++struct snd_soc_tplg_stream {
++	__le32 size;		/* in bytes of this structure */
++	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* Name of the stream */
++	__le64 format;		/* SNDRV_PCM_FMTBIT_* */
++	__le32 rate;		/* SNDRV_PCM_RATE_* */
++	__le32 period_bytes;	/* size of period in bytes */
++	__le32 buffer_bytes;	/* size of buffer in bytes */
++	__le32 channels;	/* channels */
++} __attribute__((packed));
++
++
++/*
++ * Describes a physical link's runtime supported hardware config,
++ * i.e. hardware audio formats.
++ */
++struct snd_soc_tplg_hw_config {
++	__le32 size;            /* in bytes of this structure */
++	__le32 id;		/* unique ID - - used to match */
++	__le32 fmt;		/* SND_SOC_DAI_FORMAT_ format value */
++	__u8 clock_gated;	/* SND_SOC_TPLG_DAI_CLK_GATE_ value */
++	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
++	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
++	__u8 bclk_master;	/* SND_SOC_TPLG_BCLK_ value */
++	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
++	__u8 mclk_direction;    /* SND_SOC_TPLG_MCLK_ value */
++	__le16 reserved;	/* for 32bit alignment */
++	__le32 mclk_rate;	/* MCLK or SYSCLK freqency in Hz */
++	__le32 bclk_rate;	/* BCLK freqency in Hz */
++	__le32 fsync_rate;	/* frame clock in Hz */
++	__le32 tdm_slots;	/* number of TDM slots in use */
++	__le32 tdm_slot_width;	/* width in bits for each slot */
++	__le32 tx_slots;	/* bit mask for active Tx slots */
++	__le32 rx_slots;	/* bit mask for active Rx slots */
++	__le32 tx_channels;	/* number of Tx channels */
++	__le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
++	__le32 rx_channels;	/* number of Rx channels */
++	__le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
++} __attribute__((packed));
++
++/*
++ * Manifest. List totals for each payload type. Not used in parsing, but will
++ * be passed to the component driver before any other objects in order for any
++ * global component resource allocations.
++ *
++ * File block representation for manifest :-
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_hdr           |  1 |
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_manifest      |  1 |
++ * +-----------------------------------+----+
++ */
++struct snd_soc_tplg_manifest {
++	__le32 size;		/* in bytes of this structure */
++	__le32 control_elems;	/* number of control elements */
++	__le32 widget_elems;	/* number of widget elements */
++	__le32 graph_elems;	/* number of graph elements */
++	__le32 pcm_elems;	/* number of PCM elements */
++	__le32 dai_link_elems;	/* number of DAI link elements */
++	__le32 dai_elems;	/* number of physical DAI elements */
++	__le32 reserved[20];	/* reserved for new ABI element types */
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++/*
++ * Mixer kcontrol.
++ *
++ * File block representation for mixer kcontrol :-
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_hdr           |  1 |
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_mixer_control |  N |
++ * +-----------------------------------+----+
++ */
++struct snd_soc_tplg_mixer_control {
++	struct snd_soc_tplg_ctl_hdr hdr;
++	__le32 size;	/* in bytes of this structure */
++	__le32 min;
++	__le32 max;
++	__le32 platform_max;
++	__le32 invert;
++	__le32 num_channels;
++	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++/*
++ * Enumerated kcontrol
++ *
++ * File block representation for enum kcontrol :-
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_hdr           |  1 |
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_enum_control  |  N |
++ * +-----------------------------------+----+
++ */
++struct snd_soc_tplg_enum_control {
++	struct snd_soc_tplg_ctl_hdr hdr;
++	__le32 size;	/* in bytes of this structure */
++	__le32 num_channels;
++	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
++	__le32 items;
++	__le32 mask;
++	__le32 count;
++	char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	__le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++/*
++ * Bytes kcontrol
++ *
++ * File block representation for bytes kcontrol :-
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_hdr           |  1 |
++ * +-----------------------------------+----+
++ * | struct snd_soc_tplg_bytes_control |  N |
++ * +-----------------------------------+----+
++ */
++struct snd_soc_tplg_bytes_control {
++	struct snd_soc_tplg_ctl_hdr hdr;
++	__le32 size;	/* in bytes of this structure */
++	__le32 max;
++	__le32 mask;
++	__le32 base;
++	__le32 num_regs;
++	struct snd_soc_tplg_io_ops ext_ops;
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++/*
++ * DAPM Graph Element
++ *
++ * File block representation for DAPM graph elements :-
++ * +-------------------------------------+----+
++ * | struct snd_soc_tplg_hdr             |  1 |
++ * +-------------------------------------+----+
++ * | struct snd_soc_tplg_dapm_graph_elem |  N |
++ * +-------------------------------------+----+
++ */
++struct snd_soc_tplg_dapm_graph_elem {
++	char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++} __attribute__((packed));
++
++/*
++ * DAPM Widget.
++ *
++ * File block representation for DAPM widget :-
++ * +-------------------------------------+-----+
++ * | struct snd_soc_tplg_hdr             |  1  |
++ * +-------------------------------------+-----+
++ * | struct snd_soc_tplg_dapm_widget     |  N  |
++ * +-------------------------------------+-----+
++ * |   struct snd_soc_tplg_enum_control  | 0|1 |
++ * |   struct snd_soc_tplg_mixer_control | 0|N |
++ * +-------------------------------------+-----+
++ *
++ * Optional enum or mixer control can be appended to the end of each widget
++ * in the block.
++ */
++struct snd_soc_tplg_dapm_widget {
++	__le32 size;		/* in bytes of this structure */
++	__le32 id;		/* SND_SOC_DAPM_CTL */
++	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++
++	__le32 reg;		/* negative reg = no direct dapm */
++	__le32 shift;		/* bits to shift */
++	__le32 mask;		/* non-shifted mask */
++	__le32 subseq;		/* sort within widget type */
++	__le32 invert;		/* invert the power bit */
++	__le32 ignore_suspend;	/* kept enabled over suspend */
++	__le16 event_flags;
++	__le16 event_type;
++	__le32 num_kcontrols;
++	struct snd_soc_tplg_private priv;
++	/*
++	 * kcontrols that relate to this widget
++	 * follow here after widget private data
++	 */
++} __attribute__((packed));
++
++
++/*
++ * Describes SW/FW specific features of PCM (FE DAI & DAI link).
++ *
++ * File block representation for PCM :-
++ * +-----------------------------------+-----+
++ * | struct snd_soc_tplg_hdr           |  1  |
++ * +-----------------------------------+-----+
++ * | struct snd_soc_tplg_pcm           |  N  |
++ * +-----------------------------------+-----+
++ */
++struct snd_soc_tplg_pcm {
++	__le32 size;		/* in bytes of this structure */
++	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	__le32 pcm_id;		/* unique ID - used to match with DAI link */
++	__le32 dai_id;		/* unique ID - used to match */
++	__le32 playback;	/* supports playback mode */
++	__le32 capture;		/* supports capture mode */
++	__le32 compress;	/* 1 = compressed; 0 = PCM */
++	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
++	__le32 num_streams;	/* number of streams */
++	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
++	__le32 flag_mask;       /* bitmask of flags to configure */
++	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++
++/*
++ * Describes the physical link runtime supported configs or params
++ *
++ * File block representation for physical link config :-
++ * +-----------------------------------+-----+
++ * | struct snd_soc_tplg_hdr           |  1  |
++ * +-----------------------------------+-----+
++ * | struct snd_soc_tplg_link_config   |  N  |
++ * +-----------------------------------+-----+
++ */
++struct snd_soc_tplg_link_config {
++	__le32 size;            /* in bytes of this structure */
++	__le32 id;              /* unique ID - used to match */
++	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
++	char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
++	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
++	__le32 num_streams;     /* number of streams */
++	struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
++	__le32 num_hw_configs;         /* number of hw configs */
++	__le32 default_hw_config_id;   /* default hw config ID for init */
++	__le32 flag_mask;       /* bitmask of flags to configure */
++	__le32 flags;           /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++/*
++ * Describes SW/FW specific features of physical DAI.
++ * It can be used to configure backend DAIs for DPCM.
++ *
++ * File block representation for physical DAI :-
++ * +-----------------------------------+-----+
++ * | struct snd_soc_tplg_hdr           |  1  |
++ * +-----------------------------------+-----+
++ * | struct snd_soc_tplg_dai           |  N  |
++ * +-----------------------------------+-----+
++ */
++struct snd_soc_tplg_dai {
++	__le32 size;            /* in bytes of this structure */
++	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
++	__le32 dai_id;          /* unique ID - used to match */
++	__le32 playback;        /* supports playback mode */
++	__le32 capture;         /* supports capture mode */
++	struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
++	__le32 flag_mask;       /* bitmask of flags to configure */
++	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
++	struct snd_soc_tplg_private priv;
++} __attribute__((packed));
++
++/*
++ * Old version of ABI structs, supported for backward compatibility.
++ */
++
++/* Manifest v4 */
++struct snd_soc_tplg_manifest_v4 {
++	__le32 size;		/* in bytes of this structure */
++	__le32 control_elems;	/* number of control elements */
++	__le32 widget_elems;	/* number of widget elements */
++	__le32 graph_elems;	/* number of graph elements */
++	__le32 pcm_elems;	/* number of PCM elements */
++	__le32 dai_link_elems;	/* number of DAI link elements */
++	struct snd_soc_tplg_private priv;
++} __packed;
++
++/* Stream Capabilities v4 */
++struct snd_soc_tplg_stream_caps_v4 {
++	__le32 size;		/* in bytes of this structure */
++	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
++	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
++	__le32 rate_min;	/* min rate */
++	__le32 rate_max;	/* max rate */
++	__le32 channels_min;	/* min channels */
++	__le32 channels_max;	/* max channels */
++	__le32 periods_min;	/* min number of periods */
++	__le32 periods_max;	/* max number of periods */
++	__le32 period_size_min;	/* min period size bytes */
++	__le32 period_size_max;	/* max period size bytes */
++	__le32 buffer_size_min;	/* min buffer size bytes */
++	__le32 buffer_size_max;	/* max buffer size bytes */
++} __packed;
++
++/* PCM v4 */
++struct snd_soc_tplg_pcm_v4 {
++	__le32 size;		/* in bytes of this structure */
++	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
++	__le32 pcm_id;		/* unique ID - used to match with DAI link */
++	__le32 dai_id;		/* unique ID - used to match */
++	__le32 playback;	/* supports playback mode */
++	__le32 capture;		/* supports capture mode */
++	__le32 compress;	/* 1 = compressed; 0 = PCM */
++	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
++	__le32 num_streams;	/* number of streams */
++	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
++} __packed;
++
++/* Physical link config v4 */
++struct snd_soc_tplg_link_config_v4 {
++	__le32 size;            /* in bytes of this structure */
++	__le32 id;              /* unique ID - used to match */
++	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
++	__le32 num_streams;     /* number of streams */
++} __packed;
++
++#endif
+diff --git a/include/sound/uapi/asound.h b/include/sound/uapi/asound.h
+new file mode 100644
+index 00000000..df1153ce
+--- /dev/null
++++ b/include/sound/uapi/asound.h
+@@ -0,0 +1,1038 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++/*
++ *  Advanced Linux Sound Architecture - ALSA - Driver
++ *  Copyright (c) 1994-2003 by Jaroslav Kysela <perex@perex.cz>,
++ *                             Abramo Bagnara <abramo@alsa-project.org>
++ *
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ */
++
++#ifndef _UAPI__SOUND_ASOUND_H
++#define _UAPI__SOUND_ASOUND_H
++
++#if defined(__KERNEL__) || defined(__linux__)
++#include <linux/types.h>
++#else
++#include <sys/ioctl.h>
++#endif
++
++#ifndef __KERNEL__
++#include <stdlib.h>
++#include <time.h>
++#endif
++
++/*
++ *  protocol version
++ */
++
++#define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor))
++#define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff)
++#define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff)
++#define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff)
++#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \
++	(SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \
++	 (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \
++	   SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
++
++/****************************************************************************
++ *                                                                          *
++ *        Digital audio interface					    *
++ *                                                                          *
++ ****************************************************************************/
++
++struct snd_aes_iec958 {
++	unsigned char status[24];	/* AES/IEC958 channel status bits */
++	unsigned char subcode[147];	/* AES/IEC958 subcode bits */
++	unsigned char pad;		/* nothing */
++	unsigned char dig_subframe[4];	/* AES/IEC958 subframe bits */
++};
++
++/****************************************************************************
++ *                                                                          *
++ *        CEA-861 Audio InfoFrame. Used in HDMI and DisplayPort		    *
++ *                                                                          *
++ ****************************************************************************/
++
++struct snd_cea_861_aud_if {
++	unsigned char db1_ct_cc; /* coding type and channel count */
++	unsigned char db2_sf_ss; /* sample frequency and size */
++	unsigned char db3; /* not used, all zeros */
++	unsigned char db4_ca; /* channel allocation code */
++	unsigned char db5_dminh_lsv; /* downmix inhibit & level-shit values */
++};
++
++/****************************************************************************
++ *                                                                          *
++ *      Section for driver hardware dependent interface - /dev/snd/hw?      *
++ *                                                                          *
++ ****************************************************************************/
++
++#define SNDRV_HWDEP_VERSION		SNDRV_PROTOCOL_VERSION(1, 0, 1)
++
++enum {
++	SNDRV_HWDEP_IFACE_OPL2 = 0,
++	SNDRV_HWDEP_IFACE_OPL3,
++	SNDRV_HWDEP_IFACE_OPL4,
++	SNDRV_HWDEP_IFACE_SB16CSP,	/* Creative Signal Processor */
++	SNDRV_HWDEP_IFACE_EMU10K1,	/* FX8010 processor in EMU10K1 chip */
++	SNDRV_HWDEP_IFACE_YSS225,	/* Yamaha FX processor */
++	SNDRV_HWDEP_IFACE_ICS2115,	/* Wavetable synth */
++	SNDRV_HWDEP_IFACE_SSCAPE,	/* Ensoniq SoundScape ISA card (MC68EC000) */
++	SNDRV_HWDEP_IFACE_VX,		/* Digigram VX cards */
++	SNDRV_HWDEP_IFACE_MIXART,	/* Digigram miXart cards */
++	SNDRV_HWDEP_IFACE_USX2Y,	/* Tascam US122, US224 & US428 usb */
++	SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */
++	SNDRV_HWDEP_IFACE_BLUETOOTH,	/* Bluetooth audio */
++	SNDRV_HWDEP_IFACE_USX2Y_PCM,	/* Tascam US122, US224 & US428 rawusb pcm */
++	SNDRV_HWDEP_IFACE_PCXHR,	/* Digigram PCXHR */
++	SNDRV_HWDEP_IFACE_SB_RC,	/* SB Extigy/Audigy2NX remote control */
++	SNDRV_HWDEP_IFACE_HDA,		/* HD-audio */
++	SNDRV_HWDEP_IFACE_USB_STREAM,	/* direct access to usb stream */
++	SNDRV_HWDEP_IFACE_FW_DICE,	/* TC DICE FireWire device */
++	SNDRV_HWDEP_IFACE_FW_FIREWORKS,	/* Echo Audio Fireworks based device */
++	SNDRV_HWDEP_IFACE_FW_BEBOB,	/* BridgeCo BeBoB based device */
++	SNDRV_HWDEP_IFACE_FW_OXFW,	/* Oxford OXFW970/971 based device */
++	SNDRV_HWDEP_IFACE_FW_DIGI00X,	/* Digidesign Digi 002/003 family */
++	SNDRV_HWDEP_IFACE_FW_TASCAM,	/* TASCAM FireWire series */
++	SNDRV_HWDEP_IFACE_LINE6,	/* Line6 USB processors */
++	SNDRV_HWDEP_IFACE_FW_MOTU,	/* MOTU FireWire series */
++	SNDRV_HWDEP_IFACE_FW_FIREFACE,	/* RME Fireface series */
++
++	/* Don't forget to change the following: */
++	SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_FW_FIREFACE
++};
++
++struct snd_hwdep_info {
++	unsigned int device;		/* WR: device number */
++	int card;			/* R: card number */
++	unsigned char id[64];		/* ID (user selectable) */
++	unsigned char name[80];		/* hwdep name */
++	int iface;			/* hwdep interface */
++	unsigned char reserved[64];	/* reserved for future */
++};
++
++/* generic DSP loader */
++struct snd_hwdep_dsp_status {
++	unsigned int version;		/* R: driver-specific version */
++	unsigned char id[32];		/* R: driver-specific ID string */
++	unsigned int num_dsps;		/* R: number of DSP images to transfer */
++	unsigned int dsp_loaded;	/* R: bit flags indicating the loaded DSPs */
++	unsigned int chip_ready;	/* R: 1 = initialization finished */
++	unsigned char reserved[16];	/* reserved for future use */
++};
++
++struct snd_hwdep_dsp_image {
++	unsigned int index;		/* W: DSP index */
++	unsigned char name[64];		/* W: ID (e.g. file name) */
++	unsigned char __user *image;	/* W: binary image */
++	size_t length;			/* W: size of image in bytes */
++	unsigned long driver_data;	/* W: driver-specific data */
++};
++
++#define SNDRV_HWDEP_IOCTL_PVERSION	_IOR ('H', 0x00, int)
++#define SNDRV_HWDEP_IOCTL_INFO		_IOR ('H', 0x01, struct snd_hwdep_info)
++#define SNDRV_HWDEP_IOCTL_DSP_STATUS	_IOR('H', 0x02, struct snd_hwdep_dsp_status)
++#define SNDRV_HWDEP_IOCTL_DSP_LOAD	_IOW('H', 0x03, struct snd_hwdep_dsp_image)
++
++/*****************************************************************************
++ *                                                                           *
++ *             Digital Audio (PCM) interface - /dev/snd/pcm??                *
++ *                                                                           *
++ *****************************************************************************/
++
++#define SNDRV_PCM_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 14)
++
++typedef unsigned long snd_pcm_uframes_t;
++typedef signed long snd_pcm_sframes_t;
++
++enum {
++	SNDRV_PCM_CLASS_GENERIC = 0,	/* standard mono or stereo device */
++	SNDRV_PCM_CLASS_MULTI,		/* multichannel device */
++	SNDRV_PCM_CLASS_MODEM,		/* software modem class */
++	SNDRV_PCM_CLASS_DIGITIZER,	/* digitizer class */
++	/* Don't forget to change the following: */
++	SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
++};
++
++enum {
++	SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */
++	SNDRV_PCM_SUBCLASS_MULTI_MIX,	/* multichannel subdevices are mixed together */
++	/* Don't forget to change the following: */
++	SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX,
++};
++
++enum {
++	SNDRV_PCM_STREAM_PLAYBACK = 0,
++	SNDRV_PCM_STREAM_CAPTURE,
++	SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
++};
++
++typedef int __bitwise snd_pcm_access_t;
++#define	SNDRV_PCM_ACCESS_MMAP_INTERLEAVED	((__force snd_pcm_access_t) 0) /* interleaved mmap */
++#define	SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED	((__force snd_pcm_access_t) 1) /* noninterleaved mmap */
++#define	SNDRV_PCM_ACCESS_MMAP_COMPLEX		((__force snd_pcm_access_t) 2) /* complex mmap */
++#define	SNDRV_PCM_ACCESS_RW_INTERLEAVED		((__force snd_pcm_access_t) 3) /* readi/writei */
++#define	SNDRV_PCM_ACCESS_RW_NONINTERLEAVED	((__force snd_pcm_access_t) 4) /* readn/writen */
++#define	SNDRV_PCM_ACCESS_LAST		SNDRV_PCM_ACCESS_RW_NONINTERLEAVED
++
++typedef int __bitwise snd_pcm_format_t;
++#define	SNDRV_PCM_FORMAT_S8	((__force snd_pcm_format_t) 0)
++#define	SNDRV_PCM_FORMAT_U8	((__force snd_pcm_format_t) 1)
++#define	SNDRV_PCM_FORMAT_S16_LE	((__force snd_pcm_format_t) 2)
++#define	SNDRV_PCM_FORMAT_S16_BE	((__force snd_pcm_format_t) 3)
++#define	SNDRV_PCM_FORMAT_U16_LE	((__force snd_pcm_format_t) 4)
++#define	SNDRV_PCM_FORMAT_U16_BE	((__force snd_pcm_format_t) 5)
++#define	SNDRV_PCM_FORMAT_S24_LE	((__force snd_pcm_format_t) 6) /* low three bytes */
++#define	SNDRV_PCM_FORMAT_S24_BE	((__force snd_pcm_format_t) 7) /* low three bytes */
++#define	SNDRV_PCM_FORMAT_U24_LE	((__force snd_pcm_format_t) 8) /* low three bytes */
++#define	SNDRV_PCM_FORMAT_U24_BE	((__force snd_pcm_format_t) 9) /* low three bytes */
++#define	SNDRV_PCM_FORMAT_S32_LE	((__force snd_pcm_format_t) 10)
++#define	SNDRV_PCM_FORMAT_S32_BE	((__force snd_pcm_format_t) 11)
++#define	SNDRV_PCM_FORMAT_U32_LE	((__force snd_pcm_format_t) 12)
++#define	SNDRV_PCM_FORMAT_U32_BE	((__force snd_pcm_format_t) 13)
++#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 */
++#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 */
++#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 */
++#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 */
++#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE ((__force snd_pcm_format_t) 18) /* IEC-958 subframe, Little Endian */
++#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE ((__force snd_pcm_format_t) 19) /* IEC-958 subframe, Big Endian */
++#define	SNDRV_PCM_FORMAT_MU_LAW		((__force snd_pcm_format_t) 20)
++#define	SNDRV_PCM_FORMAT_A_LAW		((__force snd_pcm_format_t) 21)
++#define	SNDRV_PCM_FORMAT_IMA_ADPCM	((__force snd_pcm_format_t) 22)
++#define	SNDRV_PCM_FORMAT_MPEG		((__force snd_pcm_format_t) 23)
++#define	SNDRV_PCM_FORMAT_GSM		((__force snd_pcm_format_t) 24)
++#define	SNDRV_PCM_FORMAT_S20_LE	((__force snd_pcm_format_t) 25) /* in four bytes, LSB justified */
++#define	SNDRV_PCM_FORMAT_S20_BE	((__force snd_pcm_format_t) 26) /* in four bytes, LSB justified */
++#define	SNDRV_PCM_FORMAT_U20_LE	((__force snd_pcm_format_t) 27) /* in four bytes, LSB justified */
++#define	SNDRV_PCM_FORMAT_U20_BE	((__force snd_pcm_format_t) 28) /* in four bytes, LSB justified */
++/* gap in the numbering for a future standard linear format */
++#define	SNDRV_PCM_FORMAT_SPECIAL	((__force snd_pcm_format_t) 31)
++#define	SNDRV_PCM_FORMAT_S24_3LE	((__force snd_pcm_format_t) 32)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_S24_3BE	((__force snd_pcm_format_t) 33)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_U24_3LE	((__force snd_pcm_format_t) 34)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_U24_3BE	((__force snd_pcm_format_t) 35)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_S20_3LE	((__force snd_pcm_format_t) 36)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_S20_3BE	((__force snd_pcm_format_t) 37)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_U20_3LE	((__force snd_pcm_format_t) 38)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_U20_3BE	((__force snd_pcm_format_t) 39)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_S18_3LE	((__force snd_pcm_format_t) 40)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_S18_3BE	((__force snd_pcm_format_t) 41)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_U18_3LE	((__force snd_pcm_format_t) 42)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_U18_3BE	((__force snd_pcm_format_t) 43)	/* in three bytes */
++#define	SNDRV_PCM_FORMAT_G723_24	((__force snd_pcm_format_t) 44) /* 8 samples in 3 bytes */
++#define	SNDRV_PCM_FORMAT_G723_24_1B	((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */
++#define	SNDRV_PCM_FORMAT_G723_40	((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
++#define	SNDRV_PCM_FORMAT_G723_40_1B	((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */
++#define	SNDRV_PCM_FORMAT_DSD_U8		((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
++#define	SNDRV_PCM_FORMAT_DSD_U16_LE	((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
++#define	SNDRV_PCM_FORMAT_DSD_U32_LE	((__force snd_pcm_format_t) 50) /* DSD, 4-byte samples DSD (x32), little endian */
++#define	SNDRV_PCM_FORMAT_DSD_U16_BE	((__force snd_pcm_format_t) 51) /* DSD, 2-byte samples DSD (x16), big endian */
++#define	SNDRV_PCM_FORMAT_DSD_U32_BE	((__force snd_pcm_format_t) 52) /* DSD, 4-byte samples DSD (x32), big endian */
++#define	SNDRV_PCM_FORMAT_LAST		SNDRV_PCM_FORMAT_DSD_U32_BE
++#define	SNDRV_PCM_FORMAT_FIRST		SNDRV_PCM_FORMAT_S8
++
++#ifdef SNDRV_LITTLE_ENDIAN
++#define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_LE
++#define	SNDRV_PCM_FORMAT_U16		SNDRV_PCM_FORMAT_U16_LE
++#define	SNDRV_PCM_FORMAT_S24		SNDRV_PCM_FORMAT_S24_LE
++#define	SNDRV_PCM_FORMAT_U24		SNDRV_PCM_FORMAT_U24_LE
++#define	SNDRV_PCM_FORMAT_S32		SNDRV_PCM_FORMAT_S32_LE
++#define	SNDRV_PCM_FORMAT_U32		SNDRV_PCM_FORMAT_U32_LE
++#define	SNDRV_PCM_FORMAT_FLOAT		SNDRV_PCM_FORMAT_FLOAT_LE
++#define	SNDRV_PCM_FORMAT_FLOAT64	SNDRV_PCM_FORMAT_FLOAT64_LE
++#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE
++#define	SNDRV_PCM_FORMAT_S20		SNDRV_PCM_FORMAT_S20_LE
++#define	SNDRV_PCM_FORMAT_U20		SNDRV_PCM_FORMAT_U20_LE
++#endif
++#ifdef SNDRV_BIG_ENDIAN
++#define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_BE
++#define	SNDRV_PCM_FORMAT_U16		SNDRV_PCM_FORMAT_U16_BE
++#define	SNDRV_PCM_FORMAT_S24		SNDRV_PCM_FORMAT_S24_BE
++#define	SNDRV_PCM_FORMAT_U24		SNDRV_PCM_FORMAT_U24_BE
++#define	SNDRV_PCM_FORMAT_S32		SNDRV_PCM_FORMAT_S32_BE
++#define	SNDRV_PCM_FORMAT_U32		SNDRV_PCM_FORMAT_U32_BE
++#define	SNDRV_PCM_FORMAT_FLOAT		SNDRV_PCM_FORMAT_FLOAT_BE
++#define	SNDRV_PCM_FORMAT_FLOAT64	SNDRV_PCM_FORMAT_FLOAT64_BE
++#define	SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE
++#define	SNDRV_PCM_FORMAT_S20		SNDRV_PCM_FORMAT_S20_BE
++#define	SNDRV_PCM_FORMAT_U20		SNDRV_PCM_FORMAT_U20_BE
++#endif
++
++typedef int __bitwise snd_pcm_subformat_t;
++#define	SNDRV_PCM_SUBFORMAT_STD		((__force snd_pcm_subformat_t) 0)
++#define	SNDRV_PCM_SUBFORMAT_LAST	SNDRV_PCM_SUBFORMAT_STD
++
++#define SNDRV_PCM_INFO_MMAP		0x00000001	/* hardware supports mmap */
++#define SNDRV_PCM_INFO_MMAP_VALID	0x00000002	/* period data are valid during transfer */
++#define SNDRV_PCM_INFO_DOUBLE		0x00000004	/* Double buffering needed for PCM start/stop */
++#define SNDRV_PCM_INFO_BATCH		0x00000010	/* double buffering */
++#define SNDRV_PCM_INFO_SYNC_APPLPTR	0x00000020	/* need the explicit sync of appl_ptr update */
++#define SNDRV_PCM_INFO_INTERLEAVED	0x00000100	/* channels are interleaved */
++#define SNDRV_PCM_INFO_NONINTERLEAVED	0x00000200	/* channels are not interleaved */
++#define SNDRV_PCM_INFO_COMPLEX		0x00000400	/* complex frame organization (mmap only) */
++#define SNDRV_PCM_INFO_BLOCK_TRANSFER	0x00010000	/* hardware transfer block of samples */
++#define SNDRV_PCM_INFO_OVERRANGE	0x00020000	/* hardware supports ADC (capture) overrange detection */
++#define SNDRV_PCM_INFO_RESUME		0x00040000	/* hardware supports stream resume after suspend */
++#define SNDRV_PCM_INFO_PAUSE		0x00080000	/* pause ioctl is supported */
++#define SNDRV_PCM_INFO_HALF_DUPLEX	0x00100000	/* only half duplex */
++#define SNDRV_PCM_INFO_JOINT_DUPLEX	0x00200000	/* playback and capture stream are somewhat correlated */
++#define SNDRV_PCM_INFO_SYNC_START	0x00400000	/* pcm support some kind of sync go */
++#define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP	0x00800000	/* period wakeup can be disabled */
++#define SNDRV_PCM_INFO_HAS_WALL_CLOCK   0x01000000      /* (Deprecated)has audio wall clock for audio/system time sync */
++#define SNDRV_PCM_INFO_HAS_LINK_ATIME              0x01000000  /* report hardware link audio time, reset on startup */
++#define SNDRV_PCM_INFO_HAS_LINK_ABSOLUTE_ATIME     0x02000000  /* report absolute hardware link audio time, not reset on startup */
++#define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME    0x04000000  /* report estimated link audio time */
++#define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000  /* report synchronized audio/system time */
++
++#define SNDRV_PCM_INFO_DRAIN_TRIGGER	0x40000000		/* internal kernel flag - trigger in drain */
++#define SNDRV_PCM_INFO_FIFO_IN_FRAMES	0x80000000	/* internal kernel flag - FIFO size is in frames */
++
++
++
++typedef int __bitwise snd_pcm_state_t;
++#define	SNDRV_PCM_STATE_OPEN		((__force snd_pcm_state_t) 0) /* stream is open */
++#define	SNDRV_PCM_STATE_SETUP		((__force snd_pcm_state_t) 1) /* stream has a setup */
++#define	SNDRV_PCM_STATE_PREPARED	((__force snd_pcm_state_t) 2) /* stream is ready to start */
++#define	SNDRV_PCM_STATE_RUNNING		((__force snd_pcm_state_t) 3) /* stream is running */
++#define	SNDRV_PCM_STATE_XRUN		((__force snd_pcm_state_t) 4) /* stream reached an xrun */
++#define	SNDRV_PCM_STATE_DRAINING	((__force snd_pcm_state_t) 5) /* stream is draining */
++#define	SNDRV_PCM_STATE_PAUSED		((__force snd_pcm_state_t) 6) /* stream is paused */
++#define	SNDRV_PCM_STATE_SUSPENDED	((__force snd_pcm_state_t) 7) /* hardware is suspended */
++#define	SNDRV_PCM_STATE_DISCONNECTED	((__force snd_pcm_state_t) 8) /* hardware is disconnected */
++#define	SNDRV_PCM_STATE_LAST		SNDRV_PCM_STATE_DISCONNECTED
++
++enum {
++	SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
++	SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
++	SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
++};
++
++union snd_pcm_sync_id {
++	unsigned char id[16];
++	unsigned short id16[8];
++	unsigned int id32[4];
++};
++
++struct snd_pcm_info {
++	unsigned int device;		/* RO/WR (control): device number */
++	unsigned int subdevice;		/* RO/WR (control): subdevice number */
++	int stream;			/* RO/WR (control): stream direction */
++	int card;			/* R: card number */
++	unsigned char id[64];		/* ID (user selectable) */
++	unsigned char name[80];		/* name of this device */
++	unsigned char subname[32];	/* subdevice name */
++	int dev_class;			/* SNDRV_PCM_CLASS_* */
++	int dev_subclass;		/* SNDRV_PCM_SUBCLASS_* */
++	unsigned int subdevices_count;
++	unsigned int subdevices_avail;
++	union snd_pcm_sync_id sync;	/* hardware synchronization ID */
++	unsigned char reserved[64];	/* reserved for future... */
++};
++
++typedef int snd_pcm_hw_param_t;
++#define	SNDRV_PCM_HW_PARAM_ACCESS	0	/* Access type */
++#define	SNDRV_PCM_HW_PARAM_FORMAT	1	/* Format */
++#define	SNDRV_PCM_HW_PARAM_SUBFORMAT	2	/* Subformat */
++#define	SNDRV_PCM_HW_PARAM_FIRST_MASK	SNDRV_PCM_HW_PARAM_ACCESS
++#define	SNDRV_PCM_HW_PARAM_LAST_MASK	SNDRV_PCM_HW_PARAM_SUBFORMAT
++
++#define	SNDRV_PCM_HW_PARAM_SAMPLE_BITS	8	/* Bits per sample */
++#define	SNDRV_PCM_HW_PARAM_FRAME_BITS	9	/* Bits per frame */
++#define	SNDRV_PCM_HW_PARAM_CHANNELS	10	/* Channels */
++#define	SNDRV_PCM_HW_PARAM_RATE		11	/* Approx rate */
++#define	SNDRV_PCM_HW_PARAM_PERIOD_TIME	12	/* Approx distance between
++						 * interrupts in us
++						 */
++#define	SNDRV_PCM_HW_PARAM_PERIOD_SIZE	13	/* Approx frames between
++						 * interrupts
++						 */
++#define	SNDRV_PCM_HW_PARAM_PERIOD_BYTES	14	/* Approx bytes between
++						 * interrupts
++						 */
++#define	SNDRV_PCM_HW_PARAM_PERIODS	15	/* Approx interrupts per
++						 * buffer
++						 */
++#define	SNDRV_PCM_HW_PARAM_BUFFER_TIME	16	/* Approx duration of buffer
++						 * in us
++						 */
++#define	SNDRV_PCM_HW_PARAM_BUFFER_SIZE	17	/* Size of buffer in frames */
++#define	SNDRV_PCM_HW_PARAM_BUFFER_BYTES	18	/* Size of buffer in bytes */
++#define	SNDRV_PCM_HW_PARAM_TICK_TIME	19	/* Approx tick duration in us */
++#define	SNDRV_PCM_HW_PARAM_FIRST_INTERVAL	SNDRV_PCM_HW_PARAM_SAMPLE_BITS
++#define	SNDRV_PCM_HW_PARAM_LAST_INTERVAL	SNDRV_PCM_HW_PARAM_TICK_TIME
++
++#define SNDRV_PCM_HW_PARAMS_NORESAMPLE	(1<<0)	/* avoid rate resampling */
++#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER	(1<<1)	/* export buffer */
++#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP	(1<<2)	/* disable period wakeups */
++
++struct snd_interval {
++	unsigned int min, max;
++	unsigned int openmin:1,
++		     openmax:1,
++		     integer:1,
++		     empty:1;
++};
++
++#define SNDRV_MASK_MAX	256
++
++struct snd_mask {
++	__u32 bits[(SNDRV_MASK_MAX+31)/32];
++};
++
++struct snd_pcm_hw_params {
++	unsigned int flags;
++	struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
++			       SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
++	struct snd_mask mres[5];	/* reserved masks */
++	struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
++				        SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
++	struct snd_interval ires[9];	/* reserved intervals */
++	unsigned int rmask;		/* W: requested masks */
++	unsigned int cmask;		/* R: changed masks */
++	unsigned int info;		/* R: Info flags for returned setup */
++	unsigned int msbits;		/* R: used most significant bits */
++	unsigned int rate_num;		/* R: rate numerator */
++	unsigned int rate_den;		/* R: rate denominator */
++	snd_pcm_uframes_t fifo_size;	/* R: chip FIFO size in frames */
++	unsigned char reserved[64];	/* reserved for future */
++};
++
++enum {
++	SNDRV_PCM_TSTAMP_NONE = 0,
++	SNDRV_PCM_TSTAMP_ENABLE,
++	SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_ENABLE,
++};
++
++struct snd_pcm_sw_params {
++	int tstamp_mode;			/* timestamp mode */
++	unsigned int period_step;
++	unsigned int sleep_min;			/* min ticks to sleep */
++	snd_pcm_uframes_t avail_min;		/* min avail frames for wakeup */
++	snd_pcm_uframes_t xfer_align;		/* obsolete: xfer size need to be a multiple */
++	snd_pcm_uframes_t start_threshold;	/* min hw_avail frames for automatic start */
++	snd_pcm_uframes_t stop_threshold;	/* min avail frames for automatic stop */
++	snd_pcm_uframes_t silence_threshold;	/* min distance from noise for silence filling */
++	snd_pcm_uframes_t silence_size;		/* silence block size */
++	snd_pcm_uframes_t boundary;		/* pointers wrap point */
++	unsigned int proto;			/* protocol version */
++	unsigned int tstamp_type;		/* timestamp type (req. proto >= 2.0.12) */
++	unsigned char reserved[56];		/* reserved for future */
++};
++
++struct snd_pcm_channel_info {
++	unsigned int channel;
++	__kernel_off_t offset;		/* mmap offset */
++	unsigned int first;		/* offset to first sample in bits */
++	unsigned int step;		/* samples distance in bits */
++};
++
++enum {
++	/*
++	 *  first definition for backwards compatibility only,
++	 *  maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
++	 */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
++
++	/* timestamp definitions */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1,           /* DMA time, reported as per hw_ptr */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK = 2,	           /* link time reported by sample or wallclock counter, reset on startup */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,	   /* link time reported by sample or wallclock counter, not reset on startup */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,    /* link time estimated indirectly */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /* link time synchronized with system time */
++	SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
++};
++
++struct snd_pcm_status {
++	snd_pcm_state_t state;		/* stream state */
++	struct timespec trigger_tstamp;	/* time when stream was started/stopped/paused */
++	struct timespec tstamp;		/* reference timestamp */
++	snd_pcm_uframes_t appl_ptr;	/* appl ptr */
++	snd_pcm_uframes_t hw_ptr;	/* hw ptr */
++	snd_pcm_sframes_t delay;	/* current delay in frames */
++	snd_pcm_uframes_t avail;	/* number of frames available */
++	snd_pcm_uframes_t avail_max;	/* max frames available on hw since last status */
++	snd_pcm_uframes_t overrange;	/* count of ADC (capture) overrange detections from last status */
++	snd_pcm_state_t suspended_state; /* suspended stream state */
++	__u32 audio_tstamp_data;	 /* needed for 64-bit alignment, used for configs/report to/from userspace */
++	struct timespec audio_tstamp;	/* sample counter, wall clock, PHC or on-demand sync'ed */
++	struct timespec driver_tstamp;	/* useful in case reference system tstamp is reported with delay */
++	__u32 audio_tstamp_accuracy;	/* in ns units, only valid if indicated in audio_tstamp_data */
++	unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */
++};
++
++struct snd_pcm_mmap_status {
++	snd_pcm_state_t state;		/* RO: state - SNDRV_PCM_STATE_XXXX */
++	int pad1;			/* Needed for 64 bit alignment */
++	snd_pcm_uframes_t hw_ptr;	/* RO: hw ptr (0...boundary-1) */
++	struct timespec tstamp;		/* Timestamp */
++	snd_pcm_state_t suspended_state; /* RO: suspended stream state */
++	struct timespec audio_tstamp;	/* from sample counter or wall clock */
++};
++
++struct snd_pcm_mmap_control {
++	snd_pcm_uframes_t appl_ptr;	/* RW: appl ptr (0...boundary-1) */
++	snd_pcm_uframes_t avail_min;	/* RW: min available frames for wakeup */
++};
++
++#define SNDRV_PCM_SYNC_PTR_HWSYNC	(1<<0)	/* execute hwsync */
++#define SNDRV_PCM_SYNC_PTR_APPL		(1<<1)	/* get appl_ptr from driver (r/w op) */
++#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN	(1<<2)	/* get avail_min from driver */
++
++struct snd_pcm_sync_ptr {
++	unsigned int flags;
++	union {
++		struct snd_pcm_mmap_status status;
++		unsigned char reserved[64];
++	} s;
++	union {
++		struct snd_pcm_mmap_control control;
++		unsigned char reserved[64];
++	} c;
++};
++
++struct snd_xferi {
++	snd_pcm_sframes_t result;
++	void __user *buf;
++	snd_pcm_uframes_t frames;
++};
++
++struct snd_xfern {
++	snd_pcm_sframes_t result;
++	void __user * __user *bufs;
++	snd_pcm_uframes_t frames;
++};
++
++enum {
++	SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0,	/* gettimeofday equivalent */
++	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,	/* posix_clock_monotonic equivalent */
++	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,    /* monotonic_raw (no NTP) */
++	SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
++};
++
++/* channel positions */
++enum {
++	SNDRV_CHMAP_UNKNOWN = 0,
++	SNDRV_CHMAP_NA,		/* N/A, silent */
++	SNDRV_CHMAP_MONO,	/* mono stream */
++	/* this follows the alsa-lib mixer channel value + 3 */
++	SNDRV_CHMAP_FL,		/* front left */
++	SNDRV_CHMAP_FR,		/* front right */
++	SNDRV_CHMAP_RL,		/* rear left */
++	SNDRV_CHMAP_RR,		/* rear right */
++	SNDRV_CHMAP_FC,		/* front center */
++	SNDRV_CHMAP_LFE,	/* LFE */
++	SNDRV_CHMAP_SL,		/* side left */
++	SNDRV_CHMAP_SR,		/* side right */
++	SNDRV_CHMAP_RC,		/* rear center */
++	/* new definitions */
++	SNDRV_CHMAP_FLC,	/* front left center */
++	SNDRV_CHMAP_FRC,	/* front right center */
++	SNDRV_CHMAP_RLC,	/* rear left center */
++	SNDRV_CHMAP_RRC,	/* rear right center */
++	SNDRV_CHMAP_FLW,	/* front left wide */
++	SNDRV_CHMAP_FRW,	/* front right wide */
++	SNDRV_CHMAP_FLH,	/* front left high */
++	SNDRV_CHMAP_FCH,	/* front center high */
++	SNDRV_CHMAP_FRH,	/* front right high */
++	SNDRV_CHMAP_TC,		/* top center */
++	SNDRV_CHMAP_TFL,	/* top front left */
++	SNDRV_CHMAP_TFR,	/* top front right */
++	SNDRV_CHMAP_TFC,	/* top front center */
++	SNDRV_CHMAP_TRL,	/* top rear left */
++	SNDRV_CHMAP_TRR,	/* top rear right */
++	SNDRV_CHMAP_TRC,	/* top rear center */
++	/* new definitions for UAC2 */
++	SNDRV_CHMAP_TFLC,	/* top front left center */
++	SNDRV_CHMAP_TFRC,	/* top front right center */
++	SNDRV_CHMAP_TSL,	/* top side left */
++	SNDRV_CHMAP_TSR,	/* top side right */
++	SNDRV_CHMAP_LLFE,	/* left LFE */
++	SNDRV_CHMAP_RLFE,	/* right LFE */
++	SNDRV_CHMAP_BC,		/* bottom center */
++	SNDRV_CHMAP_BLC,	/* bottom left center */
++	SNDRV_CHMAP_BRC,	/* bottom right center */
++	SNDRV_CHMAP_LAST = SNDRV_CHMAP_BRC,
++};
++
++#define SNDRV_CHMAP_POSITION_MASK	0xffff
++#define SNDRV_CHMAP_PHASE_INVERSE	(0x01 << 16)
++#define SNDRV_CHMAP_DRIVER_SPEC		(0x02 << 16)
++
++#define SNDRV_PCM_IOCTL_PVERSION	_IOR('A', 0x00, int)
++#define SNDRV_PCM_IOCTL_INFO		_IOR('A', 0x01, struct snd_pcm_info)
++#define SNDRV_PCM_IOCTL_TSTAMP		_IOW('A', 0x02, int)
++#define SNDRV_PCM_IOCTL_TTSTAMP		_IOW('A', 0x03, int)
++#define SNDRV_PCM_IOCTL_USER_PVERSION	_IOW('A', 0x04, int)
++#define SNDRV_PCM_IOCTL_HW_REFINE	_IOWR('A', 0x10, struct snd_pcm_hw_params)
++#define SNDRV_PCM_IOCTL_HW_PARAMS	_IOWR('A', 0x11, struct snd_pcm_hw_params)
++#define SNDRV_PCM_IOCTL_HW_FREE		_IO('A', 0x12)
++#define SNDRV_PCM_IOCTL_SW_PARAMS	_IOWR('A', 0x13, struct snd_pcm_sw_params)
++#define SNDRV_PCM_IOCTL_STATUS		_IOR('A', 0x20, struct snd_pcm_status)
++#define SNDRV_PCM_IOCTL_DELAY		_IOR('A', 0x21, snd_pcm_sframes_t)
++#define SNDRV_PCM_IOCTL_HWSYNC		_IO('A', 0x22)
++#define SNDRV_PCM_IOCTL_SYNC_PTR	_IOWR('A', 0x23, struct snd_pcm_sync_ptr)
++#define SNDRV_PCM_IOCTL_STATUS_EXT	_IOWR('A', 0x24, struct snd_pcm_status)
++#define SNDRV_PCM_IOCTL_CHANNEL_INFO	_IOR('A', 0x32, struct snd_pcm_channel_info)
++#define SNDRV_PCM_IOCTL_PREPARE		_IO('A', 0x40)
++#define SNDRV_PCM_IOCTL_RESET		_IO('A', 0x41)
++#define SNDRV_PCM_IOCTL_START		_IO('A', 0x42)
++#define SNDRV_PCM_IOCTL_DROP		_IO('A', 0x43)
++#define SNDRV_PCM_IOCTL_DRAIN		_IO('A', 0x44)
++#define SNDRV_PCM_IOCTL_PAUSE		_IOW('A', 0x45, int)
++#define SNDRV_PCM_IOCTL_REWIND		_IOW('A', 0x46, snd_pcm_uframes_t)
++#define SNDRV_PCM_IOCTL_RESUME		_IO('A', 0x47)
++#define SNDRV_PCM_IOCTL_XRUN		_IO('A', 0x48)
++#define SNDRV_PCM_IOCTL_FORWARD		_IOW('A', 0x49, snd_pcm_uframes_t)
++#define SNDRV_PCM_IOCTL_WRITEI_FRAMES	_IOW('A', 0x50, struct snd_xferi)
++#define SNDRV_PCM_IOCTL_READI_FRAMES	_IOR('A', 0x51, struct snd_xferi)
++#define SNDRV_PCM_IOCTL_WRITEN_FRAMES	_IOW('A', 0x52, struct snd_xfern)
++#define SNDRV_PCM_IOCTL_READN_FRAMES	_IOR('A', 0x53, struct snd_xfern)
++#define SNDRV_PCM_IOCTL_LINK		_IOW('A', 0x60, int)
++#define SNDRV_PCM_IOCTL_UNLINK		_IO('A', 0x61)
++
++/*****************************************************************************
++ *                                                                           *
++ *                            MIDI v1.0 interface                            *
++ *                                                                           *
++ *****************************************************************************/
++
++/*
++ *  Raw MIDI section - /dev/snd/midi??
++ */
++
++#define SNDRV_RAWMIDI_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 0)
++
++enum {
++	SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
++	SNDRV_RAWMIDI_STREAM_INPUT,
++	SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
++};
++
++#define SNDRV_RAWMIDI_INFO_OUTPUT		0x00000001
++#define SNDRV_RAWMIDI_INFO_INPUT		0x00000002
++#define SNDRV_RAWMIDI_INFO_DUPLEX		0x00000004
++
++struct snd_rawmidi_info {
++	unsigned int device;		/* RO/WR (control): device number */
++	unsigned int subdevice;		/* RO/WR (control): subdevice number */
++	int stream;			/* WR: stream */
++	int card;			/* R: card number */
++	unsigned int flags;		/* SNDRV_RAWMIDI_INFO_XXXX */
++	unsigned char id[64];		/* ID (user selectable) */
++	unsigned char name[80];		/* name of device */
++	unsigned char subname[32];	/* name of active or selected subdevice */
++	unsigned int subdevices_count;
++	unsigned int subdevices_avail;
++	unsigned char reserved[64];	/* reserved for future use */
++};
++
++struct snd_rawmidi_params {
++	int stream;
++	size_t buffer_size;		/* queue size in bytes */
++	size_t avail_min;		/* minimum avail bytes for wakeup */
++	unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
++	unsigned char reserved[16];	/* reserved for future use */
++};
++
++struct snd_rawmidi_status {
++	int stream;
++	struct timespec tstamp;		/* Timestamp */
++	size_t avail;			/* available bytes */
++	size_t xruns;			/* count of overruns since last status (in bytes) */
++	unsigned char reserved[16];	/* reserved for future use */
++};
++
++#define SNDRV_RAWMIDI_IOCTL_PVERSION	_IOR('W', 0x00, int)
++#define SNDRV_RAWMIDI_IOCTL_INFO	_IOR('W', 0x01, struct snd_rawmidi_info)
++#define SNDRV_RAWMIDI_IOCTL_PARAMS	_IOWR('W', 0x10, struct snd_rawmidi_params)
++#define SNDRV_RAWMIDI_IOCTL_STATUS	_IOWR('W', 0x20, struct snd_rawmidi_status)
++#define SNDRV_RAWMIDI_IOCTL_DROP	_IOW('W', 0x30, int)
++#define SNDRV_RAWMIDI_IOCTL_DRAIN	_IOW('W', 0x31, int)
++
++/*
++ *  Timer section - /dev/snd/timer
++ */
++
++#define SNDRV_TIMER_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 6)
++
++enum {
++	SNDRV_TIMER_CLASS_NONE = -1,
++	SNDRV_TIMER_CLASS_SLAVE = 0,
++	SNDRV_TIMER_CLASS_GLOBAL,
++	SNDRV_TIMER_CLASS_CARD,
++	SNDRV_TIMER_CLASS_PCM,
++	SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
++};
++
++/* slave timer classes */
++enum {
++	SNDRV_TIMER_SCLASS_NONE = 0,
++	SNDRV_TIMER_SCLASS_APPLICATION,
++	SNDRV_TIMER_SCLASS_SEQUENCER,		/* alias */
++	SNDRV_TIMER_SCLASS_OSS_SEQUENCER,	/* alias */
++	SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
++};
++
++/* global timers (device member) */
++#define SNDRV_TIMER_GLOBAL_SYSTEM	0
++#define SNDRV_TIMER_GLOBAL_RTC		1	/* unused */
++#define SNDRV_TIMER_GLOBAL_HPET		2
++#define SNDRV_TIMER_GLOBAL_HRTIMER	3
++
++/* info flags */
++#define SNDRV_TIMER_FLG_SLAVE		(1<<0)	/* cannot be controlled */
++
++struct snd_timer_id {
++	int dev_class;
++	int dev_sclass;
++	int card;
++	int device;
++	int subdevice;
++};
++
++struct snd_timer_ginfo {
++	struct snd_timer_id tid;	/* requested timer ID */
++	unsigned int flags;		/* timer flags - SNDRV_TIMER_FLG_* */
++	int card;			/* card number */
++	unsigned char id[64];		/* timer identification */
++	unsigned char name[80];		/* timer name */
++	unsigned long reserved0;	/* reserved for future use */
++	unsigned long resolution;	/* average period resolution in ns */
++	unsigned long resolution_min;	/* minimal period resolution in ns */
++	unsigned long resolution_max;	/* maximal period resolution in ns */
++	unsigned int clients;		/* active timer clients */
++	unsigned char reserved[32];
++};
++
++struct snd_timer_gparams {
++	struct snd_timer_id tid;	/* requested timer ID */
++	unsigned long period_num;	/* requested precise period duration (in seconds) - numerator */
++	unsigned long period_den;	/* requested precise period duration (in seconds) - denominator */
++	unsigned char reserved[32];
++};
++
++struct snd_timer_gstatus {
++	struct snd_timer_id tid;	/* requested timer ID */
++	unsigned long resolution;	/* current period resolution in ns */
++	unsigned long resolution_num;	/* precise current period resolution (in seconds) - numerator */
++	unsigned long resolution_den;	/* precise current period resolution (in seconds) - denominator */
++	unsigned char reserved[32];
++};
++
++struct snd_timer_select {
++	struct snd_timer_id id;	/* bind to timer ID */
++	unsigned char reserved[32];	/* reserved */
++};
++
++struct snd_timer_info {
++	unsigned int flags;		/* timer flags - SNDRV_TIMER_FLG_* */
++	int card;			/* card number */
++	unsigned char id[64];		/* timer identificator */
++	unsigned char name[80];		/* timer name */
++	unsigned long reserved0;	/* reserved for future use */
++	unsigned long resolution;	/* average period resolution in ns */
++	unsigned char reserved[64];	/* reserved */
++};
++
++#define SNDRV_TIMER_PSFLG_AUTO		(1<<0)	/* auto start, otherwise one-shot */
++#define SNDRV_TIMER_PSFLG_EXCLUSIVE	(1<<1)	/* exclusive use, precise start/stop/pause/continue */
++#define SNDRV_TIMER_PSFLG_EARLY_EVENT	(1<<2)	/* write early event to the poll queue */
++
++struct snd_timer_params {
++	unsigned int flags;		/* flags - SNDRV_TIMER_PSFLG_* */
++	unsigned int ticks;		/* requested resolution in ticks */
++	unsigned int queue_size;	/* total size of queue (32-1024) */
++	unsigned int reserved0;		/* reserved, was: failure locations */
++	unsigned int filter;		/* event filter (bitmask of SNDRV_TIMER_EVENT_*) */
++	unsigned char reserved[60];	/* reserved */
++};
++
++struct snd_timer_status {
++	struct timespec tstamp;		/* Timestamp - last update */
++	unsigned int resolution;	/* current period resolution in ns */
++	unsigned int lost;		/* counter of master tick lost */
++	unsigned int overrun;		/* count of read queue overruns */
++	unsigned int queue;		/* used queue size */
++	unsigned char reserved[64];	/* reserved */
++};
++
++#define SNDRV_TIMER_IOCTL_PVERSION	_IOR('T', 0x00, int)
++#define SNDRV_TIMER_IOCTL_NEXT_DEVICE	_IOWR('T', 0x01, struct snd_timer_id)
++#define SNDRV_TIMER_IOCTL_TREAD		_IOW('T', 0x02, int)
++#define SNDRV_TIMER_IOCTL_GINFO		_IOWR('T', 0x03, struct snd_timer_ginfo)
++#define SNDRV_TIMER_IOCTL_GPARAMS	_IOW('T', 0x04, struct snd_timer_gparams)
++#define SNDRV_TIMER_IOCTL_GSTATUS	_IOWR('T', 0x05, struct snd_timer_gstatus)
++#define SNDRV_TIMER_IOCTL_SELECT	_IOW('T', 0x10, struct snd_timer_select)
++#define SNDRV_TIMER_IOCTL_INFO		_IOR('T', 0x11, struct snd_timer_info)
++#define SNDRV_TIMER_IOCTL_PARAMS	_IOW('T', 0x12, struct snd_timer_params)
++#define SNDRV_TIMER_IOCTL_STATUS	_IOR('T', 0x14, struct snd_timer_status)
++/* The following four ioctls are changed since 1.0.9 due to confliction */
++#define SNDRV_TIMER_IOCTL_START		_IO('T', 0xa0)
++#define SNDRV_TIMER_IOCTL_STOP		_IO('T', 0xa1)
++#define SNDRV_TIMER_IOCTL_CONTINUE	_IO('T', 0xa2)
++#define SNDRV_TIMER_IOCTL_PAUSE		_IO('T', 0xa3)
++
++struct snd_timer_read {
++	unsigned int resolution;
++	unsigned int ticks;
++};
++
++enum {
++	SNDRV_TIMER_EVENT_RESOLUTION = 0,	/* val = resolution in ns */
++	SNDRV_TIMER_EVENT_TICK,			/* val = ticks */
++	SNDRV_TIMER_EVENT_START,		/* val = resolution in ns */
++	SNDRV_TIMER_EVENT_STOP,			/* val = 0 */
++	SNDRV_TIMER_EVENT_CONTINUE,		/* val = resolution in ns */
++	SNDRV_TIMER_EVENT_PAUSE,		/* val = 0 */
++	SNDRV_TIMER_EVENT_EARLY,		/* val = 0, early event */
++	SNDRV_TIMER_EVENT_SUSPEND,		/* val = 0 */
++	SNDRV_TIMER_EVENT_RESUME,		/* val = resolution in ns */
++	/* master timer events for slave timer instances */
++	SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
++	SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
++	SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
++	SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
++	SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
++	SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
++};
++
++struct snd_timer_tread {
++	int event;
++	struct timespec tstamp;
++	unsigned int val;
++};
++
++/****************************************************************************
++ *                                                                          *
++ *        Section for driver control interface - /dev/snd/control?          *
++ *                                                                          *
++ ****************************************************************************/
++
++#define SNDRV_CTL_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 7)
++
++struct snd_ctl_card_info {
++	int card;			/* card number */
++	int pad;			/* reserved for future (was type) */
++	unsigned char id[16];		/* ID of card (user selectable) */
++	unsigned char driver[16];	/* Driver name */
++	unsigned char name[32];		/* Short name of soundcard */
++	unsigned char longname[80];	/* name + info text about soundcard */
++	unsigned char reserved_[16];	/* reserved for future (was ID of mixer) */
++	unsigned char mixername[80];	/* visual mixer identification */
++	unsigned char components[128];	/* card components / fine identification, delimited with one space (AC97 etc..) */
++};
++
++typedef int __bitwise snd_ctl_elem_type_t;
++#define	SNDRV_CTL_ELEM_TYPE_NONE	((__force snd_ctl_elem_type_t) 0) /* invalid */
++#define	SNDRV_CTL_ELEM_TYPE_BOOLEAN	((__force snd_ctl_elem_type_t) 1) /* boolean type */
++#define	SNDRV_CTL_ELEM_TYPE_INTEGER	((__force snd_ctl_elem_type_t) 2) /* integer type */
++#define	SNDRV_CTL_ELEM_TYPE_ENUMERATED	((__force snd_ctl_elem_type_t) 3) /* enumerated type */
++#define	SNDRV_CTL_ELEM_TYPE_BYTES	((__force snd_ctl_elem_type_t) 4) /* byte array */
++#define	SNDRV_CTL_ELEM_TYPE_IEC958	((__force snd_ctl_elem_type_t) 5) /* IEC958 (S/PDIF) setup */
++#define	SNDRV_CTL_ELEM_TYPE_INTEGER64	((__force snd_ctl_elem_type_t) 6) /* 64-bit integer type */
++#define	SNDRV_CTL_ELEM_TYPE_LAST	SNDRV_CTL_ELEM_TYPE_INTEGER64
++
++typedef int __bitwise snd_ctl_elem_iface_t;
++#define	SNDRV_CTL_ELEM_IFACE_CARD	((__force snd_ctl_elem_iface_t) 0) /* global control */
++#define	SNDRV_CTL_ELEM_IFACE_HWDEP	((__force snd_ctl_elem_iface_t) 1) /* hardware dependent device */
++#define	SNDRV_CTL_ELEM_IFACE_MIXER	((__force snd_ctl_elem_iface_t) 2) /* virtual mixer device */
++#define	SNDRV_CTL_ELEM_IFACE_PCM	((__force snd_ctl_elem_iface_t) 3) /* PCM device */
++#define	SNDRV_CTL_ELEM_IFACE_RAWMIDI	((__force snd_ctl_elem_iface_t) 4) /* RawMidi device */
++#define	SNDRV_CTL_ELEM_IFACE_TIMER	((__force snd_ctl_elem_iface_t) 5) /* timer device */
++#define	SNDRV_CTL_ELEM_IFACE_SEQUENCER	((__force snd_ctl_elem_iface_t) 6) /* sequencer client */
++#define	SNDRV_CTL_ELEM_IFACE_LAST	SNDRV_CTL_ELEM_IFACE_SEQUENCER
++
++#define SNDRV_CTL_ELEM_ACCESS_READ		(1<<0)
++#define SNDRV_CTL_ELEM_ACCESS_WRITE		(1<<1)
++#define SNDRV_CTL_ELEM_ACCESS_READWRITE		(SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
++#define SNDRV_CTL_ELEM_ACCESS_VOLATILE		(1<<2)	/* control value may be changed without a notification */
++#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP		(1<<3)	/* when was control changed */
++#define SNDRV_CTL_ELEM_ACCESS_TLV_READ		(1<<4)	/* TLV read is possible */
++#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE		(1<<5)	/* TLV write is possible */
++#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE	(SNDRV_CTL_ELEM_ACCESS_TLV_READ|SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
++#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND	(1<<6)	/* TLV command is possible */
++#define SNDRV_CTL_ELEM_ACCESS_INACTIVE		(1<<8)	/* control does actually nothing, but may be updated */
++#define SNDRV_CTL_ELEM_ACCESS_LOCK		(1<<9)	/* write lock */
++#define SNDRV_CTL_ELEM_ACCESS_OWNER		(1<<10)	/* write lock owner */
++#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK	(1<<28)	/* kernel use a TLV callback */
++#define SNDRV_CTL_ELEM_ACCESS_USER		(1<<29) /* user space element */
++/* bits 30 and 31 are obsoleted (for indirect access) */
++
++/* for further details see the ACPI and PCI power management specification */
++#define SNDRV_CTL_POWER_D0		0x0000	/* full On */
++#define SNDRV_CTL_POWER_D1		0x0100	/* partial On */
++#define SNDRV_CTL_POWER_D2		0x0200	/* partial On */
++#define SNDRV_CTL_POWER_D3		0x0300	/* Off */
++#define SNDRV_CTL_POWER_D3hot		(SNDRV_CTL_POWER_D3|0x0000)	/* Off, with power */
++#define SNDRV_CTL_POWER_D3cold		(SNDRV_CTL_POWER_D3|0x0001)	/* Off, without power */
++
++#define SNDRV_CTL_ELEM_ID_NAME_MAXLEN	44
++
++struct snd_ctl_elem_id {
++	unsigned int numid;		/* numeric identifier, zero = invalid */
++	snd_ctl_elem_iface_t iface;	/* interface identifier */
++	unsigned int device;		/* device/client number */
++	unsigned int subdevice;		/* subdevice (substream) number */
++	unsigned char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];		/* ASCII name of item */
++	unsigned int index;		/* index of item */
++};
++
++struct snd_ctl_elem_list {
++	unsigned int offset;		/* W: first element ID to get */
++	unsigned int space;		/* W: count of element IDs to get */
++	unsigned int used;		/* R: count of element IDs set */
++	unsigned int count;		/* R: count of all elements */
++	struct snd_ctl_elem_id __user *pids; /* R: IDs */
++	unsigned char reserved[50];
++};
++
++struct snd_ctl_elem_info {
++	struct snd_ctl_elem_id id;	/* W: element ID */
++	snd_ctl_elem_type_t type;	/* R: value type - SNDRV_CTL_ELEM_TYPE_* */
++	unsigned int access;		/* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */
++	unsigned int count;		/* count of values */
++	__kernel_pid_t owner;		/* owner's PID of this control */
++	union {
++		struct {
++			long min;		/* R: minimum value */
++			long max;		/* R: maximum value */
++			long step;		/* R: step (0 variable) */
++		} integer;
++		struct {
++			long long min;		/* R: minimum value */
++			long long max;		/* R: maximum value */
++			long long step;		/* R: step (0 variable) */
++		} integer64;
++		struct {
++			unsigned int items;	/* R: number of items */
++			unsigned int item;	/* W: item number */
++			char name[64];		/* R: value name */
++			__u64 names_ptr;	/* W: names list (ELEM_ADD only) */
++			unsigned int names_length;
++		} enumerated;
++		unsigned char reserved[128];
++	} value;
++	union {
++		unsigned short d[4];		/* dimensions */
++		unsigned short *d_ptr;		/* indirect - obsoleted */
++	} dimen;
++	unsigned char reserved[64-4*sizeof(unsigned short)];
++};
++
++struct snd_ctl_elem_value {
++	struct snd_ctl_elem_id id;	/* W: element ID */
++	unsigned int indirect: 1;	/* W: indirect access - obsoleted */
++	union {
++		union {
++			long value[128];
++			long *value_ptr;	/* obsoleted */
++		} integer;
++		union {
++			long long value[64];
++			long long *value_ptr;	/* obsoleted */
++		} integer64;
++		union {
++			unsigned int item[128];
++			unsigned int *item_ptr;	/* obsoleted */
++		} enumerated;
++		union {
++			unsigned char data[512];
++			unsigned char *data_ptr;	/* obsoleted */
++		} bytes;
++		struct snd_aes_iec958 iec958;
++	} value;		/* RO */
++	struct timespec tstamp;
++	unsigned char reserved[128-sizeof(struct timespec)];
++};
++
++struct snd_ctl_tlv {
++	unsigned int numid;	/* control element numeric identification */
++	unsigned int length;	/* in bytes aligned to 4 */
++	unsigned int tlv[0];	/* first TLV */
++};
++
++#define SNDRV_CTL_IOCTL_PVERSION	_IOR('U', 0x00, int)
++#define SNDRV_CTL_IOCTL_CARD_INFO	_IOR('U', 0x01, struct snd_ctl_card_info)
++#define SNDRV_CTL_IOCTL_ELEM_LIST	_IOWR('U', 0x10, struct snd_ctl_elem_list)
++#define SNDRV_CTL_IOCTL_ELEM_INFO	_IOWR('U', 0x11, struct snd_ctl_elem_info)
++#define SNDRV_CTL_IOCTL_ELEM_READ	_IOWR('U', 0x12, struct snd_ctl_elem_value)
++#define SNDRV_CTL_IOCTL_ELEM_WRITE	_IOWR('U', 0x13, struct snd_ctl_elem_value)
++#define SNDRV_CTL_IOCTL_ELEM_LOCK	_IOW('U', 0x14, struct snd_ctl_elem_id)
++#define SNDRV_CTL_IOCTL_ELEM_UNLOCK	_IOW('U', 0x15, struct snd_ctl_elem_id)
++#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int)
++#define SNDRV_CTL_IOCTL_ELEM_ADD	_IOWR('U', 0x17, struct snd_ctl_elem_info)
++#define SNDRV_CTL_IOCTL_ELEM_REPLACE	_IOWR('U', 0x18, struct snd_ctl_elem_info)
++#define SNDRV_CTL_IOCTL_ELEM_REMOVE	_IOWR('U', 0x19, struct snd_ctl_elem_id)
++#define SNDRV_CTL_IOCTL_TLV_READ	_IOWR('U', 0x1a, struct snd_ctl_tlv)
++#define SNDRV_CTL_IOCTL_TLV_WRITE	_IOWR('U', 0x1b, struct snd_ctl_tlv)
++#define SNDRV_CTL_IOCTL_TLV_COMMAND	_IOWR('U', 0x1c, struct snd_ctl_tlv)
++#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int)
++#define SNDRV_CTL_IOCTL_HWDEP_INFO	_IOR('U', 0x21, struct snd_hwdep_info)
++#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE	_IOR('U', 0x30, int)
++#define SNDRV_CTL_IOCTL_PCM_INFO	_IOWR('U', 0x31, struct snd_pcm_info)
++#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int)
++#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
++#define SNDRV_CTL_IOCTL_RAWMIDI_INFO	_IOWR('U', 0x41, struct snd_rawmidi_info)
++#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
++#define SNDRV_CTL_IOCTL_POWER		_IOWR('U', 0xd0, int)
++#define SNDRV_CTL_IOCTL_POWER_STATE	_IOR('U', 0xd1, int)
++
++/*
++ *  Read interface.
++ */
++
++enum sndrv_ctl_event_type {
++	SNDRV_CTL_EVENT_ELEM = 0,
++	SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
++};
++
++#define SNDRV_CTL_EVENT_MASK_VALUE	(1<<0)	/* element value was changed */
++#define SNDRV_CTL_EVENT_MASK_INFO	(1<<1)	/* element info was changed */
++#define SNDRV_CTL_EVENT_MASK_ADD	(1<<2)	/* element was added */
++#define SNDRV_CTL_EVENT_MASK_TLV	(1<<3)	/* element TLV tree was changed */
++#define SNDRV_CTL_EVENT_MASK_REMOVE	(~0U)	/* element was removed */
++
++struct snd_ctl_event {
++	int type;	/* event type - SNDRV_CTL_EVENT_* */
++	union {
++		struct {
++			unsigned int mask;
++			struct snd_ctl_elem_id id;
++		} elem;
++		unsigned char data8[60];
++	} data;
++};
++
++/*
++ *  Control names
++ */
++
++#define SNDRV_CTL_NAME_NONE				""
++#define SNDRV_CTL_NAME_PLAYBACK				"Playback "
++#define SNDRV_CTL_NAME_CAPTURE				"Capture "
++
++#define SNDRV_CTL_NAME_IEC958_NONE			""
++#define SNDRV_CTL_NAME_IEC958_SWITCH			"Switch"
++#define SNDRV_CTL_NAME_IEC958_VOLUME			"Volume"
++#define SNDRV_CTL_NAME_IEC958_DEFAULT			"Default"
++#define SNDRV_CTL_NAME_IEC958_MASK			"Mask"
++#define SNDRV_CTL_NAME_IEC958_CON_MASK			"Con Mask"
++#define SNDRV_CTL_NAME_IEC958_PRO_MASK			"Pro Mask"
++#define SNDRV_CTL_NAME_IEC958_PCM_STREAM		"PCM Stream"
++#define SNDRV_CTL_NAME_IEC958(expl,direction,what)	"IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
++
++#endif /* _UAPI__SOUND_ASOUND_H */
+diff --git a/include/sound/uapi/asound_fm.h b/include/sound/uapi/asound_fm.h
+new file mode 100644
+index 00000000..8471f404
+--- /dev/null
++++ b/include/sound/uapi/asound_fm.h
+@@ -0,0 +1,135 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++#ifndef __SOUND_ASOUND_FM_H
++#define __SOUND_ASOUND_FM_H
++
++/*
++ *  Advanced Linux Sound Architecture - ALSA
++ *
++ *  Interface file between ALSA driver & user space
++ *  Copyright (c) 1994-98 by Jaroslav Kysela <perex@perex.cz>,
++ *                           4Front Technologies
++ *
++ *  Direct FM control
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ */
++
++#define SNDRV_DM_FM_MODE_OPL2	0x00
++#define SNDRV_DM_FM_MODE_OPL3	0x01
++
++struct snd_dm_fm_info {
++	unsigned char fm_mode;		/* OPL mode, see SNDRV_DM_FM_MODE_XXX */
++	unsigned char rhythm;		/* percussion mode flag */
++};
++
++/*
++ *  Data structure composing an FM "note" or sound event.
++ */
++
++struct snd_dm_fm_voice {
++	unsigned char op;		/* operator cell (0 or 1) */
++	unsigned char voice;		/* FM voice (0 to 17) */
++
++	unsigned char am;		/* amplitude modulation */
++	unsigned char vibrato;		/* vibrato effect */
++	unsigned char do_sustain;	/* sustain phase */
++	unsigned char kbd_scale;	/* keyboard scaling */
++	unsigned char harmonic;		/* 4 bits: harmonic and multiplier */
++	unsigned char scale_level;	/* 2 bits: decrease output freq rises */
++	unsigned char volume;		/* 6 bits: volume */
++
++	unsigned char attack;		/* 4 bits: attack rate */
++	unsigned char decay;		/* 4 bits: decay rate */
++	unsigned char sustain;		/* 4 bits: sustain level */
++	unsigned char release;		/* 4 bits: release rate */
++
++	unsigned char feedback;		/* 3 bits: feedback for op0 */
++	unsigned char connection;	/* 0 for serial, 1 for parallel */
++	unsigned char left;		/* stereo left */
++	unsigned char right;		/* stereo right */
++	unsigned char waveform;		/* 3 bits: waveform shape */
++};
++
++/*
++ *  This describes an FM note by its voice, octave, frequency number (10bit)
++ *  and key on/off.
++ */
++
++struct snd_dm_fm_note {
++	unsigned char voice;	/* 0-17 voice channel */
++	unsigned char octave;	/* 3 bits: what octave to play */
++	unsigned int fnum;	/* 10 bits: frequency number */
++	unsigned char key_on;	/* set for active, clear for silent */
++};
++
++/*
++ *  FM parameters that apply globally to all voices, and thus are not "notes"
++ */
++
++struct snd_dm_fm_params {
++	unsigned char am_depth;		/* amplitude modulation depth (1=hi) */
++	unsigned char vib_depth;	/* vibrato depth (1=hi) */
++	unsigned char kbd_split;	/* keyboard split */
++	unsigned char rhythm;		/* percussion mode select */
++
++	/* This block is the percussion instrument data */
++	unsigned char bass;
++	unsigned char snare;
++	unsigned char tomtom;
++	unsigned char cymbal;
++	unsigned char hihat;
++};
++
++/*
++ *  FM mode ioctl settings
++ */
++
++#define SNDRV_DM_FM_IOCTL_INFO		_IOR('H', 0x20, struct snd_dm_fm_info)
++#define SNDRV_DM_FM_IOCTL_RESET		_IO ('H', 0x21)
++#define SNDRV_DM_FM_IOCTL_PLAY_NOTE	_IOW('H', 0x22, struct snd_dm_fm_note)
++#define SNDRV_DM_FM_IOCTL_SET_VOICE	_IOW('H', 0x23, struct snd_dm_fm_voice)
++#define SNDRV_DM_FM_IOCTL_SET_PARAMS	_IOW('H', 0x24, struct snd_dm_fm_params)
++#define SNDRV_DM_FM_IOCTL_SET_MODE	_IOW('H', 0x25, int)
++/* for OPL3 only */
++#define SNDRV_DM_FM_IOCTL_SET_CONNECTION	_IOW('H', 0x26, int)
++/* SBI patch management */
++#define SNDRV_DM_FM_IOCTL_CLEAR_PATCHES	_IO ('H', 0x40)
++
++#define SNDRV_DM_FM_OSS_IOCTL_RESET		0x20
++#define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE		0x21
++#define SNDRV_DM_FM_OSS_IOCTL_SET_VOICE		0x22
++#define SNDRV_DM_FM_OSS_IOCTL_SET_PARAMS	0x23
++#define SNDRV_DM_FM_OSS_IOCTL_SET_MODE		0x24
++#define SNDRV_DM_FM_OSS_IOCTL_SET_OPL		0x25
++
++/*
++ * Patch Record - fixed size for write
++ */
++
++#define FM_KEY_SBI	"SBI\032"
++#define FM_KEY_2OP	"2OP\032"
++#define FM_KEY_4OP	"4OP\032"
++
++struct sbi_patch {
++	unsigned char prog;
++	unsigned char bank;
++	char key[4];
++	char name[25];
++	char extension[7];
++	unsigned char data[32];
++};
++
++#endif /* __SOUND_ASOUND_FM_H */
+diff --git a/include/sound/uapi/emu10k1.h b/include/sound/uapi/emu10k1.h
+new file mode 100644
+index 00000000..c1150e4d
+--- /dev/null
++++ b/include/sound/uapi/emu10k1.h
+@@ -0,0 +1,395 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++/*
++ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
++ *		     Creative Labs, Inc.
++ *  Definitions for EMU10K1 (SB Live!) chips
++ *
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ */
++#ifndef _UAPI__SOUND_EMU10K1_H
++#define _UAPI__SOUND_EMU10K1_H
++
++/*
++ * ---- FX8010 ----
++ */
++
++#define EMU10K1_CARD_CREATIVE			0x00000000
++#define EMU10K1_CARD_EMUAPS			0x00000001
++
++#define EMU10K1_FX8010_PCM_COUNT		8
++
++/*
++ * Following definition is copied from linux/types.h to support compiling
++ * this header file in userspace since they are not generally available for
++ * uapi headers.
++ */
++#define __EMU10K1_DECLARE_BITMAP(name,bits) \
++	unsigned long name[(bits) / (sizeof(unsigned long) * 8)]
++
++/* instruction set */
++#define iMAC0	 0x00	/* R = A + (X * Y >> 31)   ; saturation */
++#define iMAC1	 0x01	/* R = A + (-X * Y >> 31)  ; saturation */
++#define iMAC2	 0x02	/* R = A + (X * Y >> 31)   ; wraparound */
++#define iMAC3	 0x03	/* R = A + (-X * Y >> 31)  ; wraparound */
++#define iMACINT0 0x04	/* R = A + X * Y	   ; saturation */
++#define iMACINT1 0x05	/* R = A + X * Y	   ; wraparound (31-bit) */
++#define iACC3	 0x06	/* R = A + X + Y	   ; saturation */
++#define iMACMV   0x07	/* R = A, acc += X * Y >> 31 */
++#define iANDXOR  0x08	/* R = (A & X) ^ Y */
++#define iTSTNEG  0x09	/* R = (A >= Y) ? X : ~X */
++#define iLIMITGE 0x0a	/* R = (A >= Y) ? X : Y */
++#define iLIMITLT 0x0b	/* R = (A < Y) ? X : Y */
++#define iLOG	 0x0c	/* R = linear_data, A (log_data), X (max_exp), Y (format_word) */
++#define iEXP	 0x0d	/* R = log_data, A (linear_data), X (max_exp), Y (format_word) */
++#define iINTERP  0x0e	/* R = A + (X * (Y - A) >> 31)  ; saturation */
++#define iSKIP    0x0f	/* R = A (cc_reg), X (count), Y (cc_test) */
++
++/* GPRs */
++#define FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x0f */
++#define EXTIN(x)	(0x10 + (x))	/* x = 0x00 - 0x0f */
++#define EXTOUT(x)	(0x20 + (x))	/* x = 0x00 - 0x0f physical outs -> FXWC low 16 bits */
++#define FXBUS2(x)	(0x30 + (x))	/* x = 0x00 - 0x0f copies of fx buses for capture -> FXWC high 16 bits */
++					/* NB: 0x31 and 0x32 are shared with Center/LFE on SB live 5.1 */
++
++#define C_00000000	0x40
++#define C_00000001	0x41
++#define C_00000002	0x42
++#define C_00000003	0x43
++#define C_00000004	0x44
++#define C_00000008	0x45
++#define C_00000010	0x46
++#define C_00000020	0x47
++#define C_00000100	0x48
++#define C_00010000	0x49
++#define C_00080000	0x4a
++#define C_10000000	0x4b
++#define C_20000000	0x4c
++#define C_40000000	0x4d
++#define C_80000000	0x4e
++#define C_7fffffff	0x4f
++#define C_ffffffff	0x50
++#define C_fffffffe	0x51
++#define C_c0000000	0x52
++#define C_4f1bbcdc	0x53
++#define C_5a7ef9db	0x54
++#define C_00100000	0x55		/* ?? */
++#define GPR_ACCU	0x56		/* ACCUM, accumulator */
++#define GPR_COND	0x57		/* CCR, condition register */
++#define GPR_NOISE0	0x58		/* noise source */
++#define GPR_NOISE1	0x59		/* noise source */
++#define GPR_IRQ		0x5a		/* IRQ register */
++#define GPR_DBAC	0x5b		/* TRAM Delay Base Address Counter */
++#define GPR(x)		(FXGPREGBASE + (x)) /* free GPRs: x = 0x00 - 0xff */
++#define ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
++#define ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
++#define ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
++#define ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
++
++#define A_ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
++#define A_ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
++#define A_ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
++#define A_ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
++#define A_ITRAM_CTL(x)	(A_TANKMEMCTLREGBASE + 0x00 + (x)) /* x = 0x00 - 0xbf */
++#define A_ETRAM_CTL(x)	(A_TANKMEMCTLREGBASE + 0xc0 + (x)) /* x = 0x00 - 0x3f */
++
++#define A_FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x3f FX buses */
++#define A_EXTIN(x)	(0x40 + (x))	/* x = 0x00 - 0x0f physical ins */
++#define A_P16VIN(x)	(0x50 + (x))	/* x = 0x00 - 0x0f p16v ins (A2 only) "EMU32 inputs" */
++#define A_EXTOUT(x)	(0x60 + (x))	/* x = 0x00 - 0x1f physical outs -> A_FXWC1 0x79-7f unknown   */
++#define A_FXBUS2(x)	(0x80 + (x))	/* x = 0x00 - 0x1f extra outs used for EFX capture -> A_FXWC2 */
++#define A_EMU32OUTH(x)	(0xa0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_10 - _1F" - ??? */
++#define A_EMU32OUTL(x)	(0xb0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_1 - _F" - ??? */
++#define A3_EMU32IN(x)	(0x160 + (x))	/* x = 0x00 - 0x3f "EMU32_IN_00 - _3F" - Only when .device = 0x0008 */
++#define A3_EMU32OUT(x)	(0x1E0 + (x))	/* x = 0x00 - 0x0f "EMU32_OUT_00 - _3F" - Only when .device = 0x0008 */
++#define A_GPR(x)	(A_FXGPREGBASE + (x))
++
++/* cc_reg constants */
++#define CC_REG_NORMALIZED C_00000001
++#define CC_REG_BORROW	C_00000002
++#define CC_REG_MINUS	C_00000004
++#define CC_REG_ZERO	C_00000008
++#define CC_REG_SATURATE	C_00000010
++#define CC_REG_NONZERO	C_00000100
++
++/* FX buses */
++#define FXBUS_PCM_LEFT		0x00
++#define FXBUS_PCM_RIGHT		0x01
++#define FXBUS_PCM_LEFT_REAR	0x02
++#define FXBUS_PCM_RIGHT_REAR	0x03
++#define FXBUS_MIDI_LEFT		0x04
++#define FXBUS_MIDI_RIGHT	0x05
++#define FXBUS_PCM_CENTER	0x06
++#define FXBUS_PCM_LFE		0x07
++#define FXBUS_PCM_LEFT_FRONT	0x08
++#define FXBUS_PCM_RIGHT_FRONT	0x09
++#define FXBUS_MIDI_REVERB	0x0c
++#define FXBUS_MIDI_CHORUS	0x0d
++#define FXBUS_PCM_LEFT_SIDE	0x0e
++#define FXBUS_PCM_RIGHT_SIDE	0x0f
++#define FXBUS_PT_LEFT		0x14
++#define FXBUS_PT_RIGHT		0x15
++
++/* Inputs */
++#define EXTIN_AC97_L	   0x00	/* AC'97 capture channel - left */
++#define EXTIN_AC97_R	   0x01	/* AC'97 capture channel - right */
++#define EXTIN_SPDIF_CD_L   0x02	/* internal S/PDIF CD - onboard - left */
++#define EXTIN_SPDIF_CD_R   0x03	/* internal S/PDIF CD - onboard - right */
++#define EXTIN_ZOOM_L	   0x04	/* Zoom Video I2S - left */
++#define EXTIN_ZOOM_R	   0x05	/* Zoom Video I2S - right */
++#define EXTIN_TOSLINK_L	   0x06	/* LiveDrive - TOSLink Optical - left */
++#define EXTIN_TOSLINK_R    0x07	/* LiveDrive - TOSLink Optical - right */
++#define EXTIN_LINE1_L	   0x08	/* LiveDrive - Line/Mic 1 - left */
++#define EXTIN_LINE1_R	   0x09	/* LiveDrive - Line/Mic 1 - right */
++#define EXTIN_COAX_SPDIF_L 0x0a	/* LiveDrive - Coaxial S/PDIF - left */
++#define EXTIN_COAX_SPDIF_R 0x0b /* LiveDrive - Coaxial S/PDIF - right */
++#define EXTIN_LINE2_L	   0x0c	/* LiveDrive - Line/Mic 2 - left */
++#define EXTIN_LINE2_R	   0x0d	/* LiveDrive - Line/Mic 2 - right */
++
++/* Outputs */
++#define EXTOUT_AC97_L	   0x00	/* AC'97 playback channel - left */
++#define EXTOUT_AC97_R	   0x01	/* AC'97 playback channel - right */
++#define EXTOUT_TOSLINK_L   0x02	/* LiveDrive - TOSLink Optical - left */
++#define EXTOUT_TOSLINK_R   0x03	/* LiveDrive - TOSLink Optical - right */
++#define EXTOUT_AC97_CENTER 0x04	/* SB Live 5.1 - center */
++#define EXTOUT_AC97_LFE	   0x05 /* SB Live 5.1 - LFE */
++#define EXTOUT_HEADPHONE_L 0x06	/* LiveDrive - Headphone - left */
++#define EXTOUT_HEADPHONE_R 0x07	/* LiveDrive - Headphone - right */
++#define EXTOUT_REAR_L	   0x08	/* Rear channel - left */
++#define EXTOUT_REAR_R	   0x09	/* Rear channel - right */
++#define EXTOUT_ADC_CAP_L   0x0a	/* ADC Capture buffer - left */
++#define EXTOUT_ADC_CAP_R   0x0b	/* ADC Capture buffer - right */
++#define EXTOUT_MIC_CAP	   0x0c	/* MIC Capture buffer */
++#define EXTOUT_AC97_REAR_L 0x0d	/* SB Live 5.1 (c) 2003 - Rear Left */
++#define EXTOUT_AC97_REAR_R 0x0e	/* SB Live 5.1 (c) 2003 - Rear Right */
++#define EXTOUT_ACENTER	   0x11 /* Analog Center */
++#define EXTOUT_ALFE	   0x12 /* Analog LFE */
++
++/* Audigy Inputs */
++#define A_EXTIN_AC97_L		0x00	/* AC'97 capture channel - left */
++#define A_EXTIN_AC97_R		0x01	/* AC'97 capture channel - right */
++#define A_EXTIN_SPDIF_CD_L	0x02	/* digital CD left */
++#define A_EXTIN_SPDIF_CD_R	0x03	/* digital CD left */
++#define A_EXTIN_OPT_SPDIF_L     0x04    /* audigy drive Optical SPDIF - left */
++#define A_EXTIN_OPT_SPDIF_R     0x05    /*                              right */ 
++#define A_EXTIN_LINE2_L		0x08	/* audigy drive line2/mic2 - left */
++#define A_EXTIN_LINE2_R		0x09	/*                           right */
++#define A_EXTIN_ADC_L		0x0a    /* Philips ADC - left */
++#define A_EXTIN_ADC_R		0x0b    /*               right */
++#define A_EXTIN_AUX2_L		0x0c	/* audigy drive aux2 - left */
++#define A_EXTIN_AUX2_R		0x0d	/*                   - right */
++
++/* Audigiy Outputs */
++#define A_EXTOUT_FRONT_L	0x00	/* digital front left */
++#define A_EXTOUT_FRONT_R	0x01	/*               right */
++#define A_EXTOUT_CENTER		0x02	/* digital front center */
++#define A_EXTOUT_LFE		0x03	/* digital front lfe */
++#define A_EXTOUT_HEADPHONE_L	0x04	/* headphone audigy drive left */
++#define A_EXTOUT_HEADPHONE_R	0x05	/*                        right */
++#define A_EXTOUT_REAR_L		0x06	/* digital rear left */
++#define A_EXTOUT_REAR_R		0x07	/*              right */
++#define A_EXTOUT_AFRONT_L	0x08	/* analog front left */
++#define A_EXTOUT_AFRONT_R	0x09	/*              right */
++#define A_EXTOUT_ACENTER	0x0a	/* analog center */
++#define A_EXTOUT_ALFE		0x0b	/* analog LFE */
++#define A_EXTOUT_ASIDE_L	0x0c	/* analog side left  - Audigy 2 ZS */
++#define A_EXTOUT_ASIDE_R	0x0d	/*             right - Audigy 2 ZS */
++#define A_EXTOUT_AREAR_L	0x0e	/* analog rear left */
++#define A_EXTOUT_AREAR_R	0x0f	/*             right */
++#define A_EXTOUT_AC97_L		0x10	/* AC97 left (front) */
++#define A_EXTOUT_AC97_R		0x11	/*      right */
++#define A_EXTOUT_ADC_CAP_L	0x16	/* ADC capture buffer left */
++#define A_EXTOUT_ADC_CAP_R	0x17	/*                    right */
++#define A_EXTOUT_MIC_CAP	0x18	/* Mic capture buffer */
++
++/* Audigy constants */
++#define A_C_00000000	0xc0
++#define A_C_00000001	0xc1
++#define A_C_00000002	0xc2
++#define A_C_00000003	0xc3
++#define A_C_00000004	0xc4
++#define A_C_00000008	0xc5
++#define A_C_00000010	0xc6
++#define A_C_00000020	0xc7
++#define A_C_00000100	0xc8
++#define A_C_00010000	0xc9
++#define A_C_00000800	0xca
++#define A_C_10000000	0xcb
++#define A_C_20000000	0xcc
++#define A_C_40000000	0xcd
++#define A_C_80000000	0xce
++#define A_C_7fffffff	0xcf
++#define A_C_ffffffff	0xd0
++#define A_C_fffffffe	0xd1
++#define A_C_c0000000	0xd2
++#define A_C_4f1bbcdc	0xd3
++#define A_C_5a7ef9db	0xd4
++#define A_C_00100000	0xd5
++#define A_GPR_ACCU	0xd6		/* ACCUM, accumulator */
++#define A_GPR_COND	0xd7		/* CCR, condition register */
++#define A_GPR_NOISE0	0xd8		/* noise source */
++#define A_GPR_NOISE1	0xd9		/* noise source */
++#define A_GPR_IRQ	0xda		/* IRQ register */
++#define A_GPR_DBAC	0xdb		/* TRAM Delay Base Address Counter - internal */
++#define A_GPR_DBACE	0xde		/* TRAM Delay Base Address Counter - external */
++
++/* definitions for debug register */
++#define EMU10K1_DBG_ZC			0x80000000	/* zero tram counter */
++#define EMU10K1_DBG_SATURATION_OCCURED	0x02000000	/* saturation control */
++#define EMU10K1_DBG_SATURATION_ADDR	0x01ff0000	/* saturation address */
++#define EMU10K1_DBG_SINGLE_STEP		0x00008000	/* single step mode */
++#define EMU10K1_DBG_STEP		0x00004000	/* start single step */
++#define EMU10K1_DBG_CONDITION_CODE	0x00003e00	/* condition code */
++#define EMU10K1_DBG_SINGLE_STEP_ADDR	0x000001ff	/* single step address */
++
++/* tank memory address line */
++#ifndef __KERNEL__
++#define TANKMEMADDRREG_ADDR_MASK 0x000fffff	/* 20 bit tank address field			*/
++#define TANKMEMADDRREG_CLEAR	 0x00800000	/* Clear tank memory				*/
++#define TANKMEMADDRREG_ALIGN	 0x00400000	/* Align read or write relative to tank access	*/
++#define TANKMEMADDRREG_WRITE	 0x00200000	/* Write to tank memory				*/
++#define TANKMEMADDRREG_READ	 0x00100000	/* Read from tank memory			*/
++#endif
++
++struct snd_emu10k1_fx8010_info {
++	unsigned int internal_tram_size;	/* in samples */
++	unsigned int external_tram_size;	/* in samples */
++	char fxbus_names[16][32];		/* names of FXBUSes */
++	char extin_names[16][32];		/* names of external inputs */
++	char extout_names[32][32];		/* names of external outputs */
++	unsigned int gpr_controls;		/* count of GPR controls */
++};
++
++#define EMU10K1_GPR_TRANSLATION_NONE		0
++#define EMU10K1_GPR_TRANSLATION_TABLE100	1
++#define EMU10K1_GPR_TRANSLATION_BASS		2
++#define EMU10K1_GPR_TRANSLATION_TREBLE		3
++#define EMU10K1_GPR_TRANSLATION_ONOFF		4
++
++enum emu10k1_ctl_elem_iface {
++	EMU10K1_CTL_ELEM_IFACE_MIXER = 2,	/* virtual mixer device */
++	EMU10K1_CTL_ELEM_IFACE_PCM = 3,		/* PCM device */
++};
++
++struct emu10k1_ctl_elem_id {
++	unsigned int pad;		/* don't use */
++	int iface;			/* interface identifier */
++	unsigned int device;		/* device/client number */
++	unsigned int subdevice;		/* subdevice (substream) number */
++	unsigned char name[44];		/* ASCII name of item */
++	unsigned int index;		/* index of item */
++};
++
++struct snd_emu10k1_fx8010_control_gpr {
++	struct emu10k1_ctl_elem_id id;	/* full control ID definition */
++	unsigned int vcount;		/* visible count */
++	unsigned int count;		/* count of GPR (1..16) */
++	unsigned short gpr[32];		/* GPR number(s) */
++	unsigned int value[32];		/* initial values */
++	unsigned int min;		/* minimum range */
++	unsigned int max;		/* maximum range */
++	unsigned int translation;	/* translation type (EMU10K1_GPR_TRANSLATION*) */
++	const unsigned int *tlv;
++};
++
++/* old ABI without TLV support */
++struct snd_emu10k1_fx8010_control_old_gpr {
++	struct emu10k1_ctl_elem_id id;
++	unsigned int vcount;
++	unsigned int count;
++	unsigned short gpr[32];
++	unsigned int value[32];
++	unsigned int min;
++	unsigned int max;
++	unsigned int translation;
++};
++
++struct snd_emu10k1_fx8010_code {
++	char name[128];
++
++	__EMU10K1_DECLARE_BITMAP(gpr_valid, 0x200); /* bitmask of valid initializers */
++	__u32 *gpr_map;			/* initializers */
++
++	unsigned int gpr_add_control_count; /* count of GPR controls to add/replace */
++	struct snd_emu10k1_fx8010_control_gpr *gpr_add_controls; /* GPR controls to add/replace */
++
++	unsigned int gpr_del_control_count; /* count of GPR controls to remove */
++	struct emu10k1_ctl_elem_id *gpr_del_controls; /* IDs of GPR controls to remove */
++
++	unsigned int gpr_list_control_count; /* count of GPR controls to list */
++	unsigned int gpr_list_control_total; /* total count of GPR controls */
++	struct snd_emu10k1_fx8010_control_gpr *gpr_list_controls; /* listed GPR controls */
++
++	__EMU10K1_DECLARE_BITMAP(tram_valid, 0x100); /* bitmask of valid initializers */
++	__u32 *tram_data_map;		  /* data initializers */
++	__u32 *tram_addr_map;		  /* map initializers */
++
++	__EMU10K1_DECLARE_BITMAP(code_valid, 1024); /* bitmask of valid instructions */
++	__u32 *code;			  /* one instruction - 64 bits */
++};
++
++struct snd_emu10k1_fx8010_tram {
++	unsigned int address;		/* 31.bit == 1 -> external TRAM */
++	unsigned int size;		/* size in samples (4 bytes) */
++	unsigned int *samples;		/* pointer to samples (20-bit) */
++					/* NULL->clear memory */
++};
++
++struct snd_emu10k1_fx8010_pcm_rec {
++	unsigned int substream;		/* substream number */
++	unsigned int res1;		/* reserved */
++	unsigned int channels;		/* 16-bit channels count, zero = remove this substream */
++	unsigned int tram_start;	/* ring buffer position in TRAM (in samples) */
++	unsigned int buffer_size;	/* count of buffered samples */
++	unsigned short gpr_size;		/* GPR containing size of ringbuffer in samples (host) */
++	unsigned short gpr_ptr;		/* GPR containing current pointer in the ring buffer (host = reset, FX8010) */
++	unsigned short gpr_count;	/* GPR containing count of samples between two interrupts (host) */
++	unsigned short gpr_tmpcount;	/* GPR containing current count of samples to interrupt (host = set, FX8010) */
++	unsigned short gpr_trigger;	/* GPR containing trigger (activate) information (host) */
++	unsigned short gpr_running;	/* GPR containing info if PCM is running (FX8010) */
++	unsigned char pad;		/* reserved */
++	unsigned char etram[32];	/* external TRAM address & data (one per channel) */
++	unsigned int res2;		/* reserved */
++};
++
++#define SNDRV_EMU10K1_VERSION		SNDRV_PROTOCOL_VERSION(1, 0, 1)
++
++#define SNDRV_EMU10K1_IOCTL_INFO	_IOR ('H', 0x10, struct snd_emu10k1_fx8010_info)
++#define SNDRV_EMU10K1_IOCTL_CODE_POKE	_IOW ('H', 0x11, struct snd_emu10k1_fx8010_code)
++#define SNDRV_EMU10K1_IOCTL_CODE_PEEK	_IOWR('H', 0x12, struct snd_emu10k1_fx8010_code)
++#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP	_IOW ('H', 0x20, int)
++#define SNDRV_EMU10K1_IOCTL_TRAM_POKE	_IOW ('H', 0x21, struct snd_emu10k1_fx8010_tram)
++#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK	_IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram)
++#define SNDRV_EMU10K1_IOCTL_PCM_POKE	_IOW ('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec)
++#define SNDRV_EMU10K1_IOCTL_PCM_PEEK	_IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec)
++#define SNDRV_EMU10K1_IOCTL_PVERSION	_IOR ('H', 0x40, int)
++#define SNDRV_EMU10K1_IOCTL_STOP	_IO  ('H', 0x80)
++#define SNDRV_EMU10K1_IOCTL_CONTINUE	_IO  ('H', 0x81)
++#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO ('H', 0x82)
++#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP	_IOW ('H', 0x83, int)
++#define SNDRV_EMU10K1_IOCTL_DBG_READ	_IOR ('H', 0x84, int)
++
++#ifndef __KERNEL__
++/* typedefs for compatibility to user-space */
++typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
++typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
++typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
++typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
++typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
++typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
++#endif
++
++#endif /* _UAPI__SOUND_EMU10K1_H */
+diff --git a/include/sound/uapi/hdsp.h b/include/sound/uapi/hdsp.h
+new file mode 100644
+index 00000000..88c92a3f
+--- /dev/null
++++ b/include/sound/uapi/hdsp.h
+@@ -0,0 +1,109 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++#ifndef __SOUND_HDSP_H
++#define __SOUND_HDSP_H
++
++/*
++ *   Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
++ *    
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#define HDSP_MATRIX_MIXER_SIZE 2048
++
++enum HDSP_IO_Type {
++	Digiface,
++	Multiface,
++	H9652,
++	H9632,
++	RPM,
++	Undefined,
++};
++
++struct hdsp_peak_rms {
++	__u32 input_peaks[26];
++	__u32 playback_peaks[26];
++	__u32 output_peaks[28];
++	__u64 input_rms[26];
++	__u64 playback_rms[26];
++	/* These are only used for H96xx cards */
++	__u64 output_rms[26];
++};
++
++#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms)
++
++struct hdsp_config_info {
++	unsigned char pref_sync_ref;
++	unsigned char wordclock_sync_check;
++	unsigned char spdif_sync_check;
++	unsigned char adatsync_sync_check;
++	unsigned char adat_sync_check[3];
++	unsigned char spdif_in;
++	unsigned char spdif_out;
++	unsigned char spdif_professional;
++	unsigned char spdif_emphasis;
++	unsigned char spdif_nonaudio;
++	unsigned int spdif_sample_rate;
++	unsigned int system_sample_rate;
++	unsigned int autosync_sample_rate;
++	unsigned char system_clock_mode;
++	unsigned char clock_source;
++	unsigned char autosync_ref;
++	unsigned char line_out;
++	unsigned char passthru; 
++	unsigned char da_gain;
++	unsigned char ad_gain;
++	unsigned char phone_gain;
++	unsigned char xlr_breakout_cable;
++	unsigned char analog_extension_board;
++};
++
++#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdsp_config_info)
++
++struct hdsp_firmware {
++	void *firmware_data;	/* 24413 x 4 bytes */
++};
++
++#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, struct hdsp_firmware)
++
++struct hdsp_version {
++	enum HDSP_IO_Type io_type;
++	unsigned short firmware_rev;
++};
++
++#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdsp_version)
++
++struct hdsp_mixer {
++	unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
++};
++
++#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdsp_mixer)
++
++struct hdsp_9632_aeb {
++	int aebi;
++	int aebo;
++};
++
++#define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
++
++/* typedefs for compatibility to user-space */
++typedef enum HDSP_IO_Type HDSP_IO_Type;
++typedef struct hdsp_peak_rms hdsp_peak_rms_t;
++typedef struct hdsp_config_info hdsp_config_info_t;
++typedef struct hdsp_firmware hdsp_firmware_t;
++typedef struct hdsp_version hdsp_version_t;
++typedef struct hdsp_mixer hdsp_mixer_t;
++typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
++
++#endif /* __SOUND_HDSP_H */
+diff --git a/include/sound/uapi/hdspm.h b/include/sound/uapi/hdspm.h
+new file mode 100644
+index 00000000..2d91f90e
+--- /dev/null
++++ b/include/sound/uapi/hdspm.h
+@@ -0,0 +1,230 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++#ifndef __SOUND_HDSPM_H
++#define __SOUND_HDSPM_H
++/*
++ *   Copyright (C) 2003 Winfried Ritsch (IEM)
++ *   based on hdsp.h from Thomas Charbonnel (thomas@undata.org)
++ *
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
++#define HDSPM_MAX_CHANNELS      64
++
++enum hdspm_io_type {
++	MADI,
++	MADIface,
++	AIO,
++	AES32,
++	RayDAT
++};
++
++enum hdspm_speed {
++	ss,
++	ds,
++	qs
++};
++
++/* -------------------- IOCTL Peak/RMS Meters -------------------- */
++
++struct hdspm_peak_rms {
++	__u32 input_peaks[64];
++	__u32 playback_peaks[64];
++	__u32 output_peaks[64];
++
++	__u64 input_rms[64];
++	__u64 playback_rms[64];
++	__u64 output_rms[64];
++
++	__u8 speed; /* enum {ss, ds, qs} */
++	int status2;
++};
++
++#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
++	_IOR('H', 0x42, struct hdspm_peak_rms)
++
++/* ------------ CONFIG block IOCTL ---------------------- */
++
++struct hdspm_config {
++	unsigned char pref_sync_ref;
++	unsigned char wordclock_sync_check;
++	unsigned char madi_sync_check;
++	unsigned int system_sample_rate;
++	unsigned int autosync_sample_rate;
++	unsigned char system_clock_mode;
++	unsigned char clock_source;
++	unsigned char autosync_ref;
++	unsigned char line_out;
++	unsigned int passthru;
++	unsigned int analog_out;
++};
++
++#define SNDRV_HDSPM_IOCTL_GET_CONFIG \
++	_IOR('H', 0x41, struct hdspm_config)
++
++/*
++ * If there's a TCO (TimeCode Option) board installed,
++ * there are further options and status data available.
++ * The hdspm_ltc structure contains the current SMPTE
++ * timecode and some status information and can be
++ * obtained via SNDRV_HDSPM_IOCTL_GET_LTC or in the
++ * hdspm_status struct.
++ */
++
++enum hdspm_ltc_format {
++	format_invalid,
++	fps_24,
++	fps_25,
++	fps_2997,
++	fps_30
++};
++
++enum hdspm_ltc_frame {
++	frame_invalid,
++	drop_frame,
++	full_frame
++};
++
++enum hdspm_ltc_input_format {
++	ntsc,
++	pal,
++	no_video
++};
++
++struct hdspm_ltc {
++	unsigned int ltc;
++
++	enum hdspm_ltc_format format;
++	enum hdspm_ltc_frame frame;
++	enum hdspm_ltc_input_format input_format;
++};
++
++#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
++
++/*
++ * The status data reflects the device's current state
++ * as determined by the card's configuration and
++ * connection status.
++ */
++
++enum hdspm_sync {
++	hdspm_sync_no_lock = 0,
++	hdspm_sync_lock = 1,
++	hdspm_sync_sync = 2
++};
++
++enum hdspm_madi_input {
++	hdspm_input_optical = 0,
++	hdspm_input_coax = 1
++};
++
++enum hdspm_madi_channel_format {
++	hdspm_format_ch_64 = 0,
++	hdspm_format_ch_56 = 1
++};
++
++enum hdspm_madi_frame_format {
++	hdspm_frame_48 = 0,
++	hdspm_frame_96 = 1
++};
++
++enum hdspm_syncsource {
++	syncsource_wc = 0,
++	syncsource_madi = 1,
++	syncsource_tco = 2,
++	syncsource_sync = 3,
++	syncsource_none = 4
++};
++
++struct hdspm_status {
++	__u8 card_type; /* enum hdspm_io_type */
++	enum hdspm_syncsource autosync_source;
++
++	__u64 card_clock;
++	__u32 master_period;
++
++	union {
++		struct {
++			__u8 sync_wc; /* enum hdspm_sync */
++			__u8 sync_madi; /* enum hdspm_sync */
++			__u8 sync_tco; /* enum hdspm_sync */
++			__u8 sync_in; /* enum hdspm_sync */
++			__u8 madi_input; /* enum hdspm_madi_input */
++			__u8 channel_format; /* enum hdspm_madi_channel_format */
++			__u8 frame_format; /* enum hdspm_madi_frame_format */
++		} madi;
++	} card_specific;
++};
++
++#define SNDRV_HDSPM_IOCTL_GET_STATUS \
++	_IOR('H', 0x47, struct hdspm_status)
++
++/*
++ * Get information about the card and its add-ons.
++ */
++
++#define HDSPM_ADDON_TCO 1
++
++struct hdspm_version {
++	__u8 card_type; /* enum hdspm_io_type */
++	char cardname[20];
++	unsigned int serial;
++	unsigned short firmware_rev;
++	int addons;
++};
++
++#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version)
++
++/* ------------- get Matrix Mixer IOCTL --------------- */
++
++/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
++ * 32768 Bytes
++ */
++
++/* organisation is 64 channelfader in a continuous memory block */
++/* equivalent to hardware definition, maybe for future feature of mmap of
++ * them
++ */
++/* each of 64 outputs has 64 infader and 64 outfader:
++   Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
++
++#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
++
++struct hdspm_channelfader {
++	unsigned int in[HDSPM_MIXER_CHANNELS];
++	unsigned int pb[HDSPM_MIXER_CHANNELS];
++};
++
++struct hdspm_mixer {
++	struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
++};
++
++struct hdspm_mixer_ioctl {
++	struct hdspm_mixer *mixer;
++};
++
++/* use indirect access due to the limit of ioctl bit size */
++#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
++
++/* typedefs for compatibility to user-space */
++typedef struct hdspm_peak_rms hdspm_peak_rms_t;
++typedef struct hdspm_config_info hdspm_config_info_t;
++typedef struct hdspm_version hdspm_version_t;
++typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
++typedef struct hdspm_mixer hdspm_mixer_t;
++
++
++#endif
+diff --git a/include/sound/uapi/sb16_csp.h b/include/sound/uapi/sb16_csp.h
+new file mode 100644
+index 00000000..e6485148
+--- /dev/null
++++ b/include/sound/uapi/sb16_csp.h
+@@ -0,0 +1,123 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++/*
++ *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
++ *                        Takashi Iwai <tiwai@suse.de>
++ *
++ *  SB16ASP/AWE32 CSP control
++ *
++ *   This program is free software; you can redistribute it and/or modify 
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ */
++#ifndef _UAPI__SOUND_SB16_CSP_H
++#define _UAPI__SOUND_SB16_CSP_H
++
++
++/* CSP modes */
++#define SNDRV_SB_CSP_MODE_NONE		0x00
++#define SNDRV_SB_CSP_MODE_DSP_READ	0x01	/* Record from DSP */
++#define SNDRV_SB_CSP_MODE_DSP_WRITE	0x02	/* Play to DSP */
++#define SNDRV_SB_CSP_MODE_QSOUND		0x04	/* QSound */
++
++/* CSP load flags */
++#define SNDRV_SB_CSP_LOAD_FROMUSER	0x01
++#define SNDRV_SB_CSP_LOAD_INITBLOCK	0x02
++
++/* CSP sample width */
++#define SNDRV_SB_CSP_SAMPLE_8BIT		0x01
++#define SNDRV_SB_CSP_SAMPLE_16BIT		0x02
++
++/* CSP channels */
++#define SNDRV_SB_CSP_MONO			0x01
++#define SNDRV_SB_CSP_STEREO		0x02
++
++/* CSP rates */
++#define SNDRV_SB_CSP_RATE_8000		0x01
++#define SNDRV_SB_CSP_RATE_11025		0x02
++#define SNDRV_SB_CSP_RATE_22050		0x04
++#define SNDRV_SB_CSP_RATE_44100		0x08
++#define SNDRV_SB_CSP_RATE_ALL		0x0f
++
++/* CSP running state */
++#define SNDRV_SB_CSP_ST_IDLE		0x00
++#define SNDRV_SB_CSP_ST_LOADED		0x01
++#define SNDRV_SB_CSP_ST_RUNNING		0x02
++#define SNDRV_SB_CSP_ST_PAUSED		0x04
++#define SNDRV_SB_CSP_ST_AUTO		0x08
++#define SNDRV_SB_CSP_ST_QSOUND		0x10
++
++/* maximum QSound value (180 degrees right) */
++#define SNDRV_SB_CSP_QSOUND_MAX_RIGHT	0x20
++
++/* maximum microcode RIFF file size */
++#define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE	0x3000
++
++/* microcode header */
++struct snd_sb_csp_mc_header {
++	char codec_name[16];		/* id name of codec */
++	unsigned short func_req;	/* requested function */
++};
++
++/* microcode to be loaded */
++struct snd_sb_csp_microcode {
++	struct snd_sb_csp_mc_header info;
++	unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE];
++};
++
++/* start CSP with sample_width in mono/stereo */
++struct snd_sb_csp_start {
++	int sample_width;	/* sample width, look above */
++	int channels;		/* channels, look above */
++};
++
++/* CSP information */
++struct snd_sb_csp_info {
++	char codec_name[16];		/* id name of codec */
++	unsigned short func_nr;		/* function number */
++	unsigned int acc_format;	/* accepted PCM formats */
++	unsigned short acc_channels;	/* accepted channels */
++	unsigned short acc_width;	/* accepted sample width */
++	unsigned short acc_rates;	/* accepted sample rates */
++	unsigned short csp_mode;	/* CSP mode, see above */
++	unsigned short run_channels;	/* current channels  */
++	unsigned short run_width;	/* current sample width */
++	unsigned short version;		/* version id: 0x10 - 0x1f */
++	unsigned short state;		/* state bits */
++};
++
++/* HWDEP controls */
++/* get CSP information */
++#define SNDRV_SB_CSP_IOCTL_INFO		_IOR('H', 0x10, struct snd_sb_csp_info)
++/* load microcode to CSP */
++/* NOTE: struct snd_sb_csp_microcode overflows the max size (13 bits)
++ * defined for some architectures like MIPS, and it leads to build errors.
++ * (x86 and co have 14-bit size, thus it's valid, though.)
++ * As a workaround for skipping the size-limit check, here we don't use the
++ * normal _IOW() macro but _IOC() with the manual argument.
++ */
++#define SNDRV_SB_CSP_IOCTL_LOAD_CODE	\
++	_IOC(_IOC_WRITE, 'H', 0x11, sizeof(struct snd_sb_csp_microcode))
++/* unload microcode from CSP */
++#define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE	_IO('H', 0x12)
++/* start CSP */
++#define SNDRV_SB_CSP_IOCTL_START		_IOW('H', 0x13, struct snd_sb_csp_start)
++/* stop CSP */
++#define SNDRV_SB_CSP_IOCTL_STOP		_IO('H', 0x14)
++/* pause CSP and DMA transfer */
++#define SNDRV_SB_CSP_IOCTL_PAUSE		_IO('H', 0x15)
++/* restart CSP and DMA transfer */
++#define SNDRV_SB_CSP_IOCTL_RESTART	_IO('H', 0x16)
++
++
++#endif /* _UAPI__SOUND_SB16_CSP_H */
+diff --git a/include/sound/uapi/sscape_ioctl.h b/include/sound/uapi/sscape_ioctl.h
+new file mode 100644
+index 00000000..c6653ebf
+--- /dev/null
++++ b/include/sound/uapi/sscape_ioctl.h
+@@ -0,0 +1,21 @@
++#ifndef SSCAPE_IOCTL_H
++#define SSCAPE_IOCTL_H
++
++
++struct sscape_bootblock
++{
++  unsigned char code[256];
++  unsigned version;
++};
++
++#define SSCAPE_MICROCODE_SIZE  65536
++
++struct sscape_microcode
++{
++  unsigned char *code;
++};
++
++#define SND_SSCAPE_LOAD_BOOTB  _IOWR('P', 100, struct sscape_bootblock)
++#define SND_SSCAPE_LOAD_MCODE  _IOW ('P', 101, struct sscape_microcode)
++
++#endif
+diff --git a/include/sound/uapi/tlv.h b/include/sound/uapi/tlv.h
+new file mode 100644
+index 00000000..7d6d65f6
+--- /dev/null
++++ b/include/sound/uapi/tlv.h
+@@ -0,0 +1,117 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
++/*
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ */
++
++#ifndef __UAPI_SOUND_TLV_H
++#define __UAPI_SOUND_TLV_H
++
++#define SNDRV_CTL_TLVT_CONTAINER 0	/* one level down - group of TLVs */
++#define SNDRV_CTL_TLVT_DB_SCALE	1       /* dB scale */
++#define SNDRV_CTL_TLVT_DB_LINEAR 2	/* linear volume */
++#define SNDRV_CTL_TLVT_DB_RANGE 3	/* dB range container */
++#define SNDRV_CTL_TLVT_DB_MINMAX 4	/* dB scale with min/max */
++#define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5	/* dB scale with min/max with mute */
++
++/*
++ * channel-mapping TLV items
++ *  TLV length must match with num_channels
++ */
++#define SNDRV_CTL_TLVT_CHMAP_FIXED	0x101	/* fixed channel position */
++#define SNDRV_CTL_TLVT_CHMAP_VAR	0x102	/* channels freely swappable */
++#define SNDRV_CTL_TLVT_CHMAP_PAIRED	0x103	/* pair-wise swappable */
++
++/*
++ * TLV structure is right behind the struct snd_ctl_tlv:
++ *   unsigned int type  	- see SNDRV_CTL_TLVT_*
++ *   unsigned int length
++ *   .... data aligned to sizeof(unsigned int), use
++ *        block_length = (length + (sizeof(unsigned int) - 1)) &
++ *                       ~(sizeof(unsigned int) - 1)) ....
++ */
++#define SNDRV_CTL_TLVD_ITEM(type, ...) \
++	(type), SNDRV_CTL_TLVD_LENGTH(__VA_ARGS__), __VA_ARGS__
++#define SNDRV_CTL_TLVD_LENGTH(...) \
++	((unsigned int)sizeof((const unsigned int[]) { __VA_ARGS__ }))
++
++/* Accessor offsets for TLV data items */
++#define SNDRV_CTL_TLVO_TYPE		0
++#define SNDRV_CTL_TLVO_LEN		1
++
++#define SNDRV_CTL_TLVD_CONTAINER_ITEM(...) \
++	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_CONTAINER, __VA_ARGS__)
++#define SNDRV_CTL_TLVD_DECLARE_CONTAINER(name, ...) \
++	unsigned int name[] = { \
++		SNDRV_CTL_TLVD_CONTAINER_ITEM(__VA_ARGS__) \
++	}
++
++#define SNDRV_CTL_TLVD_DB_SCALE_MASK	0xffff
++#define SNDRV_CTL_TLVD_DB_SCALE_MUTE	0x10000
++#define SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
++	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_SCALE, \
++			    (min), \
++			    ((step) & SNDRV_CTL_TLVD_DB_SCALE_MASK) | \
++			     ((mute) ? SNDRV_CTL_TLVD_DB_SCALE_MUTE : 0))
++#define SNDRV_CTL_TLVD_DECLARE_DB_SCALE(name, min, step, mute) \
++	unsigned int name[] = { \
++		SNDRV_CTL_TLVD_DB_SCALE_ITEM(min, step, mute) \
++	}
++
++/* Accessor offsets for min, mute and step items in dB scale type TLV */
++#define SNDRV_CTL_TLVO_DB_SCALE_MIN		2
++#define SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP	3
++
++/* dB scale specified with min/max values instead of step */
++#define SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
++	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX, (min_dB), (max_dB))
++#define SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
++	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_MINMAX_MUTE, (min_dB), (max_dB))
++#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(name, min_dB, max_dB) \
++	unsigned int name[] = { \
++		SNDRV_CTL_TLVD_DB_MINMAX_ITEM(min_dB, max_dB) \
++	}
++#define SNDRV_CTL_TLVD_DECLARE_DB_MINMAX_MUTE(name, min_dB, max_dB) \
++	unsigned int name[] = { \
++		SNDRV_CTL_TLVD_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \
++	}
++
++/* Accessor offsets for min, max items in db-minmax types of TLV. */
++#define SNDRV_CTL_TLVO_DB_MINMAX_MIN	2
++#define SNDRV_CTL_TLVO_DB_MINMAX_MAX	3
++
++/* linear volume between min_dB and max_dB (.01dB unit) */
++#define SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
++	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_LINEAR, (min_dB), (max_dB))
++#define SNDRV_CTL_TLVD_DECLARE_DB_LINEAR(name, min_dB, max_dB) \
++	unsigned int name[] = { \
++		SNDRV_CTL_TLVD_DB_LINEAR_ITEM(min_dB, max_dB) \
++	}
++
++/* Accessor offsets for min, max items in db-linear type of TLV. */
++#define SNDRV_CTL_TLVO_DB_LINEAR_MIN	2
++#define SNDRV_CTL_TLVO_DB_LINEAR_MAX	3
++
++/* dB range container:
++ * Items in dB range container must be ordered by their values and by their
++ * dB values. This implies that larger values must correspond with larger
++ * dB values (which is also required for all other mixer controls).
++ */
++/* Each item is: <min> <max> <TLV> */
++#define SNDRV_CTL_TLVD_DB_RANGE_ITEM(...) \
++	SNDRV_CTL_TLVD_ITEM(SNDRV_CTL_TLVT_DB_RANGE, __VA_ARGS__)
++#define SNDRV_CTL_TLVD_DECLARE_DB_RANGE(name, ...) \
++	unsigned int name[] = { \
++		SNDRV_CTL_TLVD_DB_RANGE_ITEM(__VA_ARGS__) \
++	}
++
++#define SNDRV_CTL_TLVD_DB_GAIN_MUTE	-9999999
++
++#endif
+diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
+index 11efce6d..101491a4 100644
+--- a/src/topology/tplg_local.h
++++ b/src/topology/tplg_local.h
+@@ -18,8 +18,7 @@
+ #include "list.h"
+ #include "topology.h"
+ 
+-#define __packed __attribute__((__packed__))
+-
++#include <sound/type_compat.h>
+ #include <sound/asound.h>
+ #include <sound/asoc.h>
+ #include <sound/tlv.h>
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch
new file mode 100644
index 0000000..4db4934
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-configure.ac-remove-an-unnecessary-libtool-fix.patch
@@ -0,0 +1,50 @@
+From 01cd8cb6d594d7a12c67d21d689ebe0e347469c0 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk@iki.fi>
+Date: Fri, 20 Dec 2019 09:26:12 +0200
+Subject: [PATCH] configure.ac: remove an unnecessary libtool fix
+
+This code was added in commit 75d393a563efb578c79364a277087c6326267f52
+without explaining why. I assume it was a mistake, since it looks like
+the libtool problem should have gone away a long time ago. The referenced
+wiki page https://wiki.debian.org/RpathIssue says:
+
+    Since libtool 1.5.2 (released 2004-01-25), on Linux libtool no
+    longer sets RPATH for any directories in the dynamic linker search
+    path, so this should no longer be an issue unless upstream used a
+    really old version of libtool when creating their distribution
+    tarball.
+
+This code caused problems in OpenEmbedded, where the libtool script is
+named "x86_64-oe-linux-libtool" or similar rather than just "libtool",
+so the sed command failed with a file not found error. Rather than
+adapting the code to OpenEmbedded's peculiarities, it seems best to just
+remove the unnecessary code altogether.
+
+Upstream-Status: Submitted [https://github.com/alsa-project/alsa-lib/pull/19]
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ configure.ac | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 119ef600..22a4a885 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -764,14 +764,3 @@ test "$build_seq" = "yes" && echo "#include <alsa/seq.h>" >> include/asoundlib.h
+ test "$build_seq" = "yes" && echo "#include <alsa/seqmid.h>" >> include/asoundlib.h
+ test "$build_seq" = "yes" && echo "#include <alsa/seq_midi_event.h>" >> include/asoundlib.h
+ cat "$srcdir"/include/asoundlib-tail.h >> include/asoundlib.h
+-
+-dnl Taken from https://wiki.debian.org/RpathIssue
+-case $host in
+-   *-*-linux-gnu)
+-   AC_MSG_RESULT([Fixing libtool for -rpath problems.])
+-   sed < libtool > libtool-2 \
+-     's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/'
+-   mv libtool-2 libtool
+-   chmod 755 libtool
+- ;;
+-esac
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch
new file mode 100644
index 0000000..c35a2c9
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-uapi-Move-typedefs-from-uapi-to-sound.patch
@@ -0,0 +1,137 @@
+From 59792f467b38d6a4c4dffdb30528f7fb03d23d96 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Fri, 20 Dec 2019 17:12:37 +0100
+Subject: [PATCH] uapi: Move typedefs from uapi to sound/*
+
+For keeping uapi/*.h cleaner.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+Upstream-Status: Backport
+
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ include/sound/emu10k1.h      |  9 +++++++++
+ include/sound/hdsp.h         | 10 ++++++++++
+ include/sound/hdspm.h        |  8 ++++++++
+ include/sound/sb16_csp.h     |  4 ++++
+ include/sound/uapi/emu10k1.h | 10 ----------
+ include/sound/uapi/hdsp.h    |  9 ---------
+ include/sound/uapi/hdspm.h   |  8 --------
+ 7 files changed, 31 insertions(+), 27 deletions(-)
+
+diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
+index f06ecee5..0832f95b 100644
+--- a/include/sound/emu10k1.h
++++ b/include/sound/emu10k1.h
+@@ -1,2 +1,11 @@
+ #include <alsa/sound/type_compat.h>
+ #include <alsa/sound/uapi/emu10k1.h>
++#ifndef __emu10k1_type_defined
++#define __emu10k1_type_defined
++typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
++typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
++typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
++typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
++typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
++typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
++#endif
+diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h
+index 78fb745b..e8f93156 100644
+--- a/include/sound/hdsp.h
++++ b/include/sound/hdsp.h
+@@ -1,2 +1,12 @@
+ #include <alsa/sound/type_compat.h>
+ #include <alsa/sound/uapi/hdsp.h>
++#ifndef __hdsp_type_defined
++#define __hdsp_type_defined
++typedef enum HDSP_IO_Type HDSP_IO_Type;
++typedef struct hdsp_peak_rms hdsp_peak_rms_t;
++typedef struct hdsp_config_info hdsp_config_info_t;
++typedef struct hdsp_firmware hdsp_firmware_t;
++typedef struct hdsp_version hdsp_version_t;
++typedef struct hdsp_mixer hdsp_mixer_t;
++typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
++#endif
+diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h
+index af6d19ed..d9095d9f 100644
+--- a/include/sound/hdspm.h
++++ b/include/sound/hdspm.h
+@@ -1,2 +1,10 @@
+ #include <alsa/sound/type_compat.h>
+ #include <alsa/sound/uapi/hdspm.h>
++#ifndef __hdspm_type_defined
++#define __hdspm_type_defined
++typedef struct hdspm_peak_rms hdspm_peak_rms_t;
++typedef struct hdspm_config_info hdspm_config_info_t;
++typedef struct hdspm_version hdspm_version_t;
++typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
++typedef struct hdspm_mixer hdspm_mixer_t;
++#endif
+diff --git a/include/sound/sb16_csp.h b/include/sound/sb16_csp.h
+index 24121fcb..fd02bc56 100644
+--- a/include/sound/sb16_csp.h
++++ b/include/sound/sb16_csp.h
+@@ -1 +1,5 @@
+ #include <alsa/sound/uapi/sb16_csp.h>
++#ifndef __sb16_csp_type_defined
++#define __sb16_csp_type_defined
++typedef struct snd_sb_csp_microcode snd_sb_csp_microcode_t;
++#endif
+diff --git a/include/sound/uapi/emu10k1.h b/include/sound/uapi/emu10k1.h
+index c1150e4d..6bcd76f6 100644
+--- a/include/sound/uapi/emu10k1.h
++++ b/include/sound/uapi/emu10k1.h
+@@ -382,14 +382,4 @@ struct snd_emu10k1_fx8010_pcm_rec {
+ #define SNDRV_EMU10K1_IOCTL_SINGLE_STEP	_IOW ('H', 0x83, int)
+ #define SNDRV_EMU10K1_IOCTL_DBG_READ	_IOR ('H', 0x84, int)
+ 
+-#ifndef __KERNEL__
+-/* typedefs for compatibility to user-space */
+-typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
+-typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
+-typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
+-typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
+-typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
+-typedef struct emu10k1_ctl_elem_id emu10k1_ctl_elem_id_t;
+-#endif
+-
+ #endif /* _UAPI__SOUND_EMU10K1_H */
+diff --git a/include/sound/uapi/hdsp.h b/include/sound/uapi/hdsp.h
+index 88c92a3f..7ac2d3f2 100644
+--- a/include/sound/uapi/hdsp.h
++++ b/include/sound/uapi/hdsp.h
+@@ -97,13 +97,4 @@ struct hdsp_9632_aeb {
+ 
+ #define SNDRV_HDSP_IOCTL_GET_9632_AEB _IOR('H', 0x45, struct hdsp_9632_aeb)
+ 
+-/* typedefs for compatibility to user-space */
+-typedef enum HDSP_IO_Type HDSP_IO_Type;
+-typedef struct hdsp_peak_rms hdsp_peak_rms_t;
+-typedef struct hdsp_config_info hdsp_config_info_t;
+-typedef struct hdsp_firmware hdsp_firmware_t;
+-typedef struct hdsp_version hdsp_version_t;
+-typedef struct hdsp_mixer hdsp_mixer_t;
+-typedef struct hdsp_9632_aeb hdsp_9632_aeb_t;
+-
+ #endif /* __SOUND_HDSP_H */
+diff --git a/include/sound/uapi/hdspm.h b/include/sound/uapi/hdspm.h
+index 2d91f90e..3fbfd9dc 100644
+--- a/include/sound/uapi/hdspm.h
++++ b/include/sound/uapi/hdspm.h
+@@ -219,12 +219,4 @@ struct hdspm_mixer_ioctl {
+ /* use indirect access due to the limit of ioctl bit size */
+ #define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
+ 
+-/* typedefs for compatibility to user-space */
+-typedef struct hdspm_peak_rms hdspm_peak_rms_t;
+-typedef struct hdspm_config_info hdspm_config_info_t;
+-typedef struct hdspm_version hdspm_version_t;
+-typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
+-typedef struct hdspm_mixer hdspm_mixer_t;
+-
+-
+ #endif
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch
new file mode 100644
index 0000000..96dcd8a
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch
@@ -0,0 +1,41 @@
+From 4b6fe372c68d1ff50e7c161cffadeb298734f49c Mon Sep 17 00:00:00 2001
+From: paulhsia <paulhsia@chromium.org>
+Date: Sat, 30 Nov 2019 03:35:30 +0800
+Subject: [PATCH 1/5] ucm: Use strncmp to avoid access-out-of-boundary
+
+If the length of the identifier is less than the length of the prefix,
+access-out-of-boundary will occur in memcmp().
+
+Signed-off-by: paulhsia <paulhsia@chromium.org>
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+
+Upstream-Status: Backport
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ src/ucm/main.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index b0b6ffb3..252e50d9 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -61,11 +61,13 @@ static int check_identifier(const char *identifier, const char *prefix)
+ {
+ 	int len;
+ 
+-	if (strcmp(identifier, prefix) == 0)
+-		return 1;
+ 	len = strlen(prefix);
+-	if (memcmp(identifier, prefix, len) == 0 && identifier[len] == '/')
++	if (strncmp(identifier, prefix, len) != 0)
++		return 0;
++
++	if (identifier[len] == 0 || identifier[len] == '/')
+ 		return 1;
++
+ 	return 0;
+ }
+ 
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch
new file mode 100644
index 0000000..42973fb
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch
@@ -0,0 +1,45 @@
+From 58f9dc9bd12a51efa12dbc67e200f4d85cd3da07 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Fri, 29 Nov 2019 22:28:26 +0100
+Subject: [PATCH 2/5] ucm: return always at least NULL if no list is available
+ in snd_use_case_get_list()
+
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+
+Upstream-Status: Backport
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ src/ucm/main.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index 252e50d9..b80db65f 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -1160,8 +1160,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
+ 
+ 	modifier = find_modifier(uc_mgr, verb, name, 0);
+ 	if (modifier) {
+-		if (modifier->dev_list.type != type)
++		if (modifier->dev_list.type != type) {
++			*list = NULL;
+ 			return 0;
++		}
+ 		return get_list(&modifier->dev_list.list, list,
+ 				struct dev_list_node, list,
+ 				name);
+@@ -1169,8 +1171,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
+ 
+ 	device = find_device(uc_mgr, verb, name, 0);
+ 	if (device) {
+-		if (device->dev_list.type != type)
++		if (device->dev_list.type != type) {
++			*list = NULL;
+ 			return 0;
++		}
+ 		return get_list(&device->dev_list.list, list,
+ 				struct dev_list_node, list,
+ 				name);
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch
new file mode 100644
index 0000000..82f8b2b
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0003-namehint-correct-the-args-check.patch
@@ -0,0 +1,34 @@
+From 10f3401ce356a675e2440993457ee7c8c7e9fcf8 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Sun, 1 Dec 2019 14:26:40 +0100
+Subject: [PATCH 3/5] namehint: correct the @args check
+
+BugLink: https://github.com/alsa-project/alsa-plugins/issues/3
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+
+Upstream-Status: Backport
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ src/control/namehint.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/control/namehint.c b/src/control/namehint.c
+index 808df6b5..4927ef97 100644
+--- a/src/control/namehint.c
++++ b/src/control/namehint.c
+@@ -348,6 +348,12 @@ static int try_config(snd_config_t *config,
+ 		goto __cleanup;
+ 	if (snd_config_search(res, "@args", &cfg) >= 0) {
+ 		snd_config_for_each(i, next, cfg) {
++			/* skip the argument list */
++			snd_config_get_id(snd_config_iterator_entry(i), &str);
++			while (*str && *str >= '0' && *str <= '9') str++;
++			if (*str == '\0')
++				continue;
++			/* the argument definition must have the default */
+ 			if (snd_config_search(snd_config_iterator_entry(i),
+ 					      "default", NULL) < 0) {
+ 				err = -EINVAL;
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch b/poky/meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch
new file mode 100644
index 0000000..98192f6
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0004-namehint-improve-the-previous-patch-check-the-return.patch
@@ -0,0 +1,31 @@
+From 1fa6664d5f0cc7d21edceba6695a4c28543c2cab Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Sun, 1 Dec 2019 14:30:54 +0100
+Subject: [PATCH 4/5] namehint: improve the previous patch (check the returned
+ value)
+
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+
+Upstream-Status: Backport
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ src/control/namehint.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/control/namehint.c b/src/control/namehint.c
+index 4927ef97..60c48ae3 100644
+--- a/src/control/namehint.c
++++ b/src/control/namehint.c
+@@ -349,7 +349,8 @@ static int try_config(snd_config_t *config,
+ 	if (snd_config_search(res, "@args", &cfg) >= 0) {
+ 		snd_config_for_each(i, next, cfg) {
+ 			/* skip the argument list */
+-			snd_config_get_id(snd_config_iterator_entry(i), &str);
++			if (snd_config_get_id(snd_config_iterator_entry(i), &str) < 0)
++				continue;
+ 			while (*str && *str >= '0' && *str <= '9') str++;
+ 			if (*str == '\0')
+ 				continue;
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib/0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch b/poky/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 0000000..cbc0a4c
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib/0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch
@@ -0,0 +1,86 @@
+From 976f8f62238f0d837584adc7c31035bdb29b6d6f Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 3 Dec 2019 18:27:39 +0100
+Subject: [PATCH 5/5] ucm: Do not fail to parse configs on cards with an empty
+ CardComponents lists
+
+Since the UCM profiles for all Bay- and Cherry-Trail SST cards have been
+moved over to UCM2, parsing them fails with:
+
+ALSA lib ucm_subs.c:220:(uc_mgr_get_substituted_value) variable '${CardComponents}' is not defined in this context!
+
+This completely breaks audio support on all Bay- and Cherry-Trail devices.
+
+This is caused by these non-SOF ASoC using cards having an empty
+CardComponents list. Which in itself is fine, but is rejected by
+the ucm_subs.c code. This commit changes the ucm_subs code to accept
+an empty string as a valid value for CardComponents restoring audio
+functionality on these boards.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+
+Upstream-Status: Backport
+Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
+---
+ src/ucm/ucm_subs.c | 20 ++++++++++++--------
+ 1 file changed, 12 insertions(+), 8 deletions(-)
+
+diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
+index 00afa9e3..90e395f0 100644
+--- a/src/ucm/ucm_subs.c
++++ b/src/ucm/ucm_subs.c
+@@ -25,6 +25,7 @@
+  */
+ 
+ #include "ucm_local.h"
++#include <stdbool.h>
+ #include <sys/stat.h>
+ #include <limits.h>
+ 
+@@ -145,10 +146,11 @@ static char *rval_sysfs(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char
+ 	return strdup(path);
+ }
+ 
+-#define MATCH_VARIABLE(name, id, fcn)					\
++#define MATCH_VARIABLE(name, id, fcn, empty_ok)				\
+ 	if (strncmp((name), (id), sizeof(id) - 1) == 0) { 		\
+ 		rval = fcn(uc_mgr);					\
+ 		idsize = sizeof(id) - 1;				\
++		allow_empty = (empty_ok);				\
+ 		goto __rval;						\
+ 	}
+ 
+@@ -189,12 +191,14 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
+ 
+ 	while (*value) {
+ 		if (*value == '$' && *(value+1) == '{') {
+-			MATCH_VARIABLE(value, "${ConfName}", rval_conf_name);
+-			MATCH_VARIABLE(value, "${CardId}", rval_card_id);
+-			MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver);
+-			MATCH_VARIABLE(value, "${CardName}", rval_card_name);
+-			MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname);
+-			MATCH_VARIABLE(value, "${CardComponents}", rval_card_components);
++			bool allow_empty = false;
++
++			MATCH_VARIABLE(value, "${ConfName}", rval_conf_name, false);
++			MATCH_VARIABLE(value, "${CardId}", rval_card_id, false);
++			MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver, false);
++			MATCH_VARIABLE(value, "${CardName}", rval_card_name, false);
++			MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname, false);
++			MATCH_VARIABLE(value, "${CardComponents}", rval_card_components, true);
+ 			MATCH_VARIABLE2(value, "${env:", rval_env);
+ 			MATCH_VARIABLE2(value, "${sys:", rval_sysfs);
+ 			err = -EINVAL;
+@@ -208,7 +212,7 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
+ 			}
+ 			goto __error;
+ __rval:
+-			if (rval == NULL || rval[0] == '\0') {
++			if (rval == NULL || (!allow_empty && rval[0] == '\0')) {
+ 				free(rval);
+ 				strncpy(r, value, idsize);
+ 				r[idsize] = '\0';
+-- 
+2.20.1
+
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.9.bb b/poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.9.bb
deleted file mode 100644
index 2c63ee7..0000000
--- a/poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.9.bb
+++ /dev/null
@@ -1,41 +0,0 @@
-SUMMARY = "ALSA sound library"
-HOMEPAGE = "http://www.alsa-project.org"
-BUGTRACKER = "http://alsa-project.org/main/index.php/Bug_Tracking"
-SECTION = "libs/multimedia"
-LICENSE = "LGPLv2.1 & GPLv2+"
-LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7 \
-                    file://src/socket.c;md5=dd1bc7f44872690224d89c1a9806e495;beginline=1;endline=26 \
-                    "
-
-SRC_URI = "https://www.alsa-project.org/files/pub/lib/${BP}.tar.bz2"
-SRC_URI[md5sum] = "e6d429dbdcfaa0f034d907fa6dc3735e"
-SRC_URI[sha256sum] = "488373aef5396682f3a411a6d064ae0ad196b9c96269d0bb912fbdeec94b994b"
-
-inherit autotools pkgconfig
-
-EXTRA_OECONF += " \
-    ${@bb.utils.contains('TARGET_FPU', 'soft', '--with-softfloat', '', d)} \
-    --disable-python \
-"
-
-PACKAGES =+ "alsa-server alsa-conf alsa-doc"
-
-FILES_alsa-server = "${bindir}/*"
-FILES_alsa-conf = "${datadir}/alsa/"
-
-RDEPENDS_${PN}_class-target = "alsa-conf"
-
-# upgrade path
-RPROVIDES_${PN} = "libasound"
-RREPLACES_${PN} = "libasound"
-RCONFLICTS_${PN} = "libasound"
-
-RPROVIDES_${PN}-dev = "alsa-dev"
-RREPLACES_${PN}-dev = "alsa-dev"
-RCONFLICTS_${PN}-dev = "alsa-dev"
-
-RPROVIDES_alsa-conf = "alsa-conf-base"
-RREPLACES_alsa-conf = "alsa-conf-base"
-RCONFLICTS_alsa-conf = "alsa-conf-base"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-lib_1.2.1.2.bb b/poky/meta/recipes-multimedia/alsa/alsa-lib_1.2.1.2.bb
new file mode 100644
index 0000000..e2bc61f
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-lib_1.2.1.2.bb
@@ -0,0 +1,52 @@
+SUMMARY = "ALSA sound library"
+HOMEPAGE = "http://www.alsa-project.org"
+BUGTRACKER = "http://alsa-project.org/main/index.php/Bug_Tracking"
+SECTION = "libs/multimedia"
+LICENSE = "LGPLv2.1 & GPLv2+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7 \
+                    file://src/socket.c;md5=285675b45e83f571c6a957fe4ab79c93;beginline=9;endline=24 \
+                    "
+
+SRC_URI = "https://www.alsa-project.org/files/pub/lib/${BP}.tar.bz2 \
+           file://0001-configure.ac-remove-an-unnecessary-libtool-fix.patch \
+           file://0001-ucm-Use-strncmp-to-avoid-access-out-of-boundary.patch \
+           file://0002-ucm-return-always-at-least-NULL-if-no-list-is-availa.patch \
+           file://0003-namehint-correct-the-args-check.patch \
+           file://0004-namehint-improve-the-previous-patch-check-the-return.patch \
+           file://0005-ucm-Do-not-fail-to-parse-configs-on-cards-with-an-em.patch \
+           file://0001-Fix-alsa-sound-.h-for-external-programs.patch \
+           file://0001-uapi-Move-typedefs-from-uapi-to-sound.patch \
+           "
+SRC_URI[md5sum] = "82ddd3698469beec147e4f4a67134ea0"
+SRC_URI[sha256sum] = "958e260e3673f1f6ff6b2d2c0df3fc2e469bea5b2957163ce96ce17f23e87943"
+
+inherit autotools pkgconfig
+
+EXTRA_OECONF += " \
+    ${@bb.utils.contains('TARGET_FPU', 'soft', '--with-softfloat', '', d)} \
+    --disable-python \
+"
+
+PACKAGES =+ "alsa-server alsa-conf libatopology"
+
+FILES_alsa-server = "${bindir}/*"
+FILES_alsa-conf = "${datadir}/alsa/"
+FILES_libatopology = "${libdir}/libatopology.so.*"
+
+RDEPENDS_${PN}_class-target = "alsa-conf alsa-ucm-conf"
+RDEPENDS_libatopology_class-target = "alsa-topology-conf"
+
+# upgrade path
+RPROVIDES_${PN} = "libasound"
+RREPLACES_${PN} = "libasound"
+RCONFLICTS_${PN} = "libasound"
+
+RPROVIDES_${PN}-dev = "alsa-dev"
+RREPLACES_${PN}-dev = "alsa-dev"
+RCONFLICTS_${PN}-dev = "alsa-dev"
+
+RPROVIDES_alsa-conf = "alsa-conf-base"
+RREPLACES_alsa-conf = "alsa-conf-base"
+RCONFLICTS_alsa-conf = "alsa-conf-base"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.9.bb b/poky/meta/recipes-multimedia/alsa/alsa-plugins_1.2.1.bb
similarity index 97%
rename from poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.9.bb
rename to poky/meta/recipes-multimedia/alsa/alsa-plugins_1.2.1.bb
index b94fc5c..9882e12 100644
--- a/poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.9.bb
+++ b/poky/meta/recipes-multimedia/alsa/alsa-plugins_1.2.1.bb
@@ -21,8 +21,8 @@
 "
 
 SRC_URI = "https://www.alsa-project.org/files/pub/plugins/${BP}.tar.bz2"
-SRC_URI[md5sum] = "e0caffbd849c51ed81751378f56cb563"
-SRC_URI[sha256sum] = "161772303da521abbbf1d91f63b470c4791392d5728f2192a42d71292078f907"
+SRC_URI[md5sum] = "5b11cd3ec92e5f9190ec378565b529e8"
+SRC_URI[sha256sum] = "4d94de7ad41734b8604a652521200bb6554fcf0c2c00fdbd302b1710d76548da"
 
 DEPENDS += "alsa-lib"
 
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-topology-conf_1.2.1.bb b/poky/meta/recipes-multimedia/alsa/alsa-topology-conf_1.2.1.bb
new file mode 100644
index 0000000..add1f30
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-topology-conf_1.2.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "ALSA topology configuration files"
+HOMEPAGE = "https://alsa-project.org"
+BUGTRACKER = "https://alsa-project.org/wiki/Bug_Tracking"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=20d74d74db9741697903372ad001d3b4"
+
+# The tarball doesn't have any toplevel directory. The subdir option tells
+# Bitbake to unpack the archive to the correct place.
+SRC_URI = "https://www.alsa-project.org/files/pub/lib/${BP}.tar.bz2;subdir=${BP}"
+SRC_URI[md5sum] = "7fdf5fff3f1e0603456e719f6033e922"
+SRC_URI[sha256sum] = "354a43f4031c98bef1349ac722d83b2603ef439f81a1ab1eba8814c28243a9b2"
+
+inherit allarch
+
+do_install() {
+        install -d ${D}/usr/share/alsa
+        cp -r ${S}/topology ${D}/usr/share/alsa
+}
+
+PACKAGES = "${PN}"
+
+FILES_${PN} = "*"
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-ucm-conf_1.2.1.2.bb b/poky/meta/recipes-multimedia/alsa/alsa-ucm-conf_1.2.1.2.bb
new file mode 100644
index 0000000..469d1f7
--- /dev/null
+++ b/poky/meta/recipes-multimedia/alsa/alsa-ucm-conf_1.2.1.2.bb
@@ -0,0 +1,23 @@
+SUMMARY = "ALSA Use Case Manager configuration"
+HOMEPAGE = "https://alsa-project.org"
+BUGTRACKER = "https://alsa-project.org/wiki/Bug_Tracking"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=20d74d74db9741697903372ad001d3b4"
+
+# The tarball doesn't have any toplevel directory. The subdir option tells
+# Bitbake to unpack the archive to the correct place.
+SRC_URI = "https://www.alsa-project.org/files/pub/lib/${BP}.tar.bz2;subdir=${BP}"
+SRC_URI[md5sum] = "b7fa43cfd79df978184a6333766d2a50"
+SRC_URI[sha256sum] = "ea8a86875f4cf430d49a662a04a6d6c606c5c9d67e54cb944c4d77b24554062f"
+
+inherit allarch
+
+do_install() {
+        install -d ${D}/usr/share/alsa
+        cp -r ${S}/ucm ${D}/usr/share/alsa
+        cp -r ${S}/ucm2 ${D}/usr/share/alsa
+}
+
+PACKAGES = "${PN}"
+
+FILES_${PN} = "*"
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.1.9.bb b/poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.2.1.bb
similarity index 100%
rename from poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.1.9.bb
rename to poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.2.1.bb
diff --git a/poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.9.bb b/poky/meta/recipes-multimedia/alsa/alsa-utils_1.2.1.bb
similarity index 94%
rename from poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.9.bb
rename to poky/meta/recipes-multimedia/alsa/alsa-utils_1.2.1.bb
index 03b5c8d..9144af6 100644
--- a/poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.9.bb
+++ b/poky/meta/recipes-multimedia/alsa/alsa-utils_1.2.1.bb
@@ -4,7 +4,7 @@
 SECTION = "console/utils"
 LICENSE = "GPLv2+"
 LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
-                    file://alsactl/utils.c;beginline=1;endline=20;md5=2ce7f7b6739487fb72c689d46521f958"
+                    file://alsactl/utils.c;beginline=3;endline=18;md5=96cc06a4cebe5eb7975688ffb0e65642"
 DEPENDS = "alsa-lib ncurses libsamplerate0"
 
 PACKAGECONFIG ??= "udev"
@@ -21,8 +21,8 @@
 
 # alsa-utils specified in SRC_URI due to alsa-utils-scripts recipe
 SRC_URI = "https://www.alsa-project.org/files/pub/utils/alsa-utils-${PV}.tar.bz2"
-SRC_URI[md5sum] = "5ed21c3e296c06046cc986e732f625f6"
-SRC_URI[sha256sum] = "5ddf2cbddb4bd1a4a2a6492a09c25898b08c3ad64893c3655be14194cf0a213a"
+SRC_URI[md5sum] = "c4628bae7632937eac2de4cf2a3de82e"
+SRC_URI[sha256sum] = "0b110ba71ef41d3009db1bc4dcae0cf79efb99cb5426fa19d0312470560a2c0d"
 
 # On build machines with python-docutils (not python3-docutils !!) installed
 # rst2man (not rst2man.py) is detected and compile fails with
@@ -56,6 +56,7 @@
 RDEPENDS_${PN} += "${ALSA_UTILS_PKGS}"
 
 FILES_${PN} = ""
+ALLOW_EMPTY_alsa-utils = "1"
 FILES_alsa-utils-alsabat     = "${bindir}/alsabat"
 FILES_alsa-utils-alsatplg    = "${bindir}/alsatplg"
 FILES_alsa-utils-aplay       = "${bindir}/aplay ${bindir}/arecord ${bindir}/axfer"
@@ -88,8 +89,6 @@
 
 RRECOMMENDS_alsa-utils-alsactl = "alsa-states"
 
-ALLOW_EMPTY_alsa-utils = "1"
-
 do_install() {
 	autotools_do_install