diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b95df5d5dcc2..30eeb304351c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -559,7 +559,7 @@ static int alc_pin_mode_get(struct snd_kcontrol *kcontrol, | |||
559 | 559 | ||
560 | /* Find enumerated value for current pinctl setting */ | 560 | /* Find enumerated value for current pinctl setting */ |
561 | i = alc_pin_mode_min(dir); | 561 | i = alc_pin_mode_min(dir); |
562 | while (alc_pin_mode_values[i] != pinctl && i <= alc_pin_mode_max(dir)) | 562 | while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl) |
563 | i++; | 563 | i++; |
564 | *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); | 564 | *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); |
565 | return 0; | 565 | return 0; |
@@ -6423,9 +6423,9 @@ static struct hda_verb alc885_mbp_ch2_init[] = { | |||
6423 | }; | 6423 | }; |
6424 | 6424 | ||
6425 | /* | 6425 | /* |
6426 | * 6ch mode | 6426 | * 4ch mode |
6427 | */ | 6427 | */ |
6428 | static struct hda_verb alc885_mbp_ch6_init[] = { | 6428 | static struct hda_verb alc885_mbp_ch4_init[] = { |
6429 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 6429 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
6430 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 6430 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
6431 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, | 6431 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, |
@@ -6434,9 +6434,9 @@ static struct hda_verb alc885_mbp_ch6_init[] = { | |||
6434 | { } /* end */ | 6434 | { } /* end */ |
6435 | }; | 6435 | }; |
6436 | 6436 | ||
6437 | static struct hda_channel_mode alc885_mbp_6ch_modes[2] = { | 6437 | static struct hda_channel_mode alc885_mbp_4ch_modes[2] = { |
6438 | { 2, alc885_mbp_ch2_init }, | 6438 | { 2, alc885_mbp_ch2_init }, |
6439 | { 6, alc885_mbp_ch6_init }, | 6439 | { 4, alc885_mbp_ch4_init }, |
6440 | }; | 6440 | }; |
6441 | 6441 | ||
6442 | /* | 6442 | /* |
@@ -6497,10 +6497,11 @@ static struct snd_kcontrol_new alc882_base_mixer[] = { | |||
6497 | }; | 6497 | }; |
6498 | 6498 | ||
6499 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { | 6499 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { |
6500 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | 6500 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), |
6501 | HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | 6501 | HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), |
6502 | HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT), | 6502 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT), |
6503 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | 6503 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT), |
6504 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
6504 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 6505 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
6505 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 6506 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
6506 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), | 6507 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), |
@@ -6814,14 +6815,18 @@ static struct hda_verb alc885_mbp3_init_verbs[] = { | |||
6814 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 6815 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
6815 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 6816 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
6816 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 6817 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
6818 | /* HP mixer */ | ||
6819 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6820 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
6821 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
6817 | /* Front Pin: output 0 (0x0c) */ | 6822 | /* Front Pin: output 0 (0x0c) */ |
6818 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 6823 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
6819 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 6824 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
6820 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | 6825 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, |
6821 | /* HP Pin: output 0 (0x0d) */ | 6826 | /* HP Pin: output 0 (0x0e) */ |
6822 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, | 6827 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, |
6823 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 6828 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
6824 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | 6829 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x02}, |
6825 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 6830 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
6826 | /* Mic (rear) pin: input vref at 80% */ | 6831 | /* Mic (rear) pin: input vref at 80% */ |
6827 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 6832 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
@@ -7195,10 +7200,11 @@ static struct alc_config_preset alc882_presets[] = { | |||
7195 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, | 7200 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, |
7196 | .init_verbs = { alc885_mbp3_init_verbs, | 7201 | .init_verbs = { alc885_mbp3_init_verbs, |
7197 | alc880_gpio1_init_verbs }, | 7202 | alc880_gpio1_init_verbs }, |
7198 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | 7203 | .num_dacs = 2, |
7199 | .dac_nids = alc882_dac_nids, | 7204 | .dac_nids = alc882_dac_nids, |
7200 | .channel_mode = alc885_mbp_6ch_modes, | 7205 | .hp_nid = 0x04, |
7201 | .num_channel_mode = ARRAY_SIZE(alc885_mbp_6ch_modes), | 7206 | .channel_mode = alc885_mbp_4ch_modes, |
7207 | .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), | ||
7202 | .input_mux = &alc882_capture_source, | 7208 | .input_mux = &alc882_capture_source, |
7203 | .dig_out_nid = ALC882_DIGOUT_NID, | 7209 | .dig_out_nid = ALC882_DIGOUT_NID, |
7204 | .dig_in_nid = ALC882_DIGIN_NID, | 7210 | .dig_in_nid = ALC882_DIGIN_NID, |
@@ -12521,8 +12527,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
12521 | ALC268_TOSHIBA), | 12527 | ALC268_TOSHIBA), |
12522 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), | 12528 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), |
12523 | SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), | 12529 | SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), |
12524 | SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", | ||
12525 | ALC268_TOSHIBA), | ||
12526 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), | 12530 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), |
12527 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), | 12531 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), |
12528 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), | 12532 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), |
@@ -12530,6 +12534,15 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
12530 | {} | 12534 | {} |
12531 | }; | 12535 | }; |
12532 | 12536 | ||
12537 | /* Toshiba laptops have no unique PCI SSID but only codec SSID */ | ||
12538 | static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = { | ||
12539 | SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO), | ||
12540 | SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO), | ||
12541 | SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", | ||
12542 | ALC268_TOSHIBA), | ||
12543 | {} | ||
12544 | }; | ||
12545 | |||
12533 | static struct alc_config_preset alc268_presets[] = { | 12546 | static struct alc_config_preset alc268_presets[] = { |
12534 | [ALC267_QUANTA_IL1] = { | 12547 | [ALC267_QUANTA_IL1] = { |
12535 | .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, | 12548 | .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, |
@@ -12696,6 +12709,10 @@ static int patch_alc268(struct hda_codec *codec) | |||
12696 | alc268_models, | 12709 | alc268_models, |
12697 | alc268_cfg_tbl); | 12710 | alc268_cfg_tbl); |
12698 | 12711 | ||
12712 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) | ||
12713 | board_config = snd_hda_check_board_codec_sid_config(codec, | ||
12714 | ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl); | ||
12715 | |||
12699 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { | 12716 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { |
12700 | printk(KERN_INFO "hda_codec: Unknown model for %s, " | 12717 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
12701 | "trying auto-probe from BIOS...\n", codec->chip_name); | 12718 | "trying auto-probe from BIOS...\n", codec->chip_name); |
@@ -13563,6 +13580,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
13563 | set_capture_mixer(spec); | 13580 | set_capture_mixer(spec); |
13564 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 13581 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
13565 | 13582 | ||
13583 | spec->vmaster_nid = 0x02; | ||
13584 | |||
13566 | codec->patch_ops = alc_patch_ops; | 13585 | codec->patch_ops = alc_patch_ops; |
13567 | if (board_config == ALC269_AUTO) | 13586 | if (board_config == ALC269_AUTO) |
13568 | spec->init_hook = alc269_auto_init; | 13587 | spec->init_hook = alc269_auto_init; |
@@ -15157,7 +15176,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = { | |||
15157 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), | 15176 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), |
15158 | SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), | 15177 | SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), |
15159 | /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ | 15178 | /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ |
15160 | SND_PCI_QUIRK(0x1179, 0xff01, "DALLAS", ALC861VD_DALLAS), | 15179 | SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO), |
15161 | SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), | 15180 | SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), |
15162 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), | 15181 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), |
15163 | SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), | 15182 | SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), |
@@ -15577,9 +15596,12 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
15577 | spec->stream_digital_playback = &alc861vd_pcm_digital_playback; | 15596 | spec->stream_digital_playback = &alc861vd_pcm_digital_playback; |
15578 | spec->stream_digital_capture = &alc861vd_pcm_digital_capture; | 15597 | spec->stream_digital_capture = &alc861vd_pcm_digital_capture; |
15579 | 15598 | ||
15580 | spec->adc_nids = alc861vd_adc_nids; | 15599 | if (!spec->adc_nids) { |
15581 | spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); | 15600 | spec->adc_nids = alc861vd_adc_nids; |
15582 | spec->capsrc_nids = alc861vd_capsrc_nids; | 15601 | spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); |
15602 | } | ||
15603 | if (!spec->capsrc_nids) | ||
15604 | spec->capsrc_nids = alc861vd_capsrc_nids; | ||
15583 | 15605 | ||
15584 | set_capture_mixer(spec); | 15606 | set_capture_mixer(spec); |
15585 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 15607 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
@@ -17496,9 +17518,12 @@ static int patch_alc662(struct hda_codec *codec) | |||
17496 | spec->stream_digital_playback = &alc662_pcm_digital_playback; | 17518 | spec->stream_digital_playback = &alc662_pcm_digital_playback; |
17497 | spec->stream_digital_capture = &alc662_pcm_digital_capture; | 17519 | spec->stream_digital_capture = &alc662_pcm_digital_capture; |
17498 | 17520 | ||
17499 | spec->adc_nids = alc662_adc_nids; | 17521 | if (!spec->adc_nids) { |
17500 | spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); | 17522 | spec->adc_nids = alc662_adc_nids; |
17501 | spec->capsrc_nids = alc662_capsrc_nids; | 17523 | spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); |
17524 | } | ||
17525 | if (!spec->capsrc_nids) | ||
17526 | spec->capsrc_nids = alc662_capsrc_nids; | ||
17502 | 17527 | ||
17503 | if (!spec->cap_mixer) | 17528 | if (!spec->cap_mixer) |
17504 | set_capture_mixer(spec); | 17529 | set_capture_mixer(spec); |