aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/tlv320dac33.c23
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
357static 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
357static int dac33_hard_power(struct snd_soc_codec *codec, int power) 372static 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
405static int playback_event(struct snd_soc_dapm_widget *w, 420static 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
615static const struct snd_soc_dapm_route audio_map[] = { 634static const struct snd_soc_dapm_route audio_map[] = {