|
@@ -354,6 +354,21 @@ static inline void dac33_soft_power(struct snd_soc_codec *codec, int power)
|
|
|
dac33_write(codec, DAC33_PWR_CTRL, reg);
|
|
|
}
|
|
|
|
|
|
+static inline void dac33_disable_digital(struct snd_soc_codec *codec)
|
|
|
+{
|
|
|
+ u8 reg;
|
|
|
+
|
|
|
+ /* Stop the DAI clock */
|
|
|
+ reg = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B);
|
|
|
+ reg &= ~DAC33_BCLKON;
|
|
|
+ dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg);
|
|
|
+
|
|
|
+ /* Power down the Oscillator, and DACs */
|
|
|
+ reg = dac33_read_reg_cache(codec, DAC33_PWR_CTRL);
|
|
|
+ reg &= ~(DAC33_OSCPDNB | DAC33_DACRPDNB | DAC33_DACLPDNB);
|
|
|
+ dac33_write(codec, DAC33_PWR_CTRL, reg);
|
|
|
+}
|
|
|
+
|
|
|
static int dac33_hard_power(struct snd_soc_codec *codec, int power)
|
|
|
{
|
|
|
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
|
|
@@ -402,7 +417,7 @@ exit:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int playback_event(struct snd_soc_dapm_widget *w,
|
|
|
+static int dac33_playback_event(struct snd_soc_dapm_widget *w,
|
|
|
struct snd_kcontrol *kcontrol, int event)
|
|
|
{
|
|
|
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,
|
|
|
dac33_prepare_chip(dac33->substream);
|
|
|
}
|
|
|
break;
|
|
|
+ case SND_SOC_DAPM_POST_PMD:
|
|
|
+ dac33_disable_digital(w->codec);
|
|
|
+ break;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -609,7 +627,8 @@ static const struct snd_soc_dapm_widget dac33_dapm_widgets[] = {
|
|
|
SND_SOC_DAPM_SUPPLY("Right DAC Power",
|
|
|
DAC33_RDAC_PWR_CTRL, 2, 0, NULL, 0),
|
|
|
|
|
|
- SND_SOC_DAPM_PRE("Prepare Playback", playback_event),
|
|
|
+ SND_SOC_DAPM_PRE("Pre Playback", dac33_playback_event),
|
|
|
+ SND_SOC_DAPM_POST("Post Playback", dac33_playback_event),
|
|
|
};
|
|
|
|
|
|
static const struct snd_soc_dapm_route audio_map[] = {
|