Commit b265faed authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/hda' into topic/hda

parents 60508abe 3d83e577
...@@ -1459,22 +1459,31 @@ struct alc_fixup { ...@@ -1459,22 +1459,31 @@ struct alc_fixup {
static void alc_pick_fixup(struct hda_codec *codec, static void alc_pick_fixup(struct hda_codec *codec,
const struct snd_pci_quirk *quirk, const struct snd_pci_quirk *quirk,
const struct alc_fixup *fix) const struct alc_fixup *fix,
int pre_init)
{ {
const struct alc_pincfg *cfg; const struct alc_pincfg *cfg;
quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
if (!quirk) if (!quirk)
return; return;
fix += quirk->value; fix += quirk->value;
cfg = fix->pins; cfg = fix->pins;
if (cfg) { if (pre_init && cfg) {
#ifdef CONFIG_SND_DEBUG_VERBOSE
snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
codec->chip_name, quirk->name);
#endif
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) if (!pre_init && fix->verbs) {
#ifdef CONFIG_SND_DEBUG_VERBOSE
snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
codec->chip_name, quirk->name);
#endif
add_verb(codec->spec, fix->verbs); add_verb(codec->spec, fix->verbs);
}
} }
static int alc_read_coef_idx(struct hda_codec *codec, static int alc_read_coef_idx(struct hda_codec *codec,
...@@ -10535,7 +10544,8 @@ static int patch_alc882(struct hda_codec *codec) ...@@ -10535,7 +10544,8 @@ static int patch_alc882(struct hda_codec *codec)
board_config = ALC882_AUTO; board_config = ALC882_AUTO;
} }
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups); if (board_config == ALC882_AUTO)
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
if (board_config == ALC882_AUTO) { if (board_config == ALC882_AUTO) {
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
...@@ -10610,6 +10620,9 @@ static int patch_alc882(struct hda_codec *codec) ...@@ -10610,6 +10620,9 @@ static int patch_alc882(struct hda_codec *codec)
if (spec->cdefine.enable_pcbeep) if (spec->cdefine.enable_pcbeep)
set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
if (board_config == ALC882_AUTO)
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
spec->vmaster_nid = 0x0c; spec->vmaster_nid = 0x0c;
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
...@@ -14192,6 +14205,27 @@ static void alc269_auto_init(struct hda_codec *codec) ...@@ -14192,6 +14205,27 @@ static void alc269_auto_init(struct hda_codec *codec)
alc_inithook(codec); alc_inithook(codec);
} }
enum {
ALC269_FIXUP_SONY_VAIO,
};
const static struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
{}
};
static const struct alc_fixup alc269_fixups[] = {
[ALC269_FIXUP_SONY_VAIO] = {
.verbs = alc269_sony_vaio_fixup_verbs
},
};
static struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
{}
};
/* /*
* configuration and preset * configuration and preset
*/ */
...@@ -14251,7 +14285,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = { ...@@ -14251,7 +14285,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = {
ALC269_DMIC), ALC269_DMIC),
SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC), SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC), SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC), SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
...@@ -14405,6 +14439,9 @@ static int patch_alc269(struct hda_codec *codec) ...@@ -14405,6 +14439,9 @@ static int patch_alc269(struct hda_codec *codec)
board_config = ALC269_AUTO; board_config = ALC269_AUTO;
} }
if (board_config == ALC269_AUTO)
alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
if (board_config == ALC269_AUTO) { if (board_config == ALC269_AUTO) {
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
err = alc269_parse_auto_config(codec); err = alc269_parse_auto_config(codec);
...@@ -14458,6 +14495,9 @@ static int patch_alc269(struct hda_codec *codec) ...@@ -14458,6 +14495,9 @@ static int patch_alc269(struct hda_codec *codec)
if (spec->cdefine.enable_pcbeep) if (spec->cdefine.enable_pcbeep)
set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
if (board_config == ALC269_AUTO)
alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
spec->vmaster_nid = 0x02; spec->vmaster_nid = 0x02;
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
...@@ -15548,7 +15588,8 @@ static int patch_alc861(struct hda_codec *codec) ...@@ -15548,7 +15588,8 @@ static int patch_alc861(struct hda_codec *codec)
board_config = ALC861_AUTO; board_config = ALC861_AUTO;
} }
alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups); if (board_config == ALC861_AUTO)
alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
if (board_config == ALC861_AUTO) { if (board_config == ALC861_AUTO) {
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
...@@ -15585,6 +15626,9 @@ static int patch_alc861(struct hda_codec *codec) ...@@ -15585,6 +15626,9 @@ static int patch_alc861(struct hda_codec *codec)
spec->vmaster_nid = 0x03; spec->vmaster_nid = 0x03;
if (board_config == ALC861_AUTO)
alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
if (board_config == ALC861_AUTO) { if (board_config == ALC861_AUTO) {
spec->init_hook = alc861_auto_init; spec->init_hook = alc861_auto_init;
...@@ -16519,7 +16563,8 @@ static int patch_alc861vd(struct hda_codec *codec) ...@@ -16519,7 +16563,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)
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
if (board_config == ALC861VD_AUTO) { if (board_config == ALC861VD_AUTO) {
/* automatic parse from the BIOS config */ /* automatic parse from the BIOS config */
...@@ -16567,6 +16612,9 @@ static int patch_alc861vd(struct hda_codec *codec) ...@@ -16567,6 +16612,9 @@ static int patch_alc861vd(struct hda_codec *codec)
spec->vmaster_nid = 0x02; spec->vmaster_nid = 0x02;
if (board_config == ALC861VD_AUTO)
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
if (board_config == ALC861VD_AUTO) if (board_config == ALC861VD_AUTO)
......
...@@ -476,7 +476,7 @@ static struct snd_kcontrol_new *via_clone_control(struct via_spec *spec, ...@@ -476,7 +476,7 @@ static struct snd_kcontrol_new *via_clone_control(struct via_spec *spec,
knew->name = kstrdup(tmpl->name, GFP_KERNEL); knew->name = kstrdup(tmpl->name, GFP_KERNEL);
if (!knew->name) if (!knew->name)
return NULL; return NULL;
return 0; return knew;
} }
static void via_free_kctls(struct hda_codec *codec) static void via_free_kctls(struct hda_codec *codec)
...@@ -1215,14 +1215,13 @@ static struct snd_kcontrol_new via_hp_mixer[2] = { ...@@ -1215,14 +1215,13 @@ static struct snd_kcontrol_new via_hp_mixer[2] = {
}, },
}; };
static int via_hp_build(struct via_spec *spec) static int via_hp_build(struct hda_codec *codec)
{ {
struct via_spec *spec = codec->spec;
struct snd_kcontrol_new *knew; struct snd_kcontrol_new *knew;
hda_nid_t nid; hda_nid_t nid;
int nums;
knew = via_clone_control(spec, &via_hp_mixer[0]); hda_nid_t conn[HDA_MAX_CONNECTIONS];
if (knew == NULL)
return -ENOMEM;
switch (spec->codec_type) { switch (spec->codec_type) {
case VT1718S: case VT1718S:
...@@ -1239,6 +1238,14 @@ static int via_hp_build(struct via_spec *spec) ...@@ -1239,6 +1238,14 @@ static int via_hp_build(struct via_spec *spec)
break; break;
} }
nums = snd_hda_get_connections(codec, nid, conn, HDA_MAX_CONNECTIONS);
if (nums <= 1)
return 0;
knew = via_clone_control(spec, &via_hp_mixer[0]);
if (knew == NULL)
return -ENOMEM;
knew->subdevice = HDA_SUBDEV_NID_FLAG | nid; knew->subdevice = HDA_SUBDEV_NID_FLAG | nid;
knew->private_value = nid; knew->private_value = nid;
...@@ -2561,7 +2568,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec) ...@@ -2561,7 +2568,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
via_smart51_build(spec); via_smart51_build(spec);
return 1; return 1;
...@@ -3087,7 +3094,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec) ...@@ -3087,7 +3094,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
via_smart51_build(spec); via_smart51_build(spec);
return 1; return 1;
...@@ -3654,7 +3661,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec) ...@@ -3654,7 +3661,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
via_smart51_build(spec); via_smart51_build(spec);
return 1; return 1;
...@@ -4140,7 +4147,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec) ...@@ -4140,7 +4147,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
via_smart51_build(spec); via_smart51_build(spec);
return 1; return 1;
...@@ -4510,7 +4517,7 @@ static int vt1702_parse_auto_config(struct hda_codec *codec) ...@@ -4510,7 +4517,7 @@ static int vt1702_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
return 1; return 1;
} }
...@@ -4930,7 +4937,7 @@ static int vt1718S_parse_auto_config(struct hda_codec *codec) ...@@ -4930,7 +4937,7 @@ static int vt1718S_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
via_smart51_build(spec); via_smart51_build(spec);
...@@ -5425,7 +5432,7 @@ static int vt1716S_parse_auto_config(struct hda_codec *codec) ...@@ -5425,7 +5432,7 @@ static int vt1716S_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
via_smart51_build(spec); via_smart51_build(spec);
...@@ -5781,7 +5788,7 @@ static int vt2002P_parse_auto_config(struct hda_codec *codec) ...@@ -5781,7 +5788,7 @@ static int vt2002P_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
return 1; return 1;
} }
...@@ -6000,12 +6007,12 @@ static int vt1812_auto_create_multi_out_ctls(struct via_spec *spec, ...@@ -6000,12 +6007,12 @@ static int vt1812_auto_create_multi_out_ctls(struct via_spec *spec,
/* Line-Out: PortE */ /* Line-Out: PortE */
err = via_add_control(spec, VIA_CTL_WIDGET_VOL, err = via_add_control(spec, VIA_CTL_WIDGET_VOL,
"Master Front Playback Volume", "Front Playback Volume",
HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT)); HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT));
if (err < 0) if (err < 0)
return err; return err;
err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE, err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE,
"Master Front Playback Switch", "Front Playback Switch",
HDA_COMPOSE_AMP_VAL(0x28, 3, 0, HDA_OUTPUT)); HDA_COMPOSE_AMP_VAL(0x28, 3, 0, HDA_OUTPUT));
if (err < 0) if (err < 0)
return err; return err;
...@@ -6130,7 +6137,7 @@ static int vt1812_parse_auto_config(struct hda_codec *codec) ...@@ -6130,7 +6137,7 @@ static int vt1812_parse_auto_config(struct hda_codec *codec)
spec->input_mux = &spec->private_imux[0]; spec->input_mux = &spec->private_imux[0];
if (spec->hp_mux) if (spec->hp_mux)
via_hp_build(spec); via_hp_build(codec);
return 1; return 1;
} }
......
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