|
@@ -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);
|