diff options
-rw-r--r-- | Documentation/sound/alsa/ALSA-Configuration.txt | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 153 |
2 files changed, 152 insertions, 2 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 79a44f5a570a..7d5a1d00259d 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -806,6 +806,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
806 | ALC262 | 806 | ALC262 |
807 | fujitsu Fujitsu Laptop | 807 | fujitsu Fujitsu Laptop |
808 | hp-bpc HP xw4400/6400/8400/9400 laptops | 808 | hp-bpc HP xw4400/6400/8400/9400 laptops |
809 | hp-bpc-d7000 HP BPC D7000 | ||
809 | benq Benq ED8 | 810 | benq Benq ED8 |
810 | hippo Hippo (ATI) with jack detection, Sony UX-90s | 811 | hippo Hippo (ATI) with jack detection, Sony UX-90s |
811 | hippo_1 Hippo (Benq) with jack detection | 812 | hippo_1 Hippo (Benq) with jack detection |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a29862509032..d01895515e0d 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -87,6 +87,8 @@ enum { | |||
87 | ALC262_HIPPO_1, | 87 | ALC262_HIPPO_1, |
88 | ALC262_FUJITSU, | 88 | ALC262_FUJITSU, |
89 | ALC262_HP_BPC, | 89 | ALC262_HP_BPC, |
90 | ALC262_HP_BPC_D7000_WL, | ||
91 | ALC262_HP_BPC_D7000_WF, | ||
90 | ALC262_BENQ_ED8, | 92 | ALC262_BENQ_ED8, |
91 | ALC262_AUTO, | 93 | ALC262_AUTO, |
92 | ALC262_MODEL_LAST /* last tag */ | 94 | ALC262_MODEL_LAST /* last tag */ |
@@ -5919,6 +5921,30 @@ static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { | |||
5919 | { } /* end */ | 5921 | { } /* end */ |
5920 | }; | 5922 | }; |
5921 | 5923 | ||
5924 | static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { | ||
5925 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
5926 | HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | ||
5927 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||
5928 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | ||
5929 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | ||
5930 | HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), | ||
5931 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
5932 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
5933 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
5934 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
5935 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
5936 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
5937 | HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | ||
5938 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), | ||
5939 | { } /* end */ | ||
5940 | }; | ||
5941 | |||
5942 | static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = { | ||
5943 | HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
5944 | HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
5945 | { } /* end */ | ||
5946 | }; | ||
5947 | |||
5922 | #define alc262_capture_mixer alc882_capture_mixer | 5948 | #define alc262_capture_mixer alc882_capture_mixer |
5923 | #define alc262_capture_alt_mixer alc882_capture_alt_mixer | 5949 | #define alc262_capture_alt_mixer alc882_capture_alt_mixer |
5924 | 5950 | ||
@@ -6448,6 +6474,100 @@ static struct hda_verb alc262_HP_BPC_init_verbs[] = { | |||
6448 | { } | 6474 | { } |
6449 | }; | 6475 | }; |
6450 | 6476 | ||
6477 | static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = { | ||
6478 | /* | ||
6479 | * Unmute ADC0-2 and set the default input to mic-in | ||
6480 | */ | ||
6481 | {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
6482 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6483 | {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
6484 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6485 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
6486 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6487 | |||
6488 | /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback | ||
6489 | * mixer widget | ||
6490 | * Note: PASD motherboards uses the Line In 2 as the input for front | ||
6491 | * panel mic (mic 2) | ||
6492 | */ | ||
6493 | /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ | ||
6494 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6495 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
6496 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, | ||
6497 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, | ||
6498 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, | ||
6499 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)}, | ||
6500 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(6)}, | ||
6501 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(7)}, | ||
6502 | /* | ||
6503 | * Set up output mixers (0x0c - 0x0e) | ||
6504 | */ | ||
6505 | /* set vol=0 to output mixers */ | ||
6506 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6507 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6508 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6509 | |||
6510 | /* set up input amps for analog loopback */ | ||
6511 | /* Amp Indices: DAC = 0, mixer = 1 */ | ||
6512 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6513 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
6514 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6515 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
6516 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6517 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
6518 | |||
6519 | |||
6520 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */ | ||
6521 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */ | ||
6522 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */ | ||
6523 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */ | ||
6524 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */ | ||
6525 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */ | ||
6526 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */ | ||
6527 | |||
6528 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
6529 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
6530 | |||
6531 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
6532 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
6533 | |||
6534 | /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */ | ||
6535 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | ||
6536 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | ||
6537 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, | ||
6538 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | ||
6539 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | ||
6540 | |||
6541 | /* FIXME: use matrix-type input source selection */ | ||
6542 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | ||
6543 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | ||
6544 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/ | ||
6545 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/ | ||
6546 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/ | ||
6547 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/ | ||
6548 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/ | ||
6549 | /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ | ||
6550 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/ | ||
6551 | /* Input mixer2 */ | ||
6552 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | ||
6553 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, | ||
6554 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, | ||
6555 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, | ||
6556 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, | ||
6557 | /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ | ||
6558 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, | ||
6559 | /* Input mixer3 */ | ||
6560 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | ||
6561 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, | ||
6562 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, | ||
6563 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, | ||
6564 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, | ||
6565 | /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ | ||
6566 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, | ||
6567 | |||
6568 | { } | ||
6569 | }; | ||
6570 | |||
6451 | /* pcm configuration: identiacal with ALC880 */ | 6571 | /* pcm configuration: identiacal with ALC880 */ |
6452 | #define alc262_pcm_analog_playback alc880_pcm_analog_playback | 6572 | #define alc262_pcm_analog_playback alc880_pcm_analog_playback |
6453 | #define alc262_pcm_analog_capture alc880_pcm_analog_capture | 6573 | #define alc262_pcm_analog_capture alc880_pcm_analog_capture |
@@ -6511,6 +6631,7 @@ static const char *alc262_models[ALC262_MODEL_LAST] = { | |||
6511 | [ALC262_HIPPO_1] = "hippo_1", | 6631 | [ALC262_HIPPO_1] = "hippo_1", |
6512 | [ALC262_FUJITSU] = "fujitsu", | 6632 | [ALC262_FUJITSU] = "fujitsu", |
6513 | [ALC262_HP_BPC] = "hp-bpc", | 6633 | [ALC262_HP_BPC] = "hp-bpc", |
6634 | [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000", | ||
6514 | [ALC262_BENQ_ED8] = "benq", | 6635 | [ALC262_BENQ_ED8] = "benq", |
6515 | [ALC262_AUTO] = "auto", | 6636 | [ALC262_AUTO] = "auto", |
6516 | }; | 6637 | }; |
@@ -6519,9 +6640,16 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = { | |||
6519 | SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), | 6640 | SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), |
6520 | SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC), | 6641 | SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC), |
6521 | SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC), | 6642 | SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC), |
6522 | SND_PCI_QUIRK(0x103c, 0x2801, "HP q954", ALC262_HP_BPC), | ||
6523 | SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC), | 6643 | SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC), |
6524 | SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC), | 6644 | SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC), |
6645 | SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), | ||
6646 | SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL), | ||
6647 | SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL), | ||
6648 | SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL), | ||
6649 | SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF), | ||
6650 | SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF), | ||
6651 | SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF), | ||
6652 | SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF), | ||
6525 | SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), | 6653 | SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), |
6526 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), | 6654 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), |
6527 | SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1), | 6655 | SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1), |
@@ -6586,6 +6714,27 @@ static struct alc_config_preset alc262_presets[] = { | |||
6586 | .channel_mode = alc262_modes, | 6714 | .channel_mode = alc262_modes, |
6587 | .input_mux = &alc262_HP_capture_source, | 6715 | .input_mux = &alc262_HP_capture_source, |
6588 | }, | 6716 | }, |
6717 | [ALC262_HP_BPC_D7000_WF] = { | ||
6718 | .mixers = { alc262_HP_BPC_WildWest_mixer }, | ||
6719 | .init_verbs = { alc262_HP_BPC_WildWest_init_verbs }, | ||
6720 | .num_dacs = ARRAY_SIZE(alc262_dac_nids), | ||
6721 | .dac_nids = alc262_dac_nids, | ||
6722 | .hp_nid = 0x03, | ||
6723 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | ||
6724 | .channel_mode = alc262_modes, | ||
6725 | .input_mux = &alc262_HP_capture_source, | ||
6726 | }, | ||
6727 | [ALC262_HP_BPC_D7000_WL] = { | ||
6728 | .mixers = { alc262_HP_BPC_WildWest_mixer, | ||
6729 | alc262_HP_BPC_WildWest_option_mixer }, | ||
6730 | .init_verbs = { alc262_HP_BPC_WildWest_init_verbs }, | ||
6731 | .num_dacs = ARRAY_SIZE(alc262_dac_nids), | ||
6732 | .dac_nids = alc262_dac_nids, | ||
6733 | .hp_nid = 0x03, | ||
6734 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | ||
6735 | .channel_mode = alc262_modes, | ||
6736 | .input_mux = &alc262_HP_capture_source, | ||
6737 | }, | ||
6589 | [ALC262_BENQ_ED8] = { | 6738 | [ALC262_BENQ_ED8] = { |
6590 | .mixers = { alc262_base_mixer }, | 6739 | .mixers = { alc262_base_mixer }, |
6591 | .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs }, | 6740 | .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs }, |
@@ -6623,7 +6772,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
6623 | board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST, | 6772 | board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST, |
6624 | alc262_models, | 6773 | alc262_models, |
6625 | alc262_cfg_tbl); | 6774 | alc262_cfg_tbl); |
6626 | 6775 | ||
6627 | if (board_config < 0) { | 6776 | if (board_config < 0) { |
6628 | printk(KERN_INFO "hda_codec: Unknown model for ALC262, " | 6777 | printk(KERN_INFO "hda_codec: Unknown model for ALC262, " |
6629 | "trying auto-probe from BIOS...\n"); | 6778 | "trying auto-probe from BIOS...\n"); |