| From c957c67d54867d7268a9928e040dad613aa0cc16 Mon Sep 17 00:00:00 2001 |
| From: Bard Liao <yung-chuan.liao@linux.intel.com> |
| Date: Mon, 8 Jun 2020 14:44:13 -0500 |
| Subject: [PATCH] ASoC: core: only convert non DPCM link to DPCM link |
| |
| commit 607fa205a7e4dfad28b8a67ab1c985756ddbccb0 upstream. |
| |
| Additional checks for valid DAIs expose a corner case, where existing |
| BE dailinks get modified, e.g. HDMI links are tagged with |
| dpcm_capture=1 even if the DAIs are for playback. |
| |
| This patch makes those changes conditional and flags configuration |
| issues when a BE dailink is has no_pcm=0 but dpcm_playback or |
| dpcm_capture=1 (which makes no sense). |
| |
| As discussed on the alsa-devel mailing list, there are redundant flags |
| for dpcm_playback, dpcm_capture, playback_only, capture_only. This |
| will have to be cleaned-up in a future update. For now only correct |
| and flag problematic configurations. |
| |
| Fixes: 218fe9b7ec7f3 ("ASoC: soc-core: Set dpcm_playback / dpcm_capture") |
| Suggested-by: Daniel Baluta <daniel.baluta@nxp.com> |
| Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> |
| Reviewed-by: Daniel Baluta <daniel.baluta@gmail.com> |
| Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> |
| Link: https://lore.kernel.org/r/20200608194415.4663-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
| index 742c1e12d512..d0c2d78f3c19 100644 |
| --- a/sound/soc/soc-core.c |
| +++ b/sound/soc/soc-core.c |
| @@ -2008,9 +2008,25 @@ static void soc_check_tplg_fes(struct snd_soc_card *card) |
| dai_link->platforms->name = component->name; |
| |
| /* convert non BE into BE */ |
| - dai_link->no_pcm = 1; |
| - dai_link->dpcm_playback = 1; |
| - dai_link->dpcm_capture = 1; |
| + if (!dai_link->no_pcm) { |
| + dai_link->no_pcm = 1; |
| + |
| + if (dai_link->dpcm_playback) |
| + dev_warn(card->dev, |
| + "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_playback=1\n", |
| + dai_link->name); |
| + if (dai_link->dpcm_capture) |
| + dev_warn(card->dev, |
| + "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_capture=1\n", |
| + dai_link->name); |
| + |
| + /* convert normal link into DPCM one */ |
| + if (!(dai_link->dpcm_playback || |
| + dai_link->dpcm_capture)) { |
| + dai_link->dpcm_playback = !dai_link->capture_only; |
| + dai_link->dpcm_capture = !dai_link->playback_only; |
| + } |
| + } |
| |
| /* override any BE fixups */ |
| dai_link->be_hw_params_fixup = |
| -- |
| 2.7.4 |
| |