Hello community,

here is the log from the commit of package alsa for openSUSE:Factory checked in 
at 2015-10-14 16:40:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/alsa (Old)
 and      /work/SRC/openSUSE:Factory/.alsa.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "alsa"

Changes:
--------
--- /work/SRC/openSUSE:Factory/alsa/alsa.changes        2015-08-21 
07:37:19.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.alsa.new/alsa.changes   2015-10-14 
16:41:01.000000000 +0200
@@ -1,0 +2,29 @@
+Fri Oct  2 12:11:24 CEST 2015 - [email protected]
+
+- Backport upsteram fixes: more topology API updates/fixes, misc
+  documentation fixes, some logical error fixes in PCM plugins,
+  LADSPA plugin segfault fix:
+  0050-topology-fix-element-object-type-is-switch.patch
+  0051-topology-Add-element-ID-so-we-can-look-up-references.patch
+  0052-topology-Add-support-for-writing-manifest-private-da.patch
+  0053-topology-update-ABI-to-improve-support-for-different.patch
+  0054-topology-Add-ops-support-to-byte-control-objects.patch
+  0055-topology-treat-all-DAPM-controls-types-the-same-when.patch
+  0056-topology-print-error-prefix-on-error-message.patch
+  0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch
+  0058-core-add-convenience-macros-to-local.h.patch
+  0059-topology-Add-C-templates-structure-for-building-topo.patch
+  0060-topology-A-API-calls-to-directly-build-topology-data.patch
+  0061-pcm-Fix-doxygen-for-two-enums.patch
+  0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch
+  0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch
+  0064-topology-builder-Fix-possibly-uninitialized-variable.patch
+  0065-topology-ctl-Fix-access-type-checks.patch
+  0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch
+  0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch
+  0068-topology-pcm-Remove-unused-variables.patch
+  0069-build-Do-not-try-to-detect-cross-compiler.patch
+  0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch
+  0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch
+
+-------------------------------------------------------------------

New:
----
  0050-topology-fix-element-object-type-is-switch.patch
  0051-topology-Add-element-ID-so-we-can-look-up-references.patch
  0052-topology-Add-support-for-writing-manifest-private-da.patch
  0053-topology-update-ABI-to-improve-support-for-different.patch
  0054-topology-Add-ops-support-to-byte-control-objects.patch
  0055-topology-treat-all-DAPM-controls-types-the-same-when.patch
  0056-topology-print-error-prefix-on-error-message.patch
  0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch
  0058-core-add-convenience-macros-to-local.h.patch
  0059-topology-Add-C-templates-structure-for-building-topo.patch
  0060-topology-A-API-calls-to-directly-build-topology-data.patch
  0061-pcm-Fix-doxygen-for-two-enums.patch
  0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch
  0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch
  0064-topology-builder-Fix-possibly-uninitialized-variable.patch
  0065-topology-ctl-Fix-access-type-checks.patch
  0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch
  0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch
  0068-topology-pcm-Remove-unused-variables.patch
  0069-build-Do-not-try-to-detect-cross-compiler.patch
  0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch
  0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch

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

Other differences:
------------------
++++++ alsa.spec ++++++
--- /var/tmp/diff_new_pack.5ipw1a/_old  2015-10-14 16:41:03.000000000 +0200
+++ /var/tmp/diff_new_pack.5ipw1a/_new  2015-10-14 16:41:03.000000000 +0200
@@ -98,6 +98,28 @@
 Patch47:        0047-conf-topology-Add-topology-file-for-broadwell-audio-.patch
 Patch48:        0048-topology-Fix-missing-inclusion-of-ctype.h.patch
 Patch49:        0049-topology-Fix-typos.patch
+Patch50:        0050-topology-fix-element-object-type-is-switch.patch
+Patch51:        0051-topology-Add-element-ID-so-we-can-look-up-references.patch
+Patch52:        0052-topology-Add-support-for-writing-manifest-private-da.patch
+Patch53:        0053-topology-update-ABI-to-improve-support-for-different.patch
+Patch54:        0054-topology-Add-ops-support-to-byte-control-objects.patch
+Patch55:        0055-topology-treat-all-DAPM-controls-types-the-same-when.patch
+Patch56:        0056-topology-print-error-prefix-on-error-message.patch
+Patch57:        0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch
+Patch58:        0058-core-add-convenience-macros-to-local.h.patch
+Patch59:        0059-topology-Add-C-templates-structure-for-building-topo.patch
+Patch60:        0060-topology-A-API-calls-to-directly-build-topology-data.patch
+Patch61:        0061-pcm-Fix-doxygen-for-two-enums.patch
+Patch62:        0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch
+Patch63:        0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch
+Patch64:        0064-topology-builder-Fix-possibly-uninitialized-variable.patch
+Patch65:        0065-topology-ctl-Fix-access-type-checks.patch
+Patch66:        0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch
+Patch67:        0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch
+Patch68:        0068-topology-pcm-Remove-unused-variables.patch
+Patch69:        0069-build-Do-not-try-to-detect-cross-compiler.patch
+Patch70:        0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch
+Patch71:        0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch
 # rest suse patches
 Patch99:        alsa-lib-doxygen-avoid-crash-for-11.3.diff
 # suppress timestamp in documents
@@ -217,6 +239,28 @@
 %patch47 -p1
 %patch48 -p1
 %patch49 -p1
+%patch50 -p1
+%patch51 -p1
+%patch52 -p1
+%patch53 -p1
+%patch54 -p1
+%patch55 -p1
+%patch56 -p1
+%patch57 -p1
+%patch58 -p1
+%patch59 -p1
+%patch60 -p1
+%patch61 -p1
+%patch62 -p1
+%patch63 -p1
+%patch64 -p1
+%patch65 -p1
+%patch66 -p1
+%patch67 -p1
+%patch68 -p1
+%patch69 -p1
+%patch70 -p1
+%patch71 -p1
 %if 0%{?suse_version} == 1130
 %patch99 -p1
 %endif

++++++ 0050-topology-fix-element-object-type-is-switch.patch ++++++
>From 1bb4c2fc304515278e6510ba7288b94f99f50bcd Mon Sep 17 00:00:00 2001
From: Liam Girdwood <[email protected]>
Date: Tue, 4 Aug 2015 18:06:55 +0100
Subject: [PATCH] topology: fix element object type is switch()

Use the correct type for this object.

Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/topology/elem.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/topology/elem.c b/src/topology/elem.c
index 32ba2c12375b..d7a1fd715d49 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -137,7 +137,7 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
                list_add_tail(&elem->list, &tplg->enum_list);
                obj_size = sizeof(struct snd_soc_tplg_enum_control);
                break;
-       case SND_SOC_TPLG_TYPE_MIXER:
+       case OBJECT_TYPE_MIXER:
                list_add_tail(&elem->list, &tplg->mixer_list);
                obj_size = sizeof(struct snd_soc_tplg_mixer_control);
                break;
-- 
2.5.3

++++++ 0051-topology-Add-element-ID-so-we-can-look-up-references.patch ++++++
>From 120b3b8eadd9a2a4c2ede0a246bffa1cfac562a9 Mon Sep 17 00:00:00 2001
From: Jin Yao <[email protected]>
Date: Tue, 4 Aug 2015 18:09:12 +0100
Subject: [PATCH] topology: Add element ID so we can look up references by
 name.

Add support to lookup elements by name. This is in preparation for adding
some new API calls that will allow building topology data using a C API. This
will allow applications to build their own topology data directly.

Signed-off-by: Jin Yao <[email protected]>
Signed-off-by: Mengdong Lin <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/topology/ctl.c        |  9 ++++-----
 src/topology/dapm.c       |  2 +-
 src/topology/data.c       |  2 +-
 src/topology/elem.c       | 15 +++++++++++----
 src/topology/pcm.c        | 10 +++++-----
 src/topology/text.c       |  2 +-
 src/topology/tplg_local.h |  2 +-
 7 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 9c1333c1fc88..aa06ff64bc48 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -264,7 +264,7 @@ int tplg_parse_tlv(snd_tplg_t *tplg, snd_config_t *cfg,
        int err = 0;
        struct tplg_elem *elem;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_TLV);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_TLV);
        if (!elem)
                return -ENOMEM;
 
@@ -298,7 +298,7 @@ int tplg_parse_control_bytes(snd_tplg_t *tplg,
        const char *id, *val = NULL;
        int err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_BYTES);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_BYTES);
        if (!elem)
                return -ENOMEM;
 
@@ -403,11 +403,10 @@ int tplg_parse_control_enum(snd_tplg_t *tplg, 
snd_config_t *cfg,
        const char *id, *val = NULL;
        int err, j;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_ENUM);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_ENUM);
        if (!elem)
                return -ENOMEM;
 
-       /* init new mixer */
        ec = elem->enum_ctrl;
        elem_copy_text(ec->hdr.name, elem->id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
        ec->hdr.type = SND_SOC_TPLG_TYPE_ENUM;
@@ -501,7 +500,7 @@ int tplg_parse_control_mixer(snd_tplg_t *tplg,
        const char *id, *val = NULL;
        int err, j;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_MIXER);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_MIXER);
        if (!elem)
                return -ENOMEM;
 
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 1da82adea470..7e26ea0326ec 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -420,7 +420,7 @@ int tplg_parse_dapm_widget(snd_tplg_t *tplg,
        const char *id, *val = NULL;
        int widget_type, err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_DAPM_WIDGET);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_DAPM_WIDGET);
        if (!elem)
                return -ENOMEM;
 
diff --git a/src/topology/data.c b/src/topology/data.c
index 13e1e2bb60fb..c768bc5b0b04 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -268,7 +268,7 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
        int err = 0;
        struct tplg_elem *elem;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_DATA);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_DATA);
        if (!elem)
                return -ENOMEM;
 
diff --git a/src/topology/elem.c b/src/topology/elem.c
index d7a1fd715d49..7fee65332124 100644
--- a/src/topology/elem.c
+++ b/src/topology/elem.c
@@ -103,20 +103,27 @@ struct tplg_elem *tplg_elem_lookup(struct list_head 
*base, const char* id,
 
 /* create a new common element and object */
 struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
-       snd_config_t *cfg, enum object_type type)
+       snd_config_t *cfg, const char *name, enum object_type type)
 {
        struct tplg_elem *elem;
        const char *id;
        int obj_size = 0;
        void *obj;
 
+       if (!cfg && !name)
+               return NULL;
+
        elem = tplg_elem_new();
        if (!elem)
                return NULL;
 
-       snd_config_get_id(cfg, &id);
-       strncpy(elem->id, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
-       elem->id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN - 1] = 0;
+       /* do we get name from cfg */
+       if (cfg) {
+               snd_config_get_id(cfg, &id);
+               elem_copy_text(elem->id, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+               elem->id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN - 1] = 0;
+       } else if (name != NULL)
+               elem_copy_text(elem->id, name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
 
        switch (type) {
        case OBJECT_TYPE_DATA:
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 8f23a6f12ec4..deae47b771be 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -228,7 +228,7 @@ int tplg_parse_pcm_config(snd_tplg_t *tplg,
        const char *id;
        int err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_STREAM_CONFIG);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_STREAM_CONFIG);
        if (!elem)
                return -ENOMEM;
 
@@ -294,7 +294,7 @@ int tplg_parse_pcm_caps(snd_tplg_t *tplg,
        char *s;
        int err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_STREAM_CAPS);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_STREAM_CAPS);
        if (!elem)
                return -ENOMEM;
 
@@ -461,7 +461,7 @@ int tplg_parse_pcm(snd_tplg_t *tplg,
        const char *id, *val = NULL;
        int err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_PCM);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_PCM);
        if (!elem)
                return -ENOMEM;
 
@@ -524,7 +524,7 @@ int tplg_parse_be(snd_tplg_t *tplg,
        const char *id, *val = NULL;
        int err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_BE);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_BE);
        if (!elem)
                return -ENOMEM;
 
@@ -587,7 +587,7 @@ int tplg_parse_cc(snd_tplg_t *tplg,
        const char *id, *val = NULL;
        int err;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_CC);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_CC);
        if (!elem)
                return -ENOMEM;
 
diff --git a/src/topology/text.c b/src/topology/text.c
index ebb6e3840d62..7128056d5d34 100644
--- a/src/topology/text.c
+++ b/src/topology/text.c
@@ -64,7 +64,7 @@ int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg,
        int err = 0;
        struct tplg_elem *elem;
 
-       elem = tplg_elem_new_common(tplg, cfg, OBJECT_TYPE_TEXT);
+       elem = tplg_elem_new_common(tplg, cfg, NULL, OBJECT_TYPE_TEXT);
        if (!elem)
                return -ENOMEM;
 
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 688c78f3a6a4..62788e4b7ca1 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -216,7 +216,7 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base,
                                const char* id,
                                unsigned int type);
 struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
-       snd_config_t *cfg, enum object_type type);
+       snd_config_t *cfg, const char *name, enum object_type type);
 
 static inline void elem_copy_text(char *dest, const char *src, int len)
 {
-- 
2.5.3

++++++ 0052-topology-Add-support-for-writing-manifest-private-da.patch ++++++
>From d5e7e8bb38681c2cbf3777314c422130a740810e Mon Sep 17 00:00:00 2001
From: Mengdong Lin <[email protected]>
Date: Tue, 4 Aug 2015 18:09:46 +0100
Subject: [PATCH] topology: Add support for writing manifest private data.

Allow manifest to contain private data and write this data to file.

Signed-off-by: Mengdong Lin <[email protected]>
Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/topology/builder.c    | 37 ++++++++++++++++++++++++++++++++-----
 src/topology/tplg_local.h |  1 +
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/src/topology/builder.c b/src/topology/builder.c
index 0066b220353c..a944866a2d68 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -226,9 +226,6 @@ static int write_block(snd_tplg_t *tplg, struct list_head 
*base,
        case OBJECT_TYPE_CC:
                return write_elem_block(tplg, base, size,
                        SND_SOC_TPLG_TYPE_DAI_LINK, "cc");
-       case OBJECT_TYPE_MANIFEST:
-               return write_data_block(tplg, size, SND_SOC_TPLG_TYPE_MANIFEST,
-                       "manifest", &tplg->manifest);
        case OBJECT_TYPE_DATA:
                return write_elem_block(tplg, base, size,
                        SND_SOC_TPLG_TYPE_PDATA, "data");
@@ -239,13 +236,43 @@ static int write_block(snd_tplg_t *tplg, struct list_head 
*base,
        return 0;
 }
 
+/* write the manifest including its private data */
+static int write_manifest_data(snd_tplg_t *tplg)
+{
+       int ret;
+
+       /* write the header for this block */
+       ret = write_block_header(tplg, SND_SOC_TPLG_TYPE_MANIFEST, 0,
+               SND_SOC_TPLG_ABI_VERSION, 0,
+               sizeof(tplg->manifest) + tplg->manifest.priv.size, 1);
+       if (ret < 0) {
+               SNDERR("error: failed to write manifest block %d\n", ret);
+               return ret;
+       }
+
+       verbose(tplg, "manifest : write %d bytes\n", sizeof(tplg->manifest));
+       ret = write(tplg->out_fd, &tplg->manifest, sizeof(tplg->manifest));
+       if (ret < 0) {
+               SNDERR("error: failed to write manifest %d\n", ret);
+               return ret;
+       }
+
+       verbose(tplg, "manifest : write %d priv bytes\n", 
tplg->manifest.priv.size);
+       ret = write(tplg->out_fd, tplg->manifest_pdata, 
tplg->manifest.priv.size);
+       if (ret < 0) {
+               SNDERR("error: failed to write manifest priv data %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 int tplg_write_data(snd_tplg_t *tplg)
 {
        int ret;
 
        /* write manifest */
-       ret = write_data_block(tplg, sizeof(tplg->manifest),
-               OBJECT_TYPE_MANIFEST, "manifest", &tplg->manifest);
+       ret = write_manifest_data(tplg);
        if (ret < 0) {
                SNDERR("failed to write manifest %d\n", ret);
                return ret;
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 62788e4b7ca1..ad38945056df 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -77,6 +77,7 @@ struct snd_tplg {
 
        /* manifest */
        struct snd_soc_tplg_manifest manifest;
+       const void *manifest_pdata;     /* copied by builder at file write */
 
        /* list of each element type */
        struct list_head tlv_list;
-- 
2.5.3

++++++ 0053-topology-update-ABI-to-improve-support-for-different.patch ++++++
>From 8c8372cc060ec16776db28f927c9402dcc09b001 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <[email protected]>
Date: Wed, 5 Aug 2015 14:41:50 +0100
Subject: [PATCH] topology: update ABI to improve support for different TLV
 object types.

Currently the TLV topology structure is targeted at only supporting the
DB scale data. This patch extends support for the other TLV types so they
can be easily added at a later stage.

TLV structure is moved to common topology control header since it's a
common field for controls and can be processed in a general way.

Users must set a proper access flag for a control since it's used to decide
if the TLV field is valid and if a TLV callback is needed.

Removed the following fields from topology TLV struct:
 - size/count: type can decide the size.
 - numid: not needed to initialize TLV for kcontrol.
 - data: replaced by the type specific struct.

Added TLV structure to generic control header and removed TLV structure from
mixer control.

Signed-off-by: Mengdong Lin <[email protected]>
Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 include/sound/asoc.h | 19 +++++++++++++------
 src/topology/ctl.c   | 20 ++++++++------------
 2 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/include/sound/asoc.h b/include/sound/asoc.h
index bb6dcf3ff7b4..73eb80ef17cc 100644
--- a/include/sound/asoc.h
+++ b/include/sound/asoc.h
@@ -135,11 +135,19 @@ struct snd_soc_tplg_private {
 /*
  * Kcontrol TLV data.
  */
+struct snd_soc_tplg_tlv_dbscale {
+       __le32 min;
+       __le32 step;
+       __le32 mute;
+} __attribute__((packed));
+
 struct snd_soc_tplg_ctl_tlv {
-       __le32 size;    /* in bytes aligned to 4 */
-       __le32 numid;   /* control element numeric identification */
-       __le32 count;   /* number of elem in data array */
-       __le32 data[SND_SOC_TPLG_TLV_SIZE];
+       __le32 size;    /* in bytes of this structure */
+       __le32 type;    /* SNDRV_CTL_TLVT_*, type of TLV */
+       union {
+               __le32 data[SND_SOC_TPLG_TLV_SIZE];
+               struct snd_soc_tplg_tlv_dbscale scale;
+       };
 } __attribute__((packed));
 
 /*
@@ -170,7 +178,7 @@ struct snd_soc_tplg_ctl_hdr {
        char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
        __le32 access;
        struct snd_soc_tplg_kcontrol_ops_id ops;
-       __le32 tlv_size;        /* non zero means control has TLV data */
+       struct snd_soc_tplg_ctl_tlv tlv;
 } __attribute__((packed));
 
 /*
@@ -258,7 +266,6 @@ struct snd_soc_tplg_mixer_control {
        __le32 invert;
        __le32 num_channels;
        struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
-       struct snd_soc_tplg_ctl_tlv tlv;
        struct snd_soc_tplg_private priv;
 } __attribute__((packed));
 
diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index aa06ff64bc48..930b50897220 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -28,10 +28,7 @@ static int copy_tlv(struct tplg_elem *elem, struct tplg_elem 
*ref)
        tplg_dbg("TLV '%s' used by '%s\n", ref->id, elem->id);
 
        /* TLV has a fixed size */
-       mixer_ctrl->tlv = *tlv;
-
-       /* set size of TLV data */
-       mixer_ctrl->hdr.tlv_size = tlv->count * sizeof(uint32_t);
+       mixer_ctrl->hdr.tlv = *tlv;
        return 0;
 }
 
@@ -209,20 +206,19 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, 
struct tplg_elem *elem)
        snd_config_iterator_t i, next;
        snd_config_t *n;
        struct snd_soc_tplg_ctl_tlv *tplg_tlv;
+       struct snd_soc_tplg_tlv_dbscale *scale;
        const char *id = NULL, *value = NULL;
-       int *data;
 
        tplg_dbg(" scale: %s\n", elem->id);
 
        tplg_tlv = calloc(1, sizeof(*tplg_tlv));
        if (!tplg_tlv)
                return -ENOMEM;
-       data = (int*)(tplg_tlv->data);
 
        elem->tlv = tplg_tlv;
-       tplg_tlv->numid = SNDRV_CTL_TLVT_DB_SCALE;
-       tplg_tlv->count = 8;
-       tplg_tlv->size = sizeof(*tplg_tlv);
+       tplg_tlv->size = sizeof(struct snd_soc_tplg_ctl_tlv);
+       tplg_tlv->type = SNDRV_CTL_TLVT_DB_SCALE;
+       scale = &tplg_tlv->scale;
 
        snd_config_for_each(i, next, cfg) {
 
@@ -242,11 +238,11 @@ static int tplg_parse_tlv_dbscale(snd_config_t *cfg, 
struct tplg_elem *elem)
 
                /* get TLV data */
                if (strcmp(id, "min") == 0)
-                       data[0] = atoi(value);
+                       scale->min = atoi(value);
                else if (strcmp(id, "step") == 0)
-                       data[1] = atoi(value);
+                       scale->step = atoi(value);
                else if (strcmp(id, "mute") == 0)
-                       data[2] = atoi(value);
+                       scale->mute = atoi(value);
                else
                        SNDERR("error: unknown key %s\n", id);
        }
-- 
2.5.3

++++++ 0054-topology-Add-ops-support-to-byte-control-objects.patch ++++++
>From 80a8283d179739f73ad007b5d60dbf28b80fddb9 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <[email protected]>
Date: Wed, 5 Aug 2015 14:41:51 +0100
Subject: [PATCH] topology: Add ops support to byte control objects.

Rename the control ops structure to make it more generic so we can use it
with other objects like bytes controls. Add this structure to the byte
control structure.

Signed-off-by: Mengdong Lin <[email protected]>
Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 include/sound/asoc.h | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/include/sound/asoc.h b/include/sound/asoc.h
index 73eb80ef17cc..c642855e4b0c 100644
--- a/include/sound/asoc.h
+++ b/include/sound/asoc.h
@@ -161,9 +161,11 @@ struct snd_soc_tplg_channel {
 } __attribute__((packed));
 
 /*
- * Kcontrol Operations IDs
+ * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
+ * Kcontrol ops need get/put/info.
+ * Bytes ext ops need get/put.
  */
-struct snd_soc_tplg_kcontrol_ops_id {
+struct snd_soc_tplg_io_ops {
        __le32 get;
        __le32 put;
        __le32 info;
@@ -177,7 +179,7 @@ struct snd_soc_tplg_ctl_hdr {
        __le32 type;
        char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
        __le32 access;
-       struct snd_soc_tplg_kcontrol_ops_id ops;
+       struct snd_soc_tplg_io_ops ops;
        struct snd_soc_tplg_ctl_tlv tlv;
 } __attribute__((packed));
 
@@ -309,6 +311,7 @@ struct snd_soc_tplg_bytes_control {
        __le32 mask;
        __le32 base;
        __le32 num_regs;
+       struct snd_soc_tplg_io_ops ext_ops;
        struct snd_soc_tplg_private priv;
 } __attribute__((packed));
 
-- 
2.5.3

++++++ 0055-topology-treat-all-DAPM-controls-types-the-same-when.patch ++++++
>From ecf7fdaeef57d300b94a1cd00db8a8b04a2edceb Mon Sep 17 00:00:00 2001
From: Mengdong Lin <[email protected]>
Date: Fri, 7 Aug 2015 16:39:15 +0100
Subject: [PATCH] topology: treat all DAPM controls types the same when copying

Copy all DAPM controls types using the same method.

Signed-off-by: Mengdong Lin <[email protected]>
Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/topology/dapm.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 7e26ea0326ec..a0a8b8656c21 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -107,8 +107,6 @@ static int tplg_parse_dapm_enums(snd_config_t *cfg, struct 
tplg_elem *elem)
 static int copy_dapm_control(struct tplg_elem *elem, struct tplg_elem *ref)
 {
        struct snd_soc_tplg_dapm_widget *widget = elem->widget;
-       struct snd_soc_tplg_mixer_control *mixer_ctrl = ref->mixer_ctrl;
-       struct snd_soc_tplg_enum_control *enum_ctrl = ref->enum_ctrl;
 
        tplg_dbg("Control '%s' used by '%s'\n", ref->id, elem->id);
        tplg_dbg("\tparent size: %d + %d -> %d, priv size -> %d\n",
@@ -121,13 +119,10 @@ static int copy_dapm_control(struct tplg_elem *elem, 
struct tplg_elem *ref)
 
        elem->widget = widget;
 
-       /* copy new widget at the end */
-       if (ref->type == OBJECT_TYPE_MIXER)
-               memcpy((void*)widget + elem->size, mixer_ctrl, ref->size);
-       else if (ref->type == OBJECT_TYPE_ENUM)
-               memcpy((void*)widget + elem->size, enum_ctrl, ref->size);
-
+       /* append the control to the end of the widget */
+       memcpy((void*)widget + elem->size, ref->obj, ref->size);
        elem->size += ref->size;
+
        widget->num_kcontrols++;
        ref->compound_elem = 1;
        return 0;
-- 
2.5.3

++++++ 0056-topology-print-error-prefix-on-error-message.patch ++++++
>From b47cf00197420d7dc9dc01dce75b41aaad49278e Mon Sep 17 00:00:00 2001
From: Liam Girdwood <[email protected]>
Date: Fri, 7 Aug 2015 16:39:16 +0100
Subject: [PATCH] topology: print error prefix on error message.

Let the user know it's an error.

Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 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 c768bc5b0b04..090185174ce4 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -384,7 +384,7 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem 
*ref)
                break;
 
        default:
-               SNDERR("elem '%s': type %d private data not supported \n",
+               SNDERR("error: elem '%s': type %d private data not supported 
\n",
                        elem->id, elem->type);
                return -EINVAL;
        }
-- 
2.5.3

++++++ 0057-topology-rename-OBJECT_TYPE_-to-SND_TPLG_TYPE_.patch ++++++
++++ 782 lines (skipped)

++++++ 0058-core-add-convenience-macros-to-local.h.patch ++++++
>From ab9633d581110a5da08bd2d2c7c070f3862fe9af Mon Sep 17 00:00:00 2001
From: Liam Girdwood <[email protected]>
Date: Tue, 11 Aug 2015 18:23:15 +0100
Subject: [PATCH] core: add convenience macros to local.h

Move ARRAY_SIZE() from tplg_local.h to local.h and add container_of()
macro to local.h. Both macros are generic but are initially used by
topology.

Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 include/local.h           | 7 +++++++
 src/topology/tplg_local.h | 1 -
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/include/local.h b/include/local.h
index 660081638a1c..b429f5d0094c 100644
--- a/include/local.h
+++ b/include/local.h
@@ -350,4 +350,11 @@ int snd_config_search_alias_hooks(snd_config_t *config,
 
 int _snd_conf_generic_id(const char *id);
 
+/* convenience macros */
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+
+#define container_of(ptr, type, member) ({                      \
+        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+       (type *)( (char *)__mptr - offsetof(type,member) );})
+
 #endif
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index febc1772fd04..3982cc70dce5 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -32,7 +32,6 @@
 #define MAX_FILE               256
 #define TPLG_MAX_PRIV_SIZE     (1024 * 128)
 #define ALSA_TPLG_DIR  ALSA_CONFIG_DIR "/topology"
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
 
 /** The name of the environment variable containing the tplg directory */
 #define ALSA_CONFIG_TPLG_VAR "ALSA_CONFIG_TPLG"
-- 
2.5.3

++++++ 0059-topology-Add-C-templates-structure-for-building-topo.patch ++++++
>From 1b148ef590f94fc30b4c814c1ce2bc31621af840 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <[email protected]>
Date: Tue, 11 Aug 2015 18:23:16 +0100
Subject: [PATCH] topology: Add C templates structure for building topology
 from C programs

Define structures that can be used by applications to directly build topology
data instead of using text files. The application will build up the topology
data by populating the template structures for each object type and then
registering the template with the topology core.

Signed-off-by: Mengdong Lin <[email protected]>
Signed-off-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 include/topology.h        | 176 ++++++++++++++++++++++++++++++++++++++++++++++
 src/topology/tplg_local.h |  18 -----
 2 files changed, 176 insertions(+), 18 deletions(-)

diff --git a/include/topology.h b/include/topology.h
index 0cb2d79e5574..aee43de6e009 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -456,9 +456,30 @@ extern "C" {
  *
  */
 
+/** Maximum number of channels supported in one control */
+#define SND_TPLG_MAX_CHAN              8
+
 /** Topology context */
 typedef struct snd_tplg snd_tplg_t;
 
+/** Topology object types */
+enum snd_tplg_type {
+       SND_TPLG_TYPE_TLV = 0,          /*!< TLV Data */
+       SND_TPLG_TYPE_MIXER,            /*!< Mixer control*/
+       SND_TPLG_TYPE_ENUM,             /*!< Enumerated control */
+       SND_TPLG_TYPE_TEXT,             /*!< Text data */
+       SND_TPLG_TYPE_DATA,             /*!< Private data */
+       SND_TPLG_TYPE_BYTES,            /*!< Byte control */
+       SND_TPLG_TYPE_STREAM_CONFIG,    /*!< PCM Stream configuration */
+       SND_TPLG_TYPE_STREAM_CAPS,      /*!< PCM Stream capabilities */
+       SND_TPLG_TYPE_PCM,              /*!< PCM stream device */
+       SND_TPLG_TYPE_DAPM_WIDGET,      /*!< DAPM widget */
+       SND_TPLG_TYPE_DAPM_GRAPH,       /*!< DAPM graph elements */
+       SND_TPLG_TYPE_BE,               /*!< BE DAI link */
+       SND_TPLG_TYPE_CC,               /*!< Hostless codec <-> codec link */
+       SND_TPLG_TYPE_MANIFEST,         /*!< Topology manifest */
+};
+
 /**
  * \brief Create a new topology parser instance.
  * \return New topology parser instance
@@ -488,6 +509,161 @@ int snd_tplg_build_file(snd_tplg_t *tplg, const char 
*infile,
  */
 void snd_tplg_verbose(snd_tplg_t *tplg, int verbose);
 
+/** \struct snd_tplg_tlv_template
+ * \brief Template type for all TLV objects.
+ */
+struct snd_tplg_tlv_template {
+       int type;        /*!< TLV type SNDRV_CTL_TLVT_ */
+};
+
+/** \struct snd_tplg_tlv_dbscale_template
+ * \brief Template type for TLV Scale objects.
+ */
+struct snd_tplg_tlv_dbscale_template {
+       struct snd_tplg_tlv_template hdr;       /*!< TLV type header */
+       int min;                        /*!< dB minimum value in 0.1dB */
+       int step;                       /*!< dB step size in 0.1dB */
+       int mute;                       /*!< is min dB value mute ? */
+};
+
+/** \struct snd_tplg_channel_template
+ * \brief Template type for single channel mapping.
+ */
+struct snd_tplg_channel_elem {
+       int size;       /*!< size in bytes of this structure */
+       int reg;        /*!< channel control register */
+       int shift;      /*!< channel shift for control bits */
+       int id;         /*!< ID maps to Left, Right, LFE etc */
+};
+
+/** \struct snd_tplg_channel_map_template
+ * \brief Template type for channel mapping.
+ */
+struct snd_tplg_channel_map_template {
+       int num_channels;       /*!< number of channel mappings */
+       struct snd_tplg_channel_elem channel[SND_TPLG_MAX_CHAN];        /*!< 
mapping */
+};
+
+/** \struct snd_tplg_pdata_template
+ * \brief Template type for private data objects.
+ */
+struct snd_tplg_pdata_template {
+       unsigned int length;    /*!< data length */
+       const void *data;       /*!< data */
+};
+
+/** \struct snd_tplg_io_ops_template
+ * \brief Template type for object operations mapping.
+ */
+struct snd_tplg_io_ops_template {
+       int get;        /*!< get callback ID */
+       int put;        /*!< put callback ID */
+       int info;       /*!< info callback ID */
+};
+
+/** \struct snd_tplg_ctl_template
+ * \brief Template type for control objects.
+ */
+struct snd_tplg_ctl_template {
+       int type;               /*!< Control type */
+       const char *name;       /*!< Control name */
+       int access;             /*!< Control access */
+       struct snd_tplg_io_ops_template ops;    /*!< operations */
+       struct snd_tplg_tlv_template *tlv; /*!< non NULL means we have TLV data 
*/
+};
+
+/** \struct snd_tplg_mixer_template
+ * \brief Template type for mixer control objects.
+ */
+struct snd_tplg_mixer_template {
+       struct snd_tplg_ctl_template hdr;       /*!< control type header */
+       struct snd_tplg_channel_map_template *map;      /*!< channel map */
+       int min;        /*!< min value for mixer */
+       int max;        /*!< max value for mixer */
+       int platform_max;       /*!< max value for platform control */
+       int invert;     /*!< whether controls bits are inverted */
+       struct snd_soc_tplg_private *priv;      /*!< control private data */
+};
+
+/** \struct snd_tplg_enum_template
+ * \brief Template type for enumerated control objects.
+ */
+struct snd_tplg_enum_template {
+       struct snd_tplg_ctl_template hdr;       /*!< control type header */
+       struct snd_tplg_channel_map_template *map;      /*!< channel map */
+       int items;      /*!< number of enumerated items in control */
+       int mask;       /*!< register mask size */
+       const char **texts;     /*!< control text items */
+       const int **values;     /*!< control value items */
+       struct snd_soc_tplg_private *priv;      /*!< control private data */
+};
+
+/** \struct snd_tplg_bytes_template
+ * \brief Template type for TLV Scale objects.
+ */
+struct snd_tplg_bytes_template {
+       struct snd_tplg_ctl_template hdr;       /*!< control type header */
+       int max;                /*!< max byte control value */
+       int mask;               /*!< byte control mask */
+       int base;               /*!< base register */
+       int num_regs;           /*!< number of registers */
+       struct snd_tplg_io_ops_template ext_ops;        /*!< ops mapping */
+       struct snd_soc_tplg_private *priv;      /*!< control private data */
+};
+
+/** \struct snd_tplg_graph_elem
+ * \brief Template type for single DAPM graph element.
+ */
+struct snd_tplg_graph_elem {
+       const char *src;        /*!< source widget name */
+       const char *ctl;        /*!< control name or NULL if no control */
+       const char *sink;       /*!< sink widget name */
+};
+
+/** \struct snd_tplg_graph_template
+ * \brief Template type for array of DAPM graph elements.
+ */
+struct snd_tplg_graph_template {
+       int count;              /*!< Number of graph elements */
+       struct snd_tplg_graph_elem elem[0];     /*!< graph elements */
+};
+
+/** \struct snd_tplg_widget_template
+ * \brief Template type for DAPM widget objects.
+ */
+struct snd_tplg_widget_template {
+       int id;                 /*!< SND_SOC_DAPM_CTL */
+       const char *name;       /*!< widget name */
+       const char *sname;      /*!< stream name (certain widgets only) */
+       int reg;                /*!< negative reg = no direct dapm */
+       int shift;              /*!< bits to shift */
+       int mask;               /*!< non-shifted mask */
+       int subseq;             /*!< sort within widget type */
+       unsigned int invert;            /*!< invert the power bit */
+       unsigned int ignore_suspend;    /*!< kept enabled over suspend */
+       unsigned short event_flags;     /*!< PM event sequence flags */
+       unsigned short event_type;      /*!< PM event sequence type */
+       struct snd_soc_tplg_private *priv;      /*!< widget private data */
+       int num_ctls;                   /*!< Number of controls used by widget 
*/
+       struct snd_tplg_ctl_template *ctl[0];   /*!< array of widget controls */
+};
+
+/** \struct snd_tplg_obj_template
+ * \brief Generic Template Object
+ */
+typedef struct snd_tplg_obj_template {
+       enum snd_tplg_type type;        /*!< template object type */
+       int index;              /*!< group index for object */
+       int version;            /*!< optional vendor specific version details */
+       int vendor_type;        /*!< optional vendor specific type info */
+       union {
+               struct snd_tplg_widget_template *widget;        /*!< DAPM 
widget */
+               struct snd_tplg_mixer_template *mixer;          /*!< Mixer 
control */
+               struct snd_tplg_bytes_template *bytes_ctl;      /*!< Bytes 
control */
+               struct snd_tplg_enum_template *enum_ctl;        /*!< Enum 
control */
+               struct snd_tplg_graph_template *graph;          /*!< Graph 
elements */
+       };
+} snd_tplg_obj_template_t;
 /* \} */
 
 #ifdef __cplusplus
diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h
index 3982cc70dce5..ec6304599538 100644
--- a/src/topology/tplg_local.h
+++ b/src/topology/tplg_local.h
@@ -39,24 +39,6 @@
 struct tplg_ref;
 struct tplg_elem;
 
-/** Topology object types */
-enum snd_tplg_type {
-       SND_TPLG_TYPE_TLV = 0,          /*!< TLV Data */
-       SND_TPLG_TYPE_MIXER,            /*!< Mixer control*/
-       SND_TPLG_TYPE_ENUM,             /*!< Enumerated control */
-       SND_TPLG_TYPE_TEXT,             /*!< Text data */
-       SND_TPLG_TYPE_DATA,             /*!< Private data */
-       SND_TPLG_TYPE_BYTES,            /*!< Byte control */
-       SND_TPLG_TYPE_STREAM_CONFIG,    /*!< PCM Stream configuration */
-       SND_TPLG_TYPE_STREAM_CAPS,      /*!< PCM Stream capabilities */
-       SND_TPLG_TYPE_PCM,              /*!< PCM stream device */
-       SND_TPLG_TYPE_DAPM_WIDGET,      /*!< DAPM widget */
-       SND_TPLG_TYPE_DAPM_GRAPH,       /*!< DAPM graph elements */
-       SND_TPLG_TYPE_BE,               /*!< BE DAI link */
-       SND_TPLG_TYPE_CC,               /*!< Hostless codec <-> codec link */
-       SND_TPLG_TYPE_MANIFEST,         /*!< Topology manifest */
-};
-
 struct snd_tplg {
 
        /* opaque vendor data */
-- 
2.5.3

++++++ 0060-topology-A-API-calls-to-directly-build-topology-data.patch ++++++
++++ 732 lines (skipped)

++++++ 0061-pcm-Fix-doxygen-for-two-enums.patch ++++++
>From 3313f8740d936b1dbc6391ce3227ba467c6f603d Mon Sep 17 00:00:00 2001
From: David Henningsson <[email protected]>
Date: Mon, 24 Aug 2015 20:37:29 +0200
Subject: [PATCH] pcm: Fix doxygen for two enums

The doxygen comments were wrong, making doxygen output weird.

Signed-off-by: David Henningsson <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 include/pcm.h | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/include/pcm.h b/include/pcm.h
index a1d14a989a47..0be1a321adba 100644
--- a/include/pcm.h
+++ b/include/pcm.h
@@ -324,9 +324,9 @@ typedef enum _snd_pcm_tstamp {
 } snd_pcm_tstamp_t;
 
 typedef enum _snd_pcm_tstamp_type {
-       SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0,   /** gettimeofday equivalent */
-       SND_PCM_TSTAMP_TYPE_MONOTONIC,  /** posix_clock_monotonic equivalent */
-       SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,      /** monotonic_raw (no NTP) */
+       SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0,   /**< gettimeofday equivalent */
+       SND_PCM_TSTAMP_TYPE_MONOTONIC,  /**< posix_clock_monotonic equivalent */
+       SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,      /**< monotonic_raw (no NTP) */
        SND_PCM_TSTAMP_TYPE_LAST = SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
 } snd_pcm_tstamp_type_t;
 
@@ -527,11 +527,11 @@ int snd_pcm_unlink(snd_pcm_t *pcm);
 
 /** channel map list type */
 enum snd_pcm_chmap_type {
-       SND_CHMAP_TYPE_NONE = 0,/** unspecified channel position */
-       SND_CHMAP_TYPE_FIXED,   /** fixed channel position */
-       SND_CHMAP_TYPE_VAR,     /** freely swappable channel position */
-       SND_CHMAP_TYPE_PAIRED,  /** pair-wise swappable channel position */
-       SND_CHMAP_TYPE_LAST = SND_CHMAP_TYPE_PAIRED, /** last entry */
+       SND_CHMAP_TYPE_NONE = 0,/**< unspecified channel position */
+       SND_CHMAP_TYPE_FIXED,   /**< fixed channel position */
+       SND_CHMAP_TYPE_VAR,     /**< freely swappable channel position */
+       SND_CHMAP_TYPE_PAIRED,  /**< pair-wise swappable channel position */
+       SND_CHMAP_TYPE_LAST = SND_CHMAP_TYPE_PAIRED, /**< last entry */
 };
 
 /** channel positions */
-- 
2.5.3

++++++ 0062-pcm-ioplug-extplug-Fix-logic-errors-in-type-checks.patch ++++++
>From fe8bb1fe02f9c7b7cb6048a17a8ff1ea30f97fc8 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 20:57:47 +0200
Subject: [PATCH] pcm: ioplug,extplug: Fix logic errors in type checks

A few error checks are wrongly performed with logical and (&&) instead
of logical or (||), which condition never met.

Reported-by: David Binderman <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/pcm/pcm_extplug.c | 8 ++++----
 src/pcm/pcm_ioplug.c  | 4 ++--
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/pcm/pcm_extplug.c b/src/pcm/pcm_extplug.c
index a5de6d848e21..a04f826c90a0 100644
--- a/src/pcm/pcm_extplug.c
+++ b/src/pcm/pcm_extplug.c
@@ -766,7 +766,7 @@ void snd_pcm_extplug_params_reset(snd_pcm_extplug_t 
*extplug)
 int snd_pcm_extplug_set_slave_param_list(snd_pcm_extplug_t *extplug, int type, 
unsigned int num_list, const unsigned int *list)
 {
        extplug_priv_t *ext = extplug->pcm->private_data;
-       if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) {
+       if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) {
                SNDERR("EXTPLUG: invalid parameter type %d", type);
                return -EINVAL;
        }
@@ -788,7 +788,7 @@ int snd_pcm_extplug_set_slave_param_list(snd_pcm_extplug_t 
*extplug, int type, u
 int snd_pcm_extplug_set_slave_param_minmax(snd_pcm_extplug_t *extplug, int 
type, unsigned int min, unsigned int max)
 {
        extplug_priv_t *ext = extplug->pcm->private_data;
-       if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) {
+       if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) {
                SNDERR("EXTPLUG: invalid parameter type %d", type);
                return -EINVAL;
        }
@@ -814,7 +814,7 @@ int 
snd_pcm_extplug_set_slave_param_minmax(snd_pcm_extplug_t *extplug, int type,
 int snd_pcm_extplug_set_param_list(snd_pcm_extplug_t *extplug, int type, 
unsigned int num_list, const unsigned int *list)
 {
        extplug_priv_t *ext = extplug->pcm->private_data;
-       if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) {
+       if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) {
                SNDERR("EXTPLUG: invalid parameter type %d", type);
                return -EINVAL;
        }
@@ -836,7 +836,7 @@ int snd_pcm_extplug_set_param_list(snd_pcm_extplug_t 
*extplug, int type, unsigne
 int snd_pcm_extplug_set_param_minmax(snd_pcm_extplug_t *extplug, int type, 
unsigned int min, unsigned int max)
 {
        extplug_priv_t *ext = extplug->pcm->private_data;
-       if (type < 0 && type >= SND_PCM_EXTPLUG_HW_PARAMS) {
+       if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) {
                SNDERR("EXTPLUG: invalid parameter type %d", type);
                return -EINVAL;
        }
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index fe9347c835d5..43550c03875b 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -1019,7 +1019,7 @@ void snd_pcm_ioplug_params_reset(snd_pcm_ioplug_t *ioplug)
 int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *ioplug, int type, unsigned 
int num_list, const unsigned int *list)
 {
        ioplug_priv_t *io = ioplug->pcm->private_data;
-       if (type < 0 && type >= SND_PCM_IOPLUG_HW_PARAMS) {
+       if (type < 0 || type >= SND_PCM_IOPLUG_HW_PARAMS) {
                SNDERR("IOPLUG: invalid parameter type %d", type);
                return -EINVAL;
        }
@@ -1043,7 +1043,7 @@ int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t 
*ioplug, int type, unsigned i
 int snd_pcm_ioplug_set_param_minmax(snd_pcm_ioplug_t *ioplug, int type, 
unsigned int min, unsigned int max)
 {
        ioplug_priv_t *io = ioplug->pcm->private_data;
-       if (type < 0 && type >= SND_PCM_IOPLUG_HW_PARAMS) {
+       if (type < 0 || type >= SND_PCM_IOPLUG_HW_PARAMS) {
                SNDERR("IOPLUG: invalid parameter type %d", type);
                return -EINVAL;
        }
-- 
2.5.3

++++++ 0063-pcm-route-Remove-bogus-in-snd_config_get_id-checks.patch ++++++
>From 03d6b15291e3534afb72c5aa36495a932ef0cc6a Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 21:48:17 +0200
Subject: [PATCH] pcm: route: Remove bogus ! in snd_config_get_id() checks

There are strange "!" added before snd_config_get_id() return value
checks in a couple of places in pcm_route.c.  This essentially makes
the result always positive, making checks bogus.

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

diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c
index 2a437e88b93c..646517d2a9d2 100644
--- a/src/pcm/pcm_route.c
+++ b/src/pcm/pcm_route.c
@@ -770,7 +770,7 @@ static int determine_chmap(snd_config_t *tt, 
snd_pcm_chmap_t **tt_chmap)
                snd_config_iterator_t j, jnext;
                snd_config_t *in = snd_config_iterator_entry(i);
 
-               if (!snd_config_get_id(in, &id) < 0)
+               if (snd_config_get_id(in, &id) < 0)
                        continue;
                if (snd_config_get_type(in) != SND_CONFIG_TYPE_COMPOUND)
                        goto err;
@@ -1070,7 +1070,7 @@ static int _snd_pcm_route_determine_ttable(snd_config_t 
*tt,
                snd_config_iterator_t j, jnext;
                long cchannel;
                const char *id;
-               if (!snd_config_get_id(in, &id) < 0)
+               if (snd_config_get_id(in, &id) < 0)
                        continue;
                err = safe_strtol(id, &cchannel);
                if (err < 0) {
-- 
2.5.3

++++++ 0064-topology-builder-Fix-possibly-uninitialized-variable.patch ++++++
>From 76b9cae026bf73a00ccf3ec8833ec56f0e64f451 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 22:04:48 +0200
Subject: [PATCH] topology: builder: Fix possibly uninitialized variable in
 write_elem_block()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When an empty list is passed to write_elem_block(), it may leave
vendor_type uninitialized.
  builder.c: In function ‘write_elem_block’:
  builder.c:127:8: warning: ‘vendor_type’ may be used uninitialized in this 
function [-Wmaybe-uninitialized]
    ret = write_block_header(tplg, tplg_type, vendor_type,
          ^
  builder.c:114:33: note: ‘vendor_type’ was declared here
    int ret, wsize = 0, count = 0, vendor_type;
                                   ^

Add an immediate return for count = 0 for avoiding it, and simplify
the code initializing vendor_type without using a one-shot loop.

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

diff --git a/src/topology/builder.c b/src/topology/builder.c
index 3bccd44827cc..91412aadd098 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -116,13 +116,12 @@ static int write_elem_block(snd_tplg_t *tplg,
        /* count number of elements */
        list_for_each(pos, base)
                count++;
+       if (!count)
+               return 0;
 
        /* write the header for this block */
-       list_for_each(pos, base) {
-               elem = list_entry(pos, struct tplg_elem, list);
-               vendor_type = elem->vendor_type;
-               break;
-       }
+       elem = list_entry(base->next, struct tplg_elem, list);
+       vendor_type = elem->vendor_type;
 
        ret = write_block_header(tplg, tplg_type, vendor_type,
                SND_SOC_TPLG_ABI_VERSION, 0, size, count);
-- 
2.5.3

++++++ 0065-topology-ctl-Fix-access-type-checks.patch ++++++
>From f41fe763e9bc80783bf1471141ac06d514ffaef3 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 22:09:44 +0200
Subject: [PATCH] topology: ctl: Fix access type checks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fix the wrong bit-and check by adding parentheses properly:
  ctl.c: In function ‘tplg_add_bytes’:
  ctl.c:868:22: warning: suggest parentheses around comparison in operand of 
‘&’ [-Wparentheses]
     if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE
                        ^

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

diff --git a/src/topology/ctl.c b/src/topology/ctl.c
index 68c4ce5803d1..7d8787f347b8 100644
--- a/src/topology/ctl.c
+++ b/src/topology/ctl.c
@@ -865,7 +865,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct 
snd_tplg_bytes_template *bytes_ctl,
 
        /* check on TLV bytes control */
        if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
-               if (be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE
+               if ((be->hdr.access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)
                        != SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE) {
                        SNDERR("error: Invalid TLV bytes control access 0x%x\n",
                                be->hdr.access);
-- 
2.5.3

++++++ 0066-topology-data-Fix-wrong-size-check-in-tplg_parse_dat.patch ++++++
>From 5b21400c42877ff6c2a386c7c5ed5c6c6c9bf664 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 22:11:48 +0200
Subject: [PATCH] topology: data: Fix wrong size check in tplg_parse_data_hex()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

A wrong, uninitialized variable is referred as the size to check in
tplg_parse_data_hex().  Spotted by gcc warning:
  data.c: In function ‘tplg_parse_data_hex’:
  data.c:228:5: warning: ‘esize’ may be used uninitialized in this function 
[-Wmaybe-uninitialized]
    if (esize > TPLG_MAX_PRIV_SIZE) {
        ^
  data.c:211:12: note: ‘esize’ was declared here
    int size, esize, off, num;
              ^

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

diff --git a/src/topology/data.c b/src/topology/data.c
index 4ee1f8a15f95..370c0faead36 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -225,8 +225,8 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct 
tplg_elem *elem,
        size = num * width;
        priv = elem->data;
 
-       if (esize > TPLG_MAX_PRIV_SIZE) {
-               SNDERR("error: data too big %d\n", esize);
+       if (size > TPLG_MAX_PRIV_SIZE) {
+               SNDERR("error: data too big %d\n", size);
                return -EINVAL;
        }
 
-- 
2.5.3

++++++ 0067-topology-parser-Add-missing-return-value-to-snd_tplg.patch ++++++
>From e38b13f128c743fe1f664e4491fdd0c880265da1 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 22:13:50 +0200
Subject: [PATCH] topology: parser: Add missing return value to
 snd_tplg_set_manifest_data()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Spotted by gcc warning:
  parser.c: In function ‘snd_tplg_set_manifest_data’:
  parser.c:361:1: warning: control reaches end of non-void function 
[-Wreturn-type]
   }
   ^

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

diff --git a/src/topology/parser.c b/src/topology/parser.c
index ca7de0689cea..44c6146b22f2 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -358,6 +358,7 @@ int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void 
*data, int len)
 {
        tplg->manifest.priv.size = len;
        tplg->manifest_pdata = data;
+       return 0;
 }
 
 void snd_tplg_verbose(snd_tplg_t *tplg, int verbose)
-- 
2.5.3

++++++ 0068-topology-pcm-Remove-unused-variables.patch ++++++
>From 9a2fe5399c6ff987fe4e23907c6467c3d2baa307 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Tue, 8 Sep 2015 22:15:02 +0200
Subject: [PATCH] topology: pcm: Remove unused variables
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fix gcc warnings:
  pcm.c: In function ‘tplg_parse_stream_cfg’:
  pcm.c:160:6: warning: unused variable ‘ret’ [-Wunused-variable]
    int ret;
        ^
  pcm.c: In function ‘split_format’:
  pcm.c:267:13: warning: unused variable ‘ret’ [-Wunused-variable]
    int i = 0, ret;
               ^

Signed-off-by: Takashi Iwai <[email protected]>
---
 src/topology/pcm.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 6e42aa18b99b..18d5f0b1b040 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -157,7 +157,6 @@ static int tplg_parse_stream_cfg(snd_tplg_t *tplg 
ATTRIBUTE_UNUSED,
        struct snd_soc_tplg_stream *stream;
        const char *id, *val;
        snd_pcm_format_t format;
-       int ret;
 
        snd_config_get_id(cfg, &id);
 
@@ -264,7 +263,7 @@ static int split_format(struct snd_soc_tplg_stream_caps 
*caps, char *str)
 {
        char *s = NULL;
        snd_pcm_format_t format;
-       int i = 0, ret;
+       int i = 0;
 
        s = strtok(str, ",");
        while ((s != NULL) && (i < SND_SOC_TPLG_MAX_FORMATS)) {
-- 
2.5.3

++++++ 0069-build-Do-not-try-to-detect-cross-compiler.patch ++++++
>From c82417650a1ea4446c19dd82bfab9d8e6cd5a969 Mon Sep 17 00:00:00 2001
From: Khem Raj <[email protected]>
Date: Tue, 15 Sep 2015 18:48:02 +0300
Subject: [PATCH] build: Do not try to detect cross-compiler

cross compilers are passed via path may not be a gcc based cross
compiler in such cases this check fails and try's to force gcc based
cross compiler detection, This code is a convenience that limits the
build system

Signed-off-by: Khem Raj <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 configure.ac | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/configure.ac b/configure.ac
index a482b3e7f6ca..a14e52de5e3b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -27,20 +27,6 @@ AC_PREFIX_DEFAULT(/usr)
 
 dnl Checks for programs.
 
-dnl try to gues cross-compiler if not set
-if test "x$host" != "x$build" -a -z "`echo $CC | grep -e '-gcc'`";
-then
-  AC_MSG_CHECKING(for cross-compiler)
-
-  which ${program_prefix}gcc >/dev/null 2>&1 && CC=${program_prefix}gcc
-  which ${host_cpu}-${host_os}-gcc >/dev/null 2>&1 \
-  && CC=${host_cpu}-${host_os}-gcc
-  which ${host_cpu}-${host_vendor}-${host_os}-gcc >/dev/null 2>&1 \
-  && CC=${host_cpu}-${host_vendor}-${host_os}-gcc
-
-  AC_MSG_RESULT($CC)
-fi
-           
 CFLAGS="$CFLAGS -D_GNU_SOURCE"
 
 
-- 
2.5.3

++++++ 0070-topology-Add-API-to-set-a-vendor-specific-version-nu.patch ++++++
>From 8b0a5310bf3cb6ca1f7d70e3f4149b25b17b453a Mon Sep 17 00:00:00 2001
From: Mengdong Lin <[email protected]>
Date: Wed, 16 Sep 2015 17:07:13 +0800
Subject: [PATCH] topology: Add API to set a vendor specific version number

This vendor-specific version number is optional. It will be written to
the 'version' field of each block header of the binary toplogy data file.
The vendor driver can check this number for further processing in kernel.

The topology ABI version number is still stored in the 'abi' field of
block headers.

Signed-off-by: Mengdong Lin <[email protected]>
Reviewed-by: Liam Girdwood <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 include/topology.h     | 8 ++++++++
 src/topology/builder.c | 6 +++---
 src/topology/parser.c  | 7 +++++++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/include/topology.h b/include/topology.h
index 6ff8c5fb4609..9b84bd9331dc 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -690,6 +690,14 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile);
  */
 int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len);
 
+/**
+ * \brief Set an optional vendor specific version number.
+ * \param tplg Topology instance.
+ * \param version Vendor specific version number.
+ * \return Zero on success, otherwise a negative error code
+ */
+int snd_tplg_set_version(snd_tplg_t *tplg, unsigned int version);
+
 /* \} */
 
 #ifdef __cplusplus
diff --git a/src/topology/builder.c b/src/topology/builder.c
index 91412aadd098..8d57a8b719f7 100644
--- a/src/topology/builder.c
+++ b/src/topology/builder.c
@@ -89,7 +89,7 @@ static int write_data_block(snd_tplg_t *tplg, int size, int 
tplg_type,
 
        /* write the header for this block */
        ret = write_block_header(tplg, tplg_type, 0,
-               SND_SOC_TPLG_ABI_VERSION, 0, size, 1);
+               tplg->version, 0, size, 1);
        if (ret < 0) {
                SNDERR("error: failed to write %s block %d\n", obj_name, ret);
                return ret;
@@ -124,7 +124,7 @@ static int write_elem_block(snd_tplg_t *tplg,
        vendor_type = elem->vendor_type;
 
        ret = write_block_header(tplg, tplg_type, vendor_type,
-               SND_SOC_TPLG_ABI_VERSION, 0, size, count);
+               tplg->version, 0, size, count);
        if (ret < 0) {
                SNDERR("error: failed to write %s block %d\n",
                        obj_name, ret);
@@ -242,7 +242,7 @@ static int write_manifest_data(snd_tplg_t *tplg)
 
        /* write the header for this block */
        ret = write_block_header(tplg, SND_SOC_TPLG_TYPE_MANIFEST, 0,
-               SND_SOC_TPLG_ABI_VERSION, 0,
+               tplg->version, 0,
                sizeof(tplg->manifest) + tplg->manifest.priv.size, 1);
        if (ret < 0) {
                SNDERR("error: failed to write manifest block %d\n", ret);
diff --git a/src/topology/parser.c b/src/topology/parser.c
index 44c6146b22f2..6671055ae226 100644
--- a/src/topology/parser.c
+++ b/src/topology/parser.c
@@ -361,6 +361,13 @@ int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const 
void *data, int len)
        return 0;
 }
 
+int snd_tplg_set_version(snd_tplg_t *tplg, unsigned int version)
+{
+       tplg->version = version;
+
+       return 0;
+}
+
 void snd_tplg_verbose(snd_tplg_t *tplg, int verbose)
 {
        tplg->verbose = verbose;
-- 
2.5.3

++++++ 0071-pcm-ladspa-Fix-segfault-due-to-a-wrong-channel-refer.patch ++++++
>From f07e9af7eeebc950fd7bf4101a6af7f53ac741b6 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Fri, 2 Oct 2015 11:55:36 +0200
Subject: [PATCH] pcm: ladspa: Fix segfault due to a wrong channel reference

Because of a typo in referencing the input array in
snd_pcm_ladspa_allocate_memory(), ladpsa PCM plugin may cause a
segfault at prepare when input and and output channels are different:
 #0  0x00007ffff78623ef in snd_pcm_ladspa_allocate_memory (pcm=0x626fa0, 
pcm=0x626fa0, pcm=0x626fa0, ladspa=0x621ad0) at pcm_ladspa.c:753
 #1  snd_pcm_ladspa_init (pcm=0x626fa0) at pcm_ladspa.c:834
 #2  0x00007ffff7842946 in snd_pcm_plugin_prepare (pcm=0x626fa0) at 
pcm_plugin.c:171
 #3  0x00007ffff784290f in snd_pcm_plugin_prepare (pcm=0x62c760) at 
pcm_plugin.c:162
 #4  0x000000000040256a in ?? ()
 #5  0x00007ffff7222ec5 in __libc_start_main (main=0x401d80,a argc=4, 
argv=0x7fffffffde28, init=<optimized out>, fini=<optimized out>, 
rtld_fini=<optimized out>, stack_end=0x7fffffffde18) at libc-start.c:287
 #6  0x0000000000402fdd in ?? ()

This patch corrects the wrong reference.

Reported-and-tested-by: Andreas Hartmann <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
---
 src/pcm/pcm_ladspa.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pcm/pcm_ladspa.c b/src/pcm/pcm_ladspa.c
index 631ee0f35b73..6552b4379ec0 100644
--- a/src/pcm/pcm_ladspa.c
+++ b/src/pcm/pcm_ladspa.c
@@ -749,7 +749,7 @@ static int snd_pcm_ladspa_allocate_memory(snd_pcm_t *pcm, 
snd_pcm_ladspa_t *lads
                                 return -ENOMEM;
                         }
                        for (idx = 0; idx < instance->input.channels.size; 
idx++) {
-                               chn = instance->output.channels.array[idx];
+                               chn = instance->input.channels.array[idx];
                                if (pchannels[chn] == NULL && chn < ichannels) {
                                        instance->input.data[idx] = NULL;
                                        continue;
-- 
2.5.3





Reply via email to