diff options
-rw-r--r-- | sound/soc/codecs/tlv320dac33.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index b3445b362e96..776ac80cc1a8 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c | |||
@@ -354,6 +354,21 @@ static inline void dac33_soft_power(struct snd_soc_codec *codec, int power) | |||
354 | dac33_write(codec, DAC33_PWR_CTRL, reg); | 354 | dac33_write(codec, DAC33_PWR_CTRL, reg); |
355 | } | 355 | } |
356 | 356 | ||
357 | static inline void dac33_disable_digital(struct snd_soc_codec *codec) | ||
358 | { | ||
359 | u8 reg; | ||
360 | |||
361 | /* Stop the DAI clock */ | ||
362 | reg = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B); | ||
363 | reg &= ~DAC33_BCLKON; | ||
364 | dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg); | ||
365 | |||
366 | /* Power down the Oscillator, and DACs */ | ||
367 | reg = dac33_read_reg_cache(codec, DAC33_PWR_CTRL); | ||
368 | reg &= ~(DAC33_OSCPDNB | DAC33_DACRPDNB | DAC33_DACLPDNB); | ||
369 | dac33_write(codec, DAC33_PWR_CTRL, reg); | ||
370 | } | ||
371 | |||
357 | static int dac33_hard_power(struct snd_soc_codec *codec, int power) | 372 | static int dac33_hard_power(struct snd_soc_codec *codec, int power) |
358 | { | 373 | { |
359 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); | 374 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); |
@@ -402,7 +417,7 @@ exit: | |||
402 | return ret; | 417 | return ret; |
403 | } | 418 | } |
404 | 419 | ||
405 | static int playback_event(struct snd_soc_dapm_widget *w, | 420 | static int dac33_playback_event(struct snd_soc_dapm_widget *w, |
406 | struct snd_kcontrol *kcontrol, int event) | 421 | struct snd_kcontrol *kcontrol, int event) |
407 | { | 422 | { |
408 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(w->codec); | 423 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(w->codec); |
@@ -414,6 +429,9 @@ static int playback_event(struct snd_soc_dapm_widget *w, | |||
414 | dac33_prepare_chip(dac33->substream); | 429 | dac33_prepare_chip(dac33->substream); |
415 | } | 430 | } |
416 | break; | 431 | break; |
432 | case SND_SOC_DAPM_POST_PMD: | ||
433 | dac33_disable_digital(w->codec); | ||
434 | break; | ||
417 | } | 435 | } |
418 | return 0; | 436 | return 0; |
419 | } | 437 | } |
@@ -609,7 +627,8 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = { | |||
609 | SND_SOC_DAPM_SUPPLY("Right DAC Power", | 627 | SND_SOC_DAPM_SUPPLY("Right DAC Power", |
610 | DAC33_RDAC_PWR_CTRL, 2, 0, NULL, 0), | 628 | DAC33_RDAC_PWR_CTRL, 2, 0, NULL, 0), |
611 | 629 | ||
612 | SND_SOC_DAPM_PRE("Prepare Playback", playback_event), | 630 | SND_SOC_DAPM_PRE("Pre Playback", dac33_playback_event), |
631 | SND_SOC_DAPM_POST("Post Playback", dac33_playback_event), | ||
613 | }; | 632 | }; |
614 | 633 | ||
615 | static const struct snd_soc_dapm_route audio_map[] = { | 634 | static const struct snd_soc_dapm_route audio_map[] = { |