ASoC: soc-pcm.c: remove indirect runtime copy
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>
This commit is contained in:
Родитель
5c5a7521e9
Коммит
0d3a5178c2
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче