|
@@ -3110,6 +3110,29 @@ static void stac92hd71bxx_fixup_hp_hdx(struct hda_codec *codec,
|
|
|
spec->gpio_led = 0x08;
|
|
|
}
|
|
|
|
|
|
+static bool is_hp_output(struct hda_codec *codec, hda_nid_t pin)
|
|
|
+{
|
|
|
+ unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin);
|
|
|
+
|
|
|
+ /* count line-out, too, as BIOS sets often so */
|
|
|
+ return get_defcfg_connect(pin_cfg) != AC_JACK_PORT_NONE &&
|
|
|
+ (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
|
|
|
+ get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT);
|
|
|
+}
|
|
|
+
|
|
|
+static void fixup_hp_headphone(struct hda_codec *codec, hda_nid_t pin)
|
|
|
+{
|
|
|
+ unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin);
|
|
|
+
|
|
|
+ /* It was changed in the BIOS to just satisfy MS DTM.
|
|
|
+ * Lets turn it back into slaved HP
|
|
|
+ */
|
|
|
+ pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) |
|
|
|
+ (AC_JACK_HP_OUT << AC_DEFCFG_DEVICE_SHIFT);
|
|
|
+ pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | AC_DEFCFG_SEQUENCE))) |
|
|
|
+ 0x1f;
|
|
|
+ snd_hda_codec_set_pincfg(codec, pin, pin_cfg);
|
|
|
+}
|
|
|
|
|
|
static void stac92hd71bxx_fixup_hp(struct hda_codec *codec,
|
|
|
const struct hda_fixup *fix, int action)
|
|
@@ -3119,22 +3142,12 @@ static void stac92hd71bxx_fixup_hp(struct hda_codec *codec,
|
|
|
if (action != HDA_FIXUP_ACT_PRE_PROBE)
|
|
|
return;
|
|
|
|
|
|
- if (hp_blike_system(codec->core.subsystem_id)) {
|
|
|
- unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f);
|
|
|
- if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
|
|
|
- get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER ||
|
|
|
- get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) {
|
|
|
- /* It was changed in the BIOS to just satisfy MS DTM.
|
|
|
- * Lets turn it back into slaved HP
|
|
|
- */
|
|
|
- pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE))
|
|
|
- | (AC_JACK_HP_OUT <<
|
|
|
- AC_DEFCFG_DEVICE_SHIFT);
|
|
|
- pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC
|
|
|
- | AC_DEFCFG_SEQUENCE)))
|
|
|
- | 0x1f;
|
|
|
- snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg);
|
|
|
- }
|
|
|
+ /* when both output A and F are assigned, these are supposedly
|
|
|
+ * dock and built-in headphones; fix both pin configs
|
|
|
+ */
|
|
|
+ if (is_hp_output(codec, 0x0a) && is_hp_output(codec, 0x0f)) {
|
|
|
+ fixup_hp_headphone(codec, 0x0a);
|
|
|
+ fixup_hp_headphone(codec, 0x0f);
|
|
|
}
|
|
|
|
|
|
if (find_mute_led_cfg(codec, 1))
|