ALSA: hda/realtek - Rewrite ALC880 model=futjisu with auto-parser
Now adding the support for the volume-knob widget, we can move the static quirk for ALC880 model=fujitsu to the auto-parser completely. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
589876e243
Коммит
cf5a22793c
|
@ -14,7 +14,6 @@ ALC880
|
|||
asus-dig ASUS with SPDIF out
|
||||
asus-dig2 ASUS with SPDIF out (using GPIO2)
|
||||
uniwill 3-jack
|
||||
fujitsu Fujitsu Laptops (Pi1536)
|
||||
F1734 2-jack
|
||||
test for testing/debugging purpose, almost all controls can be
|
||||
adjusted. Appearing only when compiled with
|
||||
|
|
|
@ -18,7 +18,6 @@ enum {
|
|||
ALC880_ASUS_DIG,
|
||||
ALC880_ASUS_W1V,
|
||||
ALC880_ASUS_DIG2,
|
||||
ALC880_FUJITSU,
|
||||
ALC880_UNIWILL_DIG,
|
||||
ALC880_UNIWILL,
|
||||
ALC880_UNIWILL_P53,
|
||||
|
@ -371,20 +370,6 @@ static const struct snd_kcontrol_new alc880_uniwill_mixer[] = {
|
|||
{ } /* end */
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
|
||||
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
|
||||
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
|
||||
|
@ -1074,7 +1059,6 @@ static const char * const alc880_models[ALC880_MODEL_LAST] = {
|
|||
[ALC880_ASUS_DIG2] = "asus-dig2",
|
||||
[ALC880_UNIWILL_DIG] = "uniwill",
|
||||
[ALC880_UNIWILL_P53] = "uniwill-p53",
|
||||
[ALC880_FUJITSU] = "fujitsu",
|
||||
[ALC880_F1734] = "F1734",
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
[ALC880_TEST] = "test",
|
||||
|
@ -1125,9 +1109,7 @@ static const struct snd_pci_quirk alc880_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
|
||||
SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
|
||||
SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
|
||||
SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
|
||||
SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
|
||||
SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
|
||||
SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
|
||||
SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
|
||||
SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
|
||||
|
@ -1335,21 +1317,6 @@ static const struct alc_config_preset alc880_presets[] = {
|
|||
.setup = alc880_uniwill_p53_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
[ALC880_FUJITSU] = {
|
||||
.mixers = { alc880_fujitsu_mixer },
|
||||
.init_verbs = { alc880_volume_init_verbs,
|
||||
alc880_uniwill_p53_init_verbs,
|
||||
alc880_beep_init_verbs },
|
||||
.num_dacs = ARRAY_SIZE(alc880_dac_nids),
|
||||
.dac_nids = alc880_dac_nids,
|
||||
.dig_out_nid = ALC880_DIGOUT_NID,
|
||||
.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
|
||||
.channel_mode = alc880_2_jack_modes,
|
||||
.input_mux = &alc880_capture_source,
|
||||
.unsol_event = alc880_uniwill_p53_unsol_event,
|
||||
.setup = alc880_uniwill_p53_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
[ALC880_TEST] = {
|
||||
.mixers = { alc880_test_mixer },
|
||||
|
|
|
@ -651,15 +651,51 @@ static void alc_exec_unsol_event(struct hda_codec *codec, int action)
|
|||
snd_hda_jack_report_sync(codec);
|
||||
}
|
||||
|
||||
/* update the master volume per volume-knob's unsol event */
|
||||
static void alc_update_knob_master(struct hda_codec *codec, hda_nid_t nid)
|
||||
{
|
||||
unsigned int val;
|
||||
struct snd_kcontrol *kctl;
|
||||
struct snd_ctl_elem_value *uctl;
|
||||
|
||||
kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
|
||||
if (!kctl)
|
||||
return;
|
||||
uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
|
||||
if (!uctl)
|
||||
return;
|
||||
val = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
|
||||
val &= HDA_AMP_VOLMASK;
|
||||
uctl->value.integer.value[0] = val;
|
||||
uctl->value.integer.value[1] = val;
|
||||
kctl->put(kctl, uctl);
|
||||
kfree(uctl);
|
||||
}
|
||||
|
||||
/* unsolicited event for HP jack sensing */
|
||||
static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
int action;
|
||||
|
||||
if (codec->vendor_id == 0x10ec0880)
|
||||
res >>= 28;
|
||||
else
|
||||
res >>= 26;
|
||||
res = snd_hda_jack_get_action(codec, res);
|
||||
alc_exec_unsol_event(codec, res);
|
||||
action = snd_hda_jack_get_action(codec, res);
|
||||
if (res == ALC_DCVOL_EVENT) {
|
||||
/* Execute the dc-vol event here as it requires the NID
|
||||
* but we don't pass NID to alc_exec_unsol_event().
|
||||
* Once when we convert all static quirks to the auto-parser,
|
||||
* this can be integerated into there.
|
||||
*/
|
||||
struct hda_jack_tbl *jack;
|
||||
jack = snd_hda_jack_tbl_get_from_tag(codec, res);
|
||||
if (jack)
|
||||
alc_update_knob_master(codec, jack->nid);
|
||||
return;
|
||||
}
|
||||
alc_exec_unsol_event(codec, action);
|
||||
}
|
||||
|
||||
/* call init functions of standard auto-mute helpers */
|
||||
|
@ -4408,8 +4444,18 @@ enum {
|
|||
ALC880_FIXUP_W810,
|
||||
ALC880_FIXUP_EAPD_COEF,
|
||||
ALC880_FIXUP_TCL_S700,
|
||||
ALC880_FIXUP_VOL_KNOB,
|
||||
ALC880_FIXUP_FUJITSU,
|
||||
};
|
||||
|
||||
/* enable the volume-knob widget support on NID 0x21 */
|
||||
static void alc880_fixup_vol_knob(struct hda_codec *codec,
|
||||
const struct alc_fixup *fix, int action)
|
||||
{
|
||||
if (action == ALC_FIXUP_ACT_PROBE)
|
||||
snd_hda_jack_detect_enable(codec, 0x21, ALC_DCVOL_EVENT);
|
||||
}
|
||||
|
||||
static const struct alc_fixup alc880_fixups[] = {
|
||||
[ALC880_FIXUP_GPIO2] = {
|
||||
.type = ALC_FIXUP_VERBS,
|
||||
|
@ -4465,6 +4511,30 @@ static const struct alc_fixup alc880_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC880_FIXUP_GPIO2,
|
||||
},
|
||||
[ALC880_FIXUP_VOL_KNOB] = {
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc880_fixup_vol_knob,
|
||||
},
|
||||
[ALC880_FIXUP_FUJITSU] = {
|
||||
/* override all pins as BIOS on old Amilo is broken */
|
||||
.type = ALC_FIXUP_PINS,
|
||||
.v.pins = (const struct alc_pincfg[]) {
|
||||
{ 0x14, 0x0121411f }, /* HP */
|
||||
{ 0x15, 0x99030120 }, /* speaker */
|
||||
{ 0x16, 0x99030130 }, /* bass speaker */
|
||||
{ 0x17, 0x411111f0 }, /* N/A */
|
||||
{ 0x18, 0x411111f0 }, /* N/A */
|
||||
{ 0x19, 0x01a19950 }, /* mic-in */
|
||||
{ 0x1a, 0x411111f0 }, /* N/A */
|
||||
{ 0x1b, 0x411111f0 }, /* N/A */
|
||||
{ 0x1c, 0x411111f0 }, /* N/A */
|
||||
{ 0x1d, 0x411111f0 }, /* N/A */
|
||||
{ 0x1e, 0x01454140 }, /* SPDIF out */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC880_FIXUP_VOL_KNOB,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc880_fixup_tbl[] = {
|
||||
|
@ -4472,6 +4542,8 @@ static const struct snd_pci_quirk alc880_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
|
||||
SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
|
||||
SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
|
||||
SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
|
||||
SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
|
||||
SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
|
||||
SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
|
||||
SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
|
||||
|
|
Загрузка…
Ссылка в новой задаче