|
@@ -984,6 +984,35 @@ static int rt5640_hp_event(struct snd_soc_dapm_widget *w,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int rt5640_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_POST_PMU:
|
|
|
|
+ hp_amp_power_on(codec);
|
|
|
|
+ snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
|
|
|
|
+ RT5640_PWR_LM, RT5640_PWR_LM);
|
|
|
|
+ snd_soc_update_bits(codec, RT5640_OUTPUT,
|
|
|
|
+ RT5640_L_MUTE | RT5640_R_MUTE, 0);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case SND_SOC_DAPM_PRE_PMD:
|
|
|
|
+ snd_soc_update_bits(codec, RT5640_OUTPUT,
|
|
|
|
+ RT5640_L_MUTE | RT5640_R_MUTE,
|
|
|
|
+ RT5640_L_MUTE | RT5640_R_MUTE);
|
|
|
|
+ snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
|
|
|
|
+ RT5640_PWR_LM, 0);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
|
|
static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
|
|
struct snd_kcontrol *kcontrol, int event)
|
|
struct snd_kcontrol *kcontrol, int event)
|
|
{
|
|
{
|
|
@@ -1179,13 +1208,16 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
|
|
0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)),
|
|
0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)),
|
|
SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0,
|
|
SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0,
|
|
0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)),
|
|
0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)),
|
|
- SND_SOC_DAPM_MIXER("LOUT MIX", RT5640_PWR_ANLG1, RT5640_PWR_LM_BIT, 0,
|
|
|
|
|
|
+ SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0,
|
|
rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)),
|
|
rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)),
|
|
SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
|
|
SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
|
|
0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
|
|
0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
|
|
SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
|
|
rt5640_hp_event,
|
|
rt5640_hp_event,
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
|
|
+ SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0,
|
|
|
|
+ rt5640_lout_event,
|
|
|
|
+ SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
|
|
SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
|
|
RT5640_PWR_HP_L_BIT, 0, NULL, 0),
|
|
RT5640_PWR_HP_L_BIT, 0, NULL, 0),
|
|
SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
|
|
SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
|
|
@@ -1500,8 +1532,10 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
|
|
{"HP R Playback", "Switch", "HP Amp"},
|
|
{"HP R Playback", "Switch", "HP Amp"},
|
|
{"HPOL", NULL, "HP L Playback"},
|
|
{"HPOL", NULL, "HP L Playback"},
|
|
{"HPOR", NULL, "HP R Playback"},
|
|
{"HPOR", NULL, "HP R Playback"},
|
|
- {"LOUTL", NULL, "LOUT MIX"},
|
|
|
|
- {"LOUTR", NULL, "LOUT MIX"},
|
|
|
|
|
|
+
|
|
|
|
+ {"LOUT amp", NULL, "LOUT MIX"},
|
|
|
|
+ {"LOUTL", NULL, "LOUT amp"},
|
|
|
|
+ {"LOUTR", NULL, "LOUT amp"},
|
|
};
|
|
};
|
|
|
|
|
|
static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = {
|
|
static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = {
|