ASoC: soc-pcm.c: remove indirect runtime copy
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 6 Mar 2023 01:43:54 +0000 (01:43 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 14 Mar 2023 13:58:57 +0000 (13:58 +0000)
substream->runtime will be attached when substream was opened
at snd_pcm_attach_substream(). When it uses DPCM,
FE substream->runtime is attached, but BE substream->runtime is not.
Thus, we are copying FE substream->runtime to BE.

But, we are copyig FE substream->runtime to FE dpcm->runtime first (A),
and copy it to BE dpcm->runtime (B), and copy it to
BE substream->runtime (C).

static int dpcm_fe_dai_open(...) {
...
(A) fe->dpcm[stream].runtime = fe_substream->runtime;
...
}

static int dpcm_be_connect(...) {
...
(B) be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
...
}

int dpcm_be_dai_startup(...) {
...
(C) be_substream->runtime = be->dpcm[stream].runtime;
...
}

It is too roundabout and troublesome.
OTOH, it is directly copying fe_substream->runtime at dpcm_be_reparent()
without using be->dpcm[stream].runtime.

static void dpcm_be_reparent(...)
{
...
for_each_dpcm_fe(be, stream, dpcm) {
...
=> be_substream->runtime = fe_substream->runtime;
break;
}
}

This patch removes indirect copying.

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

index 1e7d09556fe3e9b546a3dd29c6d4277704455206..4d6ac7699833d878b56deba30292af81dcc14669 100644 (file)
@@ -91,7 +91,6 @@ struct snd_soc_dpcm_runtime {
        struct list_head fe_clients;
 
        int users;
-       struct snd_pcm_runtime *runtime;
        struct snd_pcm_hw_params hw_params;
 
        /* state and update */
index e7aa6f360cabefb06521b35b3d8a8d13b549c606..554c329ec87fb80742ef4e46416d3aa6b4b7bd4d 100644 (file)
@@ -134,8 +134,6 @@ err_no_lock:
 static int soc_compr_open_fe(struct snd_compr_stream *cstream)
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
-       struct snd_pcm_substream *fe_substream =
-                fe->pcm->streams[cstream->direction].substream;
        struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(fe, 0);
        struct snd_soc_dpcm *dpcm;
        struct snd_soc_dapm_widget_list *list;
@@ -143,7 +141,6 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
        int ret;
 
        mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
-       fe->dpcm[stream].runtime = fe_substream->runtime;
 
        ret = dpcm_path_get(fe, stream, &list);
        if (ret < 0)
@@ -153,7 +150,6 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
 
        /* calculate valid and active FE <-> BE dpcms */
        dpcm_process_paths(fe, stream, &list, 1);
-       fe->dpcm[stream].runtime = fe_substream->runtime;
 
        fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
 
@@ -164,7 +160,6 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
                        dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
 
                dpcm_be_disconnect(fe, stream);
-               fe->dpcm[stream].runtime = NULL;
                goto out;
        }
 
@@ -236,8 +231,6 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
 
        mutex_unlock(&fe->card->pcm_mutex);
 
-       fe->dpcm[stream].runtime = NULL;
-
        snd_soc_link_compr_shutdown(cstream, 0);
 
        snd_soc_compr_components_free(cstream, 0);
index 5eb056b942ce8d6c1d95a9ee49c27be5d8bae8d0..b7f8a5bcfbc6c6342cc049897bee84946c4d93cd 100644 (file)
@@ -1230,7 +1230,6 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
 
        dpcm->be = be;
        dpcm->fe = fe;
-       be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
        dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
        snd_soc_dpcm_stream_lock_irq(fe, stream);
        list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
@@ -1465,10 +1464,11 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
        struct snd_soc_dapm_widget_list *list = *list_;
        struct snd_soc_pcm_runtime *be;
        struct snd_soc_dapm_widget *widget;
+       struct snd_pcm_substream *fe_substream = snd_soc_dpcm_get_substream(fe, stream);
        int i, new = 0, err;
 
        /* don't connect if FE is not running */
-       if (!fe->dpcm[stream].runtime && !fe->fe_compr)
+       if (!fe_substream->runtime && !fe->fe_compr)
                return new;
 
        /* Create any new FE <--> BE connections */
@@ -1590,6 +1590,7 @@ void dpcm_be_dai_stop(struct snd_soc_pcm_runtime *fe, int stream,
 
 int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
 {
+       struct snd_pcm_substream *fe_substream = snd_soc_dpcm_get_substream(fe, stream);
        struct snd_soc_pcm_runtime *be;
        struct snd_soc_dpcm *dpcm;
        int err, count = 0;
@@ -1629,7 +1630,7 @@ int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
                dev_dbg(be->dev, "ASoC: open %s BE %s\n",
                        stream ? "capture" : "playback", be->dai_link->name);
 
-               be_substream->runtime = be->dpcm[stream].runtime;
+               be_substream->runtime = fe_substream->runtime;
                err = __soc_pcm_open(be, be_substream);
                if (err < 0) {
                        be->dpcm[stream].users--;
@@ -2693,8 +2694,6 @@ static void dpcm_fe_dai_cleanup(struct snd_pcm_substream *fe_substream)
                dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
 
        dpcm_be_disconnect(fe, stream);
-
-       fe->dpcm[stream].runtime = NULL;
 }
 
 static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream)
@@ -2719,7 +2718,6 @@ static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream)
        int stream = fe_substream->stream;
 
        snd_soc_dpcm_mutex_lock(fe);
-       fe->dpcm[stream].runtime = fe_substream->runtime;
 
        ret = dpcm_path_get(fe, stream, &list);
        if (ret < 0)