OSDN Git Service

ASoC: soc-pcm: add snd_soc_dai_get_pcm_stream()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 19 Feb 2020 06:56:30 +0000 (15:56 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 24 Feb 2020 21:18:28 +0000 (21:18 +0000)
DAI driver has playback/capture stream.
OTOH, we have SNDRV_PCM_STREAM_PLAYBACK/CAPTURE.
Because of this kind of implementation,
ALSA SoC needs to have many verbose code.

To solve this issue, this patch adds snd_soc_dai_get_pcm_stream() macro
to get playback/capture stream pointer from stream.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87ftf7jcab.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 7481e46..c108919 100644 (file)
@@ -352,6 +352,13 @@ struct snd_soc_dai {
        unsigned int started:1;
 };
 
+static inline struct snd_soc_pcm_stream *
+snd_soc_dai_get_pcm_stream(const struct snd_soc_dai *dai, int stream)
+{
+       return (stream == SNDRV_PCM_STREAM_PLAYBACK) ?
+               &dai->driver->playback : &dai->driver->capture;
+}
+
 static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai,
                                             const struct snd_pcm_substream *ss)
 {
index 73a8293..19142f6 100644 (file)
@@ -390,12 +390,7 @@ int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
  */
 bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int dir)
 {
-       struct snd_soc_pcm_stream *stream;
-
-       if (dir == SNDRV_PCM_STREAM_PLAYBACK)
-               stream = &dai->driver->playback;
-       else
-               stream = &dai->driver->capture;
+       struct snd_soc_pcm_stream *stream = snd_soc_dai_get_pcm_stream(dai, dir);
 
        /* If the codec specifies any channels at all, it supports the stream */
        return stream->channels_min;
index aff27c8..7cb445b 100644 (file)
@@ -396,20 +396,16 @@ static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream)
        struct snd_pcm_hardware *hw = &runtime->hw;
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_dai *codec_dai;
-       struct snd_soc_dai_driver *cpu_dai_drv = rtd->cpu_dai->driver;
-       struct snd_soc_dai_driver *codec_dai_drv;
        struct snd_soc_pcm_stream *codec_stream;
        struct snd_soc_pcm_stream *cpu_stream;
        unsigned int chan_min = 0, chan_max = UINT_MAX;
        unsigned int rate_min = 0, rate_max = UINT_MAX;
        unsigned int rates = UINT_MAX;
        u64 formats = ULLONG_MAX;
+       int stream = substream->stream;
        int i;
 
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               cpu_stream = &cpu_dai_drv->playback;
-       else
-               cpu_stream = &cpu_dai_drv->capture;
+       cpu_stream = snd_soc_dai_get_pcm_stream(rtd->cpu_dai, stream);
 
        /* first calculate min/max only for CODECs in the DAI link */
        for_each_rtd_codec_dai(rtd, i, codec_dai) {
@@ -427,11 +423,8 @@ static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream)
                                              substream->stream))
                        continue;
 
-               codec_dai_drv = codec_dai->driver;
-               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       codec_stream = &codec_dai_drv->playback;
-               else
-                       codec_stream = &codec_dai_drv->capture;
+               codec_stream = snd_soc_dai_get_pcm_stream(codec_dai, stream);
+
                chan_min = max(chan_min, codec_stream->channels_min);
                chan_max = min(chan_max, codec_stream->channels_max);
                rate_min = max(rate_min, codec_stream->rate_min);
@@ -1600,7 +1593,6 @@ static void dpcm_runtime_merge_format(struct snd_pcm_substream *substream,
 
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
-               struct snd_soc_dai_driver *codec_dai_drv;
                struct snd_soc_pcm_stream *codec_stream;
                int i;
 
@@ -1612,11 +1604,7 @@ static void dpcm_runtime_merge_format(struct snd_pcm_substream *substream,
                        if (!snd_soc_dai_stream_valid(dai, stream))
                                continue;
 
-                       codec_dai_drv = dai->driver;
-                       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-                               codec_stream = &codec_dai_drv->playback;
-                       else
-                               codec_stream = &codec_dai_drv->capture;
+                       codec_stream = snd_soc_dai_get_pcm_stream(dai, stream);
 
                        *formats &= codec_stream->formats;
                }
@@ -1641,15 +1629,10 @@ static void dpcm_runtime_merge_chan(struct snd_pcm_substream *substream,
 
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
-               struct snd_soc_dai_driver *cpu_dai_drv =  be->cpu_dai->driver;
-               struct snd_soc_dai_driver *codec_dai_drv;
                struct snd_soc_pcm_stream *codec_stream;
                struct snd_soc_pcm_stream *cpu_stream;
 
-               if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       cpu_stream = &cpu_dai_drv->playback;
-               else
-                       cpu_stream = &cpu_dai_drv->capture;
+               cpu_stream = snd_soc_dai_get_pcm_stream(be->cpu_dai, stream);
 
                *channels_min = max(*channels_min, cpu_stream->channels_min);
                *channels_max = min(*channels_max, cpu_stream->channels_max);
@@ -1659,12 +1642,7 @@ static void dpcm_runtime_merge_chan(struct snd_pcm_substream *substream,
                 * DAIs connected to a single CPU DAI, use CPU DAI's directly
                 */
                if (be->num_codecs == 1) {
-                       codec_dai_drv = be->codec_dais[0]->driver;
-
-                       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-                               codec_stream = &codec_dai_drv->playback;
-                       else
-                               codec_stream = &codec_dai_drv->capture;
+                       codec_stream = snd_soc_dai_get_pcm_stream(be->codec_dais[0], stream);
 
                        *channels_min = max(*channels_min,
                                            codec_stream->channels_min);
@@ -1693,17 +1671,12 @@ static void dpcm_runtime_merge_rate(struct snd_pcm_substream *substream,
 
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
-               struct snd_soc_dai_driver *cpu_dai_drv =  be->cpu_dai->driver;
-               struct snd_soc_dai_driver *codec_dai_drv;
                struct snd_soc_pcm_stream *codec_stream;
                struct snd_soc_pcm_stream *cpu_stream;
                struct snd_soc_dai *dai;
                int i;
 
-               if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       cpu_stream = &cpu_dai_drv->playback;
-               else
-                       cpu_stream = &cpu_dai_drv->capture;
+               cpu_stream = snd_soc_dai_get_pcm_stream(be->cpu_dai, stream);
 
                *rate_min = max(*rate_min, cpu_stream->rate_min);
                *rate_max = min_not_zero(*rate_max, cpu_stream->rate_max);
@@ -1717,11 +1690,7 @@ static void dpcm_runtime_merge_rate(struct snd_pcm_substream *substream,
                        if (!snd_soc_dai_stream_valid(dai, stream))
                                continue;
 
-                       codec_dai_drv = dai->driver;
-                       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-                               codec_stream = &codec_dai_drv->playback;
-                       else
-                               codec_stream = &codec_dai_drv->capture;
+                       codec_stream = snd_soc_dai_get_pcm_stream(dai, stream);
 
                        *rate_min = max(*rate_min, codec_stream->rate_min);
                        *rate_max = min_not_zero(*rate_max,