Commit d2a764dd authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/hda' into for-linus

parents 6f775ba0 defb5ab2
...@@ -1332,15 +1332,20 @@ static int alc_subsystem_id(struct hda_codec *codec, ...@@ -1332,15 +1332,20 @@ static int alc_subsystem_id(struct hda_codec *codec,
* when the external headphone out jack is plugged" * when the external headphone out jack is plugged"
*/ */
if (!spec->autocfg.hp_pins[0]) { if (!spec->autocfg.hp_pins[0]) {
hda_nid_t nid;
tmp = (ass >> 11) & 0x3; /* HP to chassis */ tmp = (ass >> 11) & 0x3; /* HP to chassis */
if (tmp == 0) if (tmp == 0)
spec->autocfg.hp_pins[0] = porta; nid = porta;
else if (tmp == 1) else if (tmp == 1)
spec->autocfg.hp_pins[0] = porte; nid = porte;
else if (tmp == 2) else if (tmp == 2)
spec->autocfg.hp_pins[0] = portd; nid = portd;
else else
return 1; return 1;
for (i = 0; i < spec->autocfg.line_outs; i++)
if (spec->autocfg.line_out_pins[i] == nid)
return 1;
spec->autocfg.hp_pins[0] = nid;
} }
alc_init_auto_hp(codec); alc_init_auto_hp(codec);
...@@ -1362,7 +1367,7 @@ static void alc_ssid_check(struct hda_codec *codec, ...@@ -1362,7 +1367,7 @@ static void alc_ssid_check(struct hda_codec *codec,
} }
/* /*
* Fix-up pin default configurations * Fix-up pin default configurations and add default verbs
*/ */
struct alc_pincfg { struct alc_pincfg {
...@@ -1370,9 +1375,14 @@ struct alc_pincfg { ...@@ -1370,9 +1375,14 @@ struct alc_pincfg {
u32 val; u32 val;
}; };
static void alc_fix_pincfg(struct hda_codec *codec, struct alc_fixup {
const struct alc_pincfg *pins;
const struct hda_verb *verbs;
};
static void alc_pick_fixup(struct hda_codec *codec,
const struct snd_pci_quirk *quirk, const struct snd_pci_quirk *quirk,
const struct alc_pincfg **pinfix) const struct alc_fixup *fix)
{ {
const struct alc_pincfg *cfg; const struct alc_pincfg *cfg;
...@@ -1380,9 +1390,14 @@ static void alc_fix_pincfg(struct hda_codec *codec, ...@@ -1380,9 +1390,14 @@ static void alc_fix_pincfg(struct hda_codec *codec,
if (!quirk) if (!quirk)
return; return;
cfg = pinfix[quirk->value]; fix += quirk->value;
cfg = fix->pins;
if (cfg) {
for (; cfg->nid; cfg++) for (; cfg->nid; cfg++)
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
}
if (fix->verbs)
add_verb(codec->spec, fix->verbs);
} }
/* /*
...@@ -9593,11 +9608,13 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { ...@@ -9593,11 +9608,13 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
{ } { }
}; };
static const struct alc_pincfg *alc882_pin_fixes[] = { static const struct alc_fixup alc882_fixups[] = {
[PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix, [PINFIX_ABIT_AW9D_MAX] = {
.pins = alc882_abit_aw9d_pinfix
},
}; };
static struct snd_pci_quirk alc882_pinfix_tbl[] = { static struct snd_pci_quirk alc882_fixup_tbl[] = {
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
{} {}
}; };
...@@ -9869,7 +9886,7 @@ static int patch_alc882(struct hda_codec *codec) ...@@ -9869,7 +9886,7 @@ static int patch_alc882(struct hda_codec *codec)
board_config = ALC882_AUTO; board_config = ALC882_AUTO;
} }
alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes); alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
if (board_config == ALC882_AUTO) { if (board_config == ALC882_AUTO) {
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
...@@ -12842,12 +12859,15 @@ static int patch_alc268(struct hda_codec *codec) ...@@ -12842,12 +12859,15 @@ static int patch_alc268(struct hda_codec *codec)
unsigned int wcap = get_wcaps(codec, 0x07); unsigned int wcap = get_wcaps(codec, 0x07);
int i; int i;
spec->capsrc_nids = alc268_capsrc_nids;
/* get type */ /* get type */
wcap = get_wcaps_type(wcap); wcap = get_wcaps_type(wcap);
if (spec->auto_mic || if (spec->auto_mic ||
wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
spec->adc_nids = alc268_adc_nids_alt; spec->adc_nids = alc268_adc_nids_alt;
spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
if (spec->auto_mic)
fixup_automic_adc(codec);
if (spec->auto_mic || spec->input_mux->num_items == 1) if (spec->auto_mic || spec->input_mux->num_items == 1)
add_mixer(spec, alc268_capture_nosrc_mixer); add_mixer(spec, alc268_capture_nosrc_mixer);
else else
...@@ -12857,7 +12877,6 @@ static int patch_alc268(struct hda_codec *codec) ...@@ -12857,7 +12877,6 @@ static int patch_alc268(struct hda_codec *codec)
spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
add_mixer(spec, alc268_capture_mixer); add_mixer(spec, alc268_capture_mixer);
} }
spec->capsrc_nids = alc268_capsrc_nids;
/* set default input source */ /* set default input source */
for (i = 0; i < spec->num_adc_nids; i++) for (i = 0; i < spec->num_adc_nids; i++)
snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
...@@ -14357,15 +14376,16 @@ static void alc861_auto_init_multi_out(struct hda_codec *codec) ...@@ -14357,15 +14376,16 @@ static void alc861_auto_init_multi_out(struct hda_codec *codec)
static void alc861_auto_init_hp_out(struct hda_codec *codec) static void alc861_auto_init_hp_out(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
hda_nid_t pin;
pin = spec->autocfg.hp_pins[0]; if (spec->autocfg.hp_outs)
if (pin) alc861_auto_set_output_and_unmute(codec,
alc861_auto_set_output_and_unmute(codec, pin, PIN_HP, spec->autocfg.hp_pins[0],
PIN_HP,
spec->multiout.hp_nid); spec->multiout.hp_nid);
pin = spec->autocfg.speaker_pins[0]; if (spec->autocfg.speaker_outs)
if (pin) alc861_auto_set_output_and_unmute(codec,
alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT, spec->autocfg.speaker_pins[0],
PIN_OUT,
spec->multiout.dac_nids[0]); spec->multiout.dac_nids[0]);
} }
...@@ -15158,7 +15178,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = { ...@@ -15158,7 +15178,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST), /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
...@@ -15551,6 +15571,29 @@ static void alc861vd_auto_init(struct hda_codec *codec) ...@@ -15551,6 +15571,29 @@ static void alc861vd_auto_init(struct hda_codec *codec)
alc_inithook(codec); alc_inithook(codec);
} }
enum {
ALC660VD_FIX_ASUS_GPIO1
};
/* reset GPIO1 */
static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
{ }
};
static const struct alc_fixup alc861vd_fixups[] = {
[ALC660VD_FIX_ASUS_GPIO1] = {
.verbs = alc660vd_fix_asus_gpio1_verbs,
},
};
static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
{}
};
static int patch_alc861vd(struct hda_codec *codec) static int patch_alc861vd(struct hda_codec *codec)
{ {
struct alc_spec *spec; struct alc_spec *spec;
...@@ -15572,6 +15615,8 @@ static int patch_alc861vd(struct hda_codec *codec) ...@@ -15572,6 +15615,8 @@ static int patch_alc861vd(struct hda_codec *codec)
board_config = ALC861VD_AUTO; board_config = ALC861VD_AUTO;
} }
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
if (board_config == ALC861VD_AUTO) { if (board_config == ALC861VD_AUTO) {
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
err = alc861vd_parse_auto_config(codec); err = alc861vd_parse_auto_config(codec);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment