On Tue, Mar 06, 2018 at 04:30:28PM +0530, Shreyas NC wrote:
For usecases where a stream consists of multiple BE CPU DAIs, DAI Link should support the same.
This patch adds initial support for multiple CPU DAIs in ASoC for card instantiation, suspend and resume functions.
This support is added only for BE DAI Links. Support for FE and Codec-Codec Links is not added.
Signed-off-by: Shreyas NC shreyas.nc@intel.com
@@ -679,13 +687,17 @@ int snd_soc_suspend(struct device *dev) card->suspend_pre(card);
list_for_each_entry(rtd, &card->rtd_list, list) {
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
struct snd_soc_dai *cpu_dai;
if (rtd->dai_link->ignore_suspend) continue;
if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
cpu_dai->driver->suspend(cpu_dai);
for (i = 0; i < rtd->num_cpu_dai; i++) {
cpu_dai = rtd->cpu_dais[i];
if (cpu_dai->driver->suspend &&
!cpu_dai->driver->bus_control)
cpu_dai->driver->suspend(cpu_dai);
}
}
/* close any waiting streams */
@@ -793,13 +805,18 @@ static void soc_resume_deferred(struct work_struct *work)
Is there not another call to cpu_dai->driver->suspend at the bottom of snd_soc_suspend you need to handle?
@@ -1680,9 +1760,11 @@ static int soc_probe_link_dais(struct snd_soc_card *card, /* set default power off timeout */ rtd->pmdown_time = pmdown_time;
- ret = soc_probe_dai(cpu_dai, order);
- if (ret)
return ret;
for (i = 0; i < rtd->num_cpu_dai; i++) {
ret = soc_probe_dai(rtd->cpu_dais[i], order);
if (ret)
return ret;
}
/* probe the CODEC DAI */ for (i = 0; i < rtd->num_codecs; i++) {
@@ -1718,9 +1800,9 @@ static int soc_probe_link_dais(struct snd_soc_card *card, soc_dpcm_debugfs_add(rtd); #endif
- if (cpu_dai->driver->compress_new) {
- if (rtd->cpu_dais[0]->driver->compress_new) { /*create compress_device"*/
ret = cpu_dai->driver->compress_new(rtd, rtd->num);
if (ret < 0) { dev_err(card->dev, "ASoC: can't create compress %s\n", dai_link->stream_name);ret = rtd->cpu_dais[0]->driver->compress_new(rtd, rtd->num);
Is it worth throwing an error or printing a warning to say that we don't support multiple DAIs on the compressed framework? Not sure if here is were we should do that though.
@@ -1736,7 +1818,8 @@ static int soc_probe_link_dais(struct snd_soc_card *card, dai_link->stream_name, ret); return ret; }
ret = soc_link_dai_pcm_new(&cpu_dai, 1, rtd);
ret = soc_link_dai_pcm_new(rtd->cpu_dais,
rtd->num_cpu_dai, rtd); if (ret < 0) return ret; ret = soc_link_dai_pcm_new(rtd->codec_dais,
@@ -2361,10 +2444,11 @@ int snd_soc_poweroff(struct device *dev)
Do we need to update the handling in snd_soc_runtime_set_dai_fmt? Seems like we skipped over that.
Thanks, Charles