瀏覽代碼

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>
Lars-Peter Clausen 11 年之前
父節點
當前提交
208a1589db
共有 3 個文件被更改,包括 28 次插入4 次删除
  1. 2 0
      include/sound/soc.h
  2. 1 2
      sound/soc/soc-compress.c
  3. 25 2
      sound/soc/soc-pcm.c

+ 2 - 0
include/sound/soc.h

@@ -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,
 struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
 		const char *dai_link);
 		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 */
 /* 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_calc_frame_size(int sample_size, int channels, int tdm_slots);
 int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
 int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);

+ 1 - 2
sound/soc/soc-compress.c

@@ -235,8 +235,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
 	cpu_dai->runtime = NULL;
 	cpu_dai->runtime = NULL;
 
 
 	if (cstream->direction == SND_COMPRESS_PLAYBACK) {
 	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,
 			snd_soc_dapm_stream_event(rtd,
 					SNDRV_PCM_STREAM_PLAYBACK,
 					SNDRV_PCM_STREAM_PLAYBACK,
 					SND_SOC_DAPM_STREAM_STOP);
 					SND_SOC_DAPM_STREAM_STOP);

+ 25 - 2
sound/soc/soc-pcm.c

@@ -34,6 +34,30 @@
 
 
 #define DPCM_MAX_BE_USERS	8
 #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
  * snd_soc_set_runtime_hwparams - set the runtime hardware parameters
  * @substream: the pcm substream
  * @substream: the pcm substream
@@ -496,8 +520,7 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
 	cpu_dai->runtime = NULL;
 	cpu_dai->runtime = NULL;
 
 
 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 	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 */
 			/* powered down playback stream now */
 			snd_soc_dapm_stream_event(rtd,
 			snd_soc_dapm_stream_event(rtd,
 						  SNDRV_PCM_STREAM_PLAYBACK,
 						  SNDRV_PCM_STREAM_PLAYBACK,