ASoC: soc-dai: update snd_soc_dai_delay() to snd_soc_pcm_dai_delay()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 16 Nov 2021 07:45:12 +0000 (16:45 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 29 Nov 2021 12:19:40 +0000 (12:19 +0000)
Current soc_pcm_pointer() is manually calculating
both CPU-DAI's   max delay (= A)
and  Codec-DAI's max delay (= B).

static snd_pcm_uframes_t soc_pcm_pointer(...)
{
...
 ^ for_each_rtd_cpu_dais(rtd, i, cpu_dai)
(A) cpu_delay = max(cpu_delay, ...);
 v delay += cpu_delay;

 ^ for_each_rtd_codec_dais(rtd, i, codec_dai)
(B) codec_delay = max(codec_delay, ...);
 v delay += codec_delay;

runtime->delay = delay;
...
}

Current soc_pcm_pointer() and the total delay calculating
is not readable / difficult to understand.

This patch update snd_soc_dai_delay() to snd_soc_pcm_dai_delay(),
and calcule both CPU/Codec delay in one function.

Link: https://lore.kernel.org/r/87fszl4yrq.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/875yssy25z.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc-dai.h
sound/soc/soc-dai.c
sound/soc/soc-pcm.c

index 0dcb361a98bb34ec78f2bb4863419d9f94fc7670..5d4dd7c5450bc028081544167f5dba8d4c4477d5 100644 (file)
@@ -208,8 +208,6 @@ int snd_soc_dai_startup(struct snd_soc_dai *dai,
                        struct snd_pcm_substream *substream);
 void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
                          struct snd_pcm_substream *substream, int rollback);
-snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
-                                   struct snd_pcm_substream *substream);
 void snd_soc_dai_suspend(struct snd_soc_dai *dai);
 void snd_soc_dai_resume(struct snd_soc_dai *dai);
 int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
@@ -238,6 +236,8 @@ int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream, int cmd,
                            int rollback);
 int snd_soc_pcm_dai_bespoke_trigger(struct snd_pcm_substream *substream,
                                    int cmd);
+void snd_soc_pcm_dai_delay(struct snd_pcm_substream *substream,
+                          snd_pcm_sframes_t *cpu_delay, snd_pcm_sframes_t *codec_delay);
 
 int snd_soc_dai_compr_startup(struct snd_soc_dai *dai,
                              struct snd_compr_stream *cstream);
index 3db0fcf24385af21e739ab1536de557b1952a669..6078afe335f88026b83bd1a580f95682934058d1 100644 (file)
@@ -453,18 +453,6 @@ void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
        soc_dai_mark_pop(dai, substream, startup);
 }
 
-snd_pcm_sframes_t snd_soc_dai_delay(struct snd_soc_dai *dai,
-                                   struct snd_pcm_substream *substream)
-{
-       int delay = 0;
-
-       if (dai->driver->ops &&
-           dai->driver->ops->delay)
-               delay = dai->driver->ops->delay(substream, dai);
-
-       return delay;
-}
-
 int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
                             struct snd_soc_pcm_runtime *rtd, int num)
 {
@@ -693,6 +681,34 @@ int snd_soc_pcm_dai_bespoke_trigger(struct snd_pcm_substream *substream,
        return 0;
 }
 
+void snd_soc_pcm_dai_delay(struct snd_pcm_substream *substream,
+                          snd_pcm_sframes_t *cpu_delay,
+                          snd_pcm_sframes_t *codec_delay)
+{
+       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+       struct snd_soc_dai *dai;
+       int i;
+
+       /*
+        * We're looking for the delay through the full audio path so it needs to
+        * be the maximum of the DAIs doing transmit and the maximum of the DAIs
+        * doing receive (ie, all CPUs and all CODECs) rather than just the maximum
+        * of all DAIs.
+        */
+
+       /* for CPU */
+       for_each_rtd_cpu_dais(rtd, i, dai)
+               if (dai->driver->ops &&
+                   dai->driver->ops->delay)
+                       *cpu_delay = max(*cpu_delay, dai->driver->ops->delay(substream, dai));
+
+       /* for Codec */
+       for_each_rtd_codec_dais(rtd, i, dai)
+               if (dai->driver->ops &&
+                   dai->driver->ops->delay)
+                       *codec_delay = max(*codec_delay, dai->driver->ops->delay(substream, dai));
+}
+
 int snd_soc_dai_compr_startup(struct snd_soc_dai *dai,
                              struct snd_compr_stream *cstream)
 {
index 4d41ad30280290df2431ead0ef5c8d7d900df449..82fd170e16afa974e9d6f5a6ad23f7b2e1054266 100644 (file)
@@ -1084,15 +1084,11 @@ start_err:
  */
 static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
 {
-       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
-       struct snd_soc_dai *cpu_dai;
-       struct snd_soc_dai *codec_dai;
        struct snd_pcm_runtime *runtime = substream->runtime;
        snd_pcm_uframes_t offset = 0;
        snd_pcm_sframes_t delay = 0;
        snd_pcm_sframes_t codec_delay = 0;
        snd_pcm_sframes_t cpu_delay = 0;
-       int i;
 
        /* clearing the previous total delay */
        runtime->delay = 0;
@@ -1102,19 +1098,9 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
        /* base delay if assigned in pointer callback */
        delay = runtime->delay;
 
-       for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
-               cpu_delay = max(cpu_delay,
-                               snd_soc_dai_delay(cpu_dai, substream));
-       }
-       delay += cpu_delay;
-
-       for_each_rtd_codec_dais(rtd, i, codec_dai) {
-               codec_delay = max(codec_delay,
-                                 snd_soc_dai_delay(codec_dai, substream));
-       }
-       delay += codec_delay;
+       snd_soc_pcm_dai_delay(substream, &cpu_delay, &codec_delay);
 
-       runtime->delay = delay;
+       runtime->delay = delay + cpu_delay + codec_delay;
 
        return offset;
 }