ASoC: soc-dapm: add snd_soc_dapm_stream_stop()
When we stop stream, if it was Playback, we might need to care about power down time. In such case, we need to use delayed work. We have same implementation for it at soc-pcm.c and soc-compress.c, but we don't want to have duplicate code. This patch adds snd_soc_dapm_stream_stop(), and share same code. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Reviewed-By: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Link: https://lore.kernel.org/r/871rs8t4uw.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Родитель
83f94a2e29
Коммит
3f4cf79793
|
@ -434,6 +434,7 @@ void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm);
|
|||
/* dapm events */
|
||||
void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
|
||||
int event);
|
||||
void snd_soc_dapm_stream_stop(struct snd_soc_pcm_runtime *rtd, int stream);
|
||||
void snd_soc_dapm_shutdown(struct snd_soc_card *card);
|
||||
|
||||
/* external DAPM widget events */
|
||||
|
|
|
@ -259,23 +259,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
|
|||
if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
|
||||
cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
|
||||
|
||||
if (cstream->direction == SND_COMPRESS_PLAYBACK) {
|
||||
if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
|
||||
snd_soc_dapm_stream_event(rtd,
|
||||
SNDRV_PCM_STREAM_PLAYBACK,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
} else {
|
||||
rtd->pop_wait = 1;
|
||||
queue_delayed_work(system_power_efficient_wq,
|
||||
&rtd->delayed_work,
|
||||
msecs_to_jiffies(rtd->pmdown_time));
|
||||
}
|
||||
} else {
|
||||
/* capture streams can be powered down now */
|
||||
snd_soc_dapm_stream_event(rtd,
|
||||
SNDRV_PCM_STREAM_CAPTURE,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
}
|
||||
snd_soc_dapm_stream_stop(rtd, stream);
|
||||
|
||||
mutex_unlock(&rtd->card->pcm_mutex);
|
||||
|
||||
|
|
|
@ -4447,6 +4447,29 @@ void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
|
|||
mutex_unlock(&card->dapm_mutex);
|
||||
}
|
||||
|
||||
void snd_soc_dapm_stream_stop(struct snd_soc_pcm_runtime *rtd, int stream)
|
||||
{
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
|
||||
/* powered down playback stream now */
|
||||
snd_soc_dapm_stream_event(rtd,
|
||||
SNDRV_PCM_STREAM_PLAYBACK,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
} else {
|
||||
/* start delayed pop wq here for playback streams */
|
||||
rtd->pop_wait = 1;
|
||||
queue_delayed_work(system_power_efficient_wq,
|
||||
&rtd->delayed_work,
|
||||
msecs_to_jiffies(rtd->pmdown_time));
|
||||
}
|
||||
} else {
|
||||
/* capture streams can be powered down now */
|
||||
snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_stop);
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_enable_pin_unlocked - enable pin.
|
||||
* @dapm: DAPM context
|
||||
|
|
|
@ -672,24 +672,7 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
|
|||
|
||||
soc_pcm_components_close(substream, NULL);
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
|
||||
/* powered down playback stream now */
|
||||
snd_soc_dapm_stream_event(rtd,
|
||||
SNDRV_PCM_STREAM_PLAYBACK,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
} else {
|
||||
/* start delayed pop wq here for playback streams */
|
||||
rtd->pop_wait = 1;
|
||||
queue_delayed_work(system_power_efficient_wq,
|
||||
&rtd->delayed_work,
|
||||
msecs_to_jiffies(rtd->pmdown_time));
|
||||
}
|
||||
} else {
|
||||
/* capture streams can be powered down now */
|
||||
snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
}
|
||||
snd_soc_dapm_stream_stop(rtd, substream->stream);
|
||||
|
||||
mutex_unlock(&rtd->card->pcm_mutex);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче