From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
To: "Kuninori Morimoto" <kuninori.morimoto.gx@renesas.com>,
"Amadeusz Sławiński" <amadeuszx.slawinski@linux.intel.com>,
"Alper Nebi Yasak" <alpernebiyasak@gmail.com>,
"AngeloGioacchino Del Regno"
<angelogioacchino.delregno@collabora.com>,
"Banajit Goswami" <bgoswami@quicinc.com>,
"Bard Liao" <yung-chuan.liao@linux.intel.com>,
"Brent Lu" <brent.lu@intel.com>,
"Cezary Rojewski" <cezary.rojewski@intel.com>,
"Cristian Ciocaltea" <cristian.ciocaltea@collabora.com>,
"Daniel Baluta" <daniel.baluta@nxp.com>,
"Hans de Goede" <hdegoede@redhat.com>,
"Jaroslav Kysela" <perex@perex.cz>,
"Jerome Brunet" <jbrunet@baylibre.com>,
"Kai Vehmanen" <kai.vehmanen@linux.intel.com>,
"Kevin Hilman" <khilman@baylibre.com>,
"Liam Girdwood" <lgirdwood@gmail.com>,
"Linus Walleij" <linus.walleij@linaro.org>,
"Mark Brown" <broonie@kernel.org>,
"Maso Huang" <maso.huang@mediatek.com>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Peter Ujfalusi" <peter.ujfalusi@linux.intel.com>,
"Ranjani Sridharan" <ranjani.sridharan@linux.intel.com>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Shawn Guo" <shawnguo@kernel.org>,
"Shengjiu Wang" <shengjiu.wang@gmail.com>,
"Srinivas Kandagatla" <srinivas.kandagatla@linaro.org>,
"Sylwester Nawrocki" <s.nawrocki@samsung.com>,
"Takashi Iwai" <tiwai@suse.com>,
"Trevor Wu" <trevor.wu@mediatek.com>,
"Vinod Koul" <vkoul@kernel.org>, "Xiubo Li" <Xiubo.Lee@gmail.com>,
alsa-devel@alsa-project.org, imx@lists.linux.dev,
linux-sound@vger.kernel.org,
linux-stm32@st-md-mailman.stormreply.com
Subject: Re: [PATCH v2 01/16] ASoC: soc-pcm.c: cleanup soc_get_playback_capture()
Date: Mon, 1 Apr 2024 11:10:25 -0500 [thread overview]
Message-ID: <b4b37541-b67f-4593-9fd5-fc6242a0673a@linux.intel.com> (raw)
In-Reply-To: <87y19xudor.wl-kuninori.morimoto.gx@renesas.com>
On 3/31/24 19:30, Kuninori Morimoto wrote:
> Current soc_get_playback_capture() (A) is checking playback/capture
> availability for DPCM (X) / Normal (Y) / Codec2Codec (Z) connections.
>
> (A) static int soc_get_playback_capture(...)
> {
> ...
> ^ if (dai_link->dynamic || dai_link->no_pcm) {
> | ...
> |(a) if (dai_link->dpcm_playback) {
> | ...
> | ^ for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> |(*) ...
> | v }
> | ...
> (X) }
> |(b) if (dai_link->dpcm_capture) {
> | ...
> | ^ for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> |(*) ...
> | v }
> | ...
> v }
> } else {
> ^ ^ /* Adapt stream for codec2codec links */
> |(Z) int cpu_capture = ...
> | v int cpu_playback = ...
> (Y)
> | ^ for_each_rtd_ch_maps(rtd, i, ch_maps) {
> |(*) ...
> v v }
> }
> ...
> }
>
> (*) part is checking each DAI's availability.
>
> At first, (X) part is for DPCM, and it checks playback/capture
> availability if dai_link has dpcm_playback/capture flag (a)(b).
> But we are already using playback/capture_only flag for Normal (Y) and
> Codec2Codec (Z). We can use this flags for DPCM too.
>
> Before After
> dpcm_playback = 1; => /* no flags */
> dpcm_capture = 1;
>
> dpcm_playback = 1; => playback_only = 1;
>
> dpcm_capture = 1; => capture_only = 1;
>
> dpcm_playback = 0; => error
> dpcm_capture = 0;
>
> This patch convert dpcm_ flags to _only flag, and dpcm_ flag will be
> removed if all driver switched to _only flags.
>
> Here, CPU <-> Codec relationship is like this
>
> DPCM
> [CPU/dummy]-[dummy/Codec]
> ^^^^ ^^^^^
> Normal
> [CPU/Codec]
> ^^^^^^^^^^^
>
> DPCM part (X) is checking only CPU DAI, and
> Normal part (Y) is checking both CPU/Codec DAI
>
> Here, validation check on dummy DAI is always true,
> Therefor we want to expand validation check to all cases.
>
> One note here is that unfortunately DPCM BE Codec had been no validation
> check before, but all cases validation check breaks compatibility on
> some vender's devices. Thus this patch ignore it.
>
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> ---
> sound/soc/soc-pcm.c | 90 +++++++++++++++++++--------------------------
> 1 file changed, 38 insertions(+), 52 deletions(-)
>
> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
> index 77ee103b7cd1..8761ae8fc05f 100644
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -2793,7 +2793,12 @@ static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd,
> int *playback, int *capture)
> {
> struct snd_soc_dai_link *dai_link = rtd->dai_link;
> + struct snd_soc_dai_link_ch_map *ch_maps;
> struct snd_soc_dai *cpu_dai;
> + struct snd_soc_dai *codec_dai;
> + struct snd_soc_dai *dummy_dai = snd_soc_find_dai(&snd_soc_dummy_dlc);
> + int cpu_playback;
> + int cpu_capture;
> int has_playback = 0;
> int has_capture = 0;
> int i;
> @@ -2803,65 +2808,46 @@ static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd,
> return -EINVAL;
> }
>
> + /* REMOVE ME */
> if (dai_link->dynamic || dai_link->no_pcm) {
> - int stream;
> -
> - if (dai_link->dpcm_playback) {
> - stream = SNDRV_PCM_STREAM_PLAYBACK;
> -
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - if (snd_soc_dai_stream_valid(cpu_dai, stream)) {
> - has_playback = 1;
> - break;
> - }
> - }
> - if (!has_playback) {
> - dev_err(rtd->card->dev,
> - "No CPU DAIs support playback for stream %s\n",
> - dai_link->stream_name);
> - return -EINVAL;
> - }
> + if (dai_link->dpcm_playback && !dai_link->dpcm_capture)
> + dai_link->playback_only = 1;
> + if (!dai_link->dpcm_playback && dai_link->dpcm_capture)
> + dai_link->capture_only = 1;
> + if (!dai_link->dpcm_playback && !dai_link->dpcm_capture) {
> + dev_err(rtd->dev, "no dpcm_playback/capture are selected\n");
> + return -EINVAL;
> }
> - if (dai_link->dpcm_capture) {
> - stream = SNDRV_PCM_STREAM_CAPTURE;
> + }
>
> - for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
> - if (snd_soc_dai_stream_valid(cpu_dai, stream)) {
> - has_capture = 1;
> - break;
> - }
> - }
> + /* Adapt stream for codec2codec links */
> + cpu_playback = snd_soc_get_stream_cpu(dai_link, SNDRV_PCM_STREAM_PLAYBACK);
> + cpu_capture = snd_soc_get_stream_cpu(dai_link, SNDRV_PCM_STREAM_CAPTURE);
>
> - if (!has_capture) {
> - dev_err(rtd->card->dev,
> - "No CPU DAIs support capture for stream %s\n",
> - dai_link->stream_name);
> - return -EINVAL;
> - }
> - }
> - } else {
> - struct snd_soc_dai_link_ch_map *ch_maps;
> - struct snd_soc_dai *codec_dai;
> -
> - /* Adapt stream for codec2codec links */
> - int cpu_capture = snd_soc_get_stream_cpu(dai_link, SNDRV_PCM_STREAM_CAPTURE);
> - int cpu_playback = snd_soc_get_stream_cpu(dai_link, SNDRV_PCM_STREAM_PLAYBACK);
> + /*
> + * see
> + * soc.h :: [dai_link->ch_maps Image sample]
> + */
> + for_each_rtd_ch_maps(rtd, i, ch_maps) {
> + cpu_dai = snd_soc_rtd_to_cpu(rtd, ch_maps->cpu);
> + codec_dai = snd_soc_rtd_to_codec(rtd, ch_maps->codec);
>
> /*
> - * see
> - * soc.h :: [dai_link->ch_maps Image sample]
> + * FIXME
> + *
> + * DPCM BE Codec has been no checked before.
> + * It should be checked, but it breaks compatibility.
> + * It ignores BE Codec here, so far.
> */
> - for_each_rtd_ch_maps(rtd, i, ch_maps) {
> - cpu_dai = snd_soc_rtd_to_cpu(rtd, ch_maps->cpu);
> - codec_dai = snd_soc_rtd_to_codec(rtd, ch_maps->codec);
> -
> - if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) &&
> - snd_soc_dai_stream_valid(cpu_dai, cpu_playback))
> - has_playback = 1;
> - if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) &&
> - snd_soc_dai_stream_valid(cpu_dai, cpu_capture))
> - has_capture = 1;
> - }
> + if (dai_link->no_pcm)
> + codec_dai = dummy_dai;
> +
> + if (snd_soc_dai_stream_valid(cpu_dai, cpu_playback) &&
> + snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK))
> + has_playback = 1;
> + if (snd_soc_dai_stream_valid(cpu_dai, cpu_capture) &&
> + snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE))
> + has_capture = 1;
> }
The problem I have is with the following code (not shown with diff)
if (dai_link->playback_only)
has_capture = 0;
if (dai_link->capture_only)
has_playback = 0;
So with this grand unification, all the loops above may make a decision
that could be overridden by these two branches.
This was not the case before for DPCM, all the 'has_capture' and
'has_playback' variables were used as a verification of the dai_link
settings with an error thrown e.g. if the dpcm_playback was set without
any DAIs supporting playback.
Now the dailink settings are used unconditionally. There is one warning
added if there are no settings for a dailink, but we've lost the
detection of a mismatch between dailink and the set of cpu/codec dais
that are part of this dailink.
next prev parent reply other threads:[~2024-04-01 16:31 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-01 0:27 [PATCH v2 00/16] ASoC: Replace dpcm_playback/capture to playback/capture_only Kuninori Morimoto
2024-04-01 0:30 ` [PATCH v2 01/16] ASoC: soc-pcm.c: cleanup soc_get_playback_capture() Kuninori Morimoto
2024-04-01 16:10 ` Pierre-Louis Bossart [this message]
2024-04-02 0:21 ` Kuninori Morimoto
2024-04-02 6:43 ` Kuninori Morimoto
2024-04-02 14:06 ` Pierre-Louis Bossart
2024-04-02 14:02 ` Pierre-Louis Bossart
2024-04-04 1:53 ` Kuninori Morimoto
2024-04-04 13:27 ` Pierre-Louis Bossart
2024-04-05 0:46 ` Kuninori Morimoto
2024-04-08 3:55 ` Kuninori Morimoto
2024-04-08 15:34 ` Pierre-Louis Bossart
2024-04-08 23:42 ` Kuninori Morimoto
2024-04-01 0:30 ` [PATCH v2 02/16] ASoC: amd: Replace dpcm_playback/capture to playback/capture_only Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 03/16] ASoC: fsl: " Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 04/16] ASoC: sof: " Kuninori Morimoto
2024-04-01 16:12 ` Pierre-Louis Bossart
2024-04-01 23:19 ` Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 05/16] ASoC: meson: " Kuninori Morimoto
2024-04-04 8:46 ` Jerome Brunet
2024-04-01 0:31 ` [PATCH v2 06/16] ASoC: Intel: " Kuninori Morimoto
2024-04-02 14:04 ` Amadeusz Sławiński
2024-04-03 0:12 ` Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 07/16] ASoC: samsung: " Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 08/16] ASoC: mediatek: " Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 09/16] ASoC: soc-core: " Kuninori Morimoto
2024-04-01 16:22 ` Pierre-Louis Bossart
2024-04-01 23:27 ` Kuninori Morimoto
2024-04-02 14:09 ` Pierre-Louis Bossart
2024-04-04 2:04 ` Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 10/16] ASoC: soc-topology: " Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 11/16] ASoC: soc-compress: " Kuninori Morimoto
2024-04-01 0:31 ` [PATCH v2 12/16] ASoC: Intel: avs: boards: " Kuninori Morimoto
2024-04-01 0:32 ` [PATCH v2 13/16] ASoC: remove snd_soc_dai_link_set_capabilities() Kuninori Morimoto
2024-04-01 16:26 ` Pierre-Louis Bossart
2024-04-02 0:29 ` Kuninori Morimoto
2024-04-02 14:13 ` Pierre-Louis Bossart
2024-04-04 2:22 ` Kuninori Morimoto
2024-04-01 0:32 ` [PATCH v2 14/16] ASoC: soc-pcm: remove dpcm_playback/capture Kuninori Morimoto
2024-04-01 0:32 ` [PATCH v2 15/16] ASoC: soc-pcm: indicate warning if DPCM BE Codec has no settings Kuninori Morimoto
2024-04-01 16:28 ` Pierre-Louis Bossart
2024-04-01 0:32 ` [PATCH v2 16/16] ASoC: doc: remove .dpcm_playback/capture flags Kuninori Morimoto
2024-04-04 8:27 ` [PATCH v2 00/16] ASoC: Replace dpcm_playback/capture to playback/capture_only Jerome Brunet
2024-04-04 23:13 ` Kuninori Morimoto
2024-04-05 8:59 ` Jerome Brunet
2024-04-08 2:13 ` Kuninori Morimoto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b4b37541-b67f-4593-9fd5-fc6242a0673a@linux.intel.com \
--to=pierre-louis.bossart@linux.intel.com \
--cc=Xiubo.Lee@gmail.com \
--cc=alpernebiyasak@gmail.com \
--cc=alsa-devel@alsa-project.org \
--cc=amadeuszx.slawinski@linux.intel.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=bgoswami@quicinc.com \
--cc=brent.lu@intel.com \
--cc=broonie@kernel.org \
--cc=cezary.rojewski@intel.com \
--cc=cristian.ciocaltea@collabora.com \
--cc=daniel.baluta@nxp.com \
--cc=hdegoede@redhat.com \
--cc=imx@lists.linux.dev \
--cc=jbrunet@baylibre.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=khilman@baylibre.com \
--cc=kuninori.morimoto.gx@renesas.com \
--cc=lgirdwood@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-sound@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=maso.huang@mediatek.com \
--cc=matthias.bgg@gmail.com \
--cc=neil.armstrong@linaro.org \
--cc=perex@perex.cz \
--cc=peter.ujfalusi@linux.intel.com \
--cc=ranjani.sridharan@linux.intel.com \
--cc=s.hauer@pengutronix.de \
--cc=s.nawrocki@samsung.com \
--cc=shawnguo@kernel.org \
--cc=shengjiu.wang@gmail.com \
--cc=srinivas.kandagatla@linaro.org \
--cc=tiwai@suse.com \
--cc=trevor.wu@mediatek.com \
--cc=vkoul@kernel.org \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox