|
@@ -1784,6 +1784,14 @@ static int alc_add_inv_dmic_mixer(struct hda_codec *codec, hda_nid_t nid)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* typically the digital mic is put at node 0x12 */
|
|
|
+static void alc_fixup_inv_dmic_0x12(struct hda_codec *codec,
|
|
|
+ const struct alc_fixup *fix, int action)
|
|
|
+{
|
|
|
+ if (action == ALC_FIXUP_ACT_PROBE)
|
|
|
+ alc_add_inv_dmic_mixer(codec, 0x12);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* virtual master controls
|
|
|
*/
|
|
@@ -5017,6 +5025,7 @@ enum {
|
|
|
ALC889_FIXUP_DAC_ROUTE,
|
|
|
ALC889_FIXUP_MBP_VREF,
|
|
|
ALC889_FIXUP_IMAC91_VREF,
|
|
|
+ ALC882_FIXUP_INV_DMIC,
|
|
|
};
|
|
|
|
|
|
static void alc889_fixup_coef(struct hda_codec *codec,
|
|
@@ -5320,6 +5329,10 @@ static const struct alc_fixup alc882_fixups[] = {
|
|
|
.chained = true,
|
|
|
.chain_id = ALC882_FIXUP_GPIO1,
|
|
|
},
|
|
|
+ [ALC882_FIXUP_INV_DMIC] = {
|
|
|
+ .type = ALC_FIXUP_FUNC,
|
|
|
+ .v.func = alc_fixup_inv_dmic_0x12,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|
@@ -5394,6 +5407,7 @@ static const struct alc_model_fixup alc882_fixup_models[] = {
|
|
|
{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
|
|
|
{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
|
|
|
{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
|
|
|
+ {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
|
|
{}
|
|
|
};
|
|
|
|
|
@@ -5481,6 +5495,7 @@ enum {
|
|
|
ALC262_FIXUP_LENOVO_3000,
|
|
|
ALC262_FIXUP_BENQ,
|
|
|
ALC262_FIXUP_BENQ_T31,
|
|
|
+ ALC262_FIXUP_INV_DMIC,
|
|
|
};
|
|
|
|
|
|
static const struct alc_fixup alc262_fixups[] = {
|
|
@@ -5532,6 +5547,10 @@ static const struct alc_fixup alc262_fixups[] = {
|
|
|
{}
|
|
|
}
|
|
|
},
|
|
|
+ [ALC262_FIXUP_INV_DMIC] = {
|
|
|
+ .type = ALC_FIXUP_FUNC,
|
|
|
+ .v.func = alc_fixup_inv_dmic_0x12,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
static const struct snd_pci_quirk alc262_fixup_tbl[] = {
|
|
@@ -5546,6 +5565,10 @@ static const struct snd_pci_quirk alc262_fixup_tbl[] = {
|
|
|
{}
|
|
|
};
|
|
|
|
|
|
+static const struct alc_model_fixup alc262_fixup_models[] = {
|
|
|
+ {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
|
|
+ {}
|
|
|
+};
|
|
|
|
|
|
/*
|
|
|
*/
|
|
@@ -5574,7 +5597,8 @@ static int patch_alc262(struct hda_codec *codec)
|
|
|
#endif
|
|
|
alc_fix_pll_init(codec, 0x20, 0x0a, 10);
|
|
|
|
|
|
- alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
|
|
|
+ alc_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
|
|
|
+ alc262_fixups);
|
|
|
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
|
|
|
|
|
|
alc_auto_parse_customize_define(codec);
|
|
@@ -5630,6 +5654,22 @@ static const struct hda_verb alc268_beep_init_verbs[] = {
|
|
|
{ }
|
|
|
};
|
|
|
|
|
|
+enum {
|
|
|
+ ALC268_FIXUP_INV_DMIC,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct alc_fixup alc268_fixups[] = {
|
|
|
+ [ALC268_FIXUP_INV_DMIC] = {
|
|
|
+ .type = ALC_FIXUP_FUNC,
|
|
|
+ .v.func = alc_fixup_inv_dmic_0x12,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static const struct alc_model_fixup alc268_fixup_models[] = {
|
|
|
+ {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* BIOS auto configuration
|
|
|
*/
|
|
@@ -5661,6 +5701,9 @@ static int patch_alc268(struct hda_codec *codec)
|
|
|
|
|
|
spec = codec->spec;
|
|
|
|
|
|
+ alc_pick_fixup(codec, alc268_fixup_models, NULL, alc268_fixups);
|
|
|
+ alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
|
|
|
+
|
|
|
/* automatic parse from the BIOS config */
|
|
|
err = alc268_parse_auto_config(codec);
|
|
|
if (err < 0)
|
|
@@ -5690,6 +5733,8 @@ static int patch_alc268(struct hda_codec *codec)
|
|
|
codec->patch_ops = alc_patch_ops;
|
|
|
spec->shutup = alc_eapd_shutup;
|
|
|
|
|
|
+ alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
error:
|
|
@@ -5918,13 +5963,6 @@ static void alc269_fixup_mic2_mute(struct hda_codec *codec,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void alc269_fixup_inv_dmic(struct hda_codec *codec,
|
|
|
- const struct alc_fixup *fix, int action)
|
|
|
-{
|
|
|
- if (action == ALC_FIXUP_ACT_PROBE)
|
|
|
- alc_add_inv_dmic_mixer(codec, 0x12);
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
enum {
|
|
|
ALC269_FIXUP_SONY_VAIO,
|
|
@@ -6071,7 +6109,7 @@ static const struct alc_fixup alc269_fixups[] = {
|
|
|
},
|
|
|
[ALC269_FIXUP_INV_DMIC] = {
|
|
|
.type = ALC_FIXUP_FUNC,
|
|
|
- .v.func = alc269_fixup_inv_dmic,
|
|
|
+ .v.func = alc_fixup_inv_dmic_0x12,
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -6157,6 +6195,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
|
static const struct alc_model_fixup alc269_fixup_models[] = {
|
|
|
{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
|
|
|
{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
|
|
|
+ {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
|
|
|
+ {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
|
|
|
+ {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
|
|
{}
|
|
|
};
|
|
|
|
|
@@ -6550,8 +6591,6 @@ static void alc272_fixup_mario(struct hda_codec *codec,
|
|
|
"hda_codec: failed to override amp caps for NID 0x2\n");
|
|
|
}
|
|
|
|
|
|
-#define alc662_fixup_inv_dmic alc269_fixup_inv_dmic
|
|
|
-
|
|
|
enum {
|
|
|
ALC662_FIXUP_ASPIRE,
|
|
|
ALC662_FIXUP_IDEAPAD,
|
|
@@ -6728,7 +6767,7 @@ static const struct alc_fixup alc662_fixups[] = {
|
|
|
},
|
|
|
[ALC662_FIXUP_INV_DMIC] = {
|
|
|
.type = ALC_FIXUP_FUNC,
|
|
|
- .v.func = alc662_fixup_inv_dmic,
|
|
|
+ .v.func = alc_fixup_inv_dmic_0x12,
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -6817,6 +6856,7 @@ static const struct alc_model_fixup alc662_fixup_models[] = {
|
|
|
{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
|
|
|
{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
|
|
|
{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
|
|
|
+ {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
|
|
{}
|
|
|
};
|
|
|
|