diff --git a/.alsa-lib.metadata b/.alsa-lib.metadata
index 533b623..41cbb81 100644
--- a/.alsa-lib.metadata
+++ b/.alsa-lib.metadata
@@ -1,3 +1,3 @@
-5404393a44906f92ba87189b6fd7fa0c031a037e SOURCES/alsa-lib-1.2.4.tar.bz2
-ec30157ecb964594f630dc193f964ddb2ad8bc57 SOURCES/alsa-topology-conf-1.2.4.tar.bz2
-0883058d77c2516d1e2638e16d59e8693dd2e467 SOURCES/alsa-ucm-conf-1.2.4.tar.bz2
+66669eca0b5ab98985082d4971316a29d2a2cbbf SOURCES/alsa-lib-1.2.5.tar.bz2
+8c1d225b9fe108797349e8d0cb6161271aab0f50 SOURCES/alsa-topology-conf-1.2.5.tar.bz2
+d2011adda869a9e1d78a6b029252f2a8cd6a68f6 SOURCES/alsa-ucm-conf-1.2.5.tar.bz2
diff --git a/.gitignore b/.gitignore
index 6df8c62..60b4c6a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-SOURCES/alsa-lib-1.2.4.tar.bz2
-SOURCES/alsa-topology-conf-1.2.4.tar.bz2
-SOURCES/alsa-ucm-conf-1.2.4.tar.bz2
+SOURCES/alsa-lib-1.2.5.tar.bz2
+SOURCES/alsa-topology-conf-1.2.5.tar.bz2
+SOURCES/alsa-ucm-conf-1.2.5.tar.bz2
diff --git a/SOURCES/alsa-git.patch b/SOURCES/alsa-git.patch
index 5132808..ec8ecb5 100644
--- a/SOURCES/alsa-git.patch
+++ b/SOURCES/alsa-git.patch
@@ -1,2459 +1,1079 @@
-From ad8c8e5503980295dd8e5e54a6285d2d7e32eb1e Mon Sep 17 00:00:00 2001
+From ddfc32abf5697de1618b9e7ffdf57a0f97013090 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 22 Oct 2020 20:57:32 +0200
-Subject: [PATCH 01/49] dlmisc: the snd_plugin_dir_set / snd_plugin_dir must be
- declared even for \!DL_ORIGIN_AVAILABLE
+Date: Wed, 2 Jun 2021 08:49:32 +0200
+Subject: [PATCH 01/28] conf: fix load_for_all_cards()
 
-Fixes: 8580c081c2 ("dlsym: add support for ALSA_PLUGIN_DIR environment variable")
-BugLink: https://github.com/alsa-project/alsa-lib/issues/91
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/dlmisc.c | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/src/dlmisc.c b/src/dlmisc.c
-index c9517c55..f20eb593 100644
---- a/src/dlmisc.c
-+++ b/src/dlmisc.c
-@@ -42,11 +42,9 @@
- #ifndef PIC
- struct snd_dlsym_link *snd_dlsym_start = NULL;
- #endif
--#ifdef DL_ORIGIN_AVAILABLE
- static int snd_plugin_dir_set = 0;
- static char *snd_plugin_dir = NULL;
- #endif
--#endif
- 
- #if defined(DL_ORIGIN_AVAILABLE) && defined(HAVE_LIBPTHREAD)
- static pthread_mutex_t snd_dlpath_mutex = PTHREAD_MUTEX_INITIALIZER;
--- 
-2.29.2
+The 63f7745b commit is loading the driver specific configuration
+multiple times which ends with the array merges (see the bug).
 
+Introduce the loaded compound which traces the already loaded
+driver configurations and skip the multiple load requests.
 
-From 1d993b37ab4e0b9b6e6b795d7be84ce97b29e20b Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 29 Oct 2020 20:31:19 +0100
-Subject: [PATCH 02/49] dlmisc: fix snd_plugin_dir locking for not
- DL_ORIGIN_AVAILABLE
-
-Fixes: 8580c081c2 ("dlsym: add support for ALSA_PLUGIN_DIR environment variable")
+Fixes: https://github.com/alsa-project/alsa-lib/issues/143
+Fixes: 63f7745b ("conf: extend load_for_all_cards hook (id/value table)")
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/dlmisc.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/src/dlmisc.c b/src/dlmisc.c
-index f20eb593..1dd91356 100644
---- a/src/dlmisc.c
-+++ b/src/dlmisc.c
-@@ -46,7 +46,7 @@ static int snd_plugin_dir_set = 0;
- static char *snd_plugin_dir = NULL;
- #endif
- 
--#if defined(DL_ORIGIN_AVAILABLE) && defined(HAVE_LIBPTHREAD)
-+#ifdef HAVE_LIBPTHREAD
- static pthread_mutex_t snd_dlpath_mutex = PTHREAD_MUTEX_INITIALIZER;
- 
- static inline void snd_dlpath_lock(void)
-@@ -440,12 +440,10 @@ void snd_dlobj_cache_cleanup(void)
- 		free(c);
- 	}
- 	snd_dlobj_unlock();
--#ifdef DL_ORIGIN_AVAILABLE
- 	snd_dlpath_lock();
- 	snd_plugin_dir_set = 0;
- 	free(snd_plugin_dir);
- 	snd_plugin_dir = NULL;
- 	snd_dlpath_unlock();
--#endif
- }
- #endif
--- 
-2.29.2
-
-
-From 2757191e3b85d491705b31c6ecca2dbd96d26ade Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 29 Oct 2020 20:34:17 +0100
-Subject: [PATCH 03/49] pcm: snd_pcm_mmap_readi - fix typo in comment
-
-\param size frames to be *read*
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_mmap.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/pcm/pcm_mmap.c b/src/pcm/pcm_mmap.c
-index 9600c383..9cbaae05 100644
---- a/src/pcm/pcm_mmap.c
-+++ b/src/pcm/pcm_mmap.c
-@@ -183,7 +183,7 @@ snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_ufram
-  * \brief Read interleaved frames from a PCM using direct buffer (mmap)
-  * \param pcm PCM handle
-  * \param buffer frames containing buffer
-- * \param size frames to be written
-+ * \param size frames to be read
-  * \return a positive number of frames actually read otherwise a
-  * negative error code
-  * \retval -EBADFD PCM is not in the right state (#SND_PCM_STATE_PREPARED or #SND_PCM_STATE_RUNNING)
--- 
-2.29.2
-
-
-From 39bd0e1a5be3620f9123f7fe72ffa6cb7d463b21 Mon Sep 17 00:00:00 2001
-From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Date: Thu, 12 Nov 2020 10:29:38 -0600
-Subject: [PATCH 04/49] topology: use inclusive language for bclk
-
-use bclk_provider for structure fields, 'codec_provider' and
-'codec_consumer' for options and modify #defines to use CP and CC
-suffixes.
-
-Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- include/sound/uapi/asoc.h | 11 +++++++----
- include/topology.h        |  2 +-
- src/topology/pcm.c        | 36 ++++++++++++++++++++++++++----------
- 3 files changed, 34 insertions(+), 15 deletions(-)
-
-diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
-index 4efb4ec4..ceafb1a9 100644
---- a/include/sound/uapi/asoc.h
-+++ b/include/sound/uapi/asoc.h
-@@ -169,10 +169,13 @@
- #define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP            (1 << 3)
- 
- /* DAI topology BCLK parameter
-- * For the backwards capability, by default codec is bclk master
-+ * For the backwards capability, by default codec is bclk provider
-  */
--#define SND_SOC_TPLG_BCLK_CM         0 /* codec is bclk master */
--#define SND_SOC_TPLG_BCLK_CS         1 /* codec is bclk slave */
-+#define SND_SOC_TPLG_BCLK_CP         0 /* codec is bclk provider */
-+#define SND_SOC_TPLG_BCLK_CC         1 /* codec is bclk consumer */
-+/* keep previous definitions for compatibility */
-+#define SND_SOC_TPLG_BCLK_CM         SND_SOC_TPLG_BCLK_CP
-+#define SND_SOC_TPLG_BCLK_CS         SND_SOC_TPLG_BCLK_CC
- 
- /* DAI topology FSYNC parameter
-  * For the backwards capability, by default codec is fsync master
-@@ -335,7 +338,7 @@ struct snd_soc_tplg_hw_config {
- 	__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 bclk_provider;	/* 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 */
-diff --git a/include/topology.h b/include/topology.h
-index 1f52e66e..6c970649 100644
---- a/include/topology.h
-+++ b/include/topology.h
-@@ -1028,7 +1028,7 @@ struct snd_tplg_hw_config_template {
- 	unsigned char clock_gated;      /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
- 	unsigned char  invert_bclk;     /* 1 for inverted BCLK, 0 for normal */
- 	unsigned char  invert_fsync;    /* 1 for inverted frame clock, 0 for normal */
--	unsigned char  bclk_master;     /* SND_SOC_TPLG_BCLK_ value */
-+	unsigned char  bclk_provider;   /* SND_SOC_TPLG_BCLK_ value */
- 	unsigned char  fsync_master;    /* SND_SOC_TPLG_FSYNC_ value */
- 	unsigned char  mclk_direction;  /* SND_SOC_TPLG_MCLK_ value */
- 	unsigned short reserved;        /* for 32bit alignment */
-diff --git a/src/topology/pcm.c b/src/topology/pcm.c
-index 191b7a0a..f05df348 100644
---- a/src/topology/pcm.c
-+++ b/src/topology/pcm.c
-@@ -1411,6 +1411,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
- 	snd_config_t *n;
- 	const char *id, *val = NULL;
- 	int ret, ival;
-+	bool provider_legacy;
- 
- 	elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_HW_CONFIG);
- 	if (!elem)
-@@ -1451,8 +1452,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
- 			continue;
- 		}
- 
--		if (strcmp(id, "bclk") == 0 ||
--		    strcmp(id, "bclk_master") == 0) {
-+		provider_legacy = false;
-+		if (strcmp(id, "bclk_master") == 0) {
-+			SNDERR("deprecated option %s, please use 'bclk'\n", id);
-+			provider_legacy = true;
-+		}
-+
-+		if (provider_legacy ||
-+		    strcmp(id, "bclk") == 0) {
-+
- 			if (snd_config_get_string(n, &val) < 0)
- 				return -EINVAL;
- 
-@@ -1462,11 +1470,19 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
- 				 */
- 				SNDERR("deprecated bclk value '%s'", val);
- 
--				hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
-+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
- 			} else if (!strcmp(val, "codec_slave")) {
--				hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
-+				SNDERR("deprecated bclk value '%s', use 'codec_consumer'", val);
-+
-+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
-+			} else if (!strcmp(val, "codec_consumer")) {
-+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
- 			} else if (!strcmp(val, "codec_master")) {
--				hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CM;
-+				SNDERR("deprecated bclk value '%s', use 'codec_provider", val);
-+
-+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CP;
-+			} else if (!strcmp(val, "codec_provider")) {
-+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CP;
- 			}
- 			continue;
- 		}
-@@ -1623,10 +1639,10 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
- 	if (err >= 0 && hc->fmt)
- 		err = tplg_save_printf(dst, pfx, "\tformat '%s'\n",
- 				       get_audio_hw_format_name(hc->fmt));
--	if (err >= 0 && hc->bclk_master)
-+	if (err >= 0 && hc->bclk_provider)
- 		err = tplg_save_printf(dst, pfx, "\tbclk '%s'\n",
--				       hc->bclk_master == SND_SOC_TPLG_BCLK_CS ?
--						"codec_slave" : "codec_master");
-+				       hc->bclk_provider == SND_SOC_TPLG_BCLK_CC ?
-+						"codec_consumer" : "codec_provider");
- 	if (err >= 0 && hc->bclk_rate)
- 		err = tplg_save_printf(dst, pfx, "\tbclk_freq %u\n",
- 				       hc->bclk_rate);
-@@ -1791,7 +1807,7 @@ static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
- 	cfg->clock_gated = tpl->clock_gated;
- 	cfg->invert_bclk = tpl->invert_bclk;
- 	cfg->invert_fsync = tpl->invert_fsync;
--	cfg->bclk_master = tpl->bclk_master;
-+	cfg->bclk_provider = tpl->bclk_provider;
- 	cfg->fsync_master = tpl->fsync_master;
- 	cfg->mclk_direction = tpl->mclk_direction;
- 	cfg->reserved = tpl->reserved;
-@@ -2174,7 +2190,7 @@ next:
- 		hw->clock_gated = link->hw_config[i].clock_gated;
- 		hw->invert_bclk = link->hw_config[i].invert_bclk;
- 		hw->invert_fsync = link->hw_config[i].invert_fsync;
--		hw->bclk_master = link->hw_config[i].bclk_master;
-+		hw->bclk_provider = link->hw_config[i].bclk_provider;
- 		hw->fsync_master = link->hw_config[i].fsync_master;
- 		hw->mclk_direction = link->hw_config[i].mclk_direction;
- 		hw->mclk_rate = link->hw_config[i].mclk_rate;
--- 
-2.29.2
-
-
-From 706192341d1d0bbb906d690b227b9dee5c1fc4b5 Mon Sep 17 00:00:00 2001
-From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Date: Thu, 12 Nov 2020 10:29:39 -0600
-Subject: [PATCH 05/49] topology: use inclusive language for fsync
-
-use fsync_provider for structure fields, 'codec_provider' and
-'codec_consumer' for options and modify #defines to use CP and CC
-suffixes.
+ src/conf.c | 33 ++++++++++++++++++++++++++++-----
+ 1 file changed, 28 insertions(+), 5 deletions(-)
 
-Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- include/sound/uapi/asoc.h | 11 +++++++----
- include/topology.h        |  2 +-
- src/topology/pcm.c        | 37 ++++++++++++++++++++++++++-----------
- 3 files changed, 34 insertions(+), 16 deletions(-)
-
-diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
-index ceafb1a9..f32c5697 100644
---- a/include/sound/uapi/asoc.h
-+++ b/include/sound/uapi/asoc.h
-@@ -178,10 +178,13 @@
- #define SND_SOC_TPLG_BCLK_CS         SND_SOC_TPLG_BCLK_CC
- 
- /* DAI topology FSYNC parameter
-- * For the backwards capability, by default codec is fsync master
-+ * For the backwards capability, by default codec is fsync provider
-  */
--#define SND_SOC_TPLG_FSYNC_CM         0 /* codec is fsync master */
--#define SND_SOC_TPLG_FSYNC_CS         1 /* codec is fsync slave */
-+#define SND_SOC_TPLG_FSYNC_CP         0 /* codec is fsync provider */
-+#define SND_SOC_TPLG_FSYNC_CC         1 /* codec is fsync consumer */
-+/* keep previous definitions for compatibility */
-+#define SND_SOC_TPLG_FSYNC_CM         SND_SOC_TPLG_FSYNC_CP
-+#define SND_SOC_TPLG_FSYNC_CS         SND_SOC_TPLG_FSYNC_CC
- 
- /*
-  * Block Header.
-@@ -339,7 +342,7 @@ struct snd_soc_tplg_hw_config {
- 	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
- 	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
- 	__u8 bclk_provider;	/* SND_SOC_TPLG_BCLK_ value */
--	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
-+	__u8 fsync_provider;	/* 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 */
-diff --git a/include/topology.h b/include/topology.h
-index 6c970649..4ade20df 100644
---- a/include/topology.h
-+++ b/include/topology.h
-@@ -1029,7 +1029,7 @@ struct snd_tplg_hw_config_template {
- 	unsigned char  invert_bclk;     /* 1 for inverted BCLK, 0 for normal */
- 	unsigned char  invert_fsync;    /* 1 for inverted frame clock, 0 for normal */
- 	unsigned char  bclk_provider;   /* SND_SOC_TPLG_BCLK_ value */
--	unsigned char  fsync_master;    /* SND_SOC_TPLG_FSYNC_ value */
-+	unsigned char  fsync_provider;  /* SND_SOC_TPLG_FSYNC_ value */
- 	unsigned char  mclk_direction;  /* SND_SOC_TPLG_MCLK_ value */
- 	unsigned short reserved;        /* for 32bit alignment */
- 	unsigned int mclk_rate;	        /* MCLK or SYSCLK freqency in Hz */
-diff --git a/src/topology/pcm.c b/src/topology/pcm.c
-index f05df348..c8f41862 100644
---- a/src/topology/pcm.c
-+++ b/src/topology/pcm.c
-@@ -1504,8 +1504,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
- 			continue;
- 		}
- 
--		if (strcmp(id, "fsync") == 0 ||
--		    strcmp(id, "fsync_master") == 0) {
-+		provider_legacy = false;
-+		if (strcmp(id, "fsync_master") == 0) {
-+			SNDERR("deprecated option %s, please use 'fsync'\n", id);
-+			provider_legacy = true;
-+		}
-+
-+		if (provider_legacy ||
-+		    strcmp(id, "fsync") == 0) {
-+
- 			if (snd_config_get_string(n, &val) < 0)
- 				return -EINVAL;
- 
-@@ -1515,11 +1522,19 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
- 				 */
- 				SNDERR("deprecated fsync value '%s'", val);
- 
--				hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
-+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
- 			} else if (!strcmp(val, "codec_slave")) {
--				hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
-+				SNDERR("deprecated fsync value '%s', use 'codec_consumer'", val);
-+
-+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
-+			} else if (!strcmp(val, "codec_consumer")) {
-+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
- 			} else if (!strcmp(val, "codec_master")) {
--				hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CM;
-+				SNDERR("deprecated fsync value '%s', use 'codec_provider'", val);
-+
-+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CP;
-+			} else if (!strcmp(val, "codec_provider")) {
-+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CP;
+diff --git a/src/conf.c b/src/conf.c
+index f6c80031..d863dec6 100644
+--- a/src/conf.c
++++ b/src/conf.c
+@@ -4325,18 +4325,23 @@ static int _snd_config_hook_table(snd_config_t *root, snd_config_t *config, snd_
+ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config, snd_config_t **dst, snd_config_t *private_data ATTRIBUTE_UNUSED)
+ {
+ 	int card = -1, err;
++	snd_config_t *loaded;	// trace loaded cards
+ 	
++	err = snd_config_top(&loaded);
++	if (err < 0)
++		return err;
+ 	do {
+ 		err = snd_card_next(&card);
+ 		if (err < 0)
+-			return err;
++			goto __fin_err;
+ 		if (card >= 0) {
+-			snd_config_t *n, *private_data = NULL;
++			snd_config_t *n, *m, *private_data = NULL;
+ 			const char *driver;
+ 			char *fdriver = NULL;
++			bool load;
+ 			err = snd_determine_driver(card, &fdriver);
+ 			if (err < 0)
+-				return err;
++				goto __fin_err;
+ 			if (snd_config_search(root, fdriver, &n) >= 0) {
+ 				if (snd_config_get_string(n, &driver) < 0) {
+ 					if (snd_config_get_type(n) == SND_CONFIG_TYPE_COMPOUND) {
+@@ -4357,6 +4362,19 @@ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config,
+ 				driver = fdriver;
  			}
- 			continue;
+ 		      __std:
++			load = true;
++			err = snd_config_imake_integer(&m, driver, 1);
++			if (err < 0)
++				goto __err;
++			err = snd_config_add(loaded, m);
++			if (err < 0) {
++				if (err == -EEXIST) {
++					snd_config_delete(m);
++					load = false;
++				} else {
++					goto __err;
++				}
++			}
+ 			private_data = _snd_config_hook_private_data(card, driver);
+ 			if (!private_data) {
+ 				err = -ENOMEM;
+@@ -4365,17 +4383,22 @@ int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config,
+ 			err = _snd_config_hook_table(root, config, private_data);
+ 			if (err < 0)
+ 				goto __err;
+-			err = snd_config_hook_load(root, config, &n, private_data);
++			if (load)
++				err = snd_config_hook_load(root, config, &n, private_data);
+ 		      __err:
+ 			if (private_data)
+ 				snd_config_delete(private_data);
+ 			free(fdriver);
+ 			if (err < 0)
+-				return err;
++				goto __fin_err;
  		}
-@@ -1648,10 +1663,10 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
- 				       hc->bclk_rate);
- 	if (err >= 0 && hc->invert_bclk)
- 		err = tplg_save_printf(dst, pfx, "\tbclk_invert 1\n");
--	if (err >= 0 && hc->fsync_master)
--		err = tplg_save_printf(dst, pfx, "\tfsync_master '%s'\n",
--				       hc->fsync_master == SND_SOC_TPLG_FSYNC_CS ?
--						"codec_slave" : "codec_master");
-+	if (err >= 0 && hc->fsync_provider)
-+		err = tplg_save_printf(dst, pfx, "\tfsync_provider '%s'\n",
-+				       hc->fsync_provider == SND_SOC_TPLG_FSYNC_CC ?
-+						"codec_consumer" : "codec_provider");
- 	if (err >= 0 && hc->fsync_rate)
- 		err = tplg_save_printf(dst, pfx, "\tfsync_freq %u\n",
- 				       hc->fsync_rate);
-@@ -1808,7 +1823,7 @@ static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
- 	cfg->invert_bclk = tpl->invert_bclk;
- 	cfg->invert_fsync = tpl->invert_fsync;
- 	cfg->bclk_provider = tpl->bclk_provider;
--	cfg->fsync_master = tpl->fsync_master;
-+	cfg->fsync_provider = tpl->fsync_provider;
- 	cfg->mclk_direction = tpl->mclk_direction;
- 	cfg->reserved = tpl->reserved;
- 	cfg->mclk_rate = tpl->mclk_rate;
-@@ -2191,7 +2206,7 @@ next:
- 		hw->invert_bclk = link->hw_config[i].invert_bclk;
- 		hw->invert_fsync = link->hw_config[i].invert_fsync;
- 		hw->bclk_provider = link->hw_config[i].bclk_provider;
--		hw->fsync_master = link->hw_config[i].fsync_master;
-+		hw->fsync_provider = link->hw_config[i].fsync_provider;
- 		hw->mclk_direction = link->hw_config[i].mclk_direction;
- 		hw->mclk_rate = link->hw_config[i].mclk_rate;
- 		hw->bclk_rate = link->hw_config[i].bclk_rate;
+ 	} while (card >= 0);
++	snd_config_delete(loaded);
+ 	*dst = NULL;
+ 	return 0;
++__fin_err:
++	snd_config_delete(loaded);
++	return err;
+ }
+ #ifndef DOC_HIDDEN
+ SND_DLSYM_BUILD_VERSION(snd_config_hook_load_for_all_cards, SND_CONFIG_DLSYM_VERSION_HOOK);
 -- 
-2.29.2
+2.30.2
 
 
-From e5c350d7bc6f3d45702059c0ae8d32b3603273c1 Mon Sep 17 00:00:00 2001
-From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Date: Thu, 12 Nov 2020 10:29:40 -0600
-Subject: [PATCH 06/49] topology: use inclusive language in documentation
+From 0e4ba2ea8c0402f12a645032a14693eb9b1278e6 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Wed, 2 Jun 2021 11:09:43 +0200
+Subject: [PATCH 02/28] ucm: add _alibpref to get the private device prefix
 
-Use codec_provider and codec_consumer for bclk and fsync
+It may be useful to get the device prefix for the local configuration.
 
-Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1251
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- include/topology.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/include/topology.h b/include/topology.h
-index 4ade20df..d1feee4d 100644
---- a/include/topology.h
-+++ b/include/topology.h
-@@ -658,8 +658,8 @@ extern "C" {
-  *
-  *	id "1"				# used for binding to the config
-  *	format "I2S"			# physical audio format.
-- *	bclk   "master"			# Platform is master of bit clock
-- *	fsync  "slave"			# Platform is slave of fsync
-+ *	bclk   "codec_provider"		# Codec provides the bit clock
-+ *	fsync  "codec_consumer"		# Codec follows the fsync
-  * }
-  * </pre>
+ include/use-case.h |  1 +
+ src/ucm/main.c     | 21 +++++++++++++++++++++
+ 2 files changed, 22 insertions(+)
+
+diff --git a/include/use-case.h b/include/use-case.h
+index ec1a97b0..7890358b 100644
+--- a/include/use-case.h
++++ b/include/use-case.h
+@@ -258,6 +258,7 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
+  *   - _verb		- return current verb
+  *   - _file		- return configuration file loaded for current card
+  *   - _alibcfg		- return private alsa-lib's configuration for current card
++ *   - _alibpref	- return private alsa-lib's configuration device prefix for current card
   *
--- 
-2.29.2
-
-
-From 7d36895225d09ae26868997382445cc7ad2e9513 Mon Sep 17 00:00:00 2001
-From: Jonas Holmberg <jonashg@axis.com>
-Date: Wed, 4 Nov 2020 14:49:56 +0100
-Subject: [PATCH 07/49] pcm: set the snd_pcm_ioplug_status() tstamp field
-
-Set the status tstamp field so that it can be accessed with
-snd_pcm_status_get_htstamp().
-
-Signed-off-by: Jonas Holmberg <jonashg@axis.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/pcm/pcm_ioplug.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
-index a437ca32..9b1b8ac3 100644
---- a/src/pcm/pcm_ioplug.c
-+++ b/src/pcm/pcm_ioplug.c
-@@ -115,6 +115,7 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	snd_pcm_ioplug_hw_ptr_update(pcm);
- 	status->state = io->data->state;
- 	status->trigger_tstamp = io->trigger_tstamp;
-+	gettimestamp(&status->tstamp, pcm->tstamp_type);
- 	status->avail = snd_pcm_mmap_avail(pcm);
- 	status->avail_max = io->avail_max;
+  *   - [=]{NAME}[/[{modifier}|{/device}][/{verb}]]
+  *                      - value identifier {NAME}
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index 361952f6..3c9ea15d 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -2138,6 +2138,25 @@ static int get_alibcfg(snd_use_case_mgr_t *uc_mgr, char **str)
  	return 0;
--- 
-2.29.2
-
-
-From 6d3311fefb1b41c7484fd728e4ad4a6fb5b55ad4 Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Thu, 10 Dec 2020 10:36:41 +0100
-Subject: [PATCH 08/49] Makefile: Add README.md to EXTRA_DIST
-
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- Makefile.am | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/Makefile.am b/Makefile.am
-index c484d4da..ff4c963a 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -16,7 +16,7 @@ SUBDIRS += alsalisp
- endif
- endif
- SUBDIRS += test utils
--EXTRA_DIST=ChangeLog INSTALL TODO NOTES configure gitcompile libtool \
-+EXTRA_DIST=README.md ChangeLog INSTALL TODO NOTES configure gitcompile libtool \
- 	   depcomp version MEMORY-LEAK m4/attributes.m4
- AUTOMAKE_OPTIONS=foreign
- 
--- 
-2.29.2
-
-
-From ea02dbd20a535085638c63c6b8bec94e628486c4 Mon Sep 17 00:00:00 2001
-From: David Henningsson <diwic@ubuntu.com>
-Date: Wed, 16 Dec 2020 19:55:22 +0100
-Subject: [PATCH 09/49] pcm: Add snd_pcm_audio_tstamp_type_t constants
-
-These are mostly a copy-paste from the kernel headers. But since functions
-snd_pcm_audio_tstamp_config make use of these they should be added to the
-public API as well.
-
-Reported-by: Alex Moon <alex.r.moon@gmail.com>
-Signed-off-by: David Henningsson <diwic@ubuntu.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- include/pcm.h | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
-diff --git a/include/pcm.h b/include/pcm.h
-index 5b078231..cf1eea8b 100644
---- a/include/pcm.h
-+++ b/include/pcm.h
-@@ -350,6 +350,20 @@ typedef enum _snd_pcm_tstamp_type {
- 	SND_PCM_TSTAMP_TYPE_LAST = SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
- } snd_pcm_tstamp_type_t;
- 
-+typedef enum _snd_pcm_audio_tstamp_type {
-+	/**
-+	 * first definition for backwards compatibility only,
-+	 * maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
-+	 */
-+	SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
-+	SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1,           /**< DMA time, reported as per hw_ptr */
-+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK = 2,	           /**< link time reported by sample or wallclock counter, reset on startup */
-+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,	   /**< link time reported by sample or wallclock counter, not reset on startup */
-+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,    /**< link time estimated indirectly */
-+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /**< link time synchronized with system time */
-+	SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
-+} snd_pcm_audio_tstamp_type_t;
-+
- typedef struct _snd_pcm_audio_tstamp_config {
- 	/* 5 of max 16 bits used */
- 	unsigned int type_requested:4;
--- 
-2.29.2
-
-
-From dcda999d0000cbdabe61d3d175943b5f23c30057 Mon Sep 17 00:00:00 2001
-From: David Henningsson <diwic@ubuntu.com>
-Date: Wed, 16 Dec 2020 20:02:52 +0100
-Subject: [PATCH 10/49] test/audio_time: Make use of SND_PCM_AUDIO_TSTAMP_TYPE
- constants
-
-Also fixup the usage row which seemed wrong to me.
-
-Signed-off-by: David Henningsson <diwic@ubuntu.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- test/audio_time.c | 26 +++++++++++++-------------
- 1 file changed, 13 insertions(+), 13 deletions(-)
-
-diff --git a/test/audio_time.c b/test/audio_time.c
-index 530922d9..e4d4a944 100644
---- a/test/audio_time.c
-+++ b/test/audio_time.c
-@@ -32,7 +32,7 @@ static void usage(char *command)
- 		"-d, --delay             add delay \n"
- 		"-D, --device=NAME       select PCM by name \n"
- 		"-p, --playback          playback tstamps \n"
--		"-t, --ts_type=TYPE      Default(0),link(1),link_estimated(2),synchronized(3) \n"
-+		"-t, --ts_type=TYPE      Compat(0),default(1),link(2),link_absolute(3),link_estimated(4),link_synchronized(5) \n"
- 		"-r, --report            show audio timestamp and accuracy validity\n"
- 		, command);
  }
-@@ -201,17 +201,17 @@ int main(int argc, char *argv[])
- 			goto _exit;
- 		}
- 
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 0))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT))
- 			printf("Playback supports audio compat timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 1))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT))
- 			printf("Playback supports audio default timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 2))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK))
- 			printf("Playback supports audio link timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 3))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE))
- 			printf("Playback supports audio link absolute timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 4))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED))
- 			printf("Playback supports audio link estimated timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 5))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED))
- 			printf("Playback supports audio link synchronized timestamps\n");
- 
- 		snd_pcm_sw_params_alloca(&swparams_p);
-@@ -269,17 +269,17 @@ int main(int argc, char *argv[])
- 			goto _exit;
- 		}
- 
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 0))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT))
- 			printf("Capture supports audio compat timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 1))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT))
- 			printf("Capture supports audio default timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 2))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK))
- 			printf("Capture supports audio link timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 3))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE))
- 			printf("Capture supports audio link absolute timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 4))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED))
- 			printf("Capture supports audio link estimated timestamps\n");
--		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 5))
-+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED))
- 			printf("Capture supports audio link synchronized timestamps\n");
- 
- 		snd_pcm_sw_params_alloca(&swparams_c);
--- 
-2.29.2
-
-
-From a9cbfecd87777d76a83e5a912ca9bdcf48e31fa9 Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Tue, 22 Dec 2020 16:10:16 +0100
-Subject: [PATCH 11/49] pcm: Fix a typo in SND_PCM_AUDIO_TSTAMP_TYPE_LAST
- definition
-
-It was wrongly defined with SNDRV_ prefix.  Fix it.
-
-Fixes: ea02dbd20a53 ("pcm: Add snd_pcm_audio_tstamp_type_t constants")
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- include/pcm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/include/pcm.h b/include/pcm.h
-index cf1eea8b..e300b951 100644
---- a/include/pcm.h
-+++ b/include/pcm.h
-@@ -361,7 +361,7 @@ typedef enum _snd_pcm_audio_tstamp_type {
- 	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,	   /**< link time reported by sample or wallclock counter, not reset on startup */
- 	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,    /**< link time estimated indirectly */
- 	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /**< link time synchronized with system time */
--	SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
-+	SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
- } snd_pcm_audio_tstamp_type_t;
  
- typedef struct _snd_pcm_audio_tstamp_config {
--- 
-2.29.2
-
-
-From 5275d170e05639473e68e5feb349aec65bf26428 Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sat, 26 Dec 2020 14:35:39 -0700
-Subject: [PATCH 12/49] conf: fix use after free in
- _snd_config_load_with_include
-
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/conf.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/src/conf.c b/src/conf.c
-index 7df2b4e7..44d1bfde 100644
---- a/src/conf.c
-+++ b/src/conf.c
-@@ -1970,7 +1970,9 @@ int _snd_config_load_with_include(snd_config_t *config, snd_input_t *in,
- 		SNDERR("%s:%d:%d:%s", fd->name ? fd->name : "_toplevel_", fd->line, fd->column, str);
- 		goto _end;
- 	}
--	if (get_char(&input) != LOCAL_UNEXPECTED_EOF) {
-+	err = get_char(&input);
-+	fd = input.current;
-+	if (err != LOCAL_UNEXPECTED_EOF) {
- 		SNDERR("%s:%d:%d:Unexpected }", fd->name ? fd->name : "", fd->line, fd->column);
- 		err = -EINVAL;
- 		goto _end;
++/**
++ * \brief Get device prefix for private alsa-lib configuration
++ * \param uc_mgr Use case manager
++ * \param str Returned value string
++ * \return Zero on success (value is filled), otherwise a negative error code
++ */
++static int get_alibpref(snd_use_case_mgr_t *uc_mgr, char **str)
++{
++	const size_t l = 9;
++	char *s;
++
++	s = malloc(l);
++	if (s == NULL)
++		return -ENOMEM;
++	snprintf(s, l, "_ucm%04X", uc_mgr->ucm_card_number);
++	*str = s;
++	return 0;
++}
++
+ /**
+  * \brief Get current - string
+  * \param uc_mgr Use case manager
+@@ -2193,6 +2212,8 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
+ 
+ 	} else if (strcmp(identifier, "_alibcfg") == 0) {
+ 		err = get_alibcfg(uc_mgr, (char **)value);
++	} else if (strcmp(identifier, "_alibpref") == 0) {
++		err = get_alibpref(uc_mgr, (char **)value);
+ 	} else if (identifier[0] == '_') {
+ 		err = -ENOENT;
+ 	} else {
 -- 
-2.29.2
+2.30.2
 
 
-From 0f4821ec1729cd72a3dde3ea63f7857e92a10919 Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sat, 26 Dec 2020 14:35:40 -0700
-Subject: [PATCH 13/49] ucm: fix bad frees in get_list0 and get_list20
+From 9621d0bff2e60b43e329ffa5059ab19f2914ec14 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Wed, 2 Jun 2021 11:21:54 +0200
+Subject: [PATCH 03/28] ucm: fix _alibpref string (add '.' delimiter to the
+ end)
 
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Fixes: 0e4ba2ea ("ucm: add _alibpref to get the private device prefix")
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
  src/ucm/main.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/src/ucm/main.c b/src/ucm/main.c
-index 3871d5aa..754b967e 100644
+index 3c9ea15d..c9b37b68 100644
 --- a/src/ucm/main.c
 +++ b/src/ucm/main.c
-@@ -666,7 +666,7 @@ static int get_list0(struct list_head *list,
- 	}
- 	return cnt;
-       __fail:
--        snd_use_case_free_list((const char **)res, cnt);
-+        snd_use_case_free_list(*result, cnt);
-         return -ENOMEM;
- }
- 
-@@ -724,7 +724,7 @@ static int get_list20(struct list_head *list,
- 	}
- 	return cnt;
-       __fail:
--        snd_use_case_free_list((const char **)res, cnt);
-+        snd_use_case_free_list(*result, cnt);
-         return -ENOMEM;
- }
- 
--- 
-2.29.2
-
-
-From c56278cfda55b9f5d106890c7354176dba8c8f4d Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sat, 26 Dec 2020 14:35:41 -0700
-Subject: [PATCH 14/49] rawmidi: fix memory leak in snd_rawmidi_virtual_open
-
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/rawmidi/rawmidi_virt.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/rawmidi/rawmidi_virt.c b/src/rawmidi/rawmidi_virt.c
-index 2c4c27f5..884b8ff8 100644
---- a/src/rawmidi/rawmidi_virt.c
-+++ b/src/rawmidi/rawmidi_virt.c
-@@ -315,7 +315,7 @@ int snd_rawmidi_virtual_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
- 			     int merge, int mode)
+@@ -2146,13 +2146,13 @@ static int get_alibcfg(snd_use_case_mgr_t *uc_mgr, char **str)
+  */
+ static int get_alibpref(snd_use_case_mgr_t *uc_mgr, char **str)
  {
- 	int err;
--	snd_rawmidi_t *rmidi;
-+	snd_rawmidi_t *rmidi = NULL;
- 	snd_rawmidi_virtual_t *virt = NULL;
- 	struct pollfd pfd;
+-	const size_t l = 9;
++	const size_t l = 10;
+ 	char *s;
  
-@@ -392,6 +392,7 @@ int snd_rawmidi_virtual_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
- 		free(*inputp);
- 	if (outputp)
- 		free(*outputp);
-+	free(rmidi);
- 	return err;
- }
- 
--- 
-2.29.2
-
-
-From aa28847248f2f416d9ecc6cbfa75192455400f6f Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sat, 26 Dec 2020 14:35:43 -0700
-Subject: [PATCH 15/49] timer: fix sizeof operator mismatch in
- snd_timer_query_hw_open
-
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/timer/timer_query_hw.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/timer/timer_query_hw.c b/src/timer/timer_query_hw.c
-index dad228c8..d8bac6e7 100644
---- a/src/timer/timer_query_hw.c
-+++ b/src/timer/timer_query_hw.c
-@@ -104,7 +104,7 @@ int snd_timer_query_hw_open(snd_timer_query_t **handle, const char *name, int mo
- 		close(fd);
- 		return -SND_ERROR_INCOMPATIBLE_VERSION;
- 	}
--	tmr = (snd_timer_query_t *) calloc(1, sizeof(snd_timer_t));
-+	tmr = (snd_timer_query_t *) calloc(1, sizeof(snd_timer_query_t));
- 	if (tmr == NULL) {
- 		close(fd);
+ 	s = malloc(l);
+ 	if (s == NULL)
  		return -ENOMEM;
--- 
-2.29.2
-
-
-From 2e470d59d84a563a9efa81572ddc48d9858ceb92 Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sat, 26 Dec 2020 14:35:44 -0700
-Subject: [PATCH 16/49] pcm: remove dead assignments from
- snd_pcm_rate_(commit_area|grab_next_period)
-
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/pcm/pcm_rate.c | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
-index 5bf7dbb9..dc38e95e 100644
---- a/src/pcm/pcm_rate.c
-+++ b/src/pcm/pcm_rate.c
-@@ -746,7 +746,6 @@ static int snd_pcm_rate_commit_area(snd_pcm_t *pcm, snd_pcm_rate_t *rate,
- 		if (result < 0)
- 			return result;
- 	      __partial:
--		xfer = 0;
- 		cont = slave_frames;
- 		if (cont > slave_size)
- 			cont = slave_size;
-@@ -846,7 +845,6 @@ static int snd_pcm_rate_grab_next_period(snd_pcm_t *pcm, snd_pcm_uframes_t hw_of
- 		if (result < 0)
- 			return result;
- 	      __partial:
--		xfer = 0;
- 		cont = slave_frames;
- 		if (cont > rate->gen.slave->period_size)
- 			cont = rate->gen.slave->period_size;
--- 
-2.29.2
-
-
-From fc719bfe4e97bbfce899cc7e67df08ecd573c5d3 Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sat, 26 Dec 2020 14:35:45 -0700
-Subject: [PATCH 17/49] pcm_multi: remove dead assignment from
- _snd_pcm_multi_open
-
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/pcm/pcm_multi.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c
-index 53c414d5..5fa09b9b 100644
---- a/src/pcm/pcm_multi.c
-+++ b/src/pcm/pcm_multi.c
-@@ -1323,7 +1323,6 @@ int _snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name,
- 		err = -ENOMEM;
- 		goto _free;
- 	}
--	idx = 0;
- 	for (idx = 0; idx < channels_count; ++idx)
- 		channels_sidx[idx] = -1;
- 	idx = 0;
--- 
-2.29.2
-
-
-From 9ebd29d2d31df0f8967f3e60cf24bb63c95d4984 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 27 Dec 2020 13:17:26 +0100
-Subject: [PATCH 18/49] conf: fix get_hexachar() return value
-
-Reported-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/conf.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/conf.c b/src/conf.c
-index 44d1bfde..6cfe65bf 100644
---- a/src/conf.c
-+++ b/src/conf.c
-@@ -887,7 +887,7 @@ static inline int get_hexachar(input_t *input)
- 	if (c >= '0' && c <= '9') num |= (c - '0') << 0;
- 	else if (c >= 'a' && c <= 'f') num |= (c - 'a') << 0;
- 	else if (c >= 'A' && c <= 'F') num |= (c - 'A') << 0;
--	return c;
-+	return num;
+-	snprintf(s, l, "_ucm%04X", uc_mgr->ucm_card_number);
++	snprintf(s, l, "_ucm%04X.", uc_mgr->ucm_card_number);
+ 	*str = s;
+ 	return 0;
  }
- 
- static int get_quotedchar(input_t *input)
 -- 
-2.29.2
+2.30.2
 
 
-From 36aff79747b23b9535e81befe8b7b2972837bce3 Mon Sep 17 00:00:00 2001
+From 2a1dafdbe5932260aeb4db359ce5d630b8106889 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 27 Dec 2020 13:29:33 +0100
-Subject: [PATCH 19/49] pcm: fix __snd_pcm_state() return value
-
-The __snd_pcm_state() must return a valid state, not an error value
-when the plugin callback is not defined. Use the first state
-SND_PCM_STATE_OPEN - the other functions will return the error
-code depending on this state.
+Date: Wed, 2 Jun 2021 19:26:47 +0200
+Subject: [PATCH 04/28] conf: remove dead code in snd_config_get_card()
 
-Link: https://lore.kernel.org/alsa-devel/20201226213547.175071-10-alexhenrie24@gmail.com/
-Reported-by: Alex Henrie <alexhenrie24@gmail.com>
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_local.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
-index fe77e50d..bec5a408 100644
---- a/src/pcm/pcm_local.h
-+++ b/src/pcm/pcm_local.h
-@@ -444,7 +444,7 @@ static inline int __snd_pcm_start(snd_pcm_t *pcm)
- static inline snd_pcm_state_t __snd_pcm_state(snd_pcm_t *pcm)
- {
- 	if (!pcm->fast_ops->state)
--		return -ENOSYS;
-+		return SND_PCM_STATE_OPEN;
- 	return pcm->fast_ops->state(pcm->fast_op_arg);
- }
- 
--- 
-2.29.2
-
-
-From a92ad2fea4b36d7282f4a571275fb492dd1bba75 Mon Sep 17 00:00:00 2001
-From: Alex Henrie <alexhenrie24@gmail.com>
-Date: Sun, 27 Dec 2020 18:43:15 -0700
-Subject: [PATCH 20/49] confmisc: fix memory leak in snd_func_concat
-
-Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- src/confmisc.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
+ src/confmisc.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
 diff --git a/src/confmisc.c b/src/confmisc.c
-index eb8218c1..3ce95c7a 100644
+index 3663d164..a561040c 100644
 --- a/src/confmisc.c
 +++ b/src/confmisc.c
-@@ -419,7 +419,6 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
- 				tmp = realloc(res, len + len1 + 1);
- 				if (tmp == NULL) {
- 					free(ptr);
--					free(res);
- 					err = -ENOMEM;
- 					goto __error;
- 				}
-@@ -440,8 +439,8 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
- 	err = snd_config_get_id(src, &id);
- 	if (err >= 0)
- 		err = snd_config_imake_string(dst, id, res);
--	free(res);
-       __error:
-+	free(res);
- 	return err;
- }
- #ifndef DOC_HIDDEN
--- 
-2.29.2
-
-
-From 6c24cd2e60cc9c1fca809ffeeb7ffe8af94b201e Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Tue, 29 Dec 2020 11:15:46 +0100
-Subject: [PATCH 21/49] conf: fix return code in _snd_config_load_with_include
-
-Fixes: 5275d170e0 ("conf: fix use after free in _snd_config_load_with_include")
-BugLink: https://github.com/alsa-project/alsa-lib/issues/108
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/conf.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/conf.c b/src/conf.c
-index 6cfe65bf..3c943db2 100644
---- a/src/conf.c
-+++ b/src/conf.c
-@@ -1977,6 +1977,7 @@ int _snd_config_load_with_include(snd_config_t *config, snd_input_t *in,
- 		err = -EINVAL;
- 		goto _end;
- 	}
-+	err = 0;
-  _end:
- 	while (fd->next) {
- 		fd_next = fd->next;
--- 
-2.29.2
-
-
-From afe6ff3b33ee6e5ea3511fe458bfd4e516b10bcf Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Wed, 30 Dec 2020 09:31:10 +0100
-Subject: [PATCH 22/49] pcm: plugin status - fix the return value (regression)
-
-The snd_pcm_plugin_avail_update() error code in snd_pcm_plugin_status()
-should not be reported to the caller. The state errors can be determined
-using the state member in the status structure.
-
-Fixes: 4f90392f07e ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
-BugLink: https://github.com/alsa-project/alsa-lib/issues/107
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_plugin.c | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index 5739cfc2..76a524fa 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -541,19 +541,17 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
- static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- {
- 	snd_pcm_plugin_t *plugin = pcm->private_data;
--	snd_pcm_sframes_t err, avail;
-+	snd_pcm_sframes_t err;
- 
- 	/* sync with the latest hw and appl ptrs */
--	avail = snd_pcm_plugin_avail_update(pcm);
--	if (avail < 0)
--		return avail;
-+	snd_pcm_plugin_avail_update(pcm);
- 
- 	err = snd_pcm_status(plugin->gen.slave, status);
- 	if (err < 0)
- 		return err;
- 	status->appl_ptr = *pcm->appl.ptr;
- 	status->hw_ptr = *pcm->hw.ptr;
--	status->avail = avail;
-+	status->avail = snd_pcm_mmap_avail(pcm);
- 	status->delay = snd_pcm_mmap_delay(pcm);
- 	return 0;
- }
--- 
-2.29.2
-
-
-From 49eea5d7bc7d39f9a4cc1f3b3a813e90b90519eb Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 3 Jan 2021 16:16:10 +0100
-Subject: [PATCH 23/49] pcm: plugin status - revert the recent changes
-
-It's no reason to sync the avail/delay fields using the mirrored
-buffer pointers. The slave information must be valid.
-
-The original report probably tries to fix something for
-the specific plugin. Revert all changes.
-
-Fixes: afe6ff3b33e ("pcm: plugin status - fix the return value (regression)")
-Fixes: 4f90392f07e ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_plugin.c | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index 76a524fa..ea60eb98 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -551,8 +551,6 @@ static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 		return err;
- 	status->appl_ptr = *pcm->appl.ptr;
- 	status->hw_ptr = *pcm->hw.ptr;
--	status->avail = snd_pcm_mmap_avail(pcm);
--	status->delay = snd_pcm_mmap_delay(pcm);
- 	return 0;
- }
- 
--- 
-2.29.2
-
-
-From fa1895aa2b4f3f154e537bee92860fe793045643 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 3 Jan 2021 16:34:04 +0100
-Subject: [PATCH 24/49] pcm: plugin - tidy snd_pcm_plugin_avail_update()
-
-No functional changes - move the code to snd_pcm_plugin_sync_hw_ptr()
-and put the mmap capture updates to separate function for readability.
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_plugin.c | 142 +++++++++++++++++++++++--------------------
- 1 file changed, 76 insertions(+), 66 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index ea60eb98..83793397 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -460,82 +460,92 @@ snd_pcm_plugin_mmap_commit(snd_pcm_t *pcm,
- 	return xfer > 0 ? xfer : err;
- }
- 
--static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
-+static snd_pcm_sframes_t
-+snd_pcm_plugin_sync_hw_ptr_capture(snd_pcm_t *pcm,
-+				   snd_pcm_sframes_t slave_size)
- {
- 	snd_pcm_plugin_t *plugin = pcm->private_data;
- 	snd_pcm_t *slave = plugin->gen.slave;
--	snd_pcm_sframes_t slave_size;
-+	const snd_pcm_channel_area_t *areas;
-+	snd_pcm_uframes_t xfer, hw_offset, size;
+@@ -154,10 +154,10 @@ int snd_config_get_card(const snd_config_t *conf)
+ 	long v;
  	int err;
  
--	slave_size = snd_pcm_avail_update(slave);
-+	xfer = snd_pcm_mmap_capture_avail(pcm);
-+	size = pcm->buffer_size - xfer;
-+	areas = snd_pcm_mmap_areas(pcm);
-+	hw_offset = snd_pcm_mmap_hw_offset(pcm);
-+	while (size > 0 && slave_size > 0) {
-+		snd_pcm_uframes_t frames = size;
-+		snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
-+		const snd_pcm_channel_area_t *slave_areas;
-+		snd_pcm_uframes_t slave_offset;
-+		snd_pcm_uframes_t slave_frames = ULONG_MAX;
-+		snd_pcm_sframes_t result;
-+		/* As mentioned in the ALSA API (see pcm/pcm.c:942):
-+		 * The function #snd_pcm_avail_update()
-+		 * have to be called before any mmap begin+commit operation.
-+		 * Otherwise the snd_pcm_areas_copy will not called a second time.
-+		 * But this is needed, if the ring buffer wrap is reached and
-+		 * there is more data available.
-+		 */
-+		slave_size = snd_pcm_avail_update(slave);
-+		result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames);
-+		if (result < 0) {
-+			err = result;
-+			goto error;
-+		}
-+		if (frames > cont)
-+			frames = cont;
-+		frames = (plugin->read)(pcm, areas, hw_offset, frames,
-+					slave_areas, slave_offset, &slave_frames);
-+		result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
-+		if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
-+			snd_pcm_sframes_t res;
-+			res = plugin->undo_read(slave, areas, hw_offset, frames, slave_frames - result);
-+			if (res < 0) {
-+				err = res;
-+				goto error;
-+			}
-+			frames -= res;
-+		}
-+		if (result <= 0) {
-+			err = result;
-+			goto error;
-+		}
-+		snd_pcm_mmap_hw_forward(pcm, frames);
-+		if (frames == cont)
-+			hw_offset = 0;
-+		else
-+			hw_offset += frames;
-+		size -= frames;
-+		slave_size -= slave_frames;
-+		xfer += frames;
-+	}
-+	return (snd_pcm_sframes_t)xfer;
-+error:
-+	return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
-+}
-+
-+static snd_pcm_sframes_t snd_pcm_plugin_sync_hw_ptr(snd_pcm_t *pcm,
-+						    snd_pcm_uframes_t slave_hw_ptr,
-+						    snd_pcm_sframes_t slave_size)
-+{
- 	if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
- 	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
- 	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED)
--		goto _capture;
--        *pcm->hw.ptr = *slave->hw.ptr;
-+		return snd_pcm_plugin_sync_hw_ptr_capture(pcm, slave_size);
-+        *pcm->hw.ptr = slave_hw_ptr;
-         return slave_size;
-- _capture:
-- 	{
--		const snd_pcm_channel_area_t *areas;
--		snd_pcm_uframes_t xfer, hw_offset, size;
--		
--		xfer = snd_pcm_mmap_capture_avail(pcm);
--		size = pcm->buffer_size - xfer;
--		areas = snd_pcm_mmap_areas(pcm);
--		hw_offset = snd_pcm_mmap_hw_offset(pcm);
--		while (size > 0 && slave_size > 0) {
--			snd_pcm_uframes_t frames = size;
--			snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
--			const snd_pcm_channel_area_t *slave_areas;
--			snd_pcm_uframes_t slave_offset;
--			snd_pcm_uframes_t slave_frames = ULONG_MAX;
--			snd_pcm_sframes_t result;
--			/* As mentioned in the ALSA API (see pcm/pcm.c:942):
--			 * The function #snd_pcm_avail_update()
--			 * have to be called before any mmap begin+commit operation.
--			 * Otherwise the snd_pcm_areas_copy will not called a second time.
--			 * But this is needed, if the ring buffer wrap is reached and
--			 * there is more data available.
--			 */
--			slave_size = snd_pcm_avail_update(slave);
--			result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames);
--			if (result < 0) {
--				err = result;
--				goto error;
--			}
--			if (frames > cont)
--				frames = cont;
--			frames = (plugin->read)(pcm, areas, hw_offset, frames,
--					      slave_areas, slave_offset, &slave_frames);
--			result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
--			if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
--				snd_pcm_sframes_t res;
--				
--				res = plugin->undo_read(slave, areas, hw_offset, frames, slave_frames - result);
--				if (res < 0) {
--					err = res;
--					goto error;
--				}
--				frames -= res;
--			}
--			if (result <= 0) {
--				err = result;
--				goto error;
--			}
--			snd_pcm_mmap_hw_forward(pcm, frames);
--			if (frames == cont)
--				hw_offset = 0;
--			else
--				hw_offset += frames;
--			size -= frames;
--			slave_size -= slave_frames;
--			xfer += frames;
--		}
--		return (snd_pcm_sframes_t)xfer;
-+}
- 
--	error:
--		return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
--	}
-+static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
-+{
-+	snd_pcm_plugin_t *plugin = pcm->private_data;
-+	snd_pcm_t *slave = plugin->gen.slave;
-+	snd_pcm_sframes_t slave_size;
-+
-+	slave_size = snd_pcm_avail_update(slave);
-+	return snd_pcm_plugin_sync_hw_ptr(pcm, *slave->hw.ptr, slave_size);
- }
- 
- static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
--- 
-2.29.2
-
-
-From 28cc099d9ea3962b033cb1cb9c3e07db828d9ff7 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 3 Jan 2021 16:41:29 +0100
-Subject: [PATCH 25/49] pcm: plugin - optimize sync in snd_pcm_plugin_status()
-
-Do hw_ptr sync only once after the status call. This avoids
-double update.
-
-Also, the application pointer must not change when
-the status is called. Add assert() call for this condition.
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_plugin.c | 7 ++-----
- 1 file changed, 2 insertions(+), 5 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index 83793397..6a815145 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -553,14 +553,11 @@ static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	snd_pcm_plugin_t *plugin = pcm->private_data;
- 	snd_pcm_sframes_t err;
- 
--	/* sync with the latest hw and appl ptrs */
--	snd_pcm_plugin_avail_update(pcm);
--
- 	err = snd_pcm_status(plugin->gen.slave, status);
- 	if (err < 0)
- 		return err;
--	status->appl_ptr = *pcm->appl.ptr;
--	status->hw_ptr = *pcm->hw.ptr;
-+	assert(status->appl_ptr == *pcm->appl.ptr);
-+	snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
- 	return 0;
- }
- 
--- 
-2.29.2
-
-
-From 21549e6583f1dfe5b2fe1aaa88345e4645dd96d0 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Wed, 30 Dec 2020 17:49:33 +0100
-Subject: [PATCH 26/49] Revert "pcm_plugin: fix delay"
-
-This reverts commit aba87e509898ec9ddb3e319267d7c267409ff100.
-
-The commit does not look good. The plugins must handle
-the delay value correctly.
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_plugin.c | 6 ------
- 1 file changed, 6 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index 6a815145..5787a43d 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -142,12 +142,6 @@ static int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
- 	int err = snd_pcm_delay(plugin->gen.slave, &sd);
- 	if (err < 0)
- 		return err;
--        if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
--	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
--	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
--                sd += snd_pcm_mmap_capture_avail(pcm);
--        }        
--
- 	*delayp = sd;
- 	return 0;
- }
--- 
-2.29.2
-
-
-From 6ca01c07ee13435d6c2db4e9121d9a86cc4b1457 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Wed, 30 Dec 2020 19:14:25 +0100
-Subject: [PATCH 27/49] pcm: ioplug - fix the delay calculation in the status
- callback
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- src/pcm/pcm_ioplug.c | 32 ++++++++++++++++++--------------
- 1 file changed, 18 insertions(+), 14 deletions(-)
-
-diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
-index 9b1b8ac3..f2315a10 100644
---- a/src/pcm/pcm_ioplug.c
-+++ b/src/pcm/pcm_ioplug.c
-@@ -107,9 +107,24 @@ static int snd_pcm_ioplug_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *i
- 	return snd_pcm_channel_info_shm(pcm, info, -1);
- }
- 
-+static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
-+{
-+	ioplug_priv_t *io = pcm->private_data;
-+
-+	if (io->data->version >= 0x010001 &&
-+	    io->data->callback->delay)
-+		return io->data->callback->delay(io->data, delayp);
-+	else {
-+		snd_pcm_ioplug_hw_ptr_update(pcm);
-+		*delayp = snd_pcm_mmap_hw_avail(pcm);
-+	}
-+	return 0;
-+}
-+
- static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- {
- 	ioplug_priv_t *io = pcm->private_data;
-+	snd_pcm_sframes_t sd;
- 
- 	memset(status, 0, sizeof(*status));
- 	snd_pcm_ioplug_hw_ptr_update(pcm);
-@@ -118,6 +133,9 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	gettimestamp(&status->tstamp, pcm->tstamp_type);
- 	status->avail = snd_pcm_mmap_avail(pcm);
- 	status->avail_max = io->avail_max;
-+	if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
-+		sd = snd_pcm_mmap_delay(pcm);
-+	status->delay = sd;
- 	return 0;
- }
- 
-@@ -133,20 +151,6 @@ static int snd_pcm_ioplug_hwsync(snd_pcm_t *pcm)
- 	return 0;
- }
- 
--static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
--{
--	ioplug_priv_t *io = pcm->private_data;
--
--	if (io->data->version >= 0x010001 &&
--	    io->data->callback->delay)
--		return io->data->callback->delay(io->data, delayp);
--	else {
--		snd_pcm_ioplug_hw_ptr_update(pcm);
--		*delayp = snd_pcm_mmap_hw_avail(pcm);
--	}
--	return 0;
--}
--
- static int snd_pcm_ioplug_reset(snd_pcm_t *pcm)
- {
- 	ioplug_priv_t *io = pcm->private_data;
+-	if ((err = snd_config_get_integer(conf, &v)) < 0) {
++	if (snd_config_get_integer(conf, &v) < 0) {
+ 		if ((err = snd_config_get_string(conf, &str)) < 0) {
+-			snd_config_get_id(conf, &id);
+-			SNDERR("Invalid field %s", id);
++			if (snd_config_get_id(conf, &id) >= 0)
++				SNDERR("Invalid field %s", id);
+ 			return -EINVAL;
+ 		}
+ 		err = snd_card_get_index(str);
 -- 
-2.29.2
+2.30.2
 
 
-From 5988bb3ff42827ab4c13f248291ad1767c8d973d Mon Sep 17 00:00:00 2001
+From 013ec607db9de11b682f2b85d843be062ca0d046 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 3 Jan 2021 16:56:38 +0100
-Subject: [PATCH 28/49] pcm: rate - tidy up snd_pcm_rate_avail_update()
+Date: Wed, 2 Jun 2021 19:28:32 +0200
+Subject: [PATCH 05/28] control: remap - fix uninitialized value in
+ parse_map_vindex()
 
-No functional change - just move the capture code to
-a separate function for the better readability.
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+---
+ src/control/control_remap.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/control/control_remap.c b/src/control/control_remap.c
+index f3d65010..17c6558a 100644
+--- a/src/control/control_remap.c
++++ b/src/control/control_remap.c
+@@ -1040,7 +1040,7 @@ static int parse_map_vindex(struct snd_ctl_map_ctl *mctl, snd_config_t *conf)
+ 
+ 	snd_config_for_each(i, next, conf) {
+ 		snd_config_t *n = snd_config_iterator_entry(i);
+-		long idx, chn;
++		long idx = -1, chn = -1;
+ 		const char *id;
+ 		if (snd_config_get_id(n, &id) < 0)
+ 			continue;
+-- 
+2.30.2
+
+
+From 2fee6af9b6e157475159d284af8de1e879bb7a36 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Wed, 2 Jun 2021 19:35:44 +0200
+Subject: [PATCH 06/28] pcm: direct - fix pcmp error path in
+ _snd_pcm_direct_new()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_rate.c | 37 +++++++++++++++++++++----------------
- 1 file changed, 21 insertions(+), 16 deletions(-)
-
-diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
-index dc38e95e..7073f8ab 100644
---- a/src/pcm/pcm_rate.c
-+++ b/src/pcm/pcm_rate.c
-@@ -964,29 +964,18 @@ static snd_pcm_sframes_t snd_pcm_rate_mmap_commit(snd_pcm_t *pcm,
- 	return size;
- }
- 
--static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
-+static snd_pcm_sframes_t snd_pcm_rate_avail_update_capture(snd_pcm_t *pcm,
-+							   snd_pcm_sframes_t slave_size)
- {
- 	snd_pcm_rate_t *rate = pcm->private_data;
- 	snd_pcm_t *slave = rate->gen.slave;
--	snd_pcm_sframes_t slave_size;
--
--	slave_size = snd_pcm_avail_update(slave);
--	if (slave_size < 0)
--		return slave_size;
--
--	if (pcm->stream == SND_PCM_STREAM_CAPTURE)
--		goto _capture;
--	snd_pcm_rate_sync_hwptr(pcm);
--	snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
--	return snd_pcm_mmap_avail(pcm);
-- _capture: {
- 	snd_pcm_uframes_t xfer, hw_offset, size;
- 	
- 	xfer = snd_pcm_mmap_capture_avail(pcm);
- 	size = pcm->buffer_size - xfer;
- 	hw_offset = snd_pcm_mmap_hw_offset(pcm);
- 	while (size >= pcm->period_size &&
--	       (snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
-+	       (snd_pcm_uframes_t)slave_size >= slave->period_size) {
- 		int err = snd_pcm_rate_grab_next_period(pcm, hw_offset);
- 		if (err < 0)
- 			return err;
-@@ -994,13 +983,29 @@ static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
- 			return (snd_pcm_sframes_t)xfer;
- 		xfer += pcm->period_size;
- 		size -= pcm->period_size;
--		slave_size -= rate->gen.slave->period_size;
-+		slave_size -= slave->period_size;
- 		hw_offset += pcm->period_size;
- 		hw_offset %= pcm->buffer_size;
- 		snd_pcm_mmap_hw_forward(pcm, pcm->period_size);
+ src/pcm/pcm_direct.c | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
+index 0e5e0421..361805bd 100644
+--- a/src/pcm/pcm_direct.c
++++ b/src/pcm/pcm_direct.c
+@@ -2126,24 +2126,20 @@ int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type,
+ 	dmix->type = type;
+ 
+ 	ret = snd_pcm_new(pcmp, type, name, stream, mode);
+-	if (ret < 0) {
+-_err_nosem:
+-		free(dmix->bindings);
+-		free(dmix);
+-		return ret;
+-	}
++	if (ret < 0)
++		goto _err_nosem;
+ 
+ 	while (1) {
+ 		ret = snd_pcm_direct_semaphore_create_or_connect(dmix);
+ 		if (ret < 0) {
+ 			SNDERR("unable to create IPC semaphore");
+-			goto _err_nosem;
++			goto _err_nosem_free;
+ 		}
+ 		ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
+ 		if (ret < 0) {
+ 			snd_pcm_direct_semaphore_discard(dmix);
+ 			if (--fail_sem_loop <= 0)
+-				goto _err_nosem;
++				goto _err_nosem_free;
+ 			continue;
+ 		}
+ 		break;
+@@ -2153,10 +2149,17 @@ _err_nosem:
+ 	if (ret < 0) {
+ 		SNDERR("unable to create IPC shm instance");
+ 		snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
+-		goto _err_nosem;
++		goto _err_nosem_free;
+ 	} else {
+ 		*_dmix = dmix;
  	}
- 	return (snd_pcm_sframes_t)xfer;
-- }
-+}
-+
-+static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
-+{
-+	snd_pcm_rate_t *rate = pcm->private_data;
-+	snd_pcm_sframes_t slave_size;
-+
-+	slave_size = snd_pcm_avail_update(rate->gen.slave);
-+	if (slave_size < 0)
-+		return slave_size;
-+
-+	if (pcm->stream == SND_PCM_STREAM_CAPTURE)
-+		return snd_pcm_rate_avail_update_capture(pcm, slave_size);
-+
-+	snd_pcm_rate_sync_hwptr(pcm);
-+	snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
-+	return snd_pcm_mmap_avail(pcm);
- }
  
- static int snd_pcm_rate_htimestamp(snd_pcm_t *pcm,
++	return ret;
++_err_nosem_free:
++	snd_pcm_free(*pcmp);
++	*pcmp = NULL;
++_err_nosem:
++	free(dmix->bindings);
++	free(dmix);
+ 	return ret;
+ }
 -- 
-2.29.2
+2.30.2
 
 
-From 6cee452eabc5cfdf0a6955033b8ac8f6e12ea883 Mon Sep 17 00:00:00 2001
+From eb95cad4e22a0bf2577f1fa4a3f6fd18caed3362 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Sun, 3 Jan 2021 17:13:50 +0100
-Subject: [PATCH 29/49] pcm: ioplug - fix the delay calculation for old plugins
+Date: Wed, 2 Jun 2021 19:37:53 +0200
+Subject: [PATCH 07/28] pcm: remove extra NULL checks in snd_pcm_dmix_open()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_ioplug.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/pcm/pcm_dmix.c | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
 
-diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
-index f2315a10..e141b1f9 100644
---- a/src/pcm/pcm_ioplug.c
-+++ b/src/pcm/pcm_ioplug.c
-@@ -116,7 +116,7 @@ static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
- 		return io->data->callback->delay(io->data, delayp);
- 	else {
- 		snd_pcm_ioplug_hw_ptr_update(pcm);
--		*delayp = snd_pcm_mmap_hw_avail(pcm);
-+		*delayp = snd_pcm_mmap_delay(pcm);
- 	}
- 	return 0;
+diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
+index 8747450f..608593f1 100644
+--- a/src/pcm/pcm_dmix.c
++++ b/src/pcm/pcm_dmix.c
+@@ -998,7 +998,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
+ 		      snd_config_t *root, snd_config_t *sconf,
+ 		      snd_pcm_stream_t stream, int mode)
+ {
+-	snd_pcm_t *pcm = NULL, *spcm = NULL;
++	snd_pcm_t *pcm, *spcm = NULL;
+ 	snd_pcm_direct_t *dmix;
+ 	int ret, first_instance;
+ 
+@@ -1154,12 +1154,9 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
+ 	} else
+ 		snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
+  _err_nosem:
+-	if (dmix) {
+-		free(dmix->bindings);
+-		free(dmix);
+-	}
+-	if (pcm)
+-		snd_pcm_free(pcm);
++	free(dmix->bindings);
++	free(dmix);
++	snd_pcm_free(pcm);
+ 	return ret;
  }
+ 
 -- 
-2.29.2
+2.30.2
 
 
-From fc0f7af9ee7bd4c31c2bab229e8e79eb96e908fa Mon Sep 17 00:00:00 2001
+From 01a45aec6fcd5a5378a5b5e0ae0f9dacde2068e4 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 4 Jan 2021 12:29:00 +0100
-Subject: [PATCH 30/49] pcm: rate - use pcm_frame_diff() in
- snd_pcm_rate_playback_internal_delay()
+Date: Wed, 2 Jun 2021 19:39:32 +0200
+Subject: [PATCH 08/28] pcm: remove extra NULL checks in snd_pcm_dsnoop_open()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_rate.c | 6 +-----
- 1 file changed, 1 insertion(+), 5 deletions(-)
-
-diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
-index 7073f8ab..abb2753f 100644
---- a/src/pcm/pcm_rate.c
-+++ b/src/pcm/pcm_rate.c
-@@ -612,11 +612,7 @@ static snd_pcm_uframes_t snd_pcm_rate_playback_internal_delay(snd_pcm_t *pcm)
+ src/pcm/pcm_dsnoop.c | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
+
+diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
+index fb1b02c2..2c3b9f43 100644
+--- a/src/pcm/pcm_dsnoop.c
++++ b/src/pcm/pcm_dsnoop.c
+@@ -564,8 +564,8 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
+ 			snd_config_t *root, snd_config_t *sconf,
+ 			snd_pcm_stream_t stream, int mode)
  {
- 	snd_pcm_rate_t *rate = pcm->private_data;
- 
--	if (rate->appl_ptr < rate->last_commit_ptr) {
--		return rate->appl_ptr - rate->last_commit_ptr + pcm->boundary;
--	} else {
--		return rate->appl_ptr - rate->last_commit_ptr;
+-	snd_pcm_t *pcm = NULL, *spcm = NULL;
+-	snd_pcm_direct_t *dsnoop = NULL;
++	snd_pcm_t *pcm, *spcm = NULL;
++	snd_pcm_direct_t *dsnoop;
+ 	int ret, first_instance;
+ 
+ 	assert(pcmp);
+@@ -708,12 +708,9 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
+ 		snd_pcm_direct_semaphore_up(dsnoop, DIRECT_IPC_SEM_CLIENT);
+ 
+  _err_nosem:
+-	if (dsnoop) {
+-		free(dsnoop->bindings);
+-		free(dsnoop);
 -	}
-+	return pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
+-	if (pcm)
+-		snd_pcm_free(pcm);
++	free(dsnoop->bindings);
++	free(dsnoop);
++	snd_pcm_free(pcm);
+ 	return ret;
  }
  
- static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
 -- 
-2.29.2
+2.30.2
 
 
-From da5b70d3fae091a8568b80a476c1cf340965805a Mon Sep 17 00:00:00 2001
+From 74c6382df6cf18b801659d8c5c53407a7ea1f02b Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 4 Jan 2021 12:32:25 +0100
-Subject: [PATCH 31/49] pcm: plugin - fix status code for capture
-
-The recent updates do not take in account the possible
-calls for the capture stream. Fix the avail and delay
-inconsistencies (and assert).
+Date: Wed, 2 Jun 2021 19:46:46 +0200
+Subject: [PATCH 09/28] pcm: remove extra NULL checks in snd_pcm_dshare_open()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_plugin.c | 21 +++++++++++++++++++--
- 1 file changed, 19 insertions(+), 2 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index 5787a43d..7ed6f25a 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -545,13 +545,30 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
- static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
+ src/pcm/pcm_dshare.c | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
+
+diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
+index 0f5238a6..a918512b 100644
+--- a/src/pcm/pcm_dshare.c
++++ b/src/pcm/pcm_dshare.c
+@@ -690,8 +690,8 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
+ 			snd_config_t *root, snd_config_t *sconf,
+ 			snd_pcm_stream_t stream, int mode)
  {
- 	snd_pcm_plugin_t *plugin = pcm->private_data;
--	snd_pcm_sframes_t err;
-+	snd_pcm_sframes_t err, diff;
- 
- 	err = snd_pcm_status(plugin->gen.slave, status);
- 	if (err < 0)
- 		return err;
--	assert(status->appl_ptr == *pcm->appl.ptr);
- 	snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
-+	/*
-+	 * For capture stream, the situation is more complicated, because
-+	 * snd_pcm_plugin_avail_update() commits the data to the slave pcm.
-+	 * It means that the slave appl_ptr is updated. Calculate diff and
-+	 * update the delay and avail.
-+	 *
-+	 * This resolves the data inconsistency for immediate calls:
-+	 *    snd_pcm_avail_update()
-+	 *    snd_pcm_status()
-+	 */
-+	if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
-+		status->appl_ptr = *pcm->appl.ptr;
-+		diff = pcm_frame_diff(status->appl_ptr, *pcm->appl.ptr, pcm->boundary);
-+		status->avail += diff;
-+		status->delay += diff;
-+	} else {
-+		assert(status->appl_ptr == *pcm->appl.ptr);
-+	}
- 	return 0;
+-	snd_pcm_t *pcm = NULL, *spcm = NULL;
+-	snd_pcm_direct_t *dshare = NULL;
++	snd_pcm_t *pcm, *spcm = NULL;
++	snd_pcm_direct_t *dshare;
+ 	int ret, first_instance;
+ 	unsigned int chn;
+ 
+@@ -851,12 +851,9 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
+ 	} else
+ 		snd_pcm_direct_semaphore_up(dshare, DIRECT_IPC_SEM_CLIENT);
+  _err_nosem:
+-	if (dshare) {
+-		free(dshare->bindings);
+-		free(dshare);
+-	}
+-	if (pcm)
+-		snd_pcm_free(pcm);
++	free(dshare->bindings);
++	free(dshare);
++	snd_pcm_free(pcm);
+ 	return ret;
  }
  
 -- 
-2.29.2
+2.30.2
 
 
-From ac520b2ed11f31e789a4da1d55e360e3eaeac50d Mon Sep 17 00:00:00 2001
+From eabadf545c51d4c88c5f359db73726ec3ac653ba Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 4 Jan 2021 17:14:42 +0100
-Subject: [PATCH 32/49] pcm: rate - use pcm_frame_diff() on related places
+Date: Wed, 2 Jun 2021 19:49:29 +0200
+Subject: [PATCH 10/28] pcm: softvol - fix early exit in add_tlv_info()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_rate.c | 20 +++++++-------------
- 1 file changed, 7 insertions(+), 13 deletions(-)
-
-diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
-index abb2753f..3d301d0e 100644
---- a/src/pcm/pcm_rate.c
-+++ b/src/pcm/pcm_rate.c
-@@ -561,17 +561,16 @@ snd_pcm_rate_read_areas1(snd_pcm_t *pcm,
- 
- static inline void snd_pcm_rate_sync_hwptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr)
+ src/pcm/pcm_softvol.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/pcm/pcm_softvol.c b/src/pcm/pcm_softvol.c
+index e2bdd31a..eea322ca 100644
+--- a/src/pcm/pcm_softvol.c
++++ b/src/pcm/pcm_softvol.c
+@@ -711,13 +711,13 @@ static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo,
+ 			unsigned int *old_tlv, size_t old_tlv_size)
  {
--	snd_pcm_rate_t *rate = pcm->private_data;
--
--	snd_pcm_sframes_t slave_hw_ptr_diff = slave_hw_ptr - rate->last_slave_hw_ptr;
-+	snd_pcm_rate_t *rate;
-+	snd_pcm_sframes_t slave_hw_ptr_diff;
- 	snd_pcm_sframes_t last_slave_hw_ptr_frac;
- 
- 	if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
- 		return;
- 
--	if (slave_hw_ptr_diff < 0)
--		slave_hw_ptr_diff += rate->gen.slave->boundary; /* slave boundary wraparound */
--	else if (slave_hw_ptr_diff == 0)
-+	rate = pcm->private_data;
-+	slave_hw_ptr_diff = pcm_frame_diff(slave_hw_ptr, rate->last_slave_hw_ptr, rate->gen.slave->boundary);
-+	if (slave_hw_ptr_diff == 0)
- 		return;
- 	last_slave_hw_ptr_frac = rate->last_slave_hw_ptr % rate->gen.slave->period_size;
- 	/* While handling fraction part fo slave period, rounded value will be
-@@ -922,10 +921,7 @@ static int snd_pcm_rate_sync_playback_area(snd_pcm_t *pcm, snd_pcm_uframes_t app
- 	if (slave_size < 0)
- 		return slave_size;
- 
--	if (appl_ptr < rate->last_commit_ptr)
--		xfer = appl_ptr - rate->last_commit_ptr + pcm->boundary;
--	else
--		xfer = appl_ptr - rate->last_commit_ptr;
-+	xfer = pcm_frame_diff(appl_ptr, rate->last_commit_ptr, pcm->boundary);
- 	while (xfer >= pcm->period_size &&
- 	       (snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
- 		err = snd_pcm_rate_commit_next_period(pcm, rate->last_commit_ptr % pcm->buffer_size);
-@@ -1059,9 +1055,7 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm)
- 		sw_params.avail_min = 1;
- 		snd_pcm_sw_params(rate->gen.slave, &sw_params);
+ 	unsigned int tlv[4];
+-	if (sizeof(tlv) <= old_tlv_size && memcmp(tlv, old_tlv, sizeof(tlv)) == 0)
+-		return 0;
+ 	tlv[SNDRV_CTL_TLVO_TYPE] = SND_CTL_TLVT_DB_SCALE;
+ 	tlv[SNDRV_CTL_TLVO_LEN] = 2 * sizeof(int);
+ 	tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] = (int)(svol->min_dB * 100);
+ 	tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] =
+ 		(int)((svol->max_dB - svol->min_dB) * 100 / svol->max_val);
++	if (sizeof(tlv) <= old_tlv_size && memcmp(tlv, old_tlv, sizeof(tlv)) == 0)
++		return 0;
+ 	return snd_ctl_elem_tlv_write(svol->ctl, &cinfo->id, tlv);
+ }
  
--		size = rate->appl_ptr - rate->last_commit_ptr;
--		if (size > pcm->boundary)
--			size -= pcm->boundary;
-+		size = pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
- 		ofs = rate->last_commit_ptr % pcm->buffer_size;
- 		while (size > 0) {
- 			snd_pcm_uframes_t psize, spsize;
 -- 
-2.29.2
+2.30.2
 
 
-From b62f66442bfbcea7c11afe4917e196fa95a65083 Mon Sep 17 00:00:00 2001
+From cf3846d46053b23006e6a9042b586fc78e81af55 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 4 Jan 2021 17:27:32 +0100
-Subject: [PATCH 33/49] pcm: rate - fix the capture delay values
+Date: Wed, 2 Jun 2021 19:50:17 +0200
+Subject: [PATCH 11/28] timer: remove dead code in _snd_timer_hw_open()
 
-Use the correct snd_pcm_mmap_capture_delay() function instead
-snd_pcm_mmap_capture_hw_avail().
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_rate.c | 8 ++------
- 1 file changed, 2 insertions(+), 6 deletions(-)
-
-diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
-index 3d301d0e..770aafea 100644
---- a/src/pcm/pcm_rate.c
-+++ b/src/pcm/pcm_rate.c
-@@ -632,7 +632,7 @@ static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
- 				+ snd_pcm_rate_playback_internal_delay(pcm);
- 	} else {
- 		*delayp = rate->ops.output_frames(rate->obj, slave_delay)
--				+ snd_pcm_mmap_capture_hw_avail(pcm);
-+				+ snd_pcm_mmap_capture_delay(pcm);
+ src/timer/timer_hw.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/src/timer/timer_hw.c b/src/timer/timer_hw.c
+index cfb77463..fe4e40bb 100644
+--- a/src/timer/timer_hw.c
++++ b/src/timer/timer_hw.c
+@@ -330,8 +330,6 @@ int _snd_timer_hw_open(snd_timer_t **timer, char *name,
+ 		SNDERR("Unexpected field %s", id);
+ 		return -EINVAL;
  	}
- 	return 0;
+-	if (card < 0)
+-		return -EINVAL;
+ 	return snd_timer_hw_open(timer, name, dev_class, dev_sclass, card, device, subdevice, mode);
  }
-@@ -1157,12 +1157,8 @@ static int snd_pcm_rate_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 		status->avail = snd_pcm_mmap_playback_avail(pcm);
- 		status->avail_max = rate->ops.input_frames(rate->obj, status->avail_max);
- 	} else {
--		/* FIXME: Maybe possible to somthing similar to
--		 * snd_pcm_rate_playback_internal_delay()
--		 * for the capture case.
--		 */
- 		status->delay = rate->ops.output_frames(rate->obj, status->delay)
--					+ snd_pcm_mmap_capture_hw_avail(pcm);
-+					+ snd_pcm_mmap_capture_delay(pcm);
- 		status->avail = snd_pcm_mmap_capture_avail(pcm);
- 		status->avail_max = rate->ops.output_frames(rate->obj, status->avail_max);
- 	}
+ SND_DLSYM_BUILD_VERSION(_snd_timer_hw_open, SND_TIMER_DLSYM_VERSION);
 -- 
-2.29.2
+2.30.2
 
 
-From 437b5b3aae8b1d9f65289f563deb0fa6356a0fa6 Mon Sep 17 00:00:00 2001
+From 200d18cda7a700607c21ad5dc9faaea2a1e27dbd Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:32:11 +0100
-Subject: [PATCH 34/49] ucm: fix possible memory leak in parse_verb_file()
+Date: Wed, 2 Jun 2021 19:51:13 +0200
+Subject: [PATCH 12/28] ucm: fix error path in execute_cfgsave()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/ucm/parser.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/ucm/main.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
 
-diff --git a/src/ucm/parser.c b/src/ucm/parser.c
-index 75b78826..c8bee1f2 100644
---- a/src/ucm/parser.c
-+++ b/src/ucm/parser.c
-@@ -1575,7 +1575,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
- 	/* in-place evaluation */
- 	err = uc_mgr_evaluate_inplace(uc_mgr, cfg);
- 	if (err < 0)
--		return err;
-+		goto _err;
- 
- 	/* parse master config sections */
- 	snd_config_for_each(i, next, cfg) {
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index c9b37b68..42fdaa1d 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -605,8 +605,10 @@ static int execute_cfgsave(snd_use_case_mgr_t *uc_mgr, const char *filename)
+ 		uc_error("unable to open file '%s': %s", file, snd_strerror(err));
+ 		goto _err;
+ 	}
+-	if (!config || snd_config_is_empty(config))
++	if (!config || snd_config_is_empty(config)) {
++		snd_output_close(out);
+ 		goto _err;
++	}
+ 	if (with_root) {
+ 		snd_output_printf(out, "%s ", root);
+ 		err = _snd_config_save_node_value(config, out, 0);
 -- 
-2.29.2
+2.30.2
 
 
-From d0bb8f84c92357bfd0e024efe5f6d53a963c4d7a Mon Sep 17 00:00:00 2001
+From 9b71d53bde21c8bb0d900c17863664e12753d844 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:34:00 +0100
-Subject: [PATCH 35/49] topology: tplg_pprint_integer() fix coverity
- uninitalized variable error
+Date: Wed, 2 Jun 2021 19:52:12 +0200
+Subject: [PATCH 13/28] ucm: fix use after free in if_eval_regex_match()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/topology/save.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/topology/save.c b/src/topology/save.c
-index c7a5a801..f7af7af3 100644
---- a/src/topology/save.c
-+++ b/src/topology/save.c
-@@ -133,6 +133,8 @@ static int tplg_pprint_integer(snd_config_t *n, char **ret)
- 		if (llval < INT_MIN || llval > UINT_MAX)
- 			return snd_config_get_ascii(n, ret);
- 		lval = llval;
-+	} else {
-+		lval = 0;
- 	}
- 	err = tplg_nice_value_format(buf, sizeof(buf), (unsigned int)lval);
+ src/ucm/ucm_cond.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/ucm/ucm_cond.c b/src/ucm/ucm_cond.c
+index 59d1a155..adb0ecd9 100644
+--- a/src/ucm/ucm_cond.c
++++ b/src/ucm/ucm_cond.c
+@@ -160,11 +160,12 @@ static int if_eval_regex_match(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval)
  	if (err < 0)
+ 		return err;
+ 	err = regcomp(&re, s, options);
+-	free(s);
+ 	if (err) {
+ 		uc_error("Regex '%s' compilation failed (code %d)", s, err);
++		free(s);
+ 		return -EINVAL;
+ 	}
++	free(s);
+ 
+ 	err = uc_mgr_get_substituted_value(uc_mgr, &s, string);
+ 	if (err < 0) {
 -- 
-2.29.2
+2.30.2
 
 
-From b8764a061b83284be60adc01c1f7b035c4484ace Mon Sep 17 00:00:00 2001
+From 7764e3e621a4c8a52327833d44e32c8b6fe3a131 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:36:04 +0100
-Subject: [PATCH 36/49] topology: tplg_add_widget_object() - do not use invalid
- elem_ctl
+Date: Wed, 2 Jun 2021 19:53:24 +0200
+Subject: [PATCH 14/28] ucm: fix if_eval_path() - access NULL pointer
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/topology/dapm.c | 1 +
- 1 file changed, 1 insertion(+)
+ src/ucm/ucm_cond.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/src/topology/dapm.c b/src/topology/dapm.c
-index 92dc01aa..f6a84a60 100644
---- a/src/topology/dapm.c
-+++ b/src/topology/dapm.c
-@@ -836,6 +836,7 @@ int tplg_add_widget_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
- 		default:
- 			SNDERR("widget %s: invalid type %d for ctl %d",
- 				wt->name, ct->type, i);
-+			ret = -EINVAL;
- 			break;
- 		}
+diff --git a/src/ucm/ucm_cond.c b/src/ucm/ucm_cond.c
+index adb0ecd9..0ed0b690 100644
+--- a/src/ucm/ucm_cond.c
++++ b/src/ucm/ucm_cond.c
+@@ -272,7 +272,7 @@ static int if_eval_control_exists(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval
+ 
+ static int if_eval_path(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval)
+ {
+-	const char *path, *mode = NULL;
++	const char *path, *mode = "";
+ 	int err, amode = F_OK;
  
+ 	if (uc_mgr->conf_format < 4) {
 -- 
-2.29.2
+2.30.2
 
 
-From 0dbaba95f4bc59602bf2d3fb12a60db7444e5892 Mon Sep 17 00:00:00 2001
+From 7fcb1aadd56e94f03e51c4747e72d77279151c22 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:38:50 +0100
-Subject: [PATCH 37/49] topology: tplg_decode_pcm() - add missing log argument
- (compress)
+Date: Wed, 2 Jun 2021 19:56:01 +0200
+Subject: [PATCH 15/28] ucm: find_exec() - fix memory leak (dir)
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/topology/pcm.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/ucm/ucm_exec.c | 1 +
+ 1 file changed, 1 insertion(+)
 
-diff --git a/src/topology/pcm.c b/src/topology/pcm.c
-index c8f41862..a473b59b 100644
---- a/src/topology/pcm.c
-+++ b/src/topology/pcm.c
-@@ -2020,7 +2020,7 @@ next:
- 	pt->playback = pcm->playback;
- 	pt->capture = pcm->capture;
- 	pt->compress = pcm->compress;
--	tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress",
-+	tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress %d",
- 		 pt->playback, pt->capture, pt->compress);
- 	pt->num_streams = pcm->num_streams;
- 	pt->flag_mask = pcm->flag_mask;
+diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c
+index a22df8fe..1cdb2633 100644
+--- a/src/ucm/ucm_exec.c
++++ b/src/ucm/ucm_exec.c
+@@ -73,6 +73,7 @@ static int find_exec(const char *name, char *out, size_t len)
+ 				    || !(st.st_mode & S_IEXEC))
+ 					continue;
+ 				snd_strlcpy(out, bin, len);
++				closedir(dir);
+ 				return 1;
+ 			}
+ 			closedir(dir);
 -- 
-2.29.2
+2.30.2
 
 
-From 51e1d486ce4535923692bd1d7e59d5aa3a29cd50 Mon Sep 17 00:00:00 2001
+From 26ab7fc3e4cba416cf51aa0fb48fdddaa0d861ee Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:40:42 +0100
-Subject: [PATCH 38/49] topology: parse_tuple_set() - remove dead condition
- code
+Date: Wed, 2 Jun 2021 19:58:04 +0200
+Subject: [PATCH 16/28] ucm: fix possible NULL pointer dereference in
+ uc_mgr_exec()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/topology/data.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/topology/data.c b/src/topology/data.c
-index c2931bd2..5633cdc3 100644
---- a/src/topology/data.c
-+++ b/src/topology/data.c
-@@ -860,7 +860,7 @@ static int parse_tuple_set(snd_config_t *cfg,
- 			}
- 
- 			if ((type == SND_SOC_TPLG_TUPLE_TYPE_WORD
--					&& tuple_val > UINT_MAX)
-+					/* && tuple_val > UINT_MAX */)
- 				|| (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
- 					&& tuple_val > USHRT_MAX)
- 				|| (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
+ src/ucm/ucm_exec.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c
+index 1cdb2633..d83206d0 100644
+--- a/src/ucm/ucm_exec.c
++++ b/src/ucm/ucm_exec.c
+@@ -185,7 +185,11 @@ int uc_mgr_exec(const char *prog)
+ 		return -EINVAL;
+ 
+ 	prog = argv[0];
+-	if (argv[0][0] != '/' && argv[0][0] != '.') {
++	if (prog == NULL) {
++		err = -EINVAL;
++		goto __error;
++	}
++	if (prog[0] != '/' && prog[0] != '.') {
+ 		if (!find_exec(argv[0], bin, sizeof(bin))) {
+ 			err = -ENOEXEC;
+ 			goto __error;
 -- 
-2.29.2
+2.30.2
 
 
-From 3f63dc26445ae7c215e48a57af83b6da325f166d Mon Sep 17 00:00:00 2001
+From 64a6d4d1e827732bef7c68e1e6d2cb6863b4597c Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:41:38 +0100
-Subject: [PATCH 39/49] ucm: uc_mgr_substitute_tree() fix use after free
+Date: Wed, 2 Jun 2021 19:59:10 +0200
+Subject: [PATCH 17/28] ucm: check error value in parse_lookup_query()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/ucm/ucm_subs.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/ucm/ucm_subs.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
 
 diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
-index f608bb09..df6d736f 100644
+index c56730c5..0bc4e63f 100644
 --- a/src/ucm/ucm_subs.c
 +++ b/src/ucm/ucm_subs.c
-@@ -417,11 +417,12 @@ int uc_mgr_substitute_tree(snd_use_case_mgr_t *uc_mgr, snd_config_t *node)
- 		if (err < 0)
- 			return err;
- 		err = snd_config_set_id(node, s);
--		free(s);
- 		if (err < 0) {
- 			uc_error("unable to set substituted id '%s' (old id '%s')", s, id);
-+			free(s);
- 			return err;
- 		}
-+		free(s);
+@@ -224,7 +224,11 @@ static snd_config_t *parse_lookup_query(const char *query)
+ 		uc_error("unable to create memory input buffer");
+ 		return NULL;
  	}
- 	if (snd_config_get_type(node) != SND_CONFIG_TYPE_COMPOUND) {
- 		if (snd_config_get_type(node) == SND_CONFIG_TYPE_STRING) {
+-	snd_config_top(&config);
++	err = snd_config_top(&config);
++	if (err < 0) {
++		snd_input_close(input);
++		return NULL;
++	}
+ 	err = snd_config_load(config, input);
+ 	snd_input_close(input);
+ 	if (err < 0) {
 -- 
-2.29.2
+2.30.2
 
 
-From 45f503632acf24877c466a7c1c74d8a26414bf3e Mon Sep 17 00:00:00 2001
+From 30d1d256e792fbabf14c57efb98c489541b19f37 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:45:27 +0100
-Subject: [PATCH 40/49] topology: sort_config() cleanups - use goto for the
- error path
+Date: Wed, 2 Jun 2021 20:01:08 +0200
+Subject: [PATCH 18/28] ucm: fix out-of-array access in
+ rval_device_lookup_init()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/topology/save.c | 15 +++++++--------
- 1 file changed, 7 insertions(+), 8 deletions(-)
-
-diff --git a/src/topology/save.c b/src/topology/save.c
-index f7af7af3..fecbc6a5 100644
---- a/src/topology/save.c
-+++ b/src/topology/save.c
-@@ -180,29 +180,28 @@ static snd_config_t *sort_config(const char *id, snd_config_t *src)
- 	}
- 	if (array <= 0)
- 		qsort(a, count, sizeof(a[0]), _compar);
--	if (snd_config_make_compound(&dst, id, count == 1)) {
--		free(a);
--		return NULL;
--	}
-+	if (snd_config_make_compound(&dst, id, count == 1))
-+		goto lerr;
- 	for (index = 0; index < count; index++) {
- 		snd_config_t *s = a[index];
- 		const char *id2;
- 		if (snd_config_get_id(s, &id2)) {
- 			snd_config_delete(dst);
--			free(a);
--			return NULL;
-+			goto lerr;
- 		}
- 		s = sort_config(id2, s);
- 		if (s == NULL || snd_config_add(dst, s)) {
- 			if (s)
- 				snd_config_delete(s);
- 			snd_config_delete(dst);
--			free(a);
--			return NULL;
-+			goto lerr;
- 		}
+ src/ucm/ucm_subs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
+index 0bc4e63f..20905c3f 100644
+--- a/src/ucm/ucm_subs.c
++++ b/src/ucm/ucm_subs.c
+@@ -489,7 +489,7 @@ static int rval_device_lookup_init(snd_use_case_mgr_t *uc_mgr,
+ 		uc_error("Missing device type!");
+ 		return -EINVAL;
  	}
- 	free(a);
- 	return dst;
-+lerr:
-+	free(a);
-+	return NULL;
- }
- 
- static int tplg_check_quoted(const unsigned char *p)
+-	for (t = types; t; t++)
++	for (t = types; t->name; t++)
+ 		if (strcasecmp(t->name, s) == 0)
+ 			return t->init(iter, config);
+ 	uc_error("Device type '%s' is invalid", s);
 -- 
-2.29.2
+2.30.2
 
 
-From 93752fb4de397554e92a4eb9079f77dabaec7d7f Mon Sep 17 00:00:00 2001
+From 42c0ccf3275fef523471fa7ea4feecd7b1052357 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 7 Jan 2021 17:49:25 +0100
-Subject: [PATCH 41/49] conf: USB - add "Xonar U7 MKII" to
- USB-Audio.pcm.iec958_device
+Date: Thu, 3 Jun 2021 07:29:11 +0200
+Subject: [PATCH 19/28] conf: snd_config_get_card() remove unused assignment
 
-BugLink: https://github.com/alsa-project/alsa-lib/issues/100
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/conf/cards/USB-Audio.conf | 1 +
- 1 file changed, 1 insertion(+)
+ src/confmisc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
-index 9b64af3c..b1b74b02 100644
---- a/src/conf/cards/USB-Audio.conf
-+++ b/src/conf/cards/USB-Audio.conf
-@@ -39,6 +39,7 @@ USB-Audio.pcm.iec958_device {
- 	# "NoiseBlaster 3000" 42
- 	"USB Sound Blaster HD" 1
- 	"Xonar U7" 1
-+	"Xonar U7 MKII" 1
- 	"ASUS XONAR U5" 1
- 	"XONAR U5" 1
- 	"XONAR SOUND CARD" 1
+diff --git a/src/confmisc.c b/src/confmisc.c
+index a561040c..64af96fa 100644
+--- a/src/confmisc.c
++++ b/src/confmisc.c
+@@ -155,7 +155,7 @@ int snd_config_get_card(const snd_config_t *conf)
+ 	int err;
+ 
+ 	if (snd_config_get_integer(conf, &v) < 0) {
+-		if ((err = snd_config_get_string(conf, &str)) < 0) {
++		if (snd_config_get_string(conf, &str)) {
+ 			if (snd_config_get_id(conf, &id) >= 0)
+ 				SNDERR("Invalid field %s", id);
+ 			return -EINVAL;
 -- 
-2.29.2
+2.30.2
 
 
-From 644514e85da169670e4a490b7b15b5ecfcec92c0 Mon Sep 17 00:00:00 2001
+From a154cb29043a4db2fa92bc146fd4cf94c9851892 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 18 Jan 2021 21:09:43 +0100
-Subject: [PATCH 42/49] pcm_plugin: set the initial hw_ptr/appl_ptr from the
- child pcm
-
-The direct plugins (dmix & etc.) sets own initial
-hw_ptr and appl_ptr. Use this initial settings
-to export correct values in snd_pcm_status().
+Date: Thu, 3 Jun 2021 07:29:43 +0200
+Subject: [PATCH 20/28] pcm: direct - remove dead code
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_plugin.c | 32 +++++++++++++++++---------------
- 1 file changed, 17 insertions(+), 15 deletions(-)
-
-diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
-index 7ed6f25a..ff254eba 100644
---- a/src/pcm/pcm_plugin.c
-+++ b/src/pcm/pcm_plugin.c
-@@ -146,15 +146,14 @@ static int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
- 	return 0;
- }
- 
--static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
-+static int snd_pcm_plugin_call_init_cb(snd_pcm_t *pcm, snd_pcm_plugin_t *plugin)
- {
--	snd_pcm_plugin_t *plugin = pcm->private_data;
-+	snd_pcm_t *slave = plugin->gen.slave;
- 	int err;
--	err = snd_pcm_prepare(plugin->gen.slave);
--	if (err < 0)
--		return err;
--	*pcm->hw.ptr = 0;
--	*pcm->appl.ptr = 0;
-+
-+	assert(pcm->boundary == slave->boundary);
-+	*pcm->hw.ptr = *slave->hw.ptr;
-+	*pcm->appl.ptr = *slave->appl.ptr;
- 	if (plugin->init) {
- 		err = plugin->init(pcm);
- 		if (err < 0)
-@@ -163,6 +162,16 @@ static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
- 	return 0;
- }
- 
-+static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
-+{
-+	snd_pcm_plugin_t *plugin = pcm->private_data;
-+	int err;
-+	err = snd_pcm_prepare(plugin->gen.slave);
-+	if (err < 0)
-+		return err;
-+	return snd_pcm_plugin_call_init_cb(pcm, plugin);
-+}
-+
- static int snd_pcm_plugin_reset(snd_pcm_t *pcm)
- {
- 	snd_pcm_plugin_t *plugin = pcm->private_data;
-@@ -170,14 +179,7 @@ static int snd_pcm_plugin_reset(snd_pcm_t *pcm)
- 	err = snd_pcm_reset(plugin->gen.slave);
- 	if (err < 0)
- 		return err;
--	*pcm->hw.ptr = 0;
--	*pcm->appl.ptr = 0;
--	if (plugin->init) {
--		err = plugin->init(pcm);
--		if (err < 0)
--			return err;
--	}
--	return 0;
-+	return snd_pcm_plugin_call_init_cb(pcm, plugin);
- }
- 
- static snd_pcm_sframes_t snd_pcm_plugin_rewindable(snd_pcm_t *pcm)
+ src/pcm/pcm_direct.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
+index 361805bd..d50503e3 100644
+--- a/src/pcm/pcm_direct.c
++++ b/src/pcm/pcm_direct.c
+@@ -1857,8 +1857,6 @@ static int _snd_pcm_direct_get_slave_ipc_offset(snd_config_t *root,
+ 			continue;
+ 		}
+ 	}
+-	if (card < 0)
+-		card = 0;
+ 	if (device < 0)
+ 		device = 0;
+ 	if (subdevice < 0)
 -- 
-2.29.2
+2.30.2
 
 
-From 0de72e63d7bd180566c71f6fb01d7719525ee326 Mon Sep 17 00:00:00 2001
+From e2133090603a74c0b08cd45b689063071bc90c81 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Tue, 19 Jan 2021 11:17:00 +0100
-Subject: [PATCH 43/49] pcm: dmix/dshare - delay calculation fixes and cleanups
-
-Unfortunately, we cannot use status->avail from slave, because this value
-does not wrap to the buffer size and it may even overflow slave boundary
-(endless run). We can use only hw_ptr from slave.
+Date: Thu, 3 Jun 2021 07:30:27 +0200
+Subject: [PATCH 21/28] ucm: fix possible memory leak in parse_verb_file()
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_dmix.c   | 5 ++---
- src/pcm/pcm_dshare.c | 5 ++---
- 2 files changed, 4 insertions(+), 6 deletions(-)
+ src/ucm/parser.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
-index 5b7472d9..be2675af 100644
---- a/src/pcm/pcm_dmix.c
-+++ b/src/pcm/pcm_dmix.c
-@@ -488,8 +488,7 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	case SNDRV_PCM_STATE_DRAINING:
- 	case SNDRV_PCM_STATE_RUNNING:
- 		snd_pcm_dmix_sync_ptr0(pcm, status->hw_ptr);
--		status->delay += snd_pcm_mmap_playback_delay(pcm)
--				+ status->avail - dmix->spcm->buffer_size;
-+		status->delay = snd_pcm_mmap_playback_delay(pcm);
- 		break;
- 	default:
- 		break;
-@@ -518,7 +517,7 @@ static int snd_pcm_dmix_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
- 	case SNDRV_PCM_STATE_PREPARED:
- 	case SNDRV_PCM_STATE_SUSPENDED:
- 	case STATE_RUN_PENDING:
--		*delayp = snd_pcm_mmap_playback_hw_avail(pcm);
-+		*delayp = snd_pcm_mmap_playback_delay(pcm);
- 		return 0;
- 	case SNDRV_PCM_STATE_XRUN:
- 		return -EPIPE;
-diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
-index 8a672572..10243013 100644
---- a/src/pcm/pcm_dshare.c
-+++ b/src/pcm/pcm_dshare.c
-@@ -237,8 +237,7 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	case SNDRV_PCM_STATE_DRAINING:
- 	case SNDRV_PCM_STATE_RUNNING:
- 		snd_pcm_dshare_sync_ptr0(pcm, status->hw_ptr);
--		status->delay += snd_pcm_mmap_playback_delay(pcm)
--				+ status->avail - dshare->spcm->buffer_size;
-+		status->delay += snd_pcm_mmap_playback_delay(pcm);
- 		break;
- 	default:
- 		break;
-@@ -290,7 +289,7 @@ static int snd_pcm_dshare_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
- 	case SNDRV_PCM_STATE_PREPARED:
- 	case SNDRV_PCM_STATE_SUSPENDED:
- 	case STATE_RUN_PENDING:
--		*delayp = snd_pcm_mmap_playback_hw_avail(pcm);
-+		*delayp = snd_pcm_mmap_playback_delay(pcm);
- 		return 0;
- 	case SNDRV_PCM_STATE_XRUN:
- 		return -EPIPE;
+diff --git a/src/ucm/parser.c b/src/ucm/parser.c
+index ed261fa2..fccf5791 100644
+--- a/src/ucm/parser.c
++++ b/src/ucm/parser.c
+@@ -1779,7 +1779,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
+ 			err = parse_libconfig(uc_mgr, n);
+ 			if (err < 0) {
+ 				uc_error("error: failed to parse LibConfig");
+-				return err;
++				goto _err;
+ 			}
+ 			continue;
+ 		}
 -- 
-2.29.2
+2.30.2
 
 
-From ae7362c996e0b991c399cc26c6d0b3c8e295e83c Mon Sep 17 00:00:00 2001
+From 0325f4357d25f262400038f074512e1887c8e5f1 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Wed, 20 Jan 2021 16:58:33 +0100
-Subject: [PATCH 44/49] topology: fix 'parse_tuple_set() - remove dead
- condition code'
-
-The whole SND_SOC_TPLG_TUPLE_TYPE_WORD condition part must be
-commented out, otherwise the condition is always true.
+Date: Thu, 3 Jun 2021 09:00:51 +0200
+Subject: [PATCH 22/28] ucm: compound_merge() - fix use after free (and logic)
 
-Fixes: 51e1d486ce ("topology: parse_tuple_set() - remove dead condition code")
-BugLink: https://github.com/alsa-project/alsa-lib/issues/114
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/topology/data.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/topology/data.c b/src/topology/data.c
-index 5633cdc3..0546d63e 100644
---- a/src/topology/data.c
-+++ b/src/topology/data.c
-@@ -859,11 +859,11 @@ static int parse_tuple_set(snd_config_t *cfg,
- 				goto err;
- 			}
+ src/ucm/ucm_include.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/src/ucm/ucm_include.c b/src/ucm/ucm_include.c
+index 6945dd2e..a3a584a1 100644
+--- a/src/ucm/ucm_include.c
++++ b/src/ucm/ucm_include.c
+@@ -108,7 +108,7 @@ static int find_position_node(snd_config_t **res, snd_config_t *dst,
+ 	return 0;
+ }
+ 
+-static int merge_it(snd_config_t *dst, snd_config_t *n)
++static int merge_it(snd_config_t *dst, snd_config_t *n, snd_config_t **_dn)
+ {
+ 	snd_config_t *dn;
+ 	const char *id;
+@@ -123,6 +123,8 @@ static int merge_it(snd_config_t *dst, snd_config_t *n)
+ 	err = snd_config_merge(dn, n, 0); /* merge / append mode */
+ 	if (err < 0)
+ 		snd_config_delete(n);
++	else
++		*_dn = dn;
+ 	return err;
+ }
  
--			if ((type == SND_SOC_TPLG_TUPLE_TYPE_WORD
--					/* && tuple_val > UINT_MAX */)
--				|| (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
--					&& tuple_val > USHRT_MAX)
--				|| (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
-+			if (/* (type == SND_SOC_TPLG_TUPLE_TYPE_WORD
-+					&& tuple_val > UINT_MAX) || */
-+				(type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
-+					&& tuple_val > USHRT_MAX) ||
-+				(type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
- 					&& tuple_val > UCHAR_MAX)) {
- 				SNDERR("tuple %s: invalid value", id);
- 				goto err;
+@@ -198,7 +200,7 @@ static int compound_merge(const char *id,
+ 		if (_before) {
+ 			err = snd_config_add_before(_before, n);
+ 			if (err == -EEXIST)
+-				err = merge_it(dst, n);
++				err = merge_it(dst, n, &n);
+ 			if (err < 0)
+ 				return err;
+ 			_before = NULL;
+@@ -206,7 +208,7 @@ static int compound_merge(const char *id,
+ 		} else if (_after) {
+ 			err = snd_config_add_after(_after, n);
+ 			if (err == -EEXIST)
+-				err = merge_it(dst, n);
++				err = merge_it(dst, n, &n);
+ 			if (err < 0)
+ 				return err;
+ 			_after = n;
 -- 
-2.29.2
-
-
-From f2c1a9f3279a30cbd8dcba1eaf0d52f50b56b886 Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Fri, 22 Jan 2021 15:48:39 +0100
-Subject: [PATCH 45/49] pcm: direct: Fix the missing appl_ptr update
-
-A snd_pcm_status() call for the direct plugins receives the status
-from the slave PCM, but this doesn't contain a valid appl_ptr, since
-the slave PCM for the direct plugins is in a free-wheel mode, hence
-the appl_ptr is always zero.  This result in the inconsistent
-status->appl_ptr and pcm->appl.ptr, hitting the recently introduced
-assert() call.
-
-Fix it by transferring the plugin's appl_ptr to the upper caller.
-
-BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1181194
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
+2.30.2
+
+
+From abe805ed6c7f38e48002e575535afd1f673b9bcd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@gmail.com>
+Date: Thu, 3 Jun 2021 12:29:03 +0200
+Subject: [PATCH 23/28] ucm_exec.c: Include limits.h explicitly to fix build on
+ musl
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Fixes:
+| ../../../alsa-lib-1.2.5/src/ucm/ucm_exec.c: In function 'find_exec':
+| ../../../alsa-lib-1.2.5/src/ucm/ucm_exec.c:43:18: error: 'PATH_MAX' undeclared (first use in this function)
+|    43 |         char bin[PATH_MAX];
+|       |                  ^~~~~~~~
+| ../../../alsa-lib-1.2.5/src/ucm/ucm_exec.c:43:18: note: each undeclared identifier is reported only once for each function it appears in
+| ../../../alsa-lib-1.2.5/src/ucm/ucm_exec.c: In function 'uc_mgr_exec':
+| ../../../alsa-lib-1.2.5/src/ucm/ucm_exec.c:177:18: error: 'PATH_MAX' undeclared (first use in this function)
+|   177 |         char bin[PATH_MAX];
+|       |                  ^~~~~~~~
+
+Fixes: https://github.com/alsa-project/alsa-lib/pull/145
+Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_dmix.c   | 1 +
- src/pcm/pcm_dshare.c | 1 +
- src/pcm/pcm_dsnoop.c | 1 +
- 3 files changed, 3 insertions(+)
+ src/ucm/ucm_exec.c | 1 +
+ 1 file changed, 1 insertion(+)
 
-diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
-index be2675af..d8495065 100644
---- a/src/pcm/pcm_dmix.c
-+++ b/src/pcm/pcm_dmix.c
-@@ -495,6 +495,7 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	}
- 
- 	status->state = snd_pcm_dmix_state(pcm);
-+	status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
- 	status->trigger_tstamp = dmix->trigger_tstamp;
- 	status->avail = snd_pcm_mmap_playback_avail(pcm);
- 	status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max;
-diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
-index 10243013..dccb137b 100644
---- a/src/pcm/pcm_dshare.c
-+++ b/src/pcm/pcm_dshare.c
-@@ -243,6 +243,7 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 		break;
- 	}
- 	status->state = snd_pcm_dshare_state(pcm);
-+	status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
- 	status->trigger_tstamp = dshare->trigger_tstamp;
- 	status->avail = snd_pcm_mmap_playback_avail(pcm);
- 	status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
-diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
-index c6e8cd27..695bf4aa 100644
---- a/src/pcm/pcm_dsnoop.c
-+++ b/src/pcm/pcm_dsnoop.c
-@@ -193,6 +193,7 @@ static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	snd_pcm_status(dsnoop->spcm, status);
- 	state = snd_pcm_state(dsnoop->spcm);
- 	status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state;
-+	status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
- 	status->trigger_tstamp = dsnoop->trigger_tstamp;
- 	status->avail = snd_pcm_mmap_capture_avail(pcm);
- 	status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max;
+diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c
+index d83206d0..4ddf5d15 100644
+--- a/src/ucm/ucm_exec.c
++++ b/src/ucm/ucm_exec.c
+@@ -30,6 +30,7 @@
+ #include "ucm_local.h"
+ #include <sys/stat.h>
+ #include <sys/wait.h>
++#include <limits.h>
+ #include <dirent.h>
+ 
+ static pthread_mutex_t fork_lock = PTHREAD_MUTEX_INITIALIZER;
 -- 
-2.29.2
+2.30.2
 
 
-From 26fdcb98e6be186016d53f87d06ae47aabe5b7fc Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Fri, 22 Jan 2021 15:48:40 +0100
-Subject: [PATCH 46/49] pcm: ioplug: Pass appl_ptr and hw_ptr in
- snd_pcm_status()
+From 01960fa85699686763e42eab537100909e8e6607 Mon Sep 17 00:00:00 2001
+From: Chih-Wei Huang <cwhuang@linux.org.tw>
+Date: Mon, 14 Jun 2021 12:21:35 +0800
+Subject: [PATCH 24/28] ucm: include sys/wait.h to fix build on Android
 
-The snd_pcm_status() of the ioplug doesn't return the current
-positions of hw_ptr and appl_ptr as advertised.  Fix it by copying the
-current values stored in the plugin data.
+    src/ucm/main.c:788:8: error: implicit declaration of function 'WIFSIGNALED' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
+                        if (WIFSIGNALED(err)) {
+                            ^
+    src/ucm/main.c:790:10: error: implicit declaration of function 'WIFEXITED' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
+                        } if (WIFEXITED(err)) {
+                              ^
+    src/ucm/main.c:791:34: error: implicit declaration of function 'WEXITSTATUS' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
+                                if (ignore_error == false && WEXITSTATUS(err) != 0) {
 
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Chih-Wei Huang <cwhuang@linux.org.tw>
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_ioplug.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
-index e141b1f9..a1463bf6 100644
---- a/src/pcm/pcm_ioplug.c
-+++ b/src/pcm/pcm_ioplug.c
-@@ -133,6 +133,8 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	gettimestamp(&status->tstamp, pcm->tstamp_type);
- 	status->avail = snd_pcm_mmap_avail(pcm);
- 	status->avail_max = io->avail_max;
-+	status->appl_ptr = *pcm->appl.ptr;
-+	status->hw_ptr = *pcm->hw.ptr;
- 	if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
- 		sd = snd_pcm_mmap_delay(pcm);
- 	status->delay = sd;
+ src/ucm/main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/ucm/main.c b/src/ucm/main.c
+index 42fdaa1d..d4645e4a 100644
+--- a/src/ucm/main.c
++++ b/src/ucm/main.c
+@@ -37,6 +37,7 @@
+ #include <stdarg.h>
+ #include <pthread.h>
+ #include <sys/stat.h>
++#include <sys/wait.h>
+ #include <limits.h>
+ 
+ /*
 -- 
-2.29.2
+2.30.2
 
 
-From bcc762f99ad642cc0dd9eaceb51f228eba9fe68c Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Fri, 22 Jan 2021 15:48:41 +0100
-Subject: [PATCH 47/49] pcm: null: Pass appl_ptr and hw_ptr in snd_pcm_status()
+From 76d1aa0cd7635f903bb1d48bb9c18279d46ec624 Mon Sep 17 00:00:00 2001
+From: Chih-Wei Huang <cwhuang@linux.org.tw>
+Date: Mon, 14 Jun 2021 12:24:10 +0800
+Subject: [PATCH 25/28] configure: check if eaccess() is available
 
-Just like the previous fix for ioplug, the null plugin also misses the
-appl_ptr and hw_ptr updates for snd_pcm_status().  Fix it as well.
+To fix the build error on Android:
+  src/ucm/parser.c:2521:7: error: implicit declaration of function 'eaccess' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
+                if (eaccess(filename, R_OK))
+                    ^
+  src/ucm/parser.c:2521:7: note: did you mean 'access'?
 
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Chih-Wei Huang <cwhuang@linux.org.tw>
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_null.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/pcm/pcm_null.c b/src/pcm/pcm_null.c
-index 1d815485..c8ea9b38 100644
---- a/src/pcm/pcm_null.c
-+++ b/src/pcm/pcm_null.c
-@@ -96,6 +96,8 @@ static int snd_pcm_null_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
- 	memset(status, 0, sizeof(*status));
- 	status->state = null->state;
- 	status->trigger_tstamp = null->trigger_tstamp;
-+	status->appl_ptr = *pcm->appl.ptr;
-+	status->hw_ptr = *pcm->hw.ptr;
- 	gettimestamp(&status->tstamp, pcm->tstamp_type);
- 	status->avail = snd_pcm_null_avail_update(pcm);
- 	status->avail_max = pcm->buffer_size;
+ configure.ac       | 1 +
+ src/ucm/parser.c   | 4 ++++
+ src/ucm/ucm_cond.c | 4 ++++
+ 3 files changed, 9 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 60271b8a..635bfeae 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -50,6 +50,7 @@ AC_HEADER_TIME
+ dnl Checks for library functions.
+ AC_PROG_GCC_TRADITIONAL
+ AC_CHECK_FUNCS([uselocale])
++AC_CHECK_FUNCS([eaccess])
+ 
+ SAVE_LIBRARY_VERSION
+ AC_SUBST(LIBTOOL_VERSION_INFO)
+diff --git a/src/ucm/parser.c b/src/ucm/parser.c
+index fccf5791..ee997800 100644
+--- a/src/ucm/parser.c
++++ b/src/ucm/parser.c
+@@ -2518,7 +2518,11 @@ int uc_mgr_scan_master_configs(const char **_list[])
+ 
+ 		snprintf(fn, sizeof(fn), "%s.conf", d_name);
+ 		ucm_filename(filename, sizeof(filename), 2, d_name, fn);
++#ifdef HAVE_EACCESS
+ 		if (eaccess(filename, R_OK))
++#else
++		if (access(filename, R_OK))
++#endif
+ 			continue;
+ 
+ 		err = uc_mgr_config_load(2, filename, &cfg);
+diff --git a/src/ucm/ucm_cond.c b/src/ucm/ucm_cond.c
+index 0ed0b690..985a366b 100644
+--- a/src/ucm/ucm_cond.c
++++ b/src/ucm/ucm_cond.c
+@@ -305,7 +305,11 @@ static int if_eval_path(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval)
+ 		return -EINVAL;
+ 	}
+ 
++#ifdef HAVE_EACCESS
+ 	if (eaccess(path, amode))
++#else
++	if (access(path, amode))
++#endif
+ 		return 0;
+ 
+ 	return 1;
 -- 
-2.29.2
+2.30.2
+
 
+From 8253c1c1f9095901c7dbfbb8ca5147d05828651a Mon Sep 17 00:00:00 2001
+From: Chih-Wei Huang <cwhuang@linux.org.tw>
+Date: Mon, 14 Jun 2021 12:41:11 +0800
+Subject: [PATCH 26/28] Fix EXPORT_SYMBOL attribute for clang
 
-From 55d59821ffb8f44395cf2b7a424d6523da58e66a Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Fri, 22 Jan 2021 15:48:42 +0100
-Subject: [PATCH 48/49] pcm: share: Pass appl_ptr and hw_ptr in
- snd_pcm_status()
+Clang doesn't have the externally_visible attribute.
 
-This one also has the same problem as others; the appl_ptr and hw_ptr
-of share plugin aren't updated in snd_pcm_status() call.  Fix it.
+    src/pcm/pcm.c:1503:1: error: unknown attribute 'externally_visible' ignored [-Werror,-Wunknown-attributes]
+    #define EXPORT_SYMBOL __attribute__((visibility("default"),externally_visible))                                                         ^
 
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Chih-Wei Huang <cwhuang@linux.org.tw>
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm_share.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c
-index bff9507d..72509491 100644
---- a/src/pcm/pcm_share.c
-+++ b/src/pcm/pcm_share.c
-@@ -711,6 +711,8 @@ static int snd_pcm_share_status(snd_pcm_t *pcm, snd_pcm_status_t *status)
-  _notrunning:
- 	status->delay = sd + d;
- 	status->state = share->state;
-+	status->appl_ptr = *pcm->appl.ptr;
-+	status->hw_ptr = *pcm->hw.ptr;
- 	status->trigger_tstamp = share->trigger_tstamp;
-  _end:
- 	Pthread_mutex_unlock(&slave->mutex);
+ include/alsa-symbols.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/include/alsa-symbols.h b/include/alsa-symbols.h
+index bba9a9d4..344f021a 100644
+--- a/include/alsa-symbols.h
++++ b/include/alsa-symbols.h
+@@ -34,7 +34,11 @@
+ #define default_symbol_version(real, name, version) \
+ 	__asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@@" #version)
+ 
++#ifdef __clang__
++#define EXPORT_SYMBOL __attribute__((visibility("default")))
++#else
+ #define EXPORT_SYMBOL __attribute__((visibility("default"),externally_visible))
++#endif
+ 
+ #ifdef USE_VERSIONED_SYMBOLS
+ #define use_symbol_version(real, name, version) \
 -- 
-2.29.2
+2.30.2
 
 
-From 00eafe98eebff8ecd1ecdc58470068bfd610cc8d Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 21 Jan 2021 15:45:49 +0100
-Subject: [PATCH 49/49] pcm: pcm_ioplug - fix the avail_update mmap capture
- copy issue
-
-It seems that the commit "pcm: ioplug: Transfer all available data"
-introduced new regressions (wrong memory access). The second issue
-is that the avail_update in ioplug does not move appl_ptr nor hw_ptr,
-so it's possible that the transfers may be repetitive.
+From f4c061f349188c548497607efd4622c6e6a43270 Mon Sep 17 00:00:00 2001
+From: Chih-Wei Huang <cwhuang@linux.org.tw>
+Date: Mon, 14 Jun 2021 13:08:08 +0800
+Subject: [PATCH 27/28] control: remap - fix an infinite recursive call in the
+ async callback
 
-This patch moves the transfer calls to mmap_begin callback where it
-should be. The pointer wraps are handled by design now.
+The function snd_ctl_remap_async will call itself infinitely. Looks like
+a typo.
 
-Fixes: 1714332719 ("pcm: ioplug: Transfer all available data")
-BugLink: https://github.com/alsa-project/alsa-lib/pull/103
-Tested-by: Andreas Pape <apape@de.adit-jv.com>
+Fixes: a64391a42 ("control: remap plugin - initial version")
+Signed-off-by: Chih-Wei Huang <cwhuang@linux.org.tw>
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- src/pcm/pcm.c        | 20 ++++++++++-----
- src/pcm/pcm_ioplug.c | 60 +++++++++++++++++++++++++-------------------
- src/pcm/pcm_local.h  |  2 ++
- 3 files changed, 50 insertions(+), 32 deletions(-)
-
-diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
-index 24030b31..a57ce5d9 100644
---- a/src/pcm/pcm.c
-+++ b/src/pcm/pcm.c
-@@ -7218,9 +7218,8 @@ int snd_pcm_mmap_begin(snd_pcm_t *pcm,
- }
- 
- #ifndef DOC_HIDDEN
--/* locked version */
--int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
--		       snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
-+int __snd_pcm_mmap_begin_generic(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
-+				 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
+ src/control/control_remap.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/control/control_remap.c b/src/control/control_remap.c
+index 17c6558a..a85c1725 100644
+--- a/src/control/control_remap.c
++++ b/src/control/control_remap.c
+@@ -323,7 +323,7 @@ static int snd_ctl_remap_nonblock(snd_ctl_t *ctl, int nonblock)
+ static int snd_ctl_remap_async(snd_ctl_t *ctl, int sig, pid_t pid)
  {
- 	snd_pcm_uframes_t cont;
- 	snd_pcm_uframes_t f;
-@@ -7229,9 +7228,6 @@ int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
- 
- 	assert(pcm && areas && offset && frames);
- 
--	if (pcm->fast_ops->mmap_begin)
--		return pcm->fast_ops->mmap_begin(pcm->fast_op_arg, areas, offset, frames);
--
- 	/* fallback for plugins that do not specify new callback */
- 	xareas = snd_pcm_mmap_areas(pcm);
- 	if (xareas == NULL)
-@@ -7250,6 +7246,18 @@ int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
- 	*frames = f;
- 	return 0;
- }
-+
-+/* locked version */
-+int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
-+			 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
-+{
-+	assert(pcm && areas && offset && frames);
-+
-+	if (pcm->fast_ops->mmap_begin)
-+		return pcm->fast_ops->mmap_begin(pcm->fast_op_arg, areas, offset, frames);
-+
-+	return __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
-+}
- #endif
- 
- /**
-diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
-index a1463bf6..98184398 100644
---- a/src/pcm/pcm_ioplug.c
-+++ b/src/pcm/pcm_ioplug.c
-@@ -697,6 +697,38 @@ static snd_pcm_sframes_t snd_pcm_ioplug_readn(snd_pcm_t *pcm, void **bufs, snd_p
- 	}
+ 	snd_ctl_remap_t *priv = ctl->private_data;
+-	return snd_ctl_remap_async(priv->child, sig, pid);
++	return snd_ctl_async(priv->child, sig, pid);
  }
  
-+static int snd_pcm_ioplug_mmap_begin_capture(snd_pcm_t *pcm,
-+					     const snd_pcm_channel_area_t **areas,
-+					     snd_pcm_uframes_t *offset,
-+					     snd_pcm_uframes_t *frames)
-+{
-+	ioplug_priv_t *io = pcm->private_data;
-+	int err;
-+
-+	err = __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
-+	if (err < 0)
-+		return err;
-+
-+	if (io->data->callback->transfer &&
-+	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
-+	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
-+		snd_pcm_sframes_t result;
-+		result = io->data->callback->transfer(io->data, *areas, *offset, *frames);
-+		if (result < 0)
-+			return result;
-+	}
-+
-+	return err;
-+}
-+
-+static int snd_pcm_ioplug_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
-+				     snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
-+{
-+	if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
-+		return __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
-+	return snd_pcm_ioplug_mmap_begin_capture(pcm, areas, offset, frames);
-+}
-+
- static snd_pcm_sframes_t snd_pcm_ioplug_mmap_commit(snd_pcm_t *pcm,
- 						    snd_pcm_uframes_t offset,
- 						    snd_pcm_uframes_t size)
-@@ -707,7 +739,7 @@ static snd_pcm_sframes_t snd_pcm_ioplug_mmap_commit(snd_pcm_t *pcm,
- 		const snd_pcm_channel_area_t *areas;
- 		snd_pcm_uframes_t ofs, frames = size;
- 
--		__snd_pcm_mmap_begin(pcm, &areas, &ofs, &frames);
-+		__snd_pcm_mmap_begin_generic(pcm, &areas, &ofs, &frames);
- 		if (ofs != offset)
- 			return -EIO;
- 		return ioplug_priv_transfer_areas(pcm, areas, offset, frames);
-@@ -727,31 +759,6 @@ static snd_pcm_sframes_t snd_pcm_ioplug_avail_update(snd_pcm_t *pcm)
- 		return -EPIPE;
- 
- 	avail = snd_pcm_mmap_avail(pcm);
--	if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
--	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
--	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
--		if (io->data->callback->transfer) {
--			const snd_pcm_channel_area_t *areas;
--			snd_pcm_uframes_t offset, size = UINT_MAX;
--			snd_pcm_sframes_t result;
--
--			__snd_pcm_mmap_begin(pcm, &areas, &offset, &size);
--			result = io->data->callback->transfer(io->data, areas, offset, size);
--			if (result < 0)
--				return result;
--
--			/* If the available data doesn't fit in the
--			   contiguous area at the end of the mmap we
--			   must transfer the remaining data to the
--			   beginning of the mmap. */
--			if (size < avail) {
--				result = io->data->callback->transfer(io->data, areas,
--								      0, avail - size);
--				if (result < 0)
--					return result;
--			}
--		}
--	}
- 	if (avail > io->avail_max)
- 		io->avail_max = avail;
- 	return (snd_pcm_sframes_t)avail;
-@@ -947,6 +954,7 @@ static const snd_pcm_fast_ops_t snd_pcm_ioplug_fast_ops = {
- 	.poll_descriptors_count = snd_pcm_ioplug_poll_descriptors_count,
- 	.poll_descriptors = snd_pcm_ioplug_poll_descriptors,
- 	.poll_revents = snd_pcm_ioplug_poll_revents,
-+	.mmap_begin = snd_pcm_ioplug_mmap_begin,
- };
- 
- #endif /* !DOC_HIDDEN */
-diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
-index bec5a408..a63f4be0 100644
---- a/src/pcm/pcm_local.h
-+++ b/src/pcm/pcm_local.h
-@@ -420,6 +420,8 @@ int _snd_pcm_poll_descriptor(snd_pcm_t *pcm);
- #define _snd_pcm_async_descriptor _snd_pcm_poll_descriptor /* FIXME */
- 
- /* locked versions */
-+int __snd_pcm_mmap_begin_generic(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
-+				 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames);
- int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
- 			 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames);
- snd_pcm_sframes_t __snd_pcm_mmap_commit(snd_pcm_t *pcm,
+ static int snd_ctl_remap_subscribe_events(snd_ctl_t *ctl, int subscribe)
 -- 
-2.29.2
+2.30.2
+
 
diff --git a/SOURCES/alsa-ucm-git.patch b/SOURCES/alsa-ucm-git.patch
index 3e330d2..4c423c5 100644
--- a/SOURCES/alsa-ucm-git.patch
+++ b/SOURCES/alsa-ucm-git.patch
@@ -1,1571 +1,24 @@
-From 33be660e4b1e75c19d5332556c3d2636dd3344bf Mon Sep 17 00:00:00 2001
+From 3f34021beffba4e39f064a14c5faceeaa224b766 Mon Sep 17 00:00:00 2001
 From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 2 Nov 2020 16:44:51 +0100
-Subject: [PATCH 01/24] fix the ucm2/codecs/hda/hdmi.conf use
-
-The mentioned commit (dcef48f13d) removed the index for the IEC958 on/off
-control which made the HDMI 2+ outputs silent.
-
-Fixes: dcef48f13d ("HDA-Intel: add support for AMD acp microphone devices")
-BugLink: https://github.com/alsa-project/alsa-lib/issues/95
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/HDA-Intel/Hdmi.conf   | 8 +++++++-
- ucm2/codecs/hda/hdmi.conf  | 4 ++--
- ucm2/sof-hda-dsp/Hdmi.conf | 3 +++
- 3 files changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/ucm2/HDA-Intel/Hdmi.conf b/ucm2/HDA-Intel/Hdmi.conf
-index c8b6e77..c533e49 100644
---- a/ucm2/HDA-Intel/Hdmi.conf
-+++ b/ucm2/HDA-Intel/Hdmi.conf
-@@ -6,6 +6,7 @@ If.hdmi1 {
- 		Define {
- 			HdmiNum 1
- 			HdmiPCM 3
-+			HdmiCtlIndex 0
- 			HdmiPrio 1100
- 		}
- 		Include.hdmi1.File "/codecs/hda/hdmi.conf"
-@@ -18,6 +19,7 @@ If.hdmi2 {
- 		Define {
- 			HdmiNum 2
- 			HdmiPCM 7
-+			HdmiCtlIndex 1
- 			HdmiPrio 1200
- 		}
- 		Include.hdmi2.File "/codecs/hda/hdmi.conf"
-@@ -30,6 +32,7 @@ If.hdmi3 {
- 		Define {
- 			HdmiNum 3
- 			HdmiPCM 8
-+			HdmiCtlIndex 2
- 			HdmiPrio 1300
- 		}
- 		Include.hdmi3.File "/codecs/hda/hdmi.conf"
-@@ -42,6 +45,7 @@ If.hdmi4 {
- 		Define {
- 			HdmiNum 4
- 			HdmiPCM 9
-+			HdmiCtlIndex 3
- 			HdmiPrio 1400
- 		}
- 		Include.hdmi4.File "/codecs/hda/hdmi.conf"
-@@ -54,6 +58,7 @@ If.hdmi5 {
- 		Define {
- 			HdmiNum 5
- 			HdmiPCM 10
-+			HdmiCtlIndex 4
- 			HdmiPrio 1500
- 		}
- 		Include.hdmi5.File "/codecs/hda/hdmi.conf"
-@@ -66,8 +71,9 @@ If.hdmi6 {
- 		Define {
- 			HdmiNum 6
- 			HdmiPCM 11
-+			HdmiCtlIndex 5
- 			HdmiPrio 1600
- 		}
--		Include.hdmi5.File "/codecs/hda/hdmi.conf"
-+		Include.hdmi6.File "/codecs/hda/hdmi.conf"
- 	}
- }
-diff --git a/ucm2/codecs/hda/hdmi.conf b/ucm2/codecs/hda/hdmi.conf
-index ba80fef..32a77f4 100644
---- a/ucm2/codecs/hda/hdmi.conf
-+++ b/ucm2/codecs/hda/hdmi.conf
-@@ -8,11 +8,11 @@ If.hdmi {
- 			Comment "HDMI${var:HdmiNum} Output"
- 
- 			EnableSequence [
--				cset "name='IEC958 Playback Switch' on"
-+				cset "name='IEC958 Playback Switch',index=${var:HdmiCtlIndex} on"
- 			]
- 
- 			DisableSequence [
--				cset "name='IEC958 Playback Switch' off"
-+				cset "name='IEC958 Playback Switch',index=${var:HdmiCtlIndex} off"
- 			]
- 
- 			Value {
-diff --git a/ucm2/sof-hda-dsp/Hdmi.conf b/ucm2/sof-hda-dsp/Hdmi.conf
-index 7b777d1..1726567 100644
---- a/ucm2/sof-hda-dsp/Hdmi.conf
-+++ b/ucm2/sof-hda-dsp/Hdmi.conf
-@@ -6,6 +6,7 @@ If.hdmi1 {
- 		Define {
- 			HdmiNum 1
- 			HdmiPCM 3
-+			HdmiCtlIndex 0
- 			HdmiPrio 500
- 		}
- 		Include.hdmi1.File "/codecs/hda/hdmi.conf"
-@@ -18,6 +19,7 @@ If.hdmi2 {
- 		Define {
- 			HdmiNum 2
- 			HdmiPCM 4
-+			HdmiCtlIndex 1
- 			HdmiPrio 600
- 		}
- 		Include.hdmi2.File "/codecs/hda/hdmi.conf"
-@@ -30,6 +32,7 @@ If.hdmi3 {
- 		Define {
- 			HdmiNum 3
- 			HdmiPCM 5
-+			HdmiCtlIndex 2
- 			HdmiPrio 700
- 		}
- 		Include.hdmi3.File "/codecs/hda/hdmi.conf"
--- 
-2.29.2
-
-
-From f8c2428ccc42488c5e96801cce9f7e28080ecb71 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 2 Nov 2020 18:15:14 +0100
-Subject: [PATCH 02/24] codecs/hda/hdmi.conf - add DisplayPort to the device
- description (Comment)
+Date: Tue, 1 Jun 2021 21:08:53 +0200
+Subject: [PATCH 3/4] HDA-Intel: the lookups are supported from syntax 4
 
 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
 ---
- ucm2/codecs/hda/hdmi.conf | 2 +-
+ ucm2/HDA-Intel/HDA-Intel.conf | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/ucm2/codecs/hda/hdmi.conf b/ucm2/codecs/hda/hdmi.conf
-index 32a77f4..c7b7ba4 100644
---- a/ucm2/codecs/hda/hdmi.conf
-+++ b/ucm2/codecs/hda/hdmi.conf
-@@ -5,7 +5,7 @@ If.hdmi {
- 	}
- 	True {
- 		SectionDevice."HDMI${var:HdmiNum}" {
--			Comment "HDMI${var:HdmiNum} Output"
-+			Comment "HDMI / DisplayPort ${var:HdmiNum} Output"
- 
- 			EnableSequence [
- 				cset "name='IEC958 Playback Switch',index=${var:HdmiCtlIndex} on"
--- 
-2.29.2
-
-
-From 334b12e9a796cddf70779b68418ee7ad52ba1d14 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 16 Nov 2020 11:48:05 +0100
-Subject: [PATCH 03/24] sof-soundwire: use the codecs/hda/hdmi.conf macro
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/sof-soundwire/Hdmi.conf | 83 ++++++++++--------------------------
- 1 file changed, 22 insertions(+), 61 deletions(-)
-
-diff --git a/ucm2/sof-soundwire/Hdmi.conf b/ucm2/sof-soundwire/Hdmi.conf
-index d0ba790..d5ee9c6 100644
---- a/ucm2/sof-soundwire/Hdmi.conf
-+++ b/ucm2/sof-soundwire/Hdmi.conf
-@@ -1,79 +1,40 @@
--# Use case Configuration for sof-soundwire card
-+# Use case Configuration for sof-soundwire
- 
- If.hdmi1 {
--	Condition {
--		Type ControlExists
--		Control "iface=CARD,name='HDMI/DP,pcm=5 Jack'"
--	}
-+	Condition { Type String Empty "" }
- 	True {
--		SectionDevice."HDMI1" {
--			Comment "HDMI1/DP1 Output"
--
--			EnableSequence [
--				cset "name='IEC958 Playback Switch' on"
--			]
--
--			DisableSequence [
--				cset "name='IEC958 Playback Switch' off"
--			]
--
--			Value {
--				PlaybackPriority 500
--				PlaybackPCM "hw:${CardId},5"
--				JackControl "HDMI/DP,pcm=5 Jack"
--			}
-+		Define {
-+			HdmiNum 1
-+			HdmiPCM 5
-+			HdmiCtlIndex 0
-+			HdmiPrio 500
- 		}
-+		Include.hdmi1.File "/codecs/hda/hdmi.conf"
- 	}
- }
- 
- If.hdmi2 {
--	Condition {
--		Type ControlExists
--		Control "iface=CARD,name='HDMI/DP,pcm=6 Jack'"
--	}
-+	Condition { Type String Empty "" }
- 	True {
--		SectionDevice."HDMI2" {
--			Comment "HDMI2/DP2 Output"
--
--			EnableSequence [
--				cset "name='IEC958 Playback Switch',index=1 on"
--			]
--
--			DisableSequence [
--				cset "name='IEC958 Playback Switch',index=1 off"
--			]
--
--			Value {
--				PlaybackPriority 600
--				PlaybackPCM "hw:${CardId},6"
--				JackControl "HDMI/DP,pcm=6 Jack"
--			}
-+		Define {
-+			HdmiNum 2
-+			HdmiPCM 6
-+			HdmiCtlIndex 1
-+			HdmiPrio 600
- 		}
-+		Include.hdmi2.File "/codecs/hda/hdmi.conf"
- 	}
- }
- 
- If.hdmi3 {
--	Condition {
--		Type ControlExists
--		Control "iface=CARD,name='HDMI/DP,pcm=7 Jack'"
--	}
-+	Condition { Type String Empty "" }
- 	True {
--		SectionDevice."HDMI3" {
--			Comment "HDMI3/DP3 Output"
--
--			EnableSequence [
--				cset "name='IEC958 Playback Switch',index=2 on"
--			]
--
--			DisableSequence [
--				cset "name='IEC958 Playback Switch',index=2 off"
--			]
--
--			Value {
--				PlaybackPriority 700
--				PlaybackPCM "hw:${CardId},7"
--				JackControl "HDMI/DP,pcm=7 Jack"
--			}
-+		Define {
-+			HdmiNum 3
-+			HdmiPCM 7
-+			HdmiCtlIndex 2
-+			HdmiPrio 700
- 		}
-+		Include.hdmi3.File "/codecs/hda/hdmi.conf"
- 	}
- }
--- 
-2.29.2
-
-
-From 6889736b917eed89c4d775824efd8655400e27e3 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Mon, 7 Dec 2020 09:33:30 +0100
-Subject: [PATCH 04/24] Revert "ucm2: HDA/acp - add Capture simple mixer
- element to the ACP Mic device"
-
-This reverts commit 3320b1ac804595d6c145c1ad7af85917182a3c98.
-
-This solution does not work. The mute state is shared between
-the HDA and AMD ACP in PA, so it may cause the security issue, if
-the users do not set the mute manually.
-
-BugLink: https://github.com/alsa-project/alsa-ucm-conf/issues/64
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/HDA-Intel/HiFi-acp.conf | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/ucm2/HDA-Intel/HiFi-acp.conf b/ucm2/HDA-Intel/HiFi-acp.conf
-index 15eeca5..123ae15 100644
---- a/ucm2/HDA-Intel/HiFi-acp.conf
-+++ b/ucm2/HDA-Intel/HiFi-acp.conf
-@@ -4,6 +4,5 @@ SectionDevice."Mic1" {
- 	Value {
- 		CapturePriority 100
- 		CapturePCM "hw:${var:AcpCardId}"
--		CaptureMixerElem "Capture"
- 	}
- }
--- 
-2.29.2
-
-
-From 13420f94a6858e9c3e3a056a7987d9c0db823394 Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Sun, 6 Dec 2020 13:47:16 +0100
-Subject: [PATCH 05/24] chtnau8824: Fix mono speaker config not working
-
-Fix the Speaker define / var being changed from "Speaker" to "MonoSpeaker"
-not having any effect because the variable gets expanded before the if
-making the change is interpreted.
-
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/chtnau8824/HiFi.conf | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
-diff --git a/ucm2/chtnau8824/HiFi.conf b/ucm2/chtnau8824/HiFi.conf
-index 3ccd6b1..d7a5f63 100644
---- a/ucm2/chtnau8824/HiFi.conf
-+++ b/ucm2/chtnau8824/HiFi.conf
-@@ -34,8 +34,15 @@ SectionVerb {
- 	}
- }
- 
--Include.spk.File "/codecs/nau8824/${var:Speaker}.conf"
--Include.hp.File "/codecs/nau8824/HeadPhones.conf"
-+# The includes using $vars in there path must be conditional otherwise the
-+# $var gets expanded before the other If-s above can change the vars.
-+If.cfg-includes {
-+	Condition { Type String Empty "" }
-+	True {
-+		Include.spk.File "/codecs/nau8824/${var:Speaker}.conf"
-+		Include.hp.File "/codecs/nau8824/HeadPhones.conf"
- 
--Include.mic.File "/codecs/nau8824/InternalMic.conf"
--Include.hsmic.File "/codecs/nau8824/HeadsetMic.conf"
-+		Include.mic.File "/codecs/nau8824/InternalMic.conf"
-+		Include.hsmic.File "/codecs/nau8824/HeadsetMic.conf"
-+	}
-+}
--- 
-2.29.2
-
-
-From 7db718571440b13045ebb3150a71745033ff5c0c Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Sun, 6 Dec 2020 13:47:17 +0100
-Subject: [PATCH 06/24] chtnau8824: Add support for laptops using stereo DMICs
-
-The Medion E2228T uses a NAU8824 codec combined with stereo
-DMICs, add support for this.
-
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/chtnau8824/HiFi.conf        | 16 +++++++++++++++-
- ucm2/codecs/nau8824/DMIC1_2.conf | 30 ++++++++++++++++++++++++++++++
- 2 files changed, 45 insertions(+), 1 deletion(-)
- create mode 100644 ucm2/codecs/nau8824/DMIC1_2.conf
-
-diff --git a/ucm2/chtnau8824/HiFi.conf b/ucm2/chtnau8824/HiFi.conf
-index d7a5f63..105f360 100644
---- a/ucm2/chtnau8824/HiFi.conf
-+++ b/ucm2/chtnau8824/HiFi.conf
-@@ -1,4 +1,5 @@
- Define.Speaker "Speaker"
-+Define.Mic "InternalMic"
- 
- If.cfg-mspk {
- 	Condition {
-@@ -11,6 +12,19 @@ If.cfg-mspk {
- 	}
- }
- 
-+If.cfg-mic {
-+	Condition {
-+		Type RegexMatch
-+		String "${CardLongName}"
-+		# Medion E22??T models put DMIC in their product version
-+		# when using DMICs
-+		Regex "(MEDION-E22..T.*-DMIC-)"
-+	}
-+	True {
-+		Define.Mic "DMIC1_2"
-+	}
-+}
-+
- SectionVerb {
- 
- 	Value {
-@@ -42,7 +56,7 @@ If.cfg-includes {
- 		Include.spk.File "/codecs/nau8824/${var:Speaker}.conf"
- 		Include.hp.File "/codecs/nau8824/HeadPhones.conf"
- 
--		Include.mic.File "/codecs/nau8824/InternalMic.conf"
-+		Include.mic.File "/codecs/nau8824/${var:Mic}.conf"
- 		Include.hsmic.File "/codecs/nau8824/HeadsetMic.conf"
- 	}
- }
-diff --git a/ucm2/codecs/nau8824/DMIC1_2.conf b/ucm2/codecs/nau8824/DMIC1_2.conf
-new file mode 100644
-index 0000000..f54f671
---- /dev/null
-+++ b/ucm2/codecs/nau8824/DMIC1_2.conf
-@@ -0,0 +1,30 @@
-+# Stereo DMICs on the DMIC1 and DMIC2 inputs
-+
-+SectionDevice."Mic" {
-+	Comment "Internal Digital Microphones"
-+
-+	Value {
-+		CapturePriority 200
-+		CapturePCM "hw:${CardId}"
-+	}
-+
-+	ConflictingDevice [
-+		"Headset"
-+	]
-+
-+	EnableSequence [
-+		# Note needs to be swapped / swap is deliberate!
-+		cset "name='ADC CH0 Select' 1"
-+		cset "name='ADC CH1 Select' 0"
-+
-+		cset "name='Int Mic Switch' on"
-+		cset "name='DMIC1 Enable Switch' on"
-+		cset "name='DMIC2 Enable Switch' on"
-+	]
-+
-+	DisableSequence [
-+		cset "name='Int Mic Switch' off"
-+		cset "name='DMIC1 Enable Switch' off"
-+		cset "name='DMIC2 Enable Switch' off"
-+	]
-+}
--- 
-2.29.2
-
-
-From dacfe2fc7b41b800f4f379ce4b1722462b97cab2 Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Sun, 6 Dec 2020 13:47:18 +0100
-Subject: [PATCH 07/24] chtnau8824: Boost analog mic volumes a bit
-
-Both Mic1 (internal analog mic) and Mic2 (headset mic) are a bit soft
-with the current settings, boost their volumes a bit.
-
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/codecs/nau8824/EnableSeq.conf | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/ucm2/codecs/nau8824/EnableSeq.conf b/ucm2/codecs/nau8824/EnableSeq.conf
-index 433e8e2..3650d06 100644
---- a/ucm2/codecs/nau8824/EnableSeq.conf
-+++ b/ucm2/codecs/nau8824/EnableSeq.conf
-@@ -7,8 +7,8 @@ EnableSequence [
- 	cset "name='DMIC2 Enable Switch' off"
- 	cset "name='DMIC3 Enable Switch' off"
- 	cset "name='DMIC4 Enable Switch' off"
--	cset "name='MIC1 Volume' 10"
--	cset "name='MIC2 Volume' 10"
-+	cset "name='MIC1 Volume' 14"
-+	cset "name='MIC2 Volume' 14"
- 	# Button Configuration
- 	cset "name='THD for key media' 10"
- 	cset "name='THD for key voice command' 16"
--- 
-2.29.2
-
-
-From 263bd26b1216c933db3d216197a78678d0f8610e Mon Sep 17 00:00:00 2001
-From: Libin Yang <libin.yang@intel.com>
-Date: Thu, 19 Nov 2020 20:01:30 +0800
-Subject: [PATCH 08/24] rt715: init: setup ADC07 to a proper volume
-
-This patch initiates 'rt715 ADC 07 Capture Volume' to a proper volume.
-
-Signed-off-by: Libin Yang <libin.yang@intel.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/codecs/rt715/init.conf | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/ucm2/codecs/rt715/init.conf b/ucm2/codecs/rt715/init.conf
-index 6e07b2d..15a0571 100644
---- a/ucm2/codecs/rt715/init.conf
-+++ b/ucm2/codecs/rt715/init.conf
-@@ -7,4 +7,5 @@ BootSequence [
- 	cset "name='rt715 ADC 25 Mux' 4"
- 	cset "name='rt715 ADC 27 Capture Switch' 1"
- 	cset "name='rt715 ADC 07 Capture Switch' 1"
-+	cset "name='rt715 ADC 07 Capture Volume' 58"
- ]
--- 
-2.29.2
-
-
-From cf267cce6d553d4d436c166c23d3befc5476acef Mon Sep 17 00:00:00 2001
-From: Hui Wang <hui.wang@canonical.com>
-Date: Thu, 29 Oct 2020 13:34:02 +0800
-Subject: [PATCH 09/24] sof-hda-dsp: Set Master Playback Switch on in the
- BootSequence
-
-Otherwise, the audio output will be muted by default if there is no
-/var/lib/alsa/asound.state. I have experienced this issue When newly
-install an OS.
-
-Signed-off-by: Hui Wang <hui.wang@canonical.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/HDA-Intel/init.conf          | 1 +
- ucm2/sof-hda-dsp/sof-hda-dsp.conf | 1 +
- 2 files changed, 2 insertions(+)
-
-diff --git a/ucm2/HDA-Intel/init.conf b/ucm2/HDA-Intel/init.conf
-index 1a351a9..6310eb3 100644
---- a/ucm2/HDA-Intel/init.conf
-+++ b/ucm2/HDA-Intel/init.conf
-@@ -15,6 +15,7 @@ If.master {
- 	}
- 	True.BootSequence [
- 		cset "name='Master Playback Volume' 60%"
-+		cset "name='Master Playback Switch' on"
- 	]
- }
- 
-diff --git a/ucm2/sof-hda-dsp/sof-hda-dsp.conf b/ucm2/sof-hda-dsp/sof-hda-dsp.conf
-index c8069a6..79b54a9 100644
---- a/ucm2/sof-hda-dsp/sof-hda-dsp.conf
-+++ b/ucm2/sof-hda-dsp/sof-hda-dsp.conf
-@@ -24,6 +24,7 @@ If.master {
- 	}
- 	True.BootSequence [
- 		cset "name='Master Playback Volume' 60%"
-+		cset "name='Master Playback Switch' on"
- 	]
- }
- 
--- 
-2.29.2
-
-
-From 5405544752c18153acc310ee7e4a4bacda040dca Mon Sep 17 00:00:00 2001
-From: Kai-Heng Feng <kai.heng.feng@canonical.com>
-Date: Thu, 27 Aug 2020 21:18:13 +0800
-Subject: [PATCH 10/24] HDA-Intel/HiFi-dual: Add EnableSequence and
- DisableSequence for Speaker and Headphones
-
-BugLink: https://github.com/alsa-project/alsa-ucm-conf/pull/48
-Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/HDA-Intel/HiFi-dual.conf | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
-
-diff --git a/ucm2/HDA-Intel/HiFi-dual.conf b/ucm2/HDA-Intel/HiFi-dual.conf
-index cff948e..bacfd80 100644
---- a/ucm2/HDA-Intel/HiFi-dual.conf
-+++ b/ucm2/HDA-Intel/HiFi-dual.conf
-@@ -27,6 +27,14 @@ SectionDevice."Speaker" {
- 		PlaybackMixerElem "Speaker"
- 	}
- 
-+	EnableSequence [
-+		cset "name='Speaker Playback Switch' on"
-+	]
-+
-+	DisableSequence [
-+		cset "name='Speaker Playback Switch' off"
-+	]
-+
- 	ConflictingDevice [
- 		"Headphones"
- 	]
-@@ -54,6 +62,14 @@ SectionDevice."Headphones" {
- 		JackHWMute "Speaker"
- 	}
- 
-+	EnableSequence [
-+		cset "name='Headphone Playback Switch' on"
-+	]
-+
-+	DisableSequence [
-+		cset "name='Headphone Playback Switch' off"
-+	]
-+
- 	ConflictingDevice [
- 		"Speaker"
- 	]
--- 
-2.29.2
-
-
-From 5947daef124c84fae511233248196576dfbfab7c Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Wed, 16 Dec 2020 08:55:04 +0100
-Subject: [PATCH 11/24] HDA-Intel/HiFi-dual: Add BootSequence and disable
- playback channels in verb init
-
-BugLink: https://github.com/alsa-project/alsa-ucm-conf/pull/48
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/HDA-Intel/HDAudio-DualCodecs.conf | 12 ++++++++++++
- ucm2/HDA-Intel/HiFi-dual.conf          |  2 ++
- 2 files changed, 14 insertions(+)
-
-diff --git a/ucm2/HDA-Intel/HDAudio-DualCodecs.conf b/ucm2/HDA-Intel/HDAudio-DualCodecs.conf
-index 8aaabd0..6fd7bd1 100644
---- a/ucm2/HDA-Intel/HDAudio-DualCodecs.conf
-+++ b/ucm2/HDA-Intel/HDAudio-DualCodecs.conf
-@@ -4,3 +4,15 @@ SectionUseCase."HiFi" {
- 	File "HiFi-dual.conf"
- 	Comment "Default"
- }
-+
-+BootSequence [
-+	cset "name='Headphone Playback Volume' 60%"
-+	cset "name='Headphone Playback Switch' off"
-+	cset "name='Speaker Playback Volume' 60%"
-+	cset "name='Speaker Playback Switch' on"
-+	cset "name='Front Playback Volume' 100%"
-+	cset "name='Front Playback Switch' on"
-+	cset "name='Rear-Panel Capture Volume' 100%"
-+	cset "name='Rear-Panel Capture Switch' on"
-+	cset "name='Input Source' Rear Mic"
-+]
-diff --git a/ucm2/HDA-Intel/HiFi-dual.conf b/ucm2/HDA-Intel/HiFi-dual.conf
-index bacfd80..f2c6915 100644
---- a/ucm2/HDA-Intel/HiFi-dual.conf
-+++ b/ucm2/HDA-Intel/HiFi-dual.conf
-@@ -8,6 +8,8 @@ SectionVerb {
- 		cset "name='Front Playback Switch' on"
- 		cset "name='Rear-Panel Capture Volume' 100%"
- 		cset "name='Rear-Panel Capture Switch' on"
-+		cset "name='Headphone Playback Switch' off"
-+		cset "name='Speaker Playback Switch' off"
- 	]
- 
- 	DisableSequence [
--- 
-2.29.2
-
-
-From 5634db4be3ed435f3e59f30a71c3c3711162929d Mon Sep 17 00:00:00 2001
-From: Jian-Hong Pan <jhp@endlessos.org>
-Date: Tue, 15 Dec 2020 16:54:03 +0800
-Subject: [PATCH 12/24] chtrt5645: Enable Internal MIC of ECS EF20EA
-
-The ECS EF20EA uses a digital mic connected to the dmic2 pin, rather
-then the default analog mic.
-
-1 [chtrt5645      ]: chtrt5645 - chtrt5645
-                     Standard-EF20EA-1.0
-
-Add a card long name match for this, so that the right config is used.
-
-BugLink: https://github.com/alsa-project/alsa-ucm-conf/pull/68
-Signed-off-by: Jian-Hong Pan <jhp@endlessos.org>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/chtrt5645/HiFi.conf | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/ucm2/chtrt5645/HiFi.conf b/ucm2/chtrt5645/HiFi.conf
-index 10b0a1c..30fad50 100644
---- a/ucm2/chtrt5645/HiFi.conf
-+++ b/ucm2/chtrt5645/HiFi.conf
-@@ -18,7 +18,7 @@ If.cfg-dmic2 {
- 	Condition {
- 		Type RegexMatch
- 		String "${CardLongName}"
--		Regex "(LENOVO.*LenovoMIIX320|MEDION.*Wingman)"
-+		Regex "(LENOVO.*LenovoMIIX320|MEDION.*Wingman|Standard-EF20EA-1.0)"
- 	}
- 	True {
- 		Define.AnalogMic ""
--- 
-2.29.2
-
-
-From bdd05ac3396a3a09f3818aaa9157eb7ef07676d6 Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Sat, 9 Jan 2021 22:02:51 +0100
-Subject: [PATCH 13/24] bytcr-rt5640: Add support for devices without speakers
- and/or an internal mic
-
-There are kernel patches pending upstream for the bytcr-rt5640 machine-driver
-to support devices without speakers and/or an internal mic.
-
-Since the UCM profile already conditionally loads the speaker and
-internal-mic codec include files, these will simply get skipped in this
-case, so this almost works with the current UCM profile without changes.
-
-The only troublesome part is the ConflictingDevice sections in the codec
-HeadPhones.conf and HeadsetMic.conf files, which refer to resp. a "Speaker"
-and a "Mic" device. Without any of the speaker or mic codec conf files
-being included there will not by any "Speaker" / "Mic" devices leading
-to an error while parsing the HeadPhones.conf / HeadsetMic.conf files.
-
-This commit makes the ConflictingDevice section conditional, fixing this.
-
-Cc: Rasmus Porsager <rasmus@beat.dk>
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/bytcr-rt5640/HiFi-Components.conf | 28 +++++++++++++++++++++-----
- ucm2/bytcr-rt5640/HiFi-LongName.conf   | 28 +++++++++++++++++++++-----
- ucm2/codecs/rt5640/HeadPhones.conf     | 14 ++++++++++---
- ucm2/codecs/rt5640/HeadsetMic.conf     | 14 ++++++++++---
- 4 files changed, 68 insertions(+), 16 deletions(-)
-
-diff --git a/ucm2/bytcr-rt5640/HiFi-Components.conf b/ucm2/bytcr-rt5640/HiFi-Components.conf
-index 2ce4f59..a76b42d 100644
---- a/ucm2/bytcr-rt5640/HiFi-Components.conf
-+++ b/ucm2/bytcr-rt5640/HiFi-Components.conf
-@@ -1,10 +1,16 @@
-+Define.HaveSpeaker ""
-+Define.HaveInternalMic ""
-+
- If.spk {
- 	Condition {
- 		Type String
- 		Haystack "${CardComponents}"
- 		Needle "cfg-spk:2"
- 	}
--	True.Include.spk.File "/codecs/rt5640/Speaker.conf"
-+	True {
-+		Include.spk.File "/codecs/rt5640/Speaker.conf"
-+		Define.HaveSpeaker "yes"
-+	}
- }
- 
- If.mono {
-@@ -13,7 +19,10 @@ If.mono {
- 		Haystack "${CardComponents}"
- 		Needle "cfg-spk:1"
- 	}
--	True.Include.mspk.File "/codecs/rt5640/MonoSpeaker.conf"
-+	True {
-+		Include.mspk.File "/codecs/rt5640/MonoSpeaker.conf"
-+		Define.HaveSpeaker "yes"
-+	}
- }
- 
- Include.hs.File "/codecs/rt5640/HeadPhones.conf"
-@@ -24,7 +33,10 @@ If.dmic1 {
- 		Haystack "${CardComponents}"
- 		Needle "cfg-mic:dmic1"
- 	}
--	True.Include.dmic.File "/codecs/rt5640/DigitalMics.conf"
-+	True {
-+		Include.dmic.File "/codecs/rt5640/DigitalMics.conf"
-+		Define.HaveInternalMic "yes"
-+	}
- }
- 
- If.in1 {
-@@ -33,7 +45,10 @@ If.in1 {
- 		Haystack "${CardComponents}"
- 		Needle "cfg-mic:in1"
- 	}
--	True.Include.mic1.File "/codecs/rt5640/IN1-InternalMic.conf"
-+	True {
-+		Include.mic1.File "/codecs/rt5640/IN1-InternalMic.conf"
-+		Define.HaveInternalMic "yes"
-+	}
- }
- 
- If.in3 {
-@@ -42,7 +57,10 @@ If.in3 {
- 		Haystack "${CardComponents}"
- 		Needle "cfg-mic:in3"
- 	}
--	True.Include.mic3.File "/codecs/rt5640/IN3-InternalMic.conf"
-+	True {
-+		Include.mic3.File "/codecs/rt5640/IN3-InternalMic.conf"
-+		Define.HaveInternalMic "yes"
-+	}
- }
- 
- Include.hsmic.File "/codecs/rt5640/HeadsetMic.conf"
-diff --git a/ucm2/bytcr-rt5640/HiFi-LongName.conf b/ucm2/bytcr-rt5640/HiFi-LongName.conf
-index c07f153..6cb5556 100644
---- a/ucm2/bytcr-rt5640/HiFi-LongName.conf
-+++ b/ucm2/bytcr-rt5640/HiFi-LongName.conf
-@@ -1,10 +1,16 @@
-+Define.HaveSpeaker ""
-+Define.HaveInternalMic ""
-+
- If.spk {
- 	Condition {
- 		Type String
- 		Haystack "${CardLongName}"
- 		Needle "-stereo-spk"
- 	}
--	True.Include.spk.File "/codecs/rt5640/Speaker.conf"
-+	True {
-+		Include.spk.File "/codecs/rt5640/Speaker.conf"
-+		Define.HaveSpeaker "yes"
-+	}
- }
- 
- If.mono {
-@@ -13,7 +19,10 @@ If.mono {
- 		Haystack "${CardLongName}"
- 		Needle "-mono-spk"
- 	}
--	True.Include.mspk.File "/codecs/rt5640/MonoSpeaker.conf"
-+	True {
-+		Include.mspk.File "/codecs/rt5640/MonoSpeaker.conf"
-+		Define.HaveSpeaker "yes"
-+	}
- }
- 
- Include.hs.File "/codecs/rt5640/HeadPhones.conf"
-@@ -24,7 +33,10 @@ If.dmic1 {
- 		Haystack "${CardLongName}"
- 		Needle "-dmic1-mic"
- 	}
--	True.Include.dmic.File "/codecs/rt5640/DigitalMics.conf"
-+	True {
-+		Include.dmic.File "/codecs/rt5640/DigitalMics.conf"
-+		Define.HaveInternalMic "yes"
-+	}
- }
- 
- If.in1 {
-@@ -33,7 +45,10 @@ If.in1 {
- 		Haystack "${CardLongName}"
- 		Needle "-in1-mic"
- 	}
--	True.Include.mic1.File "/codecs/rt5640/IN1-InternalMic.conf"
-+	True {
-+		Include.mic1.File "/codecs/rt5640/IN1-InternalMic.conf"
-+		Define.HaveInternalMic "yes"
-+	}
- }
- 
- If.in3 {
-@@ -42,7 +57,10 @@ If.in3 {
- 		Haystack "${CardLongName}"
- 		Needle "-in3-mic"
- 	}
--	True.Include.mic3.File "/codecs/rt5640/IN3-InternalMic.conf"
-+	True {
-+		Include.mic3.File "/codecs/rt5640/IN3-InternalMic.conf"
-+		Define.HaveInternalMic "yes"
-+	}
- }
- 
- Include.hsmic.File "/codecs/rt5640/HeadsetMic.conf"
-diff --git a/ucm2/codecs/rt5640/HeadPhones.conf b/ucm2/codecs/rt5640/HeadPhones.conf
-index 42151d6..b7707e5 100644
---- a/ucm2/codecs/rt5640/HeadPhones.conf
-+++ b/ucm2/codecs/rt5640/HeadPhones.conf
-@@ -1,9 +1,17 @@
- SectionDevice."Headphones" {
- 	Comment "Headphones"
- 
--	ConflictingDevice [
--		"Speaker"
--	]
-+	If.have-spk {
-+		Condition {
-+			Type String
-+			Empty "${var:HaveSpeaker}"
-+		}
-+		False {
-+			ConflictingDevice [
-+				"Speaker"
-+			]
-+		}
-+	}
- 
- 	EnableSequence [
-  		cset "name='DAC MIXL INF1 Switch'  on"
-diff --git a/ucm2/codecs/rt5640/HeadsetMic.conf b/ucm2/codecs/rt5640/HeadsetMic.conf
-index 7a8dfb8..f88b611 100644
---- a/ucm2/codecs/rt5640/HeadsetMic.conf
-+++ b/ucm2/codecs/rt5640/HeadsetMic.conf
-@@ -1,9 +1,17 @@
- SectionDevice."Headset" {
- 	Comment "Headset Microphone"
- 
--	ConflictingDevice [
--		"Mic"
--	]
-+	If.have-mic {
-+		Condition {
-+			Type String
-+			Empty "${var:HaveInternalMic}"
-+		}
-+		False {
-+			ConflictingDevice [
-+				"Mic"
-+			]
-+		}
-+	}
- 
- 	EnableSequence [
- 		cset "name='Headset Mic Switch' on"
--- 
-2.29.2
-
-
-From cd02791e9360bcfa2cd4bed40cf5ddabb378ef93 Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Sat, 9 Jan 2021 22:02:52 +0100
-Subject: [PATCH 14/24] rt5640: Move standard DAC setup to EnableSeq.conf
-
-No matter which output is used, we always need to setup the standard
-DAC config. Move this to the shared EnableSeq.conf to avoid having
-to duplicate it in various places.
-
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/codecs/rt5640/EnableSeq.conf   | 6 ++++++
- ucm2/codecs/rt5640/HeadPhones.conf  | 6 ------
- ucm2/codecs/rt5640/MonoSpeaker.conf | 6 ------
- ucm2/codecs/rt5640/Speaker.conf     | 6 ------
- 4 files changed, 6 insertions(+), 18 deletions(-)
-
-diff --git a/ucm2/codecs/rt5640/EnableSeq.conf b/ucm2/codecs/rt5640/EnableSeq.conf
-index cbf4038..145a23b 100644
---- a/ucm2/codecs/rt5640/EnableSeq.conf
-+++ b/ucm2/codecs/rt5640/EnableSeq.conf
-@@ -1,5 +1,11 @@
- EnableSequence [
- 	# RT5640 default output routing
-+	cset "name='DAC MIXL INF1 Switch' on"
-+	cset "name='DAC MIXR INF1 Switch' on"
-+	cset "name='Stereo DAC MIXL DAC L1 Switch' on"
-+	cset "name='Stereo DAC MIXR DAC R1 Switch' on"
-+	cset "name='Stereo DAC MIXL DAC L2 Switch' on"
-+	cset "name='Stereo DAC MIXR DAC R2 Switch' on"
- 	cset "name='OUT MIXL DAC L1 Switch'  on"
- 	cset "name='OUT MIXR DAC R1 Switch'  on"
- 
-diff --git a/ucm2/codecs/rt5640/HeadPhones.conf b/ucm2/codecs/rt5640/HeadPhones.conf
-index b7707e5..a9e4d20 100644
---- a/ucm2/codecs/rt5640/HeadPhones.conf
-+++ b/ucm2/codecs/rt5640/HeadPhones.conf
-@@ -14,12 +14,6 @@ SectionDevice."Headphones" {
- 	}
+diff --git a/ucm2/HDA-Intel/HDA-Intel.conf b/ucm2/HDA-Intel/HDA-Intel.conf
+index 5794e72..8a8e0e7 100644
+--- a/ucm2/HDA-Intel/HDA-Intel.conf
++++ b/ucm2/HDA-Intel/HDA-Intel.conf
+@@ -1,4 +1,4 @@
+-Syntax 3
++Syntax 4
  
- 	EnableSequence [
-- 		cset "name='DAC MIXL INF1 Switch'  on"
-- 		cset "name='DAC MIXR INF1 Switch'  on"
-- 		cset "name='Stereo DAC MIXL DAC L1 Switch'  on"
-- 		cset "name='Stereo DAC MIXR DAC R1 Switch'  on"
--		cset "name='Stereo DAC MIXL DAC L2 Switch'  on"
-- 		cset "name='Stereo DAC MIXR DAC R2 Switch'  on"
-  		cset "name='HPO MIX HPVOL Switch'  on"
-  		cset "name='Headphone Switch'  on"
- 		cset "name='HP Channel Switch' on"
-diff --git a/ucm2/codecs/rt5640/MonoSpeaker.conf b/ucm2/codecs/rt5640/MonoSpeaker.conf
-index ddc7ba8..23cf34c 100644
---- a/ucm2/codecs/rt5640/MonoSpeaker.conf
-+++ b/ucm2/codecs/rt5640/MonoSpeaker.conf
-@@ -6,12 +6,6 @@ SectionDevice."Speaker" {
- 	]
+ Define.Use ""	# a non-empty string to use UCM configuration for HDA devices
  
- 	EnableSequence [
--		cset "name='DAC MIXL INF1 Switch' on"
--		cset "name='DAC MIXR INF1 Switch' on"
--		cset "name='Stereo DAC MIXL DAC L1 Switch' on"
--		cset "name='Stereo DAC MIXR DAC R1 Switch' on"
--		cset "name='Stereo DAC MIXL DAC L2 Switch'  on"
--		cset "name='Stereo DAC MIXR DAC R2 Switch'  on"
- 		cset "name='SPK MIXL DAC L1 Switch' on"
- 		cset "name='SPK MIXR DAC R1 Switch' on"
- 		cset "name='SPOL MIX SPKVOL L Switch' on"
-diff --git a/ucm2/codecs/rt5640/Speaker.conf b/ucm2/codecs/rt5640/Speaker.conf
-index 411cd13..422cfdf 100644
---- a/ucm2/codecs/rt5640/Speaker.conf
-+++ b/ucm2/codecs/rt5640/Speaker.conf
-@@ -6,12 +6,6 @@ SectionDevice."Speaker" {
- 	]
- 
- 	EnableSequence [
--		cset "name='DAC MIXL INF1 Switch' on"
--		cset "name='DAC MIXR INF1 Switch' on"
--		cset "name='Stereo DAC MIXL DAC L1 Switch' on"
--		cset "name='Stereo DAC MIXR DAC R1 Switch' on"
--		cset "name='Stereo DAC MIXL DAC L2 Switch'  on"
-- 		cset "name='Stereo DAC MIXR DAC R2 Switch'  on"
- 		cset "name='SPK MIXL DAC L1 Switch' on"
- 		cset "name='SPK MIXR DAC R1 Switch' on"
- 		cset "name='SPOL MIX SPKVOL L Switch' on"
 -- 
-2.29.2
-
-
-From 95587ae8b75134c4bbc2cec0181e5d529826c9c4 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 14 Jan 2021 18:31:24 +0100
-Subject: [PATCH 15/24] bytcr-rt5640: fix the execution order
-
-The includes must be run _after_ defines. The Include directives
-have precedence. Put everything to If compound.
-
-Fixes: bdd05ac339 ("bytcr-rt5640: Add support for devices without speakers and/or an internal mic")
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/bytcr-rt5640/HiFi-Components.conf | 10 ++++++++--
- ucm2/bytcr-rt5640/HiFi-LongName.conf   | 10 ++++++++--
- 2 files changed, 16 insertions(+), 4 deletions(-)
-
-diff --git a/ucm2/bytcr-rt5640/HiFi-Components.conf b/ucm2/bytcr-rt5640/HiFi-Components.conf
-index a76b42d..1999717 100644
---- a/ucm2/bytcr-rt5640/HiFi-Components.conf
-+++ b/ucm2/bytcr-rt5640/HiFi-Components.conf
-@@ -25,7 +25,10 @@ If.mono {
- 	}
- }
- 
--Include.hs.File "/codecs/rt5640/HeadPhones.conf"
-+If.hp {
-+	Condition { Type String Empty "" }
-+	True.Include.hs.File "/codecs/rt5640/HeadPhones.conf"
-+}
- 
- If.dmic1 {
- 	Condition {
-@@ -63,4 +66,7 @@ If.in3 {
- 	}
- }
- 
--Include.hsmic.File "/codecs/rt5640/HeadsetMic.conf"
-+If.hsmic {
-+	Condition { Type String Empty "" }
-+	True.Include.hsmic.File "/codecs/rt5640/HeadsetMic.conf"
-+}
-diff --git a/ucm2/bytcr-rt5640/HiFi-LongName.conf b/ucm2/bytcr-rt5640/HiFi-LongName.conf
-index 6cb5556..34acef8 100644
---- a/ucm2/bytcr-rt5640/HiFi-LongName.conf
-+++ b/ucm2/bytcr-rt5640/HiFi-LongName.conf
-@@ -25,7 +25,10 @@ If.mono {
- 	}
- }
- 
--Include.hs.File "/codecs/rt5640/HeadPhones.conf"
-+If.hp {
-+	Condition { Type String Empty "" }
-+	True.Include.hs.File "/codecs/rt5640/HeadPhones.conf"
-+}
- 
- If.dmic1 {
- 	Condition {
-@@ -63,4 +66,7 @@ If.in3 {
- 	}
- }
- 
--Include.hsmic.File "/codecs/rt5640/HeadsetMic.conf"
-+If.hsmic {
-+	Condition { Type String Empty "" }
-+	True.Include.hsmic.File "/codecs/rt5640/HeadsetMic.conf"
-+}
--- 
-2.29.2
-
-
-From 09e5271401480297c2c9c0b753df9705123a1af1 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Thu, 14 Jan 2021 11:03:56 +0100
-Subject: [PATCH 16/24] ucm2: add initial configuration for TRX40 Gigabyte
- Aorus Master Audio
-
-BugLink: https://github.com/alsa-project/alsa-ucm-conf/pull/25
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ...Gigabyte-Aorus-Master-Front-Headphone.conf |  1 +
- ...Gigabyte-Aorus-Master-Main-Audio-HiFi.conf | 61 +++++++++++++++++++
- .../Gigabyte-Aorus-Master-Main-Audio.conf     |  6 ++
- 3 files changed, 68 insertions(+)
- create mode 120000 ucm2/USB-Audio/Gigabyte-Aorus-Master-Front-Headphone.conf
- create mode 100644 ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
- create mode 100644 ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio.conf
-
-diff --git a/ucm2/USB-Audio/Gigabyte-Aorus-Master-Front-Headphone.conf b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Front-Headphone.conf
-new file mode 120000
-index 0000000..1376437
---- /dev/null
-+++ b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Front-Headphone.conf
-@@ -0,0 +1 @@
-+../module/lib/linked.conf
-\ No newline at end of file
-diff --git a/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
-new file mode 100644
-index 0000000..5c24165
---- /dev/null
-+++ b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
-@@ -0,0 +1,61 @@
-+Define.SecondaryCardId "$${CardIdByName:Aorus Master Front Headphone}"
-+
-+SectionDevice."Speaker" {
-+	Comment "Speakers"
-+	Value {
-+	       PlaybackChannels 8
-+	       PlaybackPriority 200
-+	       PlaybackPCM "hw:${CardId}"
-+	       JackControl "Line Out Jack"
-+	       PlaybackMixerElem "Line Out"
-+	}
-+}
-+
-+SectionDevice."Headphones" {
-+	Comment "Front Headphones"
-+	Value {
-+		PlaybackPriority 300
-+		PlaybackPCM "hw:${var:SecondaryCardId}"
-+		JackCTL "hw:${var:SecondaryCardId}"
-+		JackControl "Headphone - Output Jack"
-+	}
-+}
-+
-+SectionDevice."SPDIF" {
-+	Comment "S/PDIF Out"
-+	Value {
-+		PlaybackPriority 100
-+		PlaybackPCM "hw:${CardId},1"
-+		# PlaybackMixerElem "IEC958"
-+	}
-+}
-+
-+SectionDevice."Line" {
-+	Comment "Line In"
-+	Value {
-+		CapturePriority 100
-+		CapturePCM "hw:${CardId}"
-+		JackControl "Line Jack"
-+		CaptureMixerElem "Line"
-+	}
-+}
-+
-+SectionDevice."Mic1" {
-+	Comment "Microphone"
-+	Value {
-+		CapturePriority 200
-+		CapturePCM "hw:${CardId},1"
-+		JackControl "Mic Jack"
-+		CaptureMixerElem "Mic"
-+	}
-+}
-+
-+SectionDevice."Mic2" {
-+	Comment "Front Microphone"
-+	Value {
-+		CapturePriority 300
-+		CapturePCM "hw:${CardId},2"
-+		JackControl "Front Mic Jack"
-+		CaptureMixerElem "Front Mic"
-+	}
-+}
-diff --git a/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio.conf b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio.conf
-new file mode 100644
-index 0000000..656b989
---- /dev/null
-+++ b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio.conf
-@@ -0,0 +1,6 @@
-+Syntax 3
-+Comment "Gigabyte Aorus Integrated Audio"
-+SectionUseCase."HiFi" {
-+	File "Gigabyte-Aorus-Master-Main-Audio-HiFi.conf"
-+	Comment "Default Alsa Profile"
-+}
--- 
-2.29.2
-
-
-From 062e4710c524283c5d11cbf99931b24c6d963f98 Mon Sep 17 00:00:00 2001
-From: Marijn Suijten <marijns95@gmail.com>
-Date: Thu, 14 Jan 2021 14:11:50 +0100
-Subject: [PATCH 17/24] USB-Audio/ALC1220: Bump analog Speaker priority over
- S/PDIF
-
-The `S/PDIF` port does not have any jack sensing, and with a priority
-higher than the `Speakers` it will always be selected by default instead
-of the `Speakers` even if unplugged.
-
-Swapping the priorities around allows analog `Speakers` to be selected
-first, _if_ they are plugged in. Otherwise `S/PDIF` is used.
-
-Signed-off-by: Marijn Suijten <marijns95@gmail.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf b/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf
-index 344db83..cbf7154 100644
---- a/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf
-+++ b/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf
-@@ -2,7 +2,7 @@ SectionDevice."Speaker" {
- 	Comment "Speakers"
- 	Value {
- 	       PlaybackChannels 8
--	       PlaybackPriority 100
-+	       PlaybackPriority 200
- 	       PlaybackPCM "hw:${CardId}"
- 	       JackControl "Speaker Jack"
- 	       PlaybackMixerElem "Speaker"
-@@ -22,7 +22,7 @@ SectionDevice."Headphones" {
- SectionDevice."SPDIF" {
- 	Comment "S/PDIF Out"
- 	Value {
--		PlaybackPriority 200
-+		PlaybackPriority 100
- 		PlaybackPCM "hw:${CardId},2"
- 		PlaybackMixerElem "IEC958"
- 	}
--- 
-2.29.2
-
-
-From 8e875c9467cc72e53e53104b07d5515f3ef0a779 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Fri, 15 Jan 2021 14:03:35 +0100
-Subject: [PATCH 18/24] USB-Audio/ALC1220: fix indentation for Speaker device
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf b/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf
-index cbf7154..0d75384 100644
---- a/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf
-+++ b/ucm2/USB-Audio/Realtek-ALC1220-VB-Desktop-HiFi.conf
-@@ -1,11 +1,11 @@
- SectionDevice."Speaker" {
- 	Comment "Speakers"
- 	Value {
--	       PlaybackChannels 8
--	       PlaybackPriority 200
--	       PlaybackPCM "hw:${CardId}"
--	       JackControl "Speaker Jack"
--	       PlaybackMixerElem "Speaker"
-+		PlaybackChannels 8
-+		PlaybackPriority 200
-+		PlaybackPCM "hw:${CardId}"
-+		JackControl "Speaker Jack"
-+		PlaybackMixerElem "Speaker"
- 	}
- }
- 
--- 
-2.29.2
-
+2.30.2
 
-From 5503703ab95d5ed40b1da138016777bb5429190e Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela <perex@perex.cz>
-Date: Fri, 15 Jan 2021 14:55:53 +0100
-Subject: [PATCH 19/24] USB-Audio: fix indentation in
- Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
-
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- .../Gigabyte-Aorus-Master-Main-Audio-HiFi.conf         | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
-index 5c24165..37800fb 100644
---- a/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
-+++ b/ucm2/USB-Audio/Gigabyte-Aorus-Master-Main-Audio-HiFi.conf
-@@ -3,11 +3,11 @@ Define.SecondaryCardId "$${CardIdByName:Aorus Master Front Headphone}"
- SectionDevice."Speaker" {
- 	Comment "Speakers"
- 	Value {
--	       PlaybackChannels 8
--	       PlaybackPriority 200
--	       PlaybackPCM "hw:${CardId}"
--	       JackControl "Line Out Jack"
--	       PlaybackMixerElem "Line Out"
-+		PlaybackChannels 8
-+		PlaybackPriority 200
-+		PlaybackPCM "hw:${CardId}"
-+		JackControl "Line Out Jack"
-+		PlaybackMixerElem "Line Out"
- 	}
- }
- 
--- 
-2.29.2
-
-
-From eaa5eacd3e068471537888dee627751dc35e714a Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Wed, 16 Dec 2020 16:38:37 +0100
-Subject: [PATCH 20/24] chtnau8824: Add a SST define/variable
-
-Add a SST define which gets set to "yes" when using the SST driver
-and to "" when not using the SST driver;
-
-And decide if platforms/bytcr/PlatformEnableSeq.conf should be included
-or not based on this.
-
-This is a preparation patch for adding SOF support.
-
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/chtnau8824/HiFi.conf | 19 +++++++++++++++----
- 1 file changed, 15 insertions(+), 4 deletions(-)
-
-diff --git a/ucm2/chtnau8824/HiFi.conf b/ucm2/chtnau8824/HiFi.conf
-index 105f360..b36588f 100644
---- a/ucm2/chtnau8824/HiFi.conf
-+++ b/ucm2/chtnau8824/HiFi.conf
-@@ -1,5 +1,16 @@
- Define.Speaker "Speaker"
- Define.Mic "InternalMic"
-+Define.SST "yes"
-+
-+If.Controls {
-+	Condition {
-+		Type ControlExists
-+		Control "name='media0_in Gain 0 Switch'"
-+	}
-+	False {
-+		Define.SST ""
-+	}
-+}
- 
- If.cfg-mspk {
- 	Condition {
-@@ -33,12 +44,12 @@ SectionVerb {
- 
- 	Include.e.File "/codecs/nau8824/EnableSeq.conf"
- 
--	If.Controls {
-+	If.SST {
- 		Condition {
--			Type ControlExists
--			Control "name='media0_in Gain 0 Switch'"
-+			Type String
-+			Empty "${var:SST}"
- 		}
--		True {
-+		False {
- 			Include.pe {
- 				File "/platforms/bytcr/PlatformEnableSeq.conf"
- 				Before.EnableSequence "0"
--- 
-2.29.2
-
-
-From 4e0369b4fcebde195a38d5b90c73b08f28e0047a Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Thu, 21 Jan 2021 11:15:02 +0100
-Subject: [PATCH 21/24] kblrt5660: Fix file permissions
-
-The exec bit was set wrongly on those files.  Fix them.
-
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
----
- ucm2/kblrt5660/Hdmi1.conf     | 0
- ucm2/kblrt5660/Hdmi2.conf     | 0
- ucm2/kblrt5660/HiFi.conf      | 0
- ucm2/kblrt5660/kblrt5660.conf | 0
- 4 files changed, 0 insertions(+), 0 deletions(-)
- mode change 100755 => 100644 ucm2/kblrt5660/Hdmi1.conf
- mode change 100755 => 100644 ucm2/kblrt5660/Hdmi2.conf
- mode change 100755 => 100644 ucm2/kblrt5660/HiFi.conf
- mode change 100755 => 100644 ucm2/kblrt5660/kblrt5660.conf
-
-diff --git a/ucm2/kblrt5660/Hdmi1.conf b/ucm2/kblrt5660/Hdmi1.conf
-old mode 100755
-new mode 100644
-diff --git a/ucm2/kblrt5660/Hdmi2.conf b/ucm2/kblrt5660/Hdmi2.conf
-old mode 100755
-new mode 100644
-diff --git a/ucm2/kblrt5660/HiFi.conf b/ucm2/kblrt5660/HiFi.conf
-old mode 100755
-new mode 100644
-diff --git a/ucm2/kblrt5660/kblrt5660.conf b/ucm2/kblrt5660/kblrt5660.conf
-old mode 100755
-new mode 100644
--- 
-2.29.2
-
-
-From 96e1c19a6bcc1e353f677966d4d93399204af0ec Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede@redhat.com>
-Date: Wed, 16 Dec 2020 16:38:38 +0100
-Subject: [PATCH 22/24] chtnau8824: Add support for using the SOF driver
-
-The old (and currently the default) SST driver uses TDM 4 slots 24 bit
-as wire format to the codec. Where as the new SOF driver uses standard
-I2S 2 channel 24 bit.
-
-Normally this should not impact the UCM settings, but on the NAU8824
-the "DAC Right Channel Source" mixer setting must be set to 1 when
-using TDM 4 slots and to 0 when using I2S 2 channel mode.
-
-Getting this wrong (in either case) results in the right channel not
-outputting any sound.
-
-This commit introduces a RightOutputChannel variable which gets
-set to 0/1 depending on the driver and then uses that for the
-"DAC Right Channel Source" mixer setting so that we do the right
-thing depending on the driver.
-
-This has been tested on the following devices:
-
-Medion E2215T:    Stereo speakers, analog mic
-Medion E2228T:    Stereo speakers, stereo digital mics
-Cube iWork 8 Air: Mono speaker, analog mic
-
-Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/chtnau8824/HiFi.conf          | 2 ++
- ucm2/codecs/nau8824/EnableSeq.conf | 2 +-
- 2 files changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/ucm2/chtnau8824/HiFi.conf b/ucm2/chtnau8824/HiFi.conf
-index b36588f..c3d830d 100644
---- a/ucm2/chtnau8824/HiFi.conf
-+++ b/ucm2/chtnau8824/HiFi.conf
-@@ -1,6 +1,7 @@
- Define.Speaker "Speaker"
- Define.Mic "InternalMic"
- Define.SST "yes"
-+Define.RightOutputChannel 1
- 
- If.Controls {
- 	Condition {
-@@ -9,6 +10,7 @@ If.Controls {
- 	}
- 	False {
- 		Define.SST ""
-+		Define.RightOutputChannel 0
- 	}
- }
- 
-diff --git a/ucm2/codecs/nau8824/EnableSeq.conf b/ucm2/codecs/nau8824/EnableSeq.conf
-index 3650d06..660856f 100644
---- a/ucm2/codecs/nau8824/EnableSeq.conf
-+++ b/ucm2/codecs/nau8824/EnableSeq.conf
-@@ -1,7 +1,7 @@
- EnableSequence [
- 	# Playback TDM configuration
- 	cset "name='DACL Channel Source' 0"
--	cset "name='DACR Channel Source' 1"
-+	cset "name='DACR Channel Source' ${var:RightOutputChannel}"
- 	# Input Configuration
- 	cset "name='DMIC1 Enable Switch' off"
- 	cset "name='DMIC2 Enable Switch' off"
--- 
-2.29.2
-
-
-From 3bea51c3188257c5bc0eaaed922d1f714e3508c7 Mon Sep 17 00:00:00 2001
-From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Date: Thu, 21 Jan 2021 14:38:26 -0600
-Subject: [PATCH 23/24] sof-hda-dsp: update handling of cfg-dmics strings
-
-Existing platforms can have 1,2,3 or 4 microphones. The SOF firmware
-will generate 2 or 4 channels. Since by default CaptureChannels is 2,
-we need to add the case for cfg-dmics = 3.
-
-Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/sof-hda-dsp/HiFi.conf | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/ucm2/sof-hda-dsp/HiFi.conf b/ucm2/sof-hda-dsp/HiFi.conf
-index a250331..2c02c15 100644
---- a/ucm2/sof-hda-dsp/HiFi.conf
-+++ b/ucm2/sof-hda-dsp/HiFi.conf
-@@ -16,9 +16,9 @@ SectionDevice."Mic1" {
- 		CapturePCM "hw:${CardId},6"
- 		If.chn {
- 			Condition {
--				Type String
--				Haystack "${CardComponents}"
--				Needle "cfg-dmics:4"
-+				Type RegexMatch
-+				Regex "cfg-dmics:[34]"
-+				String "${CardComponents}"
- 			}
- 			True {
- 				CaptureChannels 4
--- 
-2.29.2
-
-
-From 889c5b9809f1635005d77871bb9abc09df6a3cc3 Mon Sep 17 00:00:00 2001
-From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Date: Thu, 21 Jan 2021 14:44:05 -0600
-Subject: [PATCH 24/24] sof-soundwire: add support for dmics
-
-the pinmux allows for SoundWire to be used on e.g. link0 and link1,
-and the rest of the pins can be assigned for dmic usages.
-
-We currently don't track this capability which means users don't see a
-capture device, e.g. on HP Spectre x360.
-
-The sof_sdw machine driver was modified to report the cfg-dmics
-string, possible values are 0..4.
-
-BugLink: https://github.com/thesofproject/linux/issues/2700
-BugLink: https://github.com/alsa-project/alsa-ucm-conf/pull/75
-Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Signed-off-by: Jaroslav Kysela <perex@perex.cz>
----
- ucm2/sof-soundwire/dmic.conf          | 21 +++++++++++++++++++++
- ucm2/sof-soundwire/sof-soundwire.conf |  5 +++++
- 2 files changed, 26 insertions(+)
- create mode 100644 ucm2/sof-soundwire/dmic.conf
-
-diff --git a/ucm2/sof-soundwire/dmic.conf b/ucm2/sof-soundwire/dmic.conf
-new file mode 100644
-index 0000000..1f704a5
---- /dev/null
-+++ b/ucm2/sof-soundwire/dmic.conf
-@@ -0,0 +1,21 @@
-+SectionDevice."Mic" {
-+	Comment "Digital Microphone"
-+
-+	Value {
-+		CapturePriority 100
-+		CapturePCM "hw:${CardId},3"
-+		If.chn {
-+			Condition {
-+				Type RegexMatch
-+				Regex "[34]"
-+				String "${var:Mics1}"
-+			}
-+			True {
-+				CaptureChannels 4
-+			}
-+		}
-+		CaptureMixerElem "Dmic0"
-+		CaptureVolume "Dmic0 Capture Volume"
-+		CaptureSwitch "Dmic0 Capture Switch"
-+	}
-+}
-diff --git a/ucm2/sof-soundwire/sof-soundwire.conf b/ucm2/sof-soundwire/sof-soundwire.conf
-index 2ba44be..ec8b01e 100644
---- a/ucm2/sof-soundwire/sof-soundwire.conf
-+++ b/ucm2/sof-soundwire/sof-soundwire.conf
-@@ -11,6 +11,7 @@ Define {
- 	SpeakerAmps1 "0"
- 	HeadsetCodec1 ""
- 	MicCodec1 ""
-+	Mics1 "0"
- }
- 
- DefineRegex {
-@@ -34,6 +35,10 @@ DefineRegex {
- 		Regex " mic:([a-z0-9]+)"
- 		String "${CardComponents}"
- 	}
-+	Mics {
-+		Regex " cfg-mics:([1-9][0-9]*)"
-+		String "${CardComponents}"
-+	}
- }
- 
- If.hs_init {
--- 
-2.29.2
 
diff --git a/SPECS/alsa-lib.spec b/SPECS/alsa-lib.spec
index 16a7798..a6ea973 100644
--- a/SPECS/alsa-lib.spec
+++ b/SPECS/alsa-lib.spec
@@ -2,14 +2,14 @@
 #define  prever_dot .rc3
 #define  postver    a
 
-%define version_alsa_lib  1.2.4
-%define version_alsa_ucm  1.2.4
-%define version_alsa_tplg 1.2.4
+%define version_alsa_lib  1.2.5
+%define version_alsa_ucm  1.2.5
+%define version_alsa_tplg 1.2.5
 
 Summary:  The Advanced Linux Sound Architecture (ALSA) library
 Name:     alsa-lib
 Version:  %{version_alsa_lib}
-Release:  5%{?prever_dot}%{?dist}
+Release:  4%{?prever_dot}%{?dist}
 License:  LGPLv2+
 Group:    System Environment/Libraries
 URL:      http://www.alsa-project.org/
@@ -163,6 +163,9 @@ rm %{buildroot}/%{_includedir}/asoundlib.h
 %{_datadir}/alsa/topology
 
 %changelog
+* Mon Jun 14 2021 Jaroslav Kysela <perex@perex.cz> - 1.2.5-4
+- Updated to 1.2.5
+
 * Mon Feb  1 2021 Jaroslav Kysela <perex@perex.cz> - 1.2.4-5
 - Apply fixes from upstream (alsa-lib, alsa-ucm-conf)