Hello community,

here is the log from the commit of package alsa for openSUSE:Factory checked in 
at 2020-02-21 16:40:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/alsa (Old)
 and      /work/SRC/openSUSE:Factory/.alsa.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "alsa"

Fri Feb 21 16:40:24 2020 rev:197 rq:774843 version:1.2.1.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/alsa/alsa.changes        2020-01-24 
13:08:14.125362534 +0100
+++ /work/SRC/openSUSE:Factory/.alsa.new.26092/alsa.changes     2020-02-21 
16:40:55.229860711 +0100
@@ -1,0 +2,18 @@
+Wed Feb 12 20:36:56 CET 2020 - [email protected]
+
+- Backport upstream fixes:
+  ucm-parser fixes and enhancements, configure script cleanup,
+  fixes of 5.6 kernel ABI, O_CLOEXEC flag fix:
+  0064-ucm-parser-cosmetic-fixes-in-the-comments.patch
+  0065-configure.ac-remove-an-unnecessary-libtool-fix.patch
+  0066-ucm-parser-use-correct-filename-in-parser_master_fil.patch
+  0067-ucm-the-ucm2-subdirectory-is-driver-name-based.patch
+  0068-ucm-implement-RenameDevice-and-RemoveDevice-verb-man.patch
+  0069-ucm-fill-missing-device-entries-conflicting-supporte.patch
+  0070-control-Remove-access-to-the-deprecated-dimen-fields.patch
+  0071-topology-Drop-SNDRV_CTL_ELEM_ACCESS_TIMESTAMP-access.patch
+  0072-uapi-Sync-with-5.6-kernel-ABI.patch
+  0073-ucm-parser-add-error-message-to-verb_dev_list_add.patch
+  0074-do-not-set-close-on-exec-flag-on-descriptor-if-it-wa.patch
+
+-------------------------------------------------------------------

New:
----
  0064-ucm-parser-cosmetic-fixes-in-the-comments.patch
  0065-configure.ac-remove-an-unnecessary-libtool-fix.patch
  0066-ucm-parser-use-correct-filename-in-parser_master_fil.patch
  0067-ucm-the-ucm2-subdirectory-is-driver-name-based.patch
  0068-ucm-implement-RenameDevice-and-RemoveDevice-verb-man.patch
  0069-ucm-fill-missing-device-entries-conflicting-supporte.patch
  0070-control-Remove-access-to-the-deprecated-dimen-fields.patch
  0071-topology-Drop-SNDRV_CTL_ELEM_ACCESS_TIMESTAMP-access.patch
  0072-uapi-Sync-with-5.6-kernel-ABI.patch
  0073-ucm-parser-add-error-message-to-verb_dev_list_add.patch
  0074-do-not-set-close-on-exec-flag-on-descriptor-if-it-wa.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ alsa.spec ++++++
--- /var/tmp/diff_new_pack.P399Up/_old  2020-02-21 16:40:59.025868296 +0100
+++ /var/tmp/diff_new_pack.P399Up/_new  2020-02-21 16:40:59.029868304 +0100
@@ -111,6 +111,17 @@
 Patch61:        0061-ucm-split-conf_file_name-and-conf_dir_name.patch
 Patch62:        0062-ucm-remove-MAX_FILE-definition-and-use-correct-PATH_.patch
 Patch63:        0063-topology-remove-MAX_FILE-definition-and-use-correct-.patch
+Patch64:        0064-ucm-parser-cosmetic-fixes-in-the-comments.patch
+Patch65:        0065-configure.ac-remove-an-unnecessary-libtool-fix.patch
+Patch66:        0066-ucm-parser-use-correct-filename-in-parser_master_fil.patch
+Patch67:        0067-ucm-the-ucm2-subdirectory-is-driver-name-based.patch
+Patch68:        0068-ucm-implement-RenameDevice-and-RemoveDevice-verb-man.patch
+Patch69:        0069-ucm-fill-missing-device-entries-conflicting-supporte.patch
+Patch70:        0070-control-Remove-access-to-the-deprecated-dimen-fields.patch
+Patch71:        0071-topology-Drop-SNDRV_CTL_ELEM_ACCESS_TIMESTAMP-access.patch
+Patch72:        0072-uapi-Sync-with-5.6-kernel-ABI.patch
+Patch73:        0073-ucm-parser-add-error-message-to-verb_dev_list_add.patch
+Patch74:        0074-do-not-set-close-on-exec-flag-on-descriptor-if-it-wa.patch
 # rest suse fixes
 Patch101:       alsa-lib-ignore-non-accessible-ALSA_CONFIG_PATH.patch
 BuildRequires:  doxygen
@@ -258,6 +269,17 @@
 %patch61 -p1
 %patch62 -p1
 %patch63 -p1
+%patch64 -p1
+%patch65 -p1
+%patch66 -p1
+%patch67 -p1
+%patch68 -p1
+%patch69 -p1
+%patch70 -p1
+%patch71 -p1
+%patch72 -p1
+%patch73 -p1
+%patch74 -p1
 %patch101 -p1
 
 %build

++++++ 0064-ucm-parser-cosmetic-fixes-in-the-comments.patch ++++++
>From 7d3fec6ac68de0244621ae0aca7474d159336639 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 17 Jan 2020 18:21:08 +0100
Subject: [PATCH 64/74] ucm: parser - cosmetic fixes in the comments

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c | 63 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 31 insertions(+), 32 deletions(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 6c13fafdabbf..6c5d29026e5e 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -676,42 +676,41 @@ static int parse_value(snd_use_case_mgr_t *uc_mgr 
ATTRIBUTE_UNUSED,
 /*
  * Parse Modifier Use cases
  *
- *     # Each modifier is described in new section. N modifiers are allowed
- *     SectionModifier."Capture Voice" {
+ * # Each modifier is described in new section. N modifiers are allowed
+ * SectionModifier."Capture Voice" {
  *
- *             Comment "Record voice call"
+ *     Comment "Record voice call"
  *
- *             SupportedDevice [
- *                     "x"
- *                     "y"
- *             ]
- *
- *             ConflictingDevice [
- *                     "x"
- *                     "y"
- *             ]
+ *     SupportedDevice [
+ *             "x"
+ *             "y"
+ *     ]
  *
- *             EnableSequence [
- *                     ....
- *             ]
+ *     ConflictingDevice [
+ *             "x"
+ *             "y"
+ *     ]
  *
- *             DisableSequence [
- *                     ...
- *             ]
+ *     EnableSequence [
+ *             ....
+ *     ]
  *
- *              TransitionSequence."ToModifierName" [
- *                     ...
- *             ]
+ *     DisableSequence [
+ *             ...
+ *     ]
  *
- *             # Optional TQ and ALSA PCMs
- *             Value {
- *                     TQ Voice
- *                     CapturePCM "hw:1"
- *                     PlaybackVolume "name='Master Playback Volume',index=2"
- *                     PlaybackSwitch "name='Master Playback Switch',index=2"
- *             }
+ *      TransitionSequence."ToModifierName" [
+ *             ...
+ *     ]
  *
- *      }
+ *     # Optional TQ and ALSA PCMs
+ *     Value {
+ *             TQ Voice
+ *             CapturePCM "hw:1"
+ *             PlaybackVolume "name='Master Playback Volume',index=2"
+ *             PlaybackSwitch "name='Master Playback Switch',index=2"
+ *     }
+ * }
  *
  * SupportedDevice and ConflictingDevice cannot be specified together.
  * Both are optional.
@@ -836,11 +835,11 @@ static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
 /*
  * Parse Device Use Cases
  *
- *# Each device is described in new section. N devices are allowed
- *SectionDevice."Headphones" {
+ * # Each device is described in new section. N devices are allowed
+ * SectionDevice."Headphones" {
  *     Comment "Headphones connected to 3.5mm jack"
  *
- *     upportedDevice [
+ *     SupportedDevice [
  *             "x"
  *             "y"
  *     ]
-- 
2.16.4

++++++ 0065-configure.ac-remove-an-unnecessary-libtool-fix.patch ++++++
>From b2fe99277a73ec80eac0bd221672dd4aa02defa7 Mon Sep 17 00:00:00 2001
From: Tanu Kaskinen <[email protected]>
Date: Fri, 20 Dec 2019 09:26:12 +0200
Subject: [PATCH 65/74] configure.ac: remove an unnecessary libtool fix

This code was added in commit 75d393a563efb578c79364a277087c6326267f52
without explaining why. I assume it was a mistake, since it looks like
the libtool problem should have gone away a long time ago. The referenced
wiki page https://wiki.debian.org/RpathIssue says:

    Since libtool 1.5.2 (released 2004-01-25), on Linux libtool no
    longer sets RPATH for any directories in the dynamic linker search
    path, so this should no longer be an issue unless upstream used a
    really old version of libtool when creating their distribution
    tarball.

This code caused problems in OpenEmbedded, where the libtool script is
named "x86_64-oe-linux-libtool" or similar rather than just "libtool",
so the sed command failed with a file not found error. Rather than
adapting the code to OpenEmbedded's peculiarities, it seems best to just
remove the unnecessary code altogether.

Note: The rpath is set (hardcoded) for 'make' but it is corrected
for 'make install' by libtool.

Signed-off-by: Tanu Kaskinen <[email protected]>
Signed-off-by: Jaroslav Kysela <[email protected]>
---
 configure.ac | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/configure.ac b/configure.ac
index 886f87bc4458..fb60c03086da 100644
--- a/configure.ac
+++ b/configure.ac
@@ -765,14 +765,3 @@ test "$build_seq" = "yes" && echo "#include <alsa/seq.h>" 
>> include/asoundlib.h
 test "$build_seq" = "yes" && echo "#include <alsa/seqmid.h>" >> 
include/asoundlib.h
 test "$build_seq" = "yes" && echo "#include <alsa/seq_midi_event.h>" >> 
include/asoundlib.h
 cat "$srcdir"/include/asoundlib-tail.h >> include/asoundlib.h
-
-dnl Taken from https://wiki.debian.org/RpathIssue
-case $host in
-   *-*-linux-gnu)
-   AC_MSG_RESULT([Fixing libtool for -rpath problems.])
-   sed < libtool > libtool-2 \
-     's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" 
-D__LIBTOOL_IS_A_FOOL__ "/'
-   mv libtool-2 libtool
-   chmod 755 libtool
- ;;
-esac
-- 
2.16.4

++++++ 0066-ucm-parser-use-correct-filename-in-parser_master_fil.patch ++++++
>From c5a09b0feaf759957dfac2c797b652781a0d41fe Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Mon, 3 Feb 2020 14:44:13 +0100
Subject: [PATCH 66/74] ucm: parser - use correct filename in
 parser_master_file()

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 6c5d29026e5e..dbbd381755b1 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1413,16 +1413,16 @@ static int parse_master_file(snd_use_case_mgr_t 
*uc_mgr, snd_config_t *cfg)
        if (uc_mgr->conf_format >= 2) {
                err = snd_config_search(cfg, "Syntax", &n);
                if (err < 0) {
-                       uc_error("Syntax field not found in %s", 
uc_mgr->conf_dir_name);
+                       uc_error("Syntax field not found in %s", 
uc_mgr->conf_file_name);
                        return -EINVAL;
                }
                err = snd_config_get_integer(n, &l);
                if (err < 0) {
-                       uc_error("Syntax field is invalid in %s", 
uc_mgr->conf_dir_name);
+                       uc_error("Syntax field is invalid in %s", 
uc_mgr->conf_file_name);
                        return err;
                }
                if (l < 2 || l > SYNTAX_VERSION_MAX) {
-                       uc_error("Incompatible syntax %d in %s", l, 
uc_mgr->conf_dir_name);
+                       uc_error("Incompatible syntax %d in %s", l, 
uc_mgr->conf_file_name);
                        return -EINVAL;
                }
                /* delete this field to avoid strcmp() call in the loop */
-- 
2.16.4

++++++ 0067-ucm-the-ucm2-subdirectory-is-driver-name-based.patch ++++++
>From 71a1367bcabc50f99302d8c76395f1cb84975775 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Mon, 3 Feb 2020 15:24:19 +0100
Subject: [PATCH 67/74] ucm: the ucm2/ subdirectory is driver name based

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index dbbd381755b1..f576fde429cf 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1515,7 +1515,7 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr, 
char *longname)
        int card, err;
        snd_ctl_t *ctl;
        snd_ctl_card_info_t *info;
-       const char *_name, *_long_name;
+       const char *_driver, *_name, *_long_name;
 
        snd_ctl_card_info_alloca(&info);
 
@@ -1535,9 +1535,11 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr, 
char *longname)
                err = get_card_info(mgr, name, &ctl, info);
 
                if (err == 0) {
+                       _driver = snd_ctl_card_info_get_driver(info);
                        _name = snd_ctl_card_info_get_name(info);
                        _long_name = snd_ctl_card_info_get_longname(info);
-                       if (!strcmp(card_name, _name) ||
+                       if (!strcmp(card_name, _driver) ||
+                           !strcmp(card_name, _name) ||
                            !strcmp(card_name, _long_name)) {
                                snd_strlcpy(longname, _long_name, 
MAX_CARD_LONG_NAME);
                                return 0;
@@ -1560,7 +1562,7 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const 
char *ctl_name, char *long
 {
        snd_ctl_t *ctl;
        snd_ctl_card_info_t *info;
-       const char *_name, *_long_name;
+       const char *_driver, *_long_name;
        int err;
 
        snd_ctl_card_info_alloca(&info);
@@ -1569,8 +1571,8 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const 
char *ctl_name, char *long
        if (err)
                return err;
 
-       _name = snd_ctl_card_info_get_name(info);
-       if (replace_string(&mgr->conf_dir_name, _name) == NULL)
+       _driver = snd_ctl_card_info_get_driver(info);
+       if (replace_string(&mgr->conf_dir_name, _driver) == NULL)
                return -ENOMEM;
        _long_name = snd_ctl_card_info_get_longname(info);
        snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
-- 
2.16.4

++++++ 0068-ucm-implement-RenameDevice-and-RemoveDevice-verb-man.patch ++++++
>From 251bc204a1e7f1bf1d12b452f2b62e15543bba94 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 7 Feb 2020 10:09:07 +0100
Subject: [PATCH 68/74] ucm: implement RenameDevice and RemoveDevice verb
 management

With the conditionals, it may be useful to define the devices
in the included configuration files. To satisfy the specification
requirements (device naming) those device names might require
to be renamed or deleted wrong references from the conflicting
or supported lists.

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c    | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/ucm/ucm_local.h |  15 ++++++
 src/ucm/utils.c     | 123 ++++++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 254 insertions(+), 13 deletions(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index f576fde429cf..f9a8f6283c3a 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -985,6 +985,71 @@ static int parse_device(snd_use_case_mgr_t *uc_mgr,
        return 0;
 }
 
+/*
+ * Parse Device Rename/Delete Command
+ *
+ * # The devices might be renamed to allow the better conditional runtime
+ * # evaluation. Bellow example renames Speaker1 device to Speaker and
+ * # removes Speaker2 device.
+ * RenameDevice."Speaker1" "Speaker"
+ * RemoveDevice."Speaker2" "Speaker2"
+ */
+static int parse_dev_name_list(snd_config_t *cfg,
+                              struct list_head *list)
+{
+       snd_config_t *n;
+       snd_config_iterator_t i, next;
+       const char *id, *name1;
+       char *name2;
+       struct ucm_dev_name *dev;
+       snd_config_iterator_t pos;
+       int err;
+
+       if (snd_config_get_id(cfg, &id) < 0)
+               return -EINVAL;
+
+       if (snd_config_get_type(cfg) != SND_CONFIG_TYPE_COMPOUND) {
+               uc_error("compound type expected for %s", id);
+               return -EINVAL;
+       }
+
+       snd_config_for_each(i, next, cfg) {
+               n = snd_config_iterator_entry(i);
+
+               if (snd_config_get_id(n, &name1) < 0)
+                       return -EINVAL;
+
+               err = parse_string(n, &name2);
+               if (err < 0) {
+                       uc_error("error: failed to get target device name for 
'%s'", name1);
+                       return err;
+               }
+
+               /* skip duplicates */
+               list_for_each(pos, list) {
+                       dev = list_entry(pos, struct ucm_dev_name, list);
+                       if (strcmp(dev->name1, name1) == 0) {
+                               free(name2);
+                               return 0;
+                       }
+               }
+
+               dev = calloc(1, sizeof(*dev));
+               if (dev == NULL)
+                       return -ENOMEM;
+               dev->name1 = strdup(name1);
+               if (dev->name1 == NULL) {
+                       free(dev);
+                       free(name2);
+                       return -ENOMEM;
+               }
+               dev->name2 = name2;
+               list_add_tail(&dev->list, list);
+       }
+
+       return 0;
+}
+
 static int parse_compound_check_legacy(snd_use_case_mgr_t *uc_mgr,
          snd_config_t *cfg,
          int (*fcn)(snd_use_case_mgr_t *, snd_config_t *, void *, void *),
@@ -1044,7 +1109,39 @@ static int parse_modifier_name(snd_use_case_mgr_t 
*uc_mgr,
                             void *data1,
                             void *data2 ATTRIBUTE_UNUSED)
 {
-       return parse_compound_check_legacy(uc_mgr, cfg, parse_modifier, data1);
+       return parse_compound(uc_mgr, cfg, parse_modifier, data1, data2);
+}
+
+static int verb_device_management(struct use_case_verb *verb)
+{
+       struct list_head *pos;
+       struct ucm_dev_name *dev;
+       int err;
+
+       /* rename devices */
+       list_for_each(pos, &verb->rename_list) {
+               dev = list_entry(pos, struct ucm_dev_name, list);
+               err = uc_mgr_rename_device(verb, dev->name1, dev->name2);
+               if (err < 0) {
+                       uc_error("error: cannot rename device '%s' to '%s'", 
dev->name1, dev->name2);
+                       return err;
+               }
+       }
+
+       /* remove devices */
+       list_for_each(pos, &verb->rename_list) {
+               dev = list_entry(pos, struct ucm_dev_name, list);
+               err = uc_mgr_remove_device(verb, dev->name2);
+               if (err < 0) {
+                       uc_error("error: cannot remove device '%s'", 
dev->name2);
+                       return err;
+               }
+       }
+
+       /* those lists are no longer used */
+       uc_mgr_free_dev_name_list(&verb->rename_list);
+       uc_mgr_free_dev_name_list(&verb->remove_list);
+       return 0;
 }
 
 /*
@@ -1180,6 +1277,8 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
        INIT_LIST_HEAD(&verb->cmpt_device_list);
        INIT_LIST_HEAD(&verb->modifier_list);
        INIT_LIST_HEAD(&verb->value_list);
+       INIT_LIST_HEAD(&verb->rename_list);
+       INIT_LIST_HEAD(&verb->remove_list);
        list_add_tail(&verb->list, &uc_mgr->verb_list);
        if (use_case_name == NULL)
                return -EINVAL;
@@ -1249,6 +1348,26 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
                        }
                        continue;
                }
+
+               /* device renames */
+               if (strcmp(id, "RenameDevice") == 0) {
+                       err = parse_dev_name_list(n, &verb->rename_list);
+                       if (err < 0) {
+                               uc_error("error: %s failed to parse device 
rename",
+                                               file);
+                               goto _err;
+                       }
+               }
+
+               /* device remove */
+               if (strcmp(id, "RemoveDevice") == 0) {
+                       err = parse_dev_name_list(n, &verb->remove_list);
+                       if (err < 0) {
+                               uc_error("error: %s failed to parse device 
remove",
+                                               file);
+                               goto _err;
+                       }
+               }
        }
 
        snd_config_delete(cfg);
@@ -1258,6 +1377,14 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
                uc_error("error: no use case device defined", file);
                return -EINVAL;
        }
+
+       /* do device rename and delete */
+       err = verb_device_management(verb);
+       if (err < 0) {
+               uc_error("error: device management error in verb '%s'", 
verb->name);
+               return err;
+       }
+
        return 0;
 
        _err:
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index fa9fc16661bb..ba8d2acb3355 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -117,6 +117,12 @@ struct ctl_list {
        snd_ctl_card_info_t *ctl_info;
 };
 
+struct ucm_dev_name {
+       struct list_head list;
+       char *name1;
+       char *name2;
+};
+
 /*
  * Describes a Use Case Modifier and it's enable and disable sequences.
  * A use case verb can have N modifiers.
@@ -196,6 +202,10 @@ struct use_case_verb {
 
        /* value list */
        struct list_head value_list;
+
+       /* temporary modifications lists */
+       struct list_head rename_list;
+       struct list_head remove_list;
 };
 
 /*
@@ -252,6 +262,11 @@ int uc_mgr_config_load(int format, const char *file, 
snd_config_t **cfg);
 int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr);
 int uc_mgr_scan_master_configs(const char **_list[]);
 
+int uc_mgr_remove_device(struct use_case_verb *verb, const char *name);
+int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
+                        const char *dst);
+
+void uc_mgr_free_dev_name_list(struct list_head *base);
 void uc_mgr_free_sequence_element(struct sequence_element *seq);
 void uc_mgr_free_transition_element(struct transition_sequence *seq);
 void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr);
diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index daa568c16a30..60a591725835 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -328,6 +328,44 @@ void uc_mgr_free_dev_list(struct dev_list *dev_list)
        }
 }
 
+int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
+                             const char *dst)
+{
+       struct list_head *pos;
+       struct dev_list_node *dlist;
+       char *dst1;
+
+       list_for_each(pos, &dev_list->list) {
+               dlist = list_entry(pos, struct dev_list_node, list);
+               if (strcmp(dlist->name, src) == 0) {
+                       dst1 = strdup(dst);
+                       if (dst1 == NULL)
+                               return -ENOMEM;
+                       free(dlist->name);
+                       dlist->name = dst1;
+                       return 0;
+               }
+       }
+       return -ENOENT;
+}
+
+int uc_mgr_remove_from_dev_list(struct dev_list *dev_list, const char *name)
+{
+       struct list_head *pos;
+       struct dev_list_node *dlist;
+
+       list_for_each(pos, &dev_list->list) {
+               dlist = list_entry(pos, struct dev_list_node, list);
+               if (strcmp(dlist->name, name) == 0) {
+                       free(dlist->name);
+                       list_del(&dlist->list);
+                       free(dlist);
+                       return 0;
+               }
+       }
+       return -ENODEV;
+}
+
 void uc_mgr_free_sequence_element(struct sequence_element *seq)
 {
        if (seq == NULL)
@@ -381,6 +419,20 @@ void uc_mgr_free_transition(struct list_head *base)
        }
 }
 
+void uc_mgr_free_dev_name_list(struct list_head *base)
+{
+       struct list_head *pos, *npos;
+       struct ucm_dev_name *dev;
+
+       list_for_each_safe(pos, npos, base) {
+               dev = list_entry(pos, struct ucm_dev_name, list);
+               list_del(&dev->list);
+               free(dev->name1);
+               free(dev->name2);
+               free(dev);
+       }
+}
+
 void uc_mgr_free_modifier(struct list_head *base)
 {
        struct list_head *pos, *npos;
@@ -400,23 +452,68 @@ void uc_mgr_free_modifier(struct list_head *base)
        }
 }
 
-void uc_mgr_free_device(struct list_head *base)
+void uc_mgr_free_device(struct use_case_device *dev)
+{
+       free(dev->name);
+       free(dev->comment);
+       uc_mgr_free_sequence(&dev->enable_list);
+       uc_mgr_free_sequence(&dev->disable_list);
+       uc_mgr_free_transition(&dev->transition_list);
+       uc_mgr_free_dev_list(&dev->dev_list);
+       uc_mgr_free_value(&dev->value_list);
+       list_del(&dev->list);
+       free(dev);
+}
+
+void uc_mgr_free_device_list(struct list_head *base)
 {
        struct list_head *pos, *npos;
        struct use_case_device *dev;
        
        list_for_each_safe(pos, npos, base) {
                dev = list_entry(pos, struct use_case_device, list);
-               free(dev->name);
-               free(dev->comment);
-               uc_mgr_free_sequence(&dev->enable_list);
-               uc_mgr_free_sequence(&dev->disable_list);
-               uc_mgr_free_transition(&dev->transition_list);
-               uc_mgr_free_dev_list(&dev->dev_list);
-               uc_mgr_free_value(&dev->value_list);
-               list_del(&dev->list);
-               free(dev);
+               uc_mgr_free_device(dev);
+       }
+}
+
+int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
+                        const char *dst)
+{
+       struct use_case_device *device;
+       struct list_head *pos, *npos;
+       char *dst1;
+
+       /* no errors when device is not found */
+       list_for_each_safe(pos, npos, &verb->device_list) {
+               device = list_entry(pos, struct use_case_device, list);
+               if (strcmp(device->name, src) == 0) {
+                       dst1 = strdup(dst);
+                       if (dst1 == NULL)
+                               return -ENOMEM;
+                       free(device->name);
+                       device->name = dst1;
+                       continue;
+               }
+               uc_mgr_rename_in_dev_list(&device->dev_list, src, dst);
+       }
+       return 0;
+}
+
+int uc_mgr_remove_device(struct use_case_verb *verb, const char *name)
+{
+       struct use_case_device *device;
+       struct list_head *pos, *npos;
+
+       list_for_each_safe(pos, npos, &verb->device_list) {
+               device = list_entry(pos, struct use_case_device, list);
+               if (strcmp(device->name, name) == 0) {
+                       uc_mgr_free_device(device);
+                       continue;
+               }
+               uc_mgr_remove_from_dev_list(&device->dev_list, name);
+               return 0;
        }
+       return -ENOENT;
 }
 
 void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
@@ -432,9 +529,11 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
                uc_mgr_free_sequence(&verb->disable_list);
                uc_mgr_free_transition(&verb->transition_list);
                uc_mgr_free_value(&verb->value_list);
-               uc_mgr_free_device(&verb->device_list);
-               uc_mgr_free_device(&verb->cmpt_device_list);
+               uc_mgr_free_device_list(&verb->device_list);
+               uc_mgr_free_device_list(&verb->cmpt_device_list);
                uc_mgr_free_modifier(&verb->modifier_list);
+               uc_mgr_free_dev_name_list(&verb->rename_list);
+               uc_mgr_free_dev_name_list(&verb->remove_list);
                list_del(&verb->list);
                free(verb);
        }
-- 
2.16.4

++++++ 0069-ucm-fill-missing-device-entries-conflicting-supporte.patch ++++++
>From fdf96312fa3c9261db2954afcde8c6a15d2ebe44 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Fri, 7 Feb 2020 16:18:11 +0100
Subject: [PATCH 69/74] ucm: fill missing device entries (conflicting /
 supported)

It is not necessary to maintain this information in sync in the configuration
files. Fill the missing entries to the complementary devices.

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c    | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
 src/ucm/ucm_local.h |  1 +
 src/ucm/utils.c     | 25 +++++++++++++++++++++++++
 3 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index f9a8f6283c3a..23bf6a63f31e 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1112,6 +1112,52 @@ static int parse_modifier_name(snd_use_case_mgr_t 
*uc_mgr,
        return parse_compound(uc_mgr, cfg, parse_modifier, data1, data2);
 }
 
+static int verb_dev_list_add(struct use_case_verb *verb,
+                            enum dev_list_type dst_type,
+                            const char *dst,
+                            const char *src)
+{
+       struct use_case_device *device;
+       struct list_head *pos;
+
+       list_for_each(pos, &verb->device_list) {
+               device = list_entry(pos, struct use_case_device, list);
+               if (strcmp(device->name, dst) != 0)
+                       continue;
+               if (device->dev_list.type != dst_type) {
+                       if (list_empty(&device->dev_list.list)) {
+                               device->dev_list.type = dst_type;
+                       } else {
+                               uc_error("error: incompatible device list type 
('%s', '%s')",
+                                        device->name, src);
+                               return -EINVAL;
+                       }
+               }
+               return uc_mgr_put_to_dev_list(&device->dev_list, src);
+       }
+       return -ENOENT;
+}
+
+static int verb_dev_list_check(struct use_case_verb *verb)
+{
+       struct list_head *pos, *pos2;
+       struct use_case_device *device;
+       struct dev_list_node *dlist;
+       int err;
+
+       list_for_each(pos, &verb->device_list) {
+               device = list_entry(pos, struct use_case_device, list);
+               list_for_each(pos2, &device->dev_list.list) {
+                       dlist = list_entry(pos2, struct dev_list_node, list);
+                       err = verb_dev_list_add(verb, device->dev_list.type,
+                                               dlist->name, device->name);
+                       if (err < 0)
+                               return err;
+               }
+       }
+       return 0;
+}
+
 static int verb_device_management(struct use_case_verb *verb)
 {
        struct list_head *pos;
@@ -1141,7 +1187,9 @@ static int verb_device_management(struct use_case_verb 
*verb)
        /* those lists are no longer used */
        uc_mgr_free_dev_name_list(&verb->rename_list);
        uc_mgr_free_dev_name_list(&verb->remove_list);
-       return 0;
+
+       /* handle conflicting/supported lists */
+       return verb_dev_list_check(verb);
 }
 
 /*
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index ba8d2acb3355..acec4bf67e30 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -262,6 +262,7 @@ int uc_mgr_config_load(int format, const char *file, 
snd_config_t **cfg);
 int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr);
 int uc_mgr_scan_master_configs(const char **_list[]);
 
+int uc_mgr_put_to_dev_list(struct dev_list *dev_list, const char *name);
 int uc_mgr_remove_device(struct use_case_verb *verb, const char *name);
 int uc_mgr_rename_device(struct use_case_verb *verb, const char *src,
                         const char *dst);
diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index 60a591725835..50b2a1df4a6a 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -328,6 +328,31 @@ void uc_mgr_free_dev_list(struct dev_list *dev_list)
        }
 }
 
+int uc_mgr_put_to_dev_list(struct dev_list *dev_list, const char *name)
+{
+       struct list_head *pos;
+       struct dev_list_node *dlist;
+       char *n;
+
+       list_for_each(pos, &dev_list->list) {
+               dlist = list_entry(pos, struct dev_list_node, list);
+               if (strcmp(dlist->name, name) == 0)
+                       return 0;
+       }
+
+       dlist = calloc(1, sizeof(*dlist));
+       if (dlist == NULL)
+               return -ENOMEM;
+       n = strdup(name);
+       if (n == NULL) {
+               free(dlist);
+               return -ENOMEM;
+       }
+       dlist->name = n;
+       list_add(&dlist->list, &dev_list->list);
+       return 0;
+}
+
 int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
                              const char *dst)
 {
-- 
2.16.4

++++++ 0070-control-Remove-access-to-the-deprecated-dimen-fields.patch ++++++
>From 43e137c06451bbdd7998ec5bef20ef82d9f4e5a7 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Mon, 10 Feb 2020 12:47:19 +0100
Subject: [PATCH 70/74] control: Remove access to the deprecated dimen fields

The dimen fields of control element has been deprecated, and it's
finally dropped in kernel 5.6 ABI definition.  Remove the
corresponding accesses in alsa-lib code.

As of this patch, it's disabled via ifdef, just to be sure.  The
disabled code should be removed in a later stage as a cleanup.

Signed-off-by: Takashi Iwai <[email protected]>
---
 src/control/control.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/control/control.c b/src/control/control.c
index 33650155cac7..27f421350fb7 100644
--- a/src/control/control.c
+++ b/src/control/control.c
@@ -303,6 +303,7 @@ int snd_ctl_elem_info(snd_ctl_t *ctl, snd_ctl_elem_info_t 
*info)
        return ctl->ops->element_info(ctl, info);
 }
 
+#if 0 /* deprecated */
 static bool validate_element_member_dimension(snd_ctl_elem_info_t *info)
 {
        unsigned int members;
@@ -328,6 +329,9 @@ static bool 
validate_element_member_dimension(snd_ctl_elem_info_t *info)
 
        return members == info->count;
 }
+#else /* deprecated */
+#define validate_element_member_dimension(info)                true
+#endif /* deprecated */
 
 /**
  * \brief Create and add some user-defined control elements of integer type.
@@ -2510,11 +2514,12 @@ const char *snd_ctl_elem_info_get_item_name(const 
snd_ctl_elem_info_t *obj)
  * #snd_ctl_elem_info_get_dimensions is deprecated without any replacement.
  */
 #ifndef DOXYGEN
-EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimensions)(const 
snd_ctl_elem_info_t *obj)
+EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimensions)(const 
snd_ctl_elem_info_t *obj ATTRIBUTE_UNUSED)
 #else
 int snd_ctl_elem_info_get_dimensions(const snd_ctl_elem_info_t *obj)
 #endif
 {
+#if 0 /* deprecated */
        int i;
 
        assert(obj);
@@ -2522,6 +2527,9 @@ int snd_ctl_elem_info_get_dimensions(const 
snd_ctl_elem_info_t *obj)
                if (obj->dimen.d[i])
                        break;
        return i + 1;
+#else
+       return -EINVAL;
+#endif
 }
 use_default_symbol_version(__snd_ctl_elem_info_get_dimensions, 
snd_ctl_elem_info_get_dimensions, ALSA_0.9.3);
 
@@ -2535,15 +2543,19 @@ 
use_default_symbol_version(__snd_ctl_elem_info_get_dimensions, snd_ctl_elem_info
  * #snd_ctl_elem_info_get_dimension is deprecated without any replacement.
  */
 #ifndef DOXYGEN
-EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimension)(const 
snd_ctl_elem_info_t *obj, unsigned int idx)
+EXPORT_SYMBOL int INTERNAL(snd_ctl_elem_info_get_dimension)(const 
snd_ctl_elem_info_t *obj ATTRIBUTE_UNUSED, unsigned int idx ATTRIBUTE_UNUSED)
 #else
 int snd_ctl_elem_info_get_dimension(const snd_ctl_elem_info_t *obj, unsigned 
int idx)
 #endif
 {
+#if 0 /* deprecated */
        assert(obj);
        if (idx > 3)
                return 0;
        return obj->dimen.d[idx];
+#else /* deprecated */
+       return -EINVAL;
+#endif /* deprecated */
 }
 use_default_symbol_version(__snd_ctl_elem_info_get_dimension, 
snd_ctl_elem_info_get_dimension, ALSA_0.9.3);
 
@@ -2565,9 +2577,10 @@ 
use_default_symbol_version(__snd_ctl_elem_info_get_dimension, snd_ctl_elem_info_
  * \deprecated Since 1.1.5
  * #snd_ctl_elem_info_set_dimension is deprecated without any replacement.
  */
-int snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t *info,
-                                   const int dimension[4])
+int snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t *info ATTRIBUTE_UNUSED,
+                                   const int dimension[4] ATTRIBUTE_UNUSED)
 {
+#if 0 /* deprecated */
        unsigned int i;
 
        if (info == NULL)
@@ -2581,6 +2594,9 @@ int snd_ctl_elem_info_set_dimension(snd_ctl_elem_info_t 
*info,
        }
 
        return 0;
+#else /* deprecated */
+       return -EINVAL;
+#endif /* deprecated */
 }
 
 /**
-- 
2.16.4

++++++ 0071-topology-Drop-SNDRV_CTL_ELEM_ACCESS_TIMESTAMP-access.patch ++++++
>From beb6b178e6d0ca4a9b6c528bac9bfa899b733462 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Mon, 10 Feb 2020 12:49:25 +0100
Subject: [PATCH 71/74] topology: Drop SNDRV_CTL_ELEM_ACCESS_TIMESTAMP access

SNDRV_CTL_ELEM_ACCESS_TIMESTAMP is removed from 5.6 kernel ABI as the
ctl timestamp field has been never used and deprecated.
Drop the corresponding access from the topology code, too.

Signed-off-by: Takashi Iwai <[email protected]>
---
 src/topology/ctl.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index b78f1c54be05..90241b6318c5 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -35,7 +35,6 @@ static const struct ctl_access_elem ctl_access[] = {
        {"read", SNDRV_CTL_ELEM_ACCESS_READ},
        {"write", SNDRV_CTL_ELEM_ACCESS_WRITE},
        {"volatile", SNDRV_CTL_ELEM_ACCESS_VOLATILE},
-       {"timestamp", SNDRV_CTL_ELEM_ACCESS_TIMESTAMP},
        {"tlv_read", SNDRV_CTL_ELEM_ACCESS_TLV_READ},
        {"tlv_write", SNDRV_CTL_ELEM_ACCESS_TLV_WRITE},
        {"tlv_command", SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND},
-- 
2.16.4

++++++ 0072-uapi-Sync-with-5.6-kernel-ABI.patch ++++++
++++ 721 lines (skipped)

++++++ 0073-ucm-parser-add-error-message-to-verb_dev_list_add.patch ++++++
>From 5bc3d4c4c14c6a54f61465987fe7e1a097288e4b Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <[email protected]>
Date: Mon, 10 Feb 2020 13:18:23 +0100
Subject: [PATCH 73/74] ucm: parser - add error message to verb_dev_list_add()

Signed-off-by: Jaroslav Kysela <[email protected]>
---
 src/ucm/parser.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 23bf6a63f31e..8d6eea31f8e7 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1135,6 +1135,7 @@ static int verb_dev_list_add(struct use_case_verb *verb,
                }
                return uc_mgr_put_to_dev_list(&device->dev_list, src);
        }
+       uc_error("error: unable to find device '%s'", dst);
        return -ENOENT;
 }
 
-- 
2.16.4

++++++ 0074-do-not-set-close-on-exec-flag-on-descriptor-if-it-wa.patch ++++++
>From b367274b4dcdd1e83e6e7211dd2c08df05c8a998 Mon Sep 17 00:00:00 2001
From: Rolf Eike Beer <[email protected]>
Date: Tue, 11 Feb 2020 11:22:18 +0100
Subject: [PATCH 74/74] do not set close-on-exec flag on descriptor if it was
 already set

There is no need to set this again if O_CLOEXEC is supported.

Signed-off-by: Rolf Eike Beer <[email protected]>
Signed-off-by: Jaroslav Kysela <[email protected]>
---
 include/local.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/local.h b/include/local.h
index ea0ec32d96b3..ed6ba93664dd 100644
--- a/include/local.h
+++ b/include/local.h
@@ -320,8 +320,10 @@ static inline int snd_open_device(const char *filename, 
int fmode)
                        fd = rsm_open_device(filename, fmode);
        }
 #endif
+#ifndef O_CLOEXEC
        if (fd >= 0)
                fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
        return fd;
 }
 
-- 
2.16.4





Reply via email to