|
@@ -1093,6 +1093,16 @@ static void alc889_coef_init(struct hda_codec *codec)
|
|
|
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
|
|
|
}
|
|
|
|
|
|
+/* turn on/off EAPD control (only if available) */
|
|
|
+static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
|
|
|
+{
|
|
|
+ if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
|
|
|
+ return;
|
|
|
+ if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
|
|
|
+ snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
|
|
|
+ on ? 2 : 0);
|
|
|
+}
|
|
|
+
|
|
|
static void alc_auto_init_amp(struct hda_codec *codec, int type)
|
|
|
{
|
|
|
unsigned int tmp;
|
|
@@ -1110,25 +1120,22 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)
|
|
|
case ALC_INIT_DEFAULT:
|
|
|
switch (codec->vendor_id) {
|
|
|
case 0x10ec0260:
|
|
|
- snd_hda_codec_write(codec, 0x0f, 0,
|
|
|
- AC_VERB_SET_EAPD_BTLENABLE, 2);
|
|
|
- snd_hda_codec_write(codec, 0x10, 0,
|
|
|
- AC_VERB_SET_EAPD_BTLENABLE, 2);
|
|
|
+ set_eapd(codec, 0x0f, 1);
|
|
|
+ set_eapd(codec, 0x10, 1);
|
|
|
break;
|
|
|
case 0x10ec0262:
|
|
|
case 0x10ec0267:
|
|
|
case 0x10ec0268:
|
|
|
case 0x10ec0269:
|
|
|
+ case 0x10ec0270:
|
|
|
case 0x10ec0272:
|
|
|
case 0x10ec0660:
|
|
|
case 0x10ec0662:
|
|
|
case 0x10ec0663:
|
|
|
case 0x10ec0862:
|
|
|
case 0x10ec0889:
|
|
|
- snd_hda_codec_write(codec, 0x14, 0,
|
|
|
- AC_VERB_SET_EAPD_BTLENABLE, 2);
|
|
|
- snd_hda_codec_write(codec, 0x15, 0,
|
|
|
- AC_VERB_SET_EAPD_BTLENABLE, 2);
|
|
|
+ set_eapd(codec, 0x14, 1);
|
|
|
+ set_eapd(codec, 0x15, 1);
|
|
|
break;
|
|
|
}
|
|
|
switch (codec->vendor_id) {
|
|
@@ -1836,10 +1843,8 @@ static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
|
|
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
|
|
static void alc889_power_eapd(struct hda_codec *codec, int power)
|
|
|
{
|
|
|
- snd_hda_codec_write(codec, 0x14, 0,
|
|
|
- AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0);
|
|
|
- snd_hda_codec_write(codec, 0x15, 0,
|
|
|
- AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0);
|
|
|
+ set_eapd(codec, 0x14, power);
|
|
|
+ set_eapd(codec, 0x15, power);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -9473,6 +9478,7 @@ static struct alc_config_preset alc882_presets[] = {
|
|
|
.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
|
|
|
.channel_mode = alc883_3ST_6ch_modes,
|
|
|
.need_dac_fix = 1,
|
|
|
+ .const_channel_count = 6,
|
|
|
.num_mux_defs =
|
|
|
ARRAY_SIZE(alc888_2_capture_sources),
|
|
|
.input_mux = alc888_2_capture_sources,
|
|
@@ -10377,7 +10383,7 @@ static void alc262_hp_t5735_setup(struct hda_codec *codec)
|
|
|
struct alc_spec *spec = codec->spec;
|
|
|
|
|
|
spec->autocfg.hp_pins[0] = 0x15;
|
|
|
- spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */
|
|
|
+ spec->autocfg.speaker_pins[0] = 0x14;
|
|
|
}
|
|
|
|
|
|
static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
|
|
@@ -11788,9 +11794,9 @@ static struct alc_config_preset alc262_presets[] = {
|
|
|
.num_channel_mode = ARRAY_SIZE(alc262_modes),
|
|
|
.channel_mode = alc262_modes,
|
|
|
.input_mux = &alc262_capture_source,
|
|
|
- .unsol_event = alc_automute_amp_unsol_event,
|
|
|
+ .unsol_event = alc_sku_unsol_event,
|
|
|
.setup = alc262_hp_t5735_setup,
|
|
|
- .init_hook = alc_automute_amp,
|
|
|
+ .init_hook = alc_inithook,
|
|
|
},
|
|
|
[ALC262_HP_RP5700] = {
|
|
|
.mixers = { alc262_hp_rp5700_mixer },
|
|
@@ -12541,6 +12547,7 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
|
|
|
dac = 0x02;
|
|
|
break;
|
|
|
case 0x15:
|
|
|
+ case 0x21:
|
|
|
dac = 0x03;
|
|
|
break;
|
|
|
default:
|