|
@@ -7227,6 +7227,37 @@ static void alc269_fill_coef(struct hda_codec *codec)
|
|
|
alc_update_coef_idx(codec, 0x4, 0, 1<<11);
|
|
|
}
|
|
|
|
|
|
+static void alc294_hp_init(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
+ hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
|
|
+ int i, val;
|
|
|
+
|
|
|
+ if (!hp_pin)
|
|
|
+ return;
|
|
|
+
|
|
|
+ snd_hda_codec_write(codec, hp_pin, 0,
|
|
|
+ AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
|
|
|
+
|
|
|
+ msleep(100);
|
|
|
+
|
|
|
+ snd_hda_codec_write(codec, hp_pin, 0,
|
|
|
+ AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
|
|
|
+
|
|
|
+ alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
|
|
|
+ alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
|
|
|
+
|
|
|
+ /* Wait for depop procedure finish */
|
|
|
+ val = alc_read_coefex_idx(codec, 0x58, 0x01);
|
|
|
+ for (i = 0; i < 20 && val & 0x0080; i++) {
|
|
|
+ msleep(50);
|
|
|
+ val = alc_read_coefex_idx(codec, 0x58, 0x01);
|
|
|
+ }
|
|
|
+ /* Set HP depop to auto mode */
|
|
|
+ alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
|
|
|
+ msleep(50);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
*/
|
|
|
static int patch_alc269(struct hda_codec *codec)
|
|
@@ -7352,6 +7383,7 @@ static int patch_alc269(struct hda_codec *codec)
|
|
|
spec->codec_variant = ALC269_TYPE_ALC294;
|
|
|
spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
|
|
|
alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
|
|
|
+ alc294_hp_init(codec);
|
|
|
break;
|
|
|
case 0x10ec0300:
|
|
|
spec->codec_variant = ALC269_TYPE_ALC300;
|
|
@@ -7363,6 +7395,7 @@ static int patch_alc269(struct hda_codec *codec)
|
|
|
spec->codec_variant = ALC269_TYPE_ALC700;
|
|
|
spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
|
|
|
alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
|
|
|
+ alc294_hp_init(codec);
|
|
|
break;
|
|
|
|
|
|
}
|