|
@@ -97,6 +97,9 @@
|
|
#define PMMP (1 << 2) /* MPWR pin Power Management */
|
|
#define PMMP (1 << 2) /* MPWR pin Power Management */
|
|
#define MGAIN0 (1 << 0) /* MIC amp gain*/
|
|
#define MGAIN0 (1 << 0) /* MIC amp gain*/
|
|
|
|
|
|
|
|
+/* SG_SL2 */
|
|
|
|
+#define LOPS (1 << 6) /* Stero Line-out Power Save Mode */
|
|
|
|
+
|
|
/* TIMER */
|
|
/* TIMER */
|
|
#define ZTM(param) ((param & 0x3) << 4) /* ALC Zero Crossing TimeOut */
|
|
#define ZTM(param) ((param & 0x3) << 4) /* ALC Zero Crossing TimeOut */
|
|
#define WTM(param) (((param & 0x4) << 4) | ((param & 0x3) << 2))
|
|
#define WTM(param) (((param & 0x4) << 4) | ((param & 0x3) << 2))
|
|
@@ -168,6 +171,29 @@ static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = {
|
|
SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0),
|
|
SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0),
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/* event handlers */
|
|
|
|
+static int ak4642_lout_event(struct snd_soc_dapm_widget *w,
|
|
|
|
+ struct snd_kcontrol *kcontrol, int event)
|
|
|
|
+{
|
|
|
|
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
|
|
|
+
|
|
|
|
+ switch (event) {
|
|
|
|
+ case SND_SOC_DAPM_PRE_PMD:
|
|
|
|
+ case SND_SOC_DAPM_PRE_PMU:
|
|
|
|
+ /* Power save mode ON */
|
|
|
|
+ snd_soc_update_bits(codec, SG_SL2, LOPS, LOPS);
|
|
|
|
+ break;
|
|
|
|
+ case SND_SOC_DAPM_POST_PMU:
|
|
|
|
+ case SND_SOC_DAPM_POST_PMD:
|
|
|
|
+ /* Power save mode OFF */
|
|
|
|
+ mdelay(300);
|
|
|
|
+ snd_soc_update_bits(codec, SG_SL2, LOPS, 0);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = {
|
|
static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = {
|
|
|
|
|
|
/* Outputs */
|
|
/* Outputs */
|
|
@@ -182,9 +208,12 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = {
|
|
|
|
|
|
SND_SOC_DAPM_PGA("DACH", MD_CTL4, 0, 0, NULL, 0),
|
|
SND_SOC_DAPM_PGA("DACH", MD_CTL4, 0, 0, NULL, 0),
|
|
|
|
|
|
- SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0,
|
|
|
|
|
|
+ SND_SOC_DAPM_MIXER_E("LINEOUT Mixer", PW_MGMT1, 3, 0,
|
|
&ak4642_lout_mixer_controls[0],
|
|
&ak4642_lout_mixer_controls[0],
|
|
- ARRAY_SIZE(ak4642_lout_mixer_controls)),
|
|
|
|
|
|
+ ARRAY_SIZE(ak4642_lout_mixer_controls),
|
|
|
|
+ ak4642_lout_event,
|
|
|
|
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
|
|
|
+ SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
|
|
|
|
|
|
/* DAC */
|
|
/* DAC */
|
|
SND_SOC_DAPM_DAC("DAC", NULL, PW_MGMT1, 2, 0),
|
|
SND_SOC_DAPM_DAC("DAC", NULL, PW_MGMT1, 2, 0),
|