ASoC: Handle ignore_pmdown_time for CODEC to CODEC links
For CODEC to CODEC links we should only immediately power down if both CODECs are configured to ignore the power down delay. Factor the logic for this into a helper function that can be used for both compressed and normal PCMs. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
38dbfb59d1
commit
208a1589db
3 changed files with 28 additions and 4 deletions
|
@ -413,6 +413,8 @@ struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
|
|||
struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
|
||||
const char *dai_link);
|
||||
|
||||
bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd);
|
||||
|
||||
/* Utility functions to get clock rates from various things */
|
||||
int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
|
||||
int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
|
||||
|
|
|
@ -235,8 +235,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
|
|||
cpu_dai->runtime = NULL;
|
||||
|
||||
if (cstream->direction == SND_COMPRESS_PLAYBACK) {
|
||||
if (!rtd->pmdown_time || codec->ignore_pmdown_time ||
|
||||
rtd->dai_link->ignore_pmdown_time) {
|
||||
if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
|
||||
snd_soc_dapm_stream_event(rtd,
|
||||
SNDRV_PCM_STREAM_PLAYBACK,
|
||||
SND_SOC_DAPM_STREAM_STOP);
|
||||
|
|
|
@ -34,6 +34,30 @@
|
|||
|
||||
#define DPCM_MAX_BE_USERS 8
|
||||
|
||||
/**
|
||||
* snd_soc_runtime_ignore_pmdown_time() - Check whether to ignore the power down delay
|
||||
* @rtd: The ASoC PCM runtime that should be checked.
|
||||
*
|
||||
* This function checks whether the power down delay should be ignored for a
|
||||
* specific PCM runtime. Returns true if the delay is 0, if it the DAI link has
|
||||
* been configured to ignore the delay, or if none of the components benefits
|
||||
* from having the delay.
|
||||
*/
|
||||
bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
bool ignore = true;
|
||||
|
||||
if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time)
|
||||
return true;
|
||||
|
||||
if (rtd->cpu_dai->codec)
|
||||
ignore &= rtd->cpu_dai->codec->ignore_pmdown_time;
|
||||
|
||||
ignore &= rtd->codec_dai->codec->ignore_pmdown_time;
|
||||
|
||||
return ignore;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_set_runtime_hwparams - set the runtime hardware parameters
|
||||
* @substream: the pcm substream
|
||||
|
@ -496,8 +520,7 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
|
|||
cpu_dai->runtime = NULL;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
if (!rtd->pmdown_time || codec->ignore_pmdown_time ||
|
||||
rtd->dai_link->ignore_pmdown_time) {
|
||||
if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
|
||||
/* powered down playback stream now */
|
||||
snd_soc_dapm_stream_event(rtd,
|
||||
SNDRV_PCM_STREAM_PLAYBACK,
|
||||
|
|
Loading…
Reference in a new issue