* [PATCH v7 00/11] ASoC: topology: Remaining kernel patches
@ 2016-11-02 16:59 mengdong.lin
2016-11-02 17:00 ` [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4 mengdong.lin
` (10 more replies)
0 siblings, 11 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 16:59 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
This series can support old topology ABI v4 in a backward compatible way,
assuming users start to use topology from ABI v4 with alsa-lib v1.1.0.
This series contains all remaining kernel patches of topology of ABI v5,
including some ABI update to PCM (FrontEnds) and link (BackEnds) objects.
Kernel can support topology files generated by ABI v4 without these
updates.
User will be able to config existing physical DAI links, configure more
for FE links. Code are verified and can cover reqeust of Intel pre-release
platforms for next year, so ABI should be stable.
Current kernel topology code does not really touch Codec-Codec links
since there is no user requst atm. We can add support for CC links later
by reusing code and data structures for physical links, and no need to revise
ABI.
History:
v2: Add the reason for creating BE DAI & DAI links by topology to commit
message.
Drop support for configuring DPCM trigger ordering in topology.
v3: Topology no longer creates BE DAI or BE DAI links, but only configure
existing ones. The API to find a DAI link can also check the name and
stream name in case a soc card doesn't use unique ID for DAI links.
The user space code is also ready.
v4: Support ABI udpate and be backward compatible for topology ABI v4.
Code refactoring to configure physical DAIs.
v5: Minor code refactoring and modification on commit messages.
v6: Change the variable of physical DAI count in manifest from
"be_dai_elems" to "dai_elems", backward compatible.
v7: Remove 2 v6 patches that have been merged.
Split ABI update and non-ABI fix for PCM to seperate patches.
No use asoc specific flags "ignore_suspend" & "ignore_powerdown_time"
for links, but add a flag for voice wake up (the last patch).
Mengdong Lin (11):
ASoC: topology: Make PCM backward compatible from ABI v4
ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI
link
ASoC: topology: Support topology file of ABI v4
ASoC: topology: ABI - Add flags and private data to PCM
ASoC: topology: ABI - Update physical DAI link configuration for
version 5
ASoC: Define API to find a dai link
ASoC: topology: Add support to configure existing physical DAI links
ASoC: topology: Rename the function to create a FE link
ASoC: topology: ABI - Rename struct and type for physical DAIs
ASoC: topology: Rename functions & variables for physical DAIs
ASoC: topology: ABI - Add voice wake up flag for DAI links
include/sound/soc.h | 3 +
include/uapi/sound/asoc.h | 73 +++++++-
sound/soc/soc-core.c | 42 +++++
sound/soc/soc-topology.c | 463 +++++++++++++++++++++++++++++++++++++++++-----
4 files changed, 522 insertions(+), 59 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
@ 2016-11-02 17:00 ` mengdong.lin
2016-11-03 16:12 ` Mark Brown
2016-11-03 16:23 ` Applied "ASoC: topology: Make PCM backward compatible from ABI v4" to the asoc tree Mark Brown
2016-11-02 17:02 ` [PATCH v7 02/11] ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link mengdong.lin
` (9 subsequent siblings)
10 siblings, 2 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:00 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
This patch adds support for old version 4 of PCMs (FE DAI & DAI links).
Topology ABI v5 added new fields to stream caps and thus changed PCMs.
Since user space may still uses v4, kernel will check the ABI version by
comparing the object size. If user space uses v4 of PCMs, kernel will
create the latest version of PCMs from the old version, and use the new
version internally to create FE DAI & DAI links. Because these new created
PCM elements will be freed later, kernel need duplicate the name strings
of DAI driver and DAI links when creating them.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index c832b24..03edde5 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -53,7 +53,6 @@
#define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST
#define SOC_TPLG_PASS_END SOC_TPLG_PASS_BE_DAI
-
/*
* Old version of ABI structs, supported for backward compatibility.
*/
@@ -69,6 +68,39 @@ struct snd_soc_tplg_manifest_v4 {
struct snd_soc_tplg_private priv;
} __packed;
+/* Stream Capabilities v4 */
+struct snd_soc_tplg_stream_caps_v4 {
+ __le32 size; /* in bytes of this structure */
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
+ __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
+ __le32 rate_min; /* min rate */
+ __le32 rate_max; /* max rate */
+ __le32 channels_min; /* min channels */
+ __le32 channels_max; /* max channels */
+ __le32 periods_min; /* min number of periods */
+ __le32 periods_max; /* max number of periods */
+ __le32 period_size_min; /* min period size bytes */
+ __le32 period_size_max; /* max period size bytes */
+ __le32 buffer_size_min; /* min buffer size bytes */
+ __le32 buffer_size_max; /* max buffer size bytes */
+} __packed;
+
+/* PCM v4 */
+struct snd_soc_tplg_pcm_v4 {
+ __le32 size; /* in bytes of this structure */
+ char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le32 pcm_id; /* unique ID - used to match with DAI link */
+ __le32 dai_id; /* unique ID - used to match */
+ __le32 playback; /* supports playback mode */
+ __le32 capture; /* supports capture mode */
+ __le32 compress; /* 1 = compressed; 0 = PCM */
+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+ __le32 num_streams; /* number of streams */
+ struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+} __packed;
+
/* topology context */
struct soc_tplg {
const struct firmware *fw;
@@ -1692,38 +1724,127 @@ static int soc_tplg_pcm_create(struct soc_tplg *tplg,
return soc_tplg_link_create(tplg, pcm);
}
+/* copy stream caps from the old version 4 of source */
+static void stream_caps_new_ver(struct snd_soc_tplg_stream_caps *dest,
+ struct snd_soc_tplg_stream_caps_v4 *src)
+{
+ dest->size = sizeof(*dest);
+ memcpy(dest->name, src->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ dest->formats = src->formats;
+ dest->rates = src->rates;
+ dest->rate_min = src->rate_min;
+ dest->rate_max = src->rate_max;
+ dest->channels_min = src->channels_min;
+ dest->channels_max = src->channels_max;
+ dest->periods_min = src->periods_min;
+ dest->periods_max = src->periods_max;
+ dest->period_size_min = src->period_size_min;
+ dest->period_size_max = src->period_size_max;
+ dest->buffer_size_min = src->buffer_size_min;
+ dest->buffer_size_max = src->buffer_size_max;
+}
+
+/**
+ * pcm_new_ver - Create the new version of PCM from the old version.
+ * @tplg: topology context
+ * @src: older version of pcm as a source
+ * @pcm: latest version of pcm created from the source
+ *
+ * Support from vesion 4. User should free the returned pcm manually.
+ */
+static int pcm_new_ver(struct soc_tplg *tplg,
+ struct snd_soc_tplg_pcm *src,
+ struct snd_soc_tplg_pcm **pcm)
+{
+ struct snd_soc_tplg_pcm *dest;
+ struct snd_soc_tplg_pcm_v4 *src_v4;
+ int i;
+
+ *pcm = NULL;
+
+ if (src->size != sizeof(*src_v4)) {
+ dev_err(tplg->dev, "ASoC: invalid PCM size\n");
+ return -EINVAL;
+ }
+
+ dev_warn(tplg->dev, "ASoC: old version of PCM\n");
+ src_v4 = (struct snd_soc_tplg_pcm_v4 *)src;
+ dest = kzalloc(sizeof(*dest), GFP_KERNEL);
+ if (!dest)
+ return -ENOMEM;
+
+ dest->size = sizeof(*dest); /* size of latest abi version */
+ memcpy(dest->pcm_name, src_v4->pcm_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ memcpy(dest->dai_name, src_v4->dai_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ dest->pcm_id = src_v4->pcm_id;
+ dest->dai_id = src_v4->dai_id;
+ dest->playback = src_v4->playback;
+ dest->capture = src_v4->capture;
+ dest->compress = src_v4->compress;
+ dest->num_streams = src_v4->num_streams;
+ for (i = 0; i < dest->num_streams; i++)
+ memcpy(&dest->stream[i], &src_v4->stream[i],
+ sizeof(struct snd_soc_tplg_stream));
+
+ for (i = 0; i < 2; i++)
+ stream_caps_new_ver(&dest->caps[i], &src_v4->caps[i]);
+
+ *pcm = dest;
+ return 0;
+}
+
static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr)
{
- struct snd_soc_tplg_pcm *pcm;
+ struct snd_soc_tplg_pcm *pcm, *_pcm;
int count = hdr->count;
- int i;
+ int i, err;
+ bool abi_match;
if (tplg->pass != SOC_TPLG_PASS_PCM_DAI)
return 0;
+ /* check the element size and count */
+ pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
+ if (pcm->size > sizeof(struct snd_soc_tplg_pcm)
+ || pcm->size < sizeof(struct snd_soc_tplg_pcm_v4)) {
+ dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n",
+ pcm->size);
+ return -EINVAL;
+ }
+
if (soc_tplg_check_elem_count(tplg,
- sizeof(struct snd_soc_tplg_pcm), count,
+ pcm->size, count,
hdr->payload_size, "PCM DAI")) {
dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n",
count);
return -EINVAL;
}
- /* create the FE DAIs and DAI links */
- pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
for (i = 0; i < count; i++) {
- if (pcm->size != sizeof(*pcm)) {
- dev_err(tplg->dev, "ASoC: invalid pcm size\n");
- return -EINVAL;
+ pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
+
+ /* check ABI version by size, create a new version of pcm
+ * if abi not match.
+ */
+ if (pcm->size == sizeof(*pcm)) {
+ abi_match = true;
+ _pcm = pcm;
+ } else {
+ abi_match = false;
+ err = pcm_new_ver(tplg, pcm, &_pcm);
}
- soc_tplg_pcm_create(tplg, pcm);
- pcm++;
+ /* create the FE DAIs and DAI links */
+ soc_tplg_pcm_create(tplg, _pcm);
+
+ if (!abi_match)
+ kfree(_pcm); /* free the duplicated one */
+
+ tplg->pos += pcm->size; /* offset by version-specific size */
}
dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
- tplg->pos += sizeof(struct snd_soc_tplg_pcm) * count;
return 0;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 02/11] ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
2016-11-02 17:00 ` [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4 mengdong.lin
@ 2016-11-02 17:02 ` mengdong.lin
2016-11-03 16:55 ` Applied "ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link" to the asoc tree Mark Brown
2016-11-02 17:03 ` [PATCH v7 03/11] ASoC: topology: Support topology file of ABI v4 mengdong.lin
` (8 subsequent siblings)
10 siblings, 1 reply; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:02 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
User space may not always set a valid FE DAI driver's name, FE DAI link's
name, stream name or cpu DAI name. In such cases, there are all ZERO in
these name string buffers of a topology PCM object. This patch will only
duplicate valid name strings for kernel FE DAI driver and DAI link when
creating them from topology, and free the name strings when destroying
them.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 03edde5..0f1c8eb 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -523,6 +523,7 @@ static void remove_dai(struct snd_soc_component *comp,
if (dobj->ops && dobj->ops->dai_unload)
dobj->ops->dai_unload(comp, dobj);
+ kfree(dai_drv->name);
list_del(&dobj->list);
kfree(dai_drv);
}
@@ -540,6 +541,10 @@ static void remove_link(struct snd_soc_component *comp,
if (dobj->ops && dobj->ops->link_unload)
dobj->ops->link_unload(comp, dobj);
+ kfree(link->name);
+ kfree(link->stream_name);
+ kfree(link->cpu_dai_name);
+
list_del(&dobj->list);
snd_soc_remove_dai_link(comp->card, link);
kfree(link);
@@ -1638,7 +1643,8 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
if (dai_drv == NULL)
return -ENOMEM;
- dai_drv->name = pcm->dai_name;
+ if (strlen(pcm->dai_name))
+ dai_drv->name = kstrdup(pcm->dai_name, GFP_KERNEL);
dai_drv->id = pcm->dai_id;
if (pcm->playback) {
@@ -1681,11 +1687,15 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
if (link == NULL)
return -ENOMEM;
- link->name = pcm->pcm_name;
- link->stream_name = pcm->pcm_name;
+ if (strlen(pcm->pcm_name)) {
+ link->name = kstrdup(pcm->pcm_name, GFP_KERNEL);
+ link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL);
+ }
link->id = pcm->pcm_id;
- link->cpu_dai_name = pcm->dai_name;
+ if (strlen(pcm->dai_name))
+ link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL);
+
link->codec_name = "snd-soc-dummy";
link->codec_dai_name = "snd-soc-dummy-dai";
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 03/11] ASoC: topology: Support topology file of ABI v4
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
2016-11-02 17:00 ` [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4 mengdong.lin
2016-11-02 17:02 ` [PATCH v7 02/11] ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link mengdong.lin
@ 2016-11-02 17:03 ` mengdong.lin
2016-11-02 17:03 ` [PATCH v7 04/11] ASoC: topology: ABI - Add flags and private data to PCM mengdong.lin
` (7 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:03 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Users start to use topology ABI from v4. ABI v5 updated existing manifest
and PCM elements. Two previous patches can support these ABI updates in a
backward compatible way. So if the topology file from user space is
generated by ABI v4, kernel will no longer quit but continue parsing.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 8d9814b..69cae71 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -83,7 +83,8 @@
#define SND_SOC_TPLG_NUM_TEXTS 16
/* ABI version */
-#define SND_SOC_TPLG_ABI_VERSION 0x5
+#define SND_SOC_TPLG_ABI_VERSION 0x5 /* current version */
+#define SND_SOC_TPLG_ABI_VERSION_MIN 0x4 /* oldest version supported */
/* Max size of TLV data */
#define SND_SOC_TPLG_TLV_SIZE 32
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 0f1c8eb..2f9b64e 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2056,7 +2056,9 @@ static int soc_valid_header(struct soc_tplg *tplg,
return -EINVAL;
}
- if (hdr->abi != SND_SOC_TPLG_ABI_VERSION) {
+ /* Support ABI from version 4 */
+ if (hdr->abi > SND_SOC_TPLG_ABI_VERSION
+ || hdr->abi < SND_SOC_TPLG_ABI_VERSION_MIN) {
dev_err(tplg->dev,
"ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n",
tplg->pass, hdr->abi,
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 04/11] ASoC: topology: ABI - Add flags and private data to PCM
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (2 preceding siblings ...)
2016-11-02 17:03 ` [PATCH v7 03/11] ASoC: topology: Support topology file of ABI v4 mengdong.lin
@ 2016-11-02 17:03 ` mengdong.lin
2016-11-03 16:55 ` Applied "ASoC: topology: ABI - Add flags and private data to PCM" to the asoc tree Mark Brown
2016-11-02 17:03 ` [PATCH v7 05/11] ASoC: topology: ABI - Update physical DAI link configuration for version 5 mengdong.lin
` (6 subsequent siblings)
10 siblings, 1 reply; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:03 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
This is the remaining update to PCM ABI object of version 5.
The flags will be applied to FE (Front End) links and can also be used
by physical links. The private data is reserved for future extension, so
offset update will add the private data size.
Now user space is using ABI v4, and the previous patch "ASoC: topology:
make PCM backward compatible from ABI v4" can assure the backward
compatibility.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 69cae71..aeb4082 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -146,6 +146,11 @@
#define SND_SOC_DAI_FORMAT_MSB SND_SOC_DAI_FORMAT_LEFT_J
#define SND_SOC_DAI_FORMAT_LSB SND_SOC_DAI_FORMAT_RIGHT_J
+/* DAI link flags */
+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
+
/*
* Block Header.
* This header precedes all object and object arrays below.
@@ -456,6 +461,9 @@ struct snd_soc_tplg_pcm {
struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
__le32 num_streams; /* number of streams */
struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
+ __le32 flag_mask; /* bitmask of flags to configure */
+ __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
+ struct snd_soc_tplg_private priv;
} __attribute__((packed));
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 2f9b64e..8baa176 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1676,6 +1676,24 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
return snd_soc_register_dai(tplg->comp, dai_drv);
}
+static void set_link_flags(struct snd_soc_dai_link *link,
+ unsigned int flag_mask, unsigned int flags)
+{
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES)
+ link->symmetric_rates =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES ? 1 : 0;
+
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS)
+ link->symmetric_channels =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS ?
+ 1 : 0;
+
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS)
+ link->symmetric_samplebits =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS ?
+ 1 : 0;
+}
+
/* create the FE DAI link */
static int soc_tplg_link_create(struct soc_tplg *tplg,
struct snd_soc_tplg_pcm *pcm)
@@ -1703,6 +1721,8 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
link->dynamic = 1;
link->dpcm_playback = pcm->playback;
link->dpcm_capture = pcm->capture;
+ if (pcm->flag_mask)
+ set_link_flags(link, pcm->flag_mask, pcm->flags);
/* pass control to component driver for optional further init */
ret = soc_tplg_dai_link_load(tplg, link);
@@ -1848,10 +1868,14 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
/* create the FE DAIs and DAI links */
soc_tplg_pcm_create(tplg, _pcm);
+
+ /* offset by version-specific struct size and
+ * real priv data size
+ */
+ tplg->pos += pcm->size + _pcm->priv.size;
+
if (!abi_match)
kfree(_pcm); /* free the duplicated one */
-
- tplg->pos += pcm->size; /* offset by version-specific size */
}
dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 05/11] ASoC: topology: ABI - Update physical DAI link configuration for version 5
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (3 preceding siblings ...)
2016-11-02 17:03 ` [PATCH v7 04/11] ASoC: topology: ABI - Add flags and private data to PCM mengdong.lin
@ 2016-11-02 17:03 ` mengdong.lin
2016-11-02 17:04 ` [PATCH v7 06/11] ASoC: Define API to find a dai link mengdong.lin
` (5 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:03 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
The following fields are added to physical link configuration struct
(snd_soc_tplg_link_config) in ABI v5:
- name and stream name
Topology will use them to find an existing physical link and configure
it.
- HW configurations
Define the types and ABI struct for runtime supported hardware configs
of physical DAI links, e.g. audio hardware formats. The default HW
config ID will help topology to find the DAI format to set on init.
Topology provides this as a fallback if such HW settings are not
available in ACPI or device tree, to avoid hard code in drivers. It's
only for config items that can be programmed by SW or FW, not for
physical things like link connections or GPIO used for HP etc.
- flags and private data
The flags will be used to configure an existing physical DAI link.
The private data is reserved for future extension.
NOTE: Current kernel has no support for physical links. A later patch
will add support for configuring physical links and make the support
backward compatible for ABI v4.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index aeb4082..ed28ebc 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -39,6 +39,11 @@
*/
#define SND_SOC_TPLG_STREAM_CONFIG_MAX 8
+/*
+ * Maximum number of physical link's hardware configs
+ */
+#define SND_SOC_TPLG_HW_CONFIG_MAX 8
+
/* individual kcontrol info types - can be mixed with other types */
#define SND_SOC_TPLG_CTL_VOLSW 1
#define SND_SOC_TPLG_CTL_VOLSW_SX 2
@@ -294,6 +299,35 @@ struct snd_soc_tplg_stream {
__le32 channels; /* channels */
} __attribute__((packed));
+
+/*
+ * Describes a physical link's runtime supported hardware config,
+ * i.e. hardware audio formats.
+ */
+struct snd_soc_tplg_hw_config {
+ __le32 size; /* in bytes of this structure */
+ __le32 id; /* unique ID - - used to match */
+ __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
+ __u8 clock_gated; /* 1 if clock can be gated to save power */
+ __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
+ __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
+ __u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
+ __u8 fsync_master; /* 1 for master of FSYNC, 0 for slave */
+ __u8 mclk_direction; /* 0 for input, 1 for output */
+ __le16 reserved; /* for 32bit alignment */
+ __le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */
+ __le32 bclk_rate; /* BCLK freqency in Hz */
+ __le32 fsync_rate; /* frame clock in Hz */
+ __le32 tdm_slots; /* number of TDM slots in use */
+ __le32 tdm_slot_width; /* width in bits for each slot */
+ __le32 tx_slots; /* bit mask for active Tx slots */
+ __le32 rx_slots; /* bit mask for active Rx slots */
+ __le32 tx_channels; /* number of Tx channels */
+ __le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
+ __le32 rx_channels; /* number of Rx channels */
+ __le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
+} __attribute__((packed));
+
/*
* Manifest. List totals for each payload type. Not used in parsing, but will
* be passed to the component driver before any other objects in order for any
@@ -468,9 +502,9 @@ struct snd_soc_tplg_pcm {
/*
- * Describes the BE or CC link runtime supported configs or params
+ * Describes the physical link runtime supported configs or params
*
- * File block representation for BE/CC link config :-
+ * File block representation for physical link config :-
* +-----------------------------------+-----+
* | struct snd_soc_tplg_hdr | 1 |
* +-----------------------------------+-----+
@@ -480,8 +514,16 @@ struct snd_soc_tplg_pcm {
struct snd_soc_tplg_link_config {
__le32 size; /* in bytes of this structure */
__le32 id; /* unique ID - used to match */
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
+ char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
__le32 num_streams; /* number of streams */
+ struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
+ __le32 num_hw_configs; /* number of hw configs */
+ __le32 default_hw_config_id; /* default hw config ID for init */
+ __le32 flag_mask; /* bitmask of flags to configure */
+ __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
+ struct snd_soc_tplg_private priv;
} __attribute__((packed));
/*
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 06/11] ASoC: Define API to find a dai link
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (4 preceding siblings ...)
2016-11-02 17:03 ` [PATCH v7 05/11] ASoC: topology: ABI - Update physical DAI link configuration for version 5 mengdong.lin
@ 2016-11-02 17:04 ` mengdong.lin
2016-11-02 17:04 ` [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links mengdong.lin
` (4 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:04 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Define the API to find an existing DAI link of the soc card by matching
the ID, name and stream name.
Some cards may use unique ID for each DAI link, so matching ID is enough,
and name or stream name are not necessary. But user need to specify name
or stream name as well if not sure whether link ID is unique since most
cards use 0 as the default link ID.
Topology can use this API to find an existing BE link and configure it.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/include/sound/soc.h b/include/sound/soc.h
index 4f1c784..c3a38ee 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -1671,6 +1671,9 @@ int snd_soc_add_dai_link(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_link);
void snd_soc_remove_dai_link(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_link);
+struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
+ int id, const char *name,
+ const char *stream_name);
int snd_soc_register_dai(struct snd_soc_component *component,
struct snd_soc_dai_driver *dai_drv);
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index c0bbcd9..a7a1ca4 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -972,6 +972,48 @@ struct snd_soc_dai *snd_soc_find_dai(
}
EXPORT_SYMBOL_GPL(snd_soc_find_dai);
+
+/**
+ * snd_soc_find_dai_link - Find a DAI link
+ *
+ * @card: soc card
+ * @id: DAI link ID to match
+ * @name: DAI link name to match, optional
+ * @stream name: DAI link stream name to match, optional
+ *
+ * This function will search all existing DAI links of the soc card to
+ * find the link of the same ID. Since DAI links may not have their
+ * unique ID, so name and stream name should also match if being
+ * specified.
+ *
+ * Return: pointer of DAI link, or NULL if not found.
+ */
+struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
+ int id, const char *name,
+ const char *stream_name)
+{
+ struct snd_soc_dai_link *link, *_link;
+
+ lockdep_assert_held(&client_mutex);
+
+ list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
+ if (link->id != id)
+ continue;
+
+ if (name && (!link->name || strcmp(name, link->name)))
+ continue;
+
+ if (stream_name && (!link->stream_name
+ || strcmp(stream_name, link->stream_name)))
+ continue;
+
+ return link;
+ }
+
+ return NULL;
+}
+EXPORT_SYMBOL_GPL(snd_soc_find_dai_link);
+
static bool soc_is_dai_link_bound(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_link)
{
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (5 preceding siblings ...)
2016-11-02 17:04 ` [PATCH v7 06/11] ASoC: Define API to find a dai link mengdong.lin
@ 2016-11-02 17:04 ` mengdong.lin
2016-11-04 17:22 ` Mark Brown
2016-11-02 17:04 ` [PATCH v7 08/11] ASoC: topology: Rename the function to create a FE link mengdong.lin
` (3 subsequent siblings)
10 siblings, 1 reply; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:04 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Topology will find an existing physical link (including BE link for
DPCM) by checking its ID, name and stream name, and configure its physical
audio format and flags.
This support is backward compatible for old ABI v4.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 8baa176..b15a204 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -49,9 +49,10 @@
#define SOC_TPLG_PASS_GRAPH 5
#define SOC_TPLG_PASS_PINS 6
#define SOC_TPLG_PASS_BE_DAI 7
+#define SOC_TPLG_PASS_LINK 8
#define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST
-#define SOC_TPLG_PASS_END SOC_TPLG_PASS_BE_DAI
+#define SOC_TPLG_PASS_END SOC_TPLG_PASS_LINK
/*
* Old version of ABI structs, supported for backward compatibility.
@@ -101,6 +102,14 @@ struct snd_soc_tplg_pcm_v4 {
struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
} __packed;
+/* Physical link config v4 */
+struct snd_soc_tplg_link_config_v4 {
+ __le32 size; /* in bytes of this structure */
+ __le32 id; /* unique ID - used to match */
+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+ __le32 num_streams; /* number of streams */
+} __packed;
+
/* topology context */
struct soc_tplg {
const struct firmware *fw;
@@ -1868,7 +1877,6 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
/* create the FE DAIs and DAI links */
soc_tplg_pcm_create(tplg, _pcm);
-
/* offset by version-specific struct size and
* real priv data size
*/
@@ -1883,6 +1891,196 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
return 0;
}
+/**
+ * set_link_hw_format - Set the HW audio format of the physical DAI link.
+ * @tplg: topology context
+ * @cfg: physical link configs.
+ *
+ * Topology context contains a list of supported HW formats (configs) and
+ * a default format ID for the physical link. This function will use this
+ * default ID to choose the HW format to set the link's DAI format for init.
+ */
+static void set_link_hw_format(struct snd_soc_dai_link *link,
+ struct snd_soc_tplg_link_config *cfg)
+{
+ struct snd_soc_tplg_hw_config *hw_config;
+ unsigned char bclk_master, fsync_master;
+ unsigned char invert_bclk, invert_fsync;
+ int i;
+
+ for (i = 0; i < cfg->num_hw_configs; i++) {
+ hw_config = &cfg->hw_config[i];
+ if (hw_config->id != cfg->default_hw_config_id)
+ continue;
+
+ link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
+
+ /* clock signal polarity */
+ invert_bclk = hw_config->invert_bclk;
+ invert_fsync = hw_config->invert_fsync;
+ if (!invert_bclk && !invert_fsync)
+ link->dai_fmt |= SND_SOC_DAIFMT_NB_NF;
+ else if (!invert_bclk && invert_fsync)
+ link->dai_fmt |= SND_SOC_DAIFMT_NB_IF;
+ else if (invert_bclk && !invert_fsync)
+ link->dai_fmt |= SND_SOC_DAIFMT_IB_NF;
+ else
+ link->dai_fmt |= SND_SOC_DAIFMT_IB_IF;
+
+ /* clock masters */
+ bclk_master = hw_config->bclk_master;
+ fsync_master = hw_config->fsync_master;
+ if (!bclk_master && !fsync_master)
+ link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
+ else if (bclk_master && !fsync_master)
+ link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
+ else if (!bclk_master && fsync_master)
+ link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFS;
+ else
+ link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
+ }
+}
+
+/**
+ * link_new_ver - Create a new physical link config from the old
+ * version of source.
+ * @toplogy: topology context
+ * @src: old version of phyical link config as a source
+ * @link: latest version of physical link config created from the source
+ *
+ * Support from vesion 4. User need free the returned link config manually.
+ */
+static int link_new_ver(struct soc_tplg *tplg,
+ struct snd_soc_tplg_link_config *src,
+ struct snd_soc_tplg_link_config **link)
+{
+ struct snd_soc_tplg_link_config *dest;
+ struct snd_soc_tplg_link_config_v4 *src_v4;
+ int i;
+
+ *link = NULL;
+
+ if (src->size != sizeof(struct snd_soc_tplg_link_config_v4)) {
+ dev_err(tplg->dev, "ASoC: invalid physical link config size\n");
+ return -EINVAL;
+ }
+
+ dev_warn(tplg->dev, "ASoC: old version of physical link config\n");
+
+ src_v4 = (struct snd_soc_tplg_link_config_v4 *)src;
+ dest = kzalloc(sizeof(*dest), GFP_KERNEL);
+ if (!dest)
+ return -ENOMEM;
+
+ dest->size = sizeof(*dest);
+ dest->id = src_v4->id;
+ dest->num_streams = src_v4->num_streams;
+ for (i = 0; i < dest->num_streams; i++)
+ memcpy(&dest->stream[i], &src_v4->stream[i],
+ sizeof(struct snd_soc_tplg_stream));
+
+ *link = dest;
+ return 0;
+}
+
+/* Find and configure an existing physical DAI link */
+static int soc_tplg_link_config(struct soc_tplg *tplg,
+ struct snd_soc_tplg_link_config *cfg)
+{
+ struct snd_soc_dai_link *link;
+ const char *name, *stream_name;
+ int ret;
+
+ name = strlen(cfg->name) ? cfg->name : NULL;
+ stream_name = strlen(cfg->stream_name) ? cfg->stream_name : NULL;
+
+ link = snd_soc_find_dai_link(tplg->comp->card, cfg->id,
+ name, stream_name);
+ if (!link) {
+ dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n",
+ name, cfg->id);
+ return -EINVAL;
+ }
+
+ /* hw format */
+ if (cfg->num_hw_configs)
+ set_link_hw_format(link, cfg);
+
+ /* flags */
+ if (cfg->flag_mask)
+ set_link_flags(link, cfg->flag_mask, cfg->flags);
+
+ /* pass control to component driver for optional further init */
+ ret = soc_tplg_dai_link_load(tplg, link);
+ if (ret < 0) {
+ dev_err(tplg->dev, "ASoC: physical link loading failed\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+
+/* Load physical link config elements from the topology context */
+static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
+ struct snd_soc_tplg_hdr *hdr)
+{
+ struct snd_soc_tplg_link_config *link, *_link;
+ int count = hdr->count;
+ int i, ret;
+ bool abi_match;
+
+ if (tplg->pass != SOC_TPLG_PASS_LINK) {
+ tplg->pos += hdr->size + hdr->payload_size;
+ return 0;
+ };
+
+ /* check the element size and count */
+ link = (struct snd_soc_tplg_link_config *)tplg->pos;
+ if (link->size > sizeof(struct snd_soc_tplg_link_config)
+ || link->size < sizeof(struct snd_soc_tplg_link_config_v4)) {
+ dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n",
+ link->size);
+ return -EINVAL;
+ }
+
+ if (soc_tplg_check_elem_count(tplg,
+ link->size, count,
+ hdr->payload_size, "physical link config")) {
+ dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n",
+ count);
+ return -EINVAL;
+ }
+
+ /* config physical DAI links */
+ for (i = 0; i < count; i++) {
+ link = (struct snd_soc_tplg_link_config *)tplg->pos;
+ if (link->size == sizeof(*link)) {
+ abi_match = true;
+ _link = link;
+ } else {
+ abi_match = false;
+ ret = link_new_ver(tplg, link, &_link);
+ if (ret < 0)
+ return ret;
+ }
+
+ ret = soc_tplg_link_config(tplg, _link);
+ if (ret < 0)
+ return ret;
+
+ /* offset by version-specific struct size and
+ * real priv data size
+ */
+ tplg->pos += link->size + _link->priv.size;
+
+ if (!abi_match)
+ kfree(_link); /* free the duplicated one */
+ }
+
+ return 0;
+}
+
/* *
* soc_tplg_be_dai_config - Find and configure an existing BE DAI.
* @tplg: topology context
@@ -2132,6 +2330,10 @@ static int soc_tplg_load_header(struct soc_tplg *tplg,
return soc_tplg_pcm_elems_load(tplg, hdr);
case SND_SOC_TPLG_TYPE_BE_DAI:
return soc_tplg_be_dai_elems_load(tplg, hdr);
+ case SND_SOC_TPLG_TYPE_DAI_LINK:
+ case SND_SOC_TPLG_TYPE_BACKEND_LINK:
+ /* physical link configurations */
+ return soc_tplg_link_elems_load(tplg, hdr);
case SND_SOC_TPLG_TYPE_MANIFEST:
return soc_tplg_manifest_load(tplg, hdr);
default:
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 08/11] ASoC: topology: Rename the function to create a FE link
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (6 preceding siblings ...)
2016-11-02 17:04 ` [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links mengdong.lin
@ 2016-11-02 17:04 ` mengdong.lin
2016-11-02 17:05 ` [PATCH v7 09/11] ASoC: topology: ABI - Rename struct and type for physical DAIs mengdong.lin
` (2 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:04 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Just code refactoring. The function soc_tplg_link_create() will
create a front end link, not a physical link. So rename it to
soc_tplg_fe_link_create().
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index b15a204..eea28ad 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1704,7 +1704,7 @@ static void set_link_flags(struct snd_soc_dai_link *link,
}
/* create the FE DAI link */
-static int soc_tplg_link_create(struct soc_tplg *tplg,
+static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
struct snd_soc_tplg_pcm *pcm)
{
struct snd_soc_dai_link *link;
@@ -1760,7 +1760,7 @@ static int soc_tplg_pcm_create(struct soc_tplg *tplg,
if (ret < 0)
return ret;
- return soc_tplg_link_create(tplg, pcm);
+ return soc_tplg_fe_link_create(tplg, pcm);
}
/* copy stream caps from the old version 4 of source */
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 09/11] ASoC: topology: ABI - Rename struct and type for physical DAIs
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (7 preceding siblings ...)
2016-11-02 17:04 ` [PATCH v7 08/11] ASoC: topology: Rename the function to create a FE link mengdong.lin
@ 2016-11-02 17:05 ` mengdong.lin
2016-11-02 17:05 ` [PATCH v7 10/11] ASoC: topology: Rename functions & variables " mengdong.lin
2016-11-02 17:05 ` [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links mengdong.lin
10 siblings, 0 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:05 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Rename the ABI struct and type because they are for configuring physical
DAIs, not only backend DAIs since users may not need DPCM:
- Rename struct snd_soc_tplg_be_dai to snd_soc_tplg_dai.
- Rename type SND_SOC_TPLG_TYPE_BE_DAI to SND_SOC_TPLG_TYPE_DAI.
This code refactoring is backward compatible because:
- Both layout of the struct and type value has no change. Kernel can
find the same type value and map to same data layout.
- This struct is not in ABI v4 at all. Now the user space uses ABI v4.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index ed28ebc..3c3fcc8 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -111,8 +111,8 @@
#define SND_SOC_TPLG_TYPE_CODEC_LINK 9
#define SND_SOC_TPLG_TYPE_BACKEND_LINK 10
#define SND_SOC_TPLG_TYPE_PDATA 11
-#define SND_SOC_TPLG_TYPE_BE_DAI 12
-#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_BE_DAI
+#define SND_SOC_TPLG_TYPE_DAI 12
+#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_DAI
/* vendor block IDs - please add new vendor types to end */
#define SND_SOC_TPLG_TYPE_VENDOR_FW 1000
@@ -131,7 +131,7 @@
#define SND_SOC_TPLG_TUPLE_TYPE_WORD 4
#define SND_SOC_TPLG_TUPLE_TYPE_SHORT 5
-/* BE DAI flags */
+/* DAI flags */
#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES (1 << 0)
#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
@@ -527,16 +527,17 @@ struct snd_soc_tplg_link_config {
} __attribute__((packed));
/*
- * Describes SW/FW specific features of BE DAI.
+ * Describes SW/FW specific features of physical DAI.
+ * It can be used to configure backend DAIs for DPCM.
*
- * File block representation for BE DAI :-
+ * File block representation for physical DAI :-
* +-----------------------------------+-----+
* | struct snd_soc_tplg_hdr | 1 |
* +-----------------------------------+-----+
- * | struct snd_soc_tplg_be_dai | N |
+ * | struct snd_soc_tplg_dai | N |
* +-----------------------------------+-----+
*/
-struct snd_soc_tplg_be_dai {
+struct snd_soc_tplg_dai {
__le32 size; /* in bytes of this structure */
char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
__le32 dai_id; /* unique ID - used to match */
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index eea28ad..a839dc8 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2090,7 +2090,7 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
* platform driver should specify the BE DAI name and ID for matching.
*/
static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
- struct snd_soc_tplg_be_dai *be)
+ struct snd_soc_tplg_dai *be)
{
struct snd_soc_dai_link_component dai_component = {0};
struct snd_soc_dai *dai;
@@ -2145,7 +2145,7 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
static int soc_tplg_be_dai_elems_load(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr)
{
- struct snd_soc_tplg_be_dai *be;
+ struct snd_soc_tplg_dai *be;
int count = hdr->count;
int i;
@@ -2154,7 +2154,7 @@ static int soc_tplg_be_dai_elems_load(struct soc_tplg *tplg,
/* config the existing BE DAIs */
for (i = 0; i < count; i++) {
- be = (struct snd_soc_tplg_be_dai *)tplg->pos;
+ be = (struct snd_soc_tplg_dai *)tplg->pos;
if (be->size != sizeof(*be)) {
dev_err(tplg->dev, "ASoC: invalid BE DAI size\n");
return -EINVAL;
@@ -2328,7 +2328,7 @@ static int soc_tplg_load_header(struct soc_tplg *tplg,
return soc_tplg_dapm_widget_elems_load(tplg, hdr);
case SND_SOC_TPLG_TYPE_PCM:
return soc_tplg_pcm_elems_load(tplg, hdr);
- case SND_SOC_TPLG_TYPE_BE_DAI:
+ case SND_SOC_TPLG_TYPE_DAI:
return soc_tplg_be_dai_elems_load(tplg, hdr);
case SND_SOC_TPLG_TYPE_DAI_LINK:
case SND_SOC_TPLG_TYPE_BACKEND_LINK:
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 10/11] ASoC: topology: Rename functions & variables for physical DAIs
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (8 preceding siblings ...)
2016-11-02 17:05 ` [PATCH v7 09/11] ASoC: topology: ABI - Rename struct and type for physical DAIs mengdong.lin
@ 2016-11-02 17:05 ` mengdong.lin
2016-11-02 17:05 ` [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links mengdong.lin
10 siblings, 0 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:05 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Code refactoring. These functions and variables are for configuring
physical DAIs, not only backend DAIs since users may not need DPCM.
So remove 'be' from the function names, and rename variables 'be'
to 'd' or 'dai'.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index a839dc8..f44f12e 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2081,16 +2081,16 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
return 0;
}
-/* *
- * soc_tplg_be_dai_config - Find and configure an existing BE DAI.
+/**
+ * soc_tplg_dai_config - Find and configure an existing physical DAI.
* @tplg: topology context
- * @be: topology BE DAI configs.
+ * @d: physical DAI configs.
*
- * The BE dai should already be registered by the platform driver. The
- * platform driver should specify the BE DAI name and ID for matching.
+ * The physical dai should already be registered by the platform driver.
+ * The platform driver should specify the DAI name and ID for matching.
*/
-static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
- struct snd_soc_tplg_dai *be)
+static int soc_tplg_dai_config(struct soc_tplg *tplg,
+ struct snd_soc_tplg_dai *d)
{
struct snd_soc_dai_link_component dai_component = {0};
struct snd_soc_dai *dai;
@@ -2099,17 +2099,17 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
struct snd_soc_tplg_stream_caps *caps;
int ret;
- dai_component.dai_name = be->dai_name;
+ dai_component.dai_name = d->dai_name;
dai = snd_soc_find_dai(&dai_component);
if (!dai) {
- dev_err(tplg->dev, "ASoC: BE DAI %s not registered\n",
- be->dai_name);
+ dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n",
+ d->dai_name);
return -EINVAL;
}
- if (be->dai_id != dai->id) {
- dev_err(tplg->dev, "ASoC: BE DAI %s id mismatch\n",
- be->dai_name);
+ if (d->dai_id != dai->id) {
+ dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n",
+ d->dai_name);
return -EINVAL;
}
@@ -2117,20 +2117,20 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
if (!dai_drv)
return -EINVAL;
- if (be->playback) {
+ if (d->playback) {
stream = &dai_drv->playback;
- caps = &be->caps[SND_SOC_TPLG_STREAM_PLAYBACK];
+ caps = &d->caps[SND_SOC_TPLG_STREAM_PLAYBACK];
set_stream_info(stream, caps);
}
- if (be->capture) {
+ if (d->capture) {
stream = &dai_drv->capture;
- caps = &be->caps[SND_SOC_TPLG_STREAM_CAPTURE];
+ caps = &d->caps[SND_SOC_TPLG_STREAM_CAPTURE];
set_stream_info(stream, caps);
}
- if (be->flag_mask)
- set_dai_flags(dai_drv, be->flag_mask, be->flags);
+ if (d->flag_mask)
+ set_dai_flags(dai_drv, d->flag_mask, d->flags);
/* pass control to component driver for optional further init */
ret = soc_tplg_dai_load(tplg, dai_drv);
@@ -2142,10 +2142,11 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
return 0;
}
-static int soc_tplg_be_dai_elems_load(struct soc_tplg *tplg,
- struct snd_soc_tplg_hdr *hdr)
+/* load physical DAI elements */
+static int soc_tplg_dai_elems_load(struct soc_tplg *tplg,
+ struct snd_soc_tplg_hdr *hdr)
{
- struct snd_soc_tplg_dai *be;
+ struct snd_soc_tplg_dai *dai;
int count = hdr->count;
int i;
@@ -2154,14 +2155,14 @@ static int soc_tplg_be_dai_elems_load(struct soc_tplg *tplg,
/* config the existing BE DAIs */
for (i = 0; i < count; i++) {
- be = (struct snd_soc_tplg_dai *)tplg->pos;
- if (be->size != sizeof(*be)) {
- dev_err(tplg->dev, "ASoC: invalid BE DAI size\n");
+ dai = (struct snd_soc_tplg_dai *)tplg->pos;
+ if (dai->size != sizeof(*dai)) {
+ dev_err(tplg->dev, "ASoC: invalid physical DAI size\n");
return -EINVAL;
}
- soc_tplg_be_dai_config(tplg, be);
- tplg->pos += (sizeof(*be) + be->priv.size);
+ soc_tplg_dai_config(tplg, dai);
+ tplg->pos += (sizeof(*dai) + dai->priv.size);
}
dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count);
@@ -2329,7 +2330,7 @@ static int soc_tplg_load_header(struct soc_tplg *tplg,
case SND_SOC_TPLG_TYPE_PCM:
return soc_tplg_pcm_elems_load(tplg, hdr);
case SND_SOC_TPLG_TYPE_DAI:
- return soc_tplg_be_dai_elems_load(tplg, hdr);
+ return soc_tplg_dai_elems_load(tplg, hdr);
case SND_SOC_TPLG_TYPE_DAI_LINK:
case SND_SOC_TPLG_TYPE_BACKEND_LINK:
/* physical link configurations */
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
` (9 preceding siblings ...)
2016-11-02 17:05 ` [PATCH v7 10/11] ASoC: topology: Rename functions & variables " mengdong.lin
@ 2016-11-02 17:05 ` mengdong.lin
2016-11-04 17:36 ` Mark Brown
2016-11-04 17:38 ` Applied "ASoC: topology: ABI - Add voice wake up flag for DAI links" to the asoc tree Mark Brown
10 siblings, 2 replies; 21+ messages in thread
From: mengdong.lin @ 2016-11-02 17:05 UTC (permalink / raw)
To: alsa-devel, broonie
Cc: Mengdong Lin, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Add a new flag bit SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP to link flags.
If a link is used for voice wake up, users can set this flag bit and
topology will set the link's 'ignore_suspend' to true.
This ABI update is backward compatible.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 3c3fcc8..6a4280c 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -155,6 +155,7 @@
#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
+#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3)
/*
* Block Header.
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index f44f12e..8772fd9 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1701,6 +1701,11 @@ static void set_link_flags(struct snd_soc_dai_link *link,
link->symmetric_samplebits =
flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS ?
1 : 0;
+
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP)
+ link->ignore_suspend =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP ?
+ 1 : 0;
}
/* create the FE DAI link */
--
2.7.4
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4
2016-11-02 17:00 ` [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4 mengdong.lin
@ 2016-11-03 16:12 ` Mark Brown
2016-11-03 16:23 ` Applied "ASoC: topology: Make PCM backward compatible from ABI v4" to the asoc tree Mark Brown
1 sibling, 0 replies; 21+ messages in thread
From: Mark Brown @ 2016-11-03 16:12 UTC (permalink / raw)
To: mengdong.lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
[-- Attachment #1.1: Type: text/plain, Size: 544 bytes --]
On Thu, Nov 03, 2016 at 01:00:16AM +0800, mengdong.lin@linux.intel.com wrote:
> From: Mengdong Lin <mengdong.lin@linux.intel.com>
>
> This patch adds support for old version 4 of PCMs (FE DAI & DAI links).
>
> Topology ABI v5 added new fields to stream caps and thus changed PCMs.
> Since user space may still uses v4, kernel will check the ABI version by
> comparing the object size. If user space uses v4 of PCMs, kernel will
This only applies on -next, not on v4.9 but this is a bug fix which we
should really get into v4.9.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Applied "ASoC: topology: Make PCM backward compatible from ABI v4" to the asoc tree
2016-11-02 17:00 ` [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4 mengdong.lin
2016-11-03 16:12 ` Mark Brown
@ 2016-11-03 16:23 ` Mark Brown
1 sibling, 0 replies; 21+ messages in thread
From: Mark Brown @ 2016-11-03 16:23 UTC (permalink / raw)
To: Mengdong Lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, broonie, rakesh.a.ughreja,
mengdong.lin
The patch
ASoC: topology: Make PCM backward compatible from ABI v4
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 55726dc95b78da32454878ac2b8a76daa53db396 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Date: Thu, 3 Nov 2016 01:00:16 +0800
Subject: [PATCH] ASoC: topology: Make PCM backward compatible from ABI v4
This patch adds support for old version 4 of PCMs (FE DAI & DAI links).
Topology ABI v5 added new fields to stream caps and thus changed PCMs.
Since user space may still uses v4, kernel will check the ABI version by
comparing the object size. If user space uses v4 of PCMs, kernel will
create the latest version of PCMs from the old version, and use the new
version internally to create FE DAI & DAI links. Because these new created
PCM elements will be freed later, kernel need duplicate the name strings
of DAI driver and DAI links when creating them.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/soc-topology.c | 145 +++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 133 insertions(+), 12 deletions(-)
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index c832b24b0cde..03edde57bfea 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -53,7 +53,6 @@
#define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST
#define SOC_TPLG_PASS_END SOC_TPLG_PASS_BE_DAI
-
/*
* Old version of ABI structs, supported for backward compatibility.
*/
@@ -69,6 +68,39 @@ struct snd_soc_tplg_manifest_v4 {
struct snd_soc_tplg_private priv;
} __packed;
+/* Stream Capabilities v4 */
+struct snd_soc_tplg_stream_caps_v4 {
+ __le32 size; /* in bytes of this structure */
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
+ __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
+ __le32 rate_min; /* min rate */
+ __le32 rate_max; /* max rate */
+ __le32 channels_min; /* min channels */
+ __le32 channels_max; /* max channels */
+ __le32 periods_min; /* min number of periods */
+ __le32 periods_max; /* max number of periods */
+ __le32 period_size_min; /* min period size bytes */
+ __le32 period_size_max; /* max period size bytes */
+ __le32 buffer_size_min; /* min buffer size bytes */
+ __le32 buffer_size_max; /* max buffer size bytes */
+} __packed;
+
+/* PCM v4 */
+struct snd_soc_tplg_pcm_v4 {
+ __le32 size; /* in bytes of this structure */
+ char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le32 pcm_id; /* unique ID - used to match with DAI link */
+ __le32 dai_id; /* unique ID - used to match */
+ __le32 playback; /* supports playback mode */
+ __le32 capture; /* supports capture mode */
+ __le32 compress; /* 1 = compressed; 0 = PCM */
+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+ __le32 num_streams; /* number of streams */
+ struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+} __packed;
+
/* topology context */
struct soc_tplg {
const struct firmware *fw;
@@ -1692,38 +1724,127 @@ static int soc_tplg_pcm_create(struct soc_tplg *tplg,
return soc_tplg_link_create(tplg, pcm);
}
+/* copy stream caps from the old version 4 of source */
+static void stream_caps_new_ver(struct snd_soc_tplg_stream_caps *dest,
+ struct snd_soc_tplg_stream_caps_v4 *src)
+{
+ dest->size = sizeof(*dest);
+ memcpy(dest->name, src->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ dest->formats = src->formats;
+ dest->rates = src->rates;
+ dest->rate_min = src->rate_min;
+ dest->rate_max = src->rate_max;
+ dest->channels_min = src->channels_min;
+ dest->channels_max = src->channels_max;
+ dest->periods_min = src->periods_min;
+ dest->periods_max = src->periods_max;
+ dest->period_size_min = src->period_size_min;
+ dest->period_size_max = src->period_size_max;
+ dest->buffer_size_min = src->buffer_size_min;
+ dest->buffer_size_max = src->buffer_size_max;
+}
+
+/**
+ * pcm_new_ver - Create the new version of PCM from the old version.
+ * @tplg: topology context
+ * @src: older version of pcm as a source
+ * @pcm: latest version of pcm created from the source
+ *
+ * Support from vesion 4. User should free the returned pcm manually.
+ */
+static int pcm_new_ver(struct soc_tplg *tplg,
+ struct snd_soc_tplg_pcm *src,
+ struct snd_soc_tplg_pcm **pcm)
+{
+ struct snd_soc_tplg_pcm *dest;
+ struct snd_soc_tplg_pcm_v4 *src_v4;
+ int i;
+
+ *pcm = NULL;
+
+ if (src->size != sizeof(*src_v4)) {
+ dev_err(tplg->dev, "ASoC: invalid PCM size\n");
+ return -EINVAL;
+ }
+
+ dev_warn(tplg->dev, "ASoC: old version of PCM\n");
+ src_v4 = (struct snd_soc_tplg_pcm_v4 *)src;
+ dest = kzalloc(sizeof(*dest), GFP_KERNEL);
+ if (!dest)
+ return -ENOMEM;
+
+ dest->size = sizeof(*dest); /* size of latest abi version */
+ memcpy(dest->pcm_name, src_v4->pcm_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ memcpy(dest->dai_name, src_v4->dai_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+ dest->pcm_id = src_v4->pcm_id;
+ dest->dai_id = src_v4->dai_id;
+ dest->playback = src_v4->playback;
+ dest->capture = src_v4->capture;
+ dest->compress = src_v4->compress;
+ dest->num_streams = src_v4->num_streams;
+ for (i = 0; i < dest->num_streams; i++)
+ memcpy(&dest->stream[i], &src_v4->stream[i],
+ sizeof(struct snd_soc_tplg_stream));
+
+ for (i = 0; i < 2; i++)
+ stream_caps_new_ver(&dest->caps[i], &src_v4->caps[i]);
+
+ *pcm = dest;
+ return 0;
+}
+
static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr)
{
- struct snd_soc_tplg_pcm *pcm;
+ struct snd_soc_tplg_pcm *pcm, *_pcm;
int count = hdr->count;
- int i;
+ int i, err;
+ bool abi_match;
if (tplg->pass != SOC_TPLG_PASS_PCM_DAI)
return 0;
+ /* check the element size and count */
+ pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
+ if (pcm->size > sizeof(struct snd_soc_tplg_pcm)
+ || pcm->size < sizeof(struct snd_soc_tplg_pcm_v4)) {
+ dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n",
+ pcm->size);
+ return -EINVAL;
+ }
+
if (soc_tplg_check_elem_count(tplg,
- sizeof(struct snd_soc_tplg_pcm), count,
+ pcm->size, count,
hdr->payload_size, "PCM DAI")) {
dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n",
count);
return -EINVAL;
}
- /* create the FE DAIs and DAI links */
- pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
for (i = 0; i < count; i++) {
- if (pcm->size != sizeof(*pcm)) {
- dev_err(tplg->dev, "ASoC: invalid pcm size\n");
- return -EINVAL;
+ pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
+
+ /* check ABI version by size, create a new version of pcm
+ * if abi not match.
+ */
+ if (pcm->size == sizeof(*pcm)) {
+ abi_match = true;
+ _pcm = pcm;
+ } else {
+ abi_match = false;
+ err = pcm_new_ver(tplg, pcm, &_pcm);
}
- soc_tplg_pcm_create(tplg, pcm);
- pcm++;
+ /* create the FE DAIs and DAI links */
+ soc_tplg_pcm_create(tplg, _pcm);
+
+ if (!abi_match)
+ kfree(_pcm); /* free the duplicated one */
+
+ tplg->pos += pcm->size; /* offset by version-specific size */
}
dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
- tplg->pos += sizeof(struct snd_soc_tplg_pcm) * count;
return 0;
}
--
2.10.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Applied "ASoC: topology: ABI - Add flags and private data to PCM" to the asoc tree
2016-11-02 17:03 ` [PATCH v7 04/11] ASoC: topology: ABI - Add flags and private data to PCM mengdong.lin
@ 2016-11-03 16:55 ` Mark Brown
0 siblings, 0 replies; 21+ messages in thread
From: Mark Brown @ 2016-11-03 16:55 UTC (permalink / raw)
To: Mengdong Lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, broonie, rakesh.a.ughreja,
mengdong.lin
The patch
ASoC: topology: ABI - Add flags and private data to PCM
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 717a8e7235377fa50f074c407cc5d0486aa15aa2 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Date: Thu, 3 Nov 2016 01:03:34 +0800
Subject: [PATCH] ASoC: topology: ABI - Add flags and private data to PCM
This is the remaining update to PCM ABI object of version 5.
The flags will be applied to FE (Front End) links and can also be used
by physical links. The private data is reserved for future extension, so
offset update will add the private data size.
Now user space is using ABI v4, and the previous patch "ASoC: topology:
make PCM backward compatible from ABI v4" can assure the backward
compatibility.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
include/uapi/sound/asoc.h | 8 ++++++++
sound/soc/soc-topology.c | 28 ++++++++++++++++++++++++++--
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 69cae7198b18..aeb408241bc3 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -146,6 +146,11 @@
#define SND_SOC_DAI_FORMAT_MSB SND_SOC_DAI_FORMAT_LEFT_J
#define SND_SOC_DAI_FORMAT_LSB SND_SOC_DAI_FORMAT_RIGHT_J
+/* DAI link flags */
+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
+#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
+
/*
* Block Header.
* This header precedes all object and object arrays below.
@@ -456,6 +461,9 @@ struct snd_soc_tplg_pcm {
struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
__le32 num_streams; /* number of streams */
struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
+ __le32 flag_mask; /* bitmask of flags to configure */
+ __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
+ struct snd_soc_tplg_private priv;
} __attribute__((packed));
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 2f9b64ec5904..8baa1761b874 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1676,6 +1676,24 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
return snd_soc_register_dai(tplg->comp, dai_drv);
}
+static void set_link_flags(struct snd_soc_dai_link *link,
+ unsigned int flag_mask, unsigned int flags)
+{
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES)
+ link->symmetric_rates =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES ? 1 : 0;
+
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS)
+ link->symmetric_channels =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS ?
+ 1 : 0;
+
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS)
+ link->symmetric_samplebits =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS ?
+ 1 : 0;
+}
+
/* create the FE DAI link */
static int soc_tplg_link_create(struct soc_tplg *tplg,
struct snd_soc_tplg_pcm *pcm)
@@ -1703,6 +1721,8 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
link->dynamic = 1;
link->dpcm_playback = pcm->playback;
link->dpcm_capture = pcm->capture;
+ if (pcm->flag_mask)
+ set_link_flags(link, pcm->flag_mask, pcm->flags);
/* pass control to component driver for optional further init */
ret = soc_tplg_dai_link_load(tplg, link);
@@ -1848,10 +1868,14 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
/* create the FE DAIs and DAI links */
soc_tplg_pcm_create(tplg, _pcm);
+
+ /* offset by version-specific struct size and
+ * real priv data size
+ */
+ tplg->pos += pcm->size + _pcm->priv.size;
+
if (!abi_match)
kfree(_pcm); /* free the duplicated one */
-
- tplg->pos += pcm->size; /* offset by version-specific size */
}
dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
--
2.10.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Applied "ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link" to the asoc tree
2016-11-02 17:02 ` [PATCH v7 02/11] ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link mengdong.lin
@ 2016-11-03 16:55 ` Mark Brown
0 siblings, 0 replies; 21+ messages in thread
From: Mark Brown @ 2016-11-03 16:55 UTC (permalink / raw)
To: Mengdong Lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, broonie, rakesh.a.ughreja,
mengdong.lin
The patch
ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 8f27c4abc2cd7a31adb896a6b4861cdcb921d063 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Date: Thu, 3 Nov 2016 01:02:59 +0800
Subject: [PATCH] ASoC: topology: Only use valid names of PCM for the kernel
DAI & DAI link
User space may not always set a valid FE DAI driver's name, FE DAI link's
name, stream name or cpu DAI name. In such cases, there are all ZERO in
these name string buffers of a topology PCM object. This patch will only
duplicate valid name strings for kernel FE DAI driver and DAI link when
creating them from topology, and free the name strings when destroying
them.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
sound/soc/soc-topology.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 03edde57bfea..0f1c8ebf8cda 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -523,6 +523,7 @@ static void remove_dai(struct snd_soc_component *comp,
if (dobj->ops && dobj->ops->dai_unload)
dobj->ops->dai_unload(comp, dobj);
+ kfree(dai_drv->name);
list_del(&dobj->list);
kfree(dai_drv);
}
@@ -540,6 +541,10 @@ static void remove_link(struct snd_soc_component *comp,
if (dobj->ops && dobj->ops->link_unload)
dobj->ops->link_unload(comp, dobj);
+ kfree(link->name);
+ kfree(link->stream_name);
+ kfree(link->cpu_dai_name);
+
list_del(&dobj->list);
snd_soc_remove_dai_link(comp->card, link);
kfree(link);
@@ -1638,7 +1643,8 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
if (dai_drv == NULL)
return -ENOMEM;
- dai_drv->name = pcm->dai_name;
+ if (strlen(pcm->dai_name))
+ dai_drv->name = kstrdup(pcm->dai_name, GFP_KERNEL);
dai_drv->id = pcm->dai_id;
if (pcm->playback) {
@@ -1681,11 +1687,15 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
if (link == NULL)
return -ENOMEM;
- link->name = pcm->pcm_name;
- link->stream_name = pcm->pcm_name;
+ if (strlen(pcm->pcm_name)) {
+ link->name = kstrdup(pcm->pcm_name, GFP_KERNEL);
+ link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL);
+ }
link->id = pcm->pcm_id;
- link->cpu_dai_name = pcm->dai_name;
+ if (strlen(pcm->dai_name))
+ link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL);
+
link->codec_name = "snd-soc-dummy";
link->codec_dai_name = "snd-soc-dummy-dai";
--
2.10.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links
2016-11-02 17:04 ` [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links mengdong.lin
@ 2016-11-04 17:22 ` Mark Brown
2016-11-05 13:35 ` Lin, Mengdong
0 siblings, 1 reply; 21+ messages in thread
From: Mark Brown @ 2016-11-04 17:22 UTC (permalink / raw)
To: mengdong.lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
[-- Attachment #1.1: Type: text/plain, Size: 364 bytes --]
On Thu, Nov 03, 2016 at 01:04:27AM +0800, mengdong.lin@linux.intel.com wrote:
> + name = strlen(cfg->name) ? cfg->name : NULL;
> + stream_name = strlen(cfg->stream_name) ? cfg->stream_name : NULL;
Please replace these with normal if statements. Also, are we sure that
we've sufficiently audited the input paths to ensure that the strings
are always terminated?
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links
2016-11-02 17:05 ` [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links mengdong.lin
@ 2016-11-04 17:36 ` Mark Brown
2016-11-05 13:35 ` Lin, Mengdong
2016-11-04 17:38 ` Applied "ASoC: topology: ABI - Add voice wake up flag for DAI links" to the asoc tree Mark Brown
1 sibling, 1 reply; 21+ messages in thread
From: Mark Brown @ 2016-11-04 17:36 UTC (permalink / raw)
To: mengdong.lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, rakesh.a.ughreja, mengdong.lin
[-- Attachment #1.1: Type: text/plain, Size: 687 bytes --]
On Thu, Nov 03, 2016 at 01:05:32AM +0800, mengdong.lin@linux.intel.com wrote:
> From: Mengdong Lin <mengdong.lin@linux.intel.com>
>
> Add a new flag bit SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP to link flags.
> If a link is used for voice wake up, users can set this flag bit and
> topology will set the link's 'ignore_suspend' to true.
So, as we discussed in person yesterday I'm not 100% convinced about the
name here - there are other applications that might want to use this
facility like other triggers or some sort of passthrough monitoring.
I'm drawing a bit of blank on better names right now... I'm going to
apply this but we should continue to think about renaming.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Applied "ASoC: topology: ABI - Add voice wake up flag for DAI links" to the asoc tree
2016-11-02 17:05 ` [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links mengdong.lin
2016-11-04 17:36 ` Mark Brown
@ 2016-11-04 17:38 ` Mark Brown
1 sibling, 0 replies; 21+ messages in thread
From: Mark Brown @ 2016-11-04 17:38 UTC (permalink / raw)
To: Mengdong Lin
Cc: alsa-devel, tiwai, hardik.t.shah, guneshwor.o.singh,
liam.r.girdwood, vinod.koul, broonie, rakesh.a.ughreja,
mengdong.lin
The patch
ASoC: topology: ABI - Add voice wake up flag for DAI links
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 6ff67ccafdf4c782489de1ccc47e1ec8d8480b63 Mon Sep 17 00:00:00 2001
From: Mengdong Lin <mengdong.lin@linux.intel.com>
Date: Thu, 3 Nov 2016 01:05:32 +0800
Subject: [PATCH] ASoC: topology: ABI - Add voice wake up flag for DAI links
Add a new flag bit SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP to link flags.
If a link is used for voice wake up, users can set this flag bit and
topology will set the link's 'ignore_suspend' to true.
This ABI update is backward compatible.
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
include/uapi/sound/asoc.h | 1 +
sound/soc/soc-topology.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 3c3fcc86b9f4..6a4280c6e860 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -155,6 +155,7 @@
#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
+#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3)
/*
* Block Header.
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index f44f12eb1798..8772fd994e82 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1701,6 +1701,11 @@ static void set_link_flags(struct snd_soc_dai_link *link,
link->symmetric_samplebits =
flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS ?
1 : 0;
+
+ if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP)
+ link->ignore_suspend =
+ flags & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP ?
+ 1 : 0;
}
/* create the FE DAI link */
--
2.10.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links
2016-11-04 17:36 ` Mark Brown
@ 2016-11-05 13:35 ` Lin, Mengdong
0 siblings, 0 replies; 21+ messages in thread
From: Lin, Mengdong @ 2016-11-05 13:35 UTC (permalink / raw)
To: Mark Brown, mengdong.lin@linux.intel.com
Cc: alsa-devel@alsa-project.org, tiwai@suse.de, Shah, Hardik T,
Singh, Guneshwor O, liam.r.girdwood@linux.intel.com, Koul, Vinod,
Ughreja, Rakesh A
> -----Original Message-----
> From: Mark Brown [mailto:broonie@kernel.org]
> Sent: Saturday, November 5, 2016 1:36 AM
> To: mengdong.lin@linux.intel.com
> Cc: alsa-devel@alsa-project.org; tiwai@suse.de;
> liam.r.girdwood@linux.intel.com; Shah, Hardik T <hardik.t.shah@intel.com>;
> Singh, Guneshwor O <guneshwor.o.singh@intel.com>; Koul, Vinod
> <vinod.koul@intel.com>; Ughreja, Rakesh A <rakesh.a.ughreja@intel.com>;
> Lin, Mengdong <mengdong.lin@intel.com>
> Subject: Re: [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag
> for DAI links
>
> On Thu, Nov 03, 2016 at 01:05:32AM +0800, mengdong.lin@linux.intel.com
> wrote:
> > From: Mengdong Lin <mengdong.lin@linux.intel.com>
> >
> > Add a new flag bit SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP to link
> flags.
> > If a link is used for voice wake up, users can set this flag bit and
> > topology will set the link's 'ignore_suspend' to true.
>
> So, as we discussed in person yesterday I'm not 100% convinced about the
> name here - there are other applications that might want to use this facility
> like other triggers or some sort of passthrough monitoring.
> I'm drawing a bit of blank on better names right now... I'm going to apply
> this but we should continue to think about renaming.
Okay. We'll rename this once we find a better name.
Thanks
Mengdong
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links
2016-11-04 17:22 ` Mark Brown
@ 2016-11-05 13:35 ` Lin, Mengdong
0 siblings, 0 replies; 21+ messages in thread
From: Lin, Mengdong @ 2016-11-05 13:35 UTC (permalink / raw)
To: Mark Brown, mengdong.lin@linux.intel.com
Cc: alsa-devel@alsa-project.org, tiwai@suse.de, Shah, Hardik T,
Singh, Guneshwor O, liam.r.girdwood@linux.intel.com, Koul, Vinod,
Ughreja, Rakesh A
> -----Original Message-----
> From: Mark Brown [mailto:broonie@kernel.org]
> Sent: Saturday, November 5, 2016 1:22 AM
> To: mengdong.lin@linux.intel.com
> Cc: alsa-devel@alsa-project.org; tiwai@suse.de;
> liam.r.girdwood@linux.intel.com; Shah, Hardik T <hardik.t.shah@intel.com>;
> Singh, Guneshwor O <guneshwor.o.singh@intel.com>; Koul, Vinod
> <vinod.koul@intel.com>; Ughreja, Rakesh A <rakesh.a.ughreja@intel.com>;
> Lin, Mengdong <mengdong.lin@intel.com>
> Subject: Re: [PATCH v7 07/11] ASoC: topology: Add support to configure
> existing physical DAI links
>
> On Thu, Nov 03, 2016 at 01:04:27AM +0800, mengdong.lin@linux.intel.com
> wrote:
>
> > + name = strlen(cfg->name) ? cfg->name : NULL;
> > + stream_name = strlen(cfg->stream_name) ? cfg->stream_name : NULL;
>
> Please replace these with normal if statements. Also, are we sure that we've
> sufficiently audited the input paths to ensure that the strings are always
> terminated?
Okay. I submitted patch to fix this - ASoC: topology: Check name strings of physical DAI links.
This another minor ABI update, just a name change of a field and backward compatible.
Thanks again for your review!
Mengdong
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2016-11-05 13:35 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-02 16:59 [PATCH v7 00/11] ASoC: topology: Remaining kernel patches mengdong.lin
2016-11-02 17:00 ` [PATCH v7 01/11] ASoC: topology: Make PCM backward compatible from ABI v4 mengdong.lin
2016-11-03 16:12 ` Mark Brown
2016-11-03 16:23 ` Applied "ASoC: topology: Make PCM backward compatible from ABI v4" to the asoc tree Mark Brown
2016-11-02 17:02 ` [PATCH v7 02/11] ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link mengdong.lin
2016-11-03 16:55 ` Applied "ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link" to the asoc tree Mark Brown
2016-11-02 17:03 ` [PATCH v7 03/11] ASoC: topology: Support topology file of ABI v4 mengdong.lin
2016-11-02 17:03 ` [PATCH v7 04/11] ASoC: topology: ABI - Add flags and private data to PCM mengdong.lin
2016-11-03 16:55 ` Applied "ASoC: topology: ABI - Add flags and private data to PCM" to the asoc tree Mark Brown
2016-11-02 17:03 ` [PATCH v7 05/11] ASoC: topology: ABI - Update physical DAI link configuration for version 5 mengdong.lin
2016-11-02 17:04 ` [PATCH v7 06/11] ASoC: Define API to find a dai link mengdong.lin
2016-11-02 17:04 ` [PATCH v7 07/11] ASoC: topology: Add support to configure existing physical DAI links mengdong.lin
2016-11-04 17:22 ` Mark Brown
2016-11-05 13:35 ` Lin, Mengdong
2016-11-02 17:04 ` [PATCH v7 08/11] ASoC: topology: Rename the function to create a FE link mengdong.lin
2016-11-02 17:05 ` [PATCH v7 09/11] ASoC: topology: ABI - Rename struct and type for physical DAIs mengdong.lin
2016-11-02 17:05 ` [PATCH v7 10/11] ASoC: topology: Rename functions & variables " mengdong.lin
2016-11-02 17:05 ` [PATCH v7 11/11] ASoC: topology: ABI - Add voice wake up flag for DAI links mengdong.lin
2016-11-04 17:36 ` Mark Brown
2016-11-05 13:35 ` Lin, Mengdong
2016-11-04 17:38 ` Applied "ASoC: topology: ABI - Add voice wake up flag for DAI links" to the asoc tree Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).