diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/soc-compress.c | 19 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 12 | ||||
-rw-r--r-- | sound/soc/soc-dapm.c | 6 | ||||
-rw-r--r-- | sound/soc/soc-pcm.c | 7 |
4 files changed, 26 insertions, 18 deletions
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c index 35726cbf1f02..b5b3db71e253 100644 --- a/sound/soc/soc-compress.c +++ b/sound/soc/soc-compress.c | |||
@@ -116,12 +116,13 @@ static int soc_compr_free(struct snd_compr_stream *cstream) | |||
116 | if (cstream->direction == SND_COMPRESS_PLAYBACK) { | 116 | if (cstream->direction == SND_COMPRESS_PLAYBACK) { |
117 | cpu_dai->playback_active--; | 117 | cpu_dai->playback_active--; |
118 | codec_dai->playback_active--; | 118 | codec_dai->playback_active--; |
119 | snd_soc_dai_digital_mute(codec_dai, 1); | ||
120 | } else { | 119 | } else { |
121 | cpu_dai->capture_active--; | 120 | cpu_dai->capture_active--; |
122 | codec_dai->capture_active--; | 121 | codec_dai->capture_active--; |
123 | } | 122 | } |
124 | 123 | ||
124 | snd_soc_dai_digital_mute(codec_dai, 1, cstream->direction); | ||
125 | |||
125 | cpu_dai->active--; | 126 | cpu_dai->active--; |
126 | codec_dai->active--; | 127 | codec_dai->active--; |
127 | codec->active--; | 128 | codec->active--; |
@@ -178,15 +179,13 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd) | |||
178 | goto out; | 179 | goto out; |
179 | } | 180 | } |
180 | 181 | ||
181 | if (cstream->direction == SND_COMPRESS_PLAYBACK) { | 182 | switch (cmd) { |
182 | switch (cmd) { | 183 | case SNDRV_PCM_TRIGGER_START: |
183 | case SNDRV_PCM_TRIGGER_START: | 184 | snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction); |
184 | snd_soc_dai_digital_mute(codec_dai, 0); | 185 | break; |
185 | break; | 186 | case SNDRV_PCM_TRIGGER_STOP: |
186 | case SNDRV_PCM_TRIGGER_STOP: | 187 | snd_soc_dai_digital_mute(codec_dai, 1, cstream->direction); |
187 | snd_soc_dai_digital_mute(codec_dai, 1); | 188 | break; |
188 | break; | ||
189 | } | ||
190 | } | 189 | } |
191 | 190 | ||
192 | out: | 191 | out: |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 2370063b5824..4eac22797893 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -3540,12 +3540,20 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate); | |||
3540 | * snd_soc_dai_digital_mute - configure DAI system or master clock. | 3540 | * snd_soc_dai_digital_mute - configure DAI system or master clock. |
3541 | * @dai: DAI | 3541 | * @dai: DAI |
3542 | * @mute: mute enable | 3542 | * @mute: mute enable |
3543 | * @direction: stream to mute | ||
3543 | * | 3544 | * |
3544 | * Mutes the DAI DAC. | 3545 | * Mutes the DAI DAC. |
3545 | */ | 3546 | */ |
3546 | int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute) | 3547 | int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute, |
3548 | int direction) | ||
3547 | { | 3549 | { |
3548 | if (dai->driver && dai->driver->ops->digital_mute) | 3550 | if (!dai->driver) |
3551 | return -ENOTSUPP; | ||
3552 | |||
3553 | if (dai->driver->ops->mute_stream) | ||
3554 | return dai->driver->ops->mute_stream(dai, mute, direction); | ||
3555 | else if (direction == SNDRV_PCM_STREAM_PLAYBACK && | ||
3556 | dai->driver->ops->digital_mute) | ||
3549 | return dai->driver->ops->digital_mute(dai, mute); | 3557 | return dai->driver->ops->digital_mute(dai, mute); |
3550 | else | 3558 | else |
3551 | return -ENOTSUPP; | 3559 | return -ENOTSUPP; |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 1e36bc81e5af..4d664f3df805 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -3247,14 +3247,16 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, | |||
3247 | break; | 3247 | break; |
3248 | 3248 | ||
3249 | case SND_SOC_DAPM_POST_PMU: | 3249 | case SND_SOC_DAPM_POST_PMU: |
3250 | ret = snd_soc_dai_digital_mute(sink, 0); | 3250 | ret = snd_soc_dai_digital_mute(sink, 0, |
3251 | SNDRV_PCM_STREAM_PLAYBACK); | ||
3251 | if (ret != 0 && ret != -ENOTSUPP) | 3252 | if (ret != 0 && ret != -ENOTSUPP) |
3252 | dev_warn(sink->dev, "ASoC: Failed to unmute: %d\n", ret); | 3253 | dev_warn(sink->dev, "ASoC: Failed to unmute: %d\n", ret); |
3253 | ret = 0; | 3254 | ret = 0; |
3254 | break; | 3255 | break; |
3255 | 3256 | ||
3256 | case SND_SOC_DAPM_PRE_PMD: | 3257 | case SND_SOC_DAPM_PRE_PMD: |
3257 | ret = snd_soc_dai_digital_mute(sink, 1); | 3258 | ret = snd_soc_dai_digital_mute(sink, 1, |
3259 | SNDRV_PCM_STREAM_PLAYBACK); | ||
3258 | if (ret != 0 && ret != -ENOTSUPP) | 3260 | if (ret != 0 && ret != -ENOTSUPP) |
3259 | dev_warn(sink->dev, "ASoC: Failed to mute: %d\n", ret); | 3261 | dev_warn(sink->dev, "ASoC: Failed to mute: %d\n", ret); |
3260 | ret = 0; | 3262 | ret = 0; |
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index cf191e6aebbe..d675b4ae0df6 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c | |||
@@ -383,8 +383,7 @@ static int soc_pcm_close(struct snd_pcm_substream *substream) | |||
383 | /* Muting the DAC suppresses artifacts caused during digital | 383 | /* Muting the DAC suppresses artifacts caused during digital |
384 | * shutdown, for example from stopping clocks. | 384 | * shutdown, for example from stopping clocks. |
385 | */ | 385 | */ |
386 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 386 | snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); |
387 | snd_soc_dai_digital_mute(codec_dai, 1); | ||
388 | 387 | ||
389 | if (cpu_dai->driver->ops->shutdown) | 388 | if (cpu_dai->driver->ops->shutdown) |
390 | cpu_dai->driver->ops->shutdown(substream, cpu_dai); | 389 | cpu_dai->driver->ops->shutdown(substream, cpu_dai); |
@@ -488,7 +487,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) | |||
488 | snd_soc_dapm_stream_event(rtd, substream->stream, | 487 | snd_soc_dapm_stream_event(rtd, substream->stream, |
489 | SND_SOC_DAPM_STREAM_START); | 488 | SND_SOC_DAPM_STREAM_START); |
490 | 489 | ||
491 | snd_soc_dai_digital_mute(codec_dai, 0); | 490 | snd_soc_dai_digital_mute(codec_dai, 0, substream->stream); |
492 | 491 | ||
493 | out: | 492 | out: |
494 | mutex_unlock(&rtd->pcm_mutex); | 493 | mutex_unlock(&rtd->pcm_mutex); |
@@ -586,7 +585,7 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) | |||
586 | 585 | ||
587 | /* apply codec digital mute */ | 586 | /* apply codec digital mute */ |
588 | if (!codec->active) | 587 | if (!codec->active) |
589 | snd_soc_dai_digital_mute(codec_dai, 1); | 588 | snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); |
590 | 589 | ||
591 | /* free any machine hw params */ | 590 | /* free any machine hw params */ |
592 | if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free) | 591 | if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free) |