Loading Documentation/sound/alsa/HD-Audio-Models.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -126,6 +126,7 @@ ALC882/883/885/888/889 mb5 Macbook 5,1 mb5 Macbook 5,1 mbp3 Macbook Pro rev3 mbp3 Macbook Pro rev3 imac24 iMac 24'' with jack detection imac24 iMac 24'' with jack detection imac91 iMac 9,1 w2jc ASUS W2JC w2jc ASUS W2JC 3stack-2ch-dig 3-jack with SPDIF I/O (ALC883) 3stack-2ch-dig 3-jack with SPDIF I/O (ALC883) alc883-6stack-dig 6-jack digital with SPDIF I/O (ALC883) alc883-6stack-dig 6-jack digital with SPDIF I/O (ALC883) Loading Documentation/sound/alsa/HD-Audio.txt +4 −2 Original line number Original line Diff line number Diff line Loading @@ -624,11 +624,13 @@ hda-verb. The program gives you an easy-to-use GUI stuff for showing the widget information and adjusting the amp values, as well as the the widget information and adjusting the amp values, as well as the proc-compatible output. proc-compatible output. The hda-analyzer is a part of alsa.git repository in The hda-analyzer: alsa-project.org: - http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer - http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer is a part of alsa.git repository in alsa-project.org: - git://git.alsa-project.org/alsa.git Codecgraph Codecgraph ~~~~~~~~~~ ~~~~~~~~~~ Loading sound/pci/hda/hda_intel.c +5 −0 Original line number Original line Diff line number Diff line Loading @@ -2450,6 +2450,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, } } } } /* disable 64bit DMA address for Teradici */ /* it does not work with device 6549:1200 subsys e4a2:040b */ if (chip->driver_type == AZX_DRIVER_TERA) gcap &= ~ICH6_GCAP_64OK; /* allow 64bit DMA address if supported by H/W */ /* allow 64bit DMA address if supported by H/W */ if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); Loading sound/pci/hda/patch_analog.c +9 −8 Original line number Original line Diff line number Diff line Loading @@ -72,7 +72,8 @@ struct ad198x_spec { hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; unsigned int jack_present :1; unsigned int jack_present :1; unsigned int inv_jack_detect:1; unsigned int inv_jack_detect:1; /* inverted jack-detection */ unsigned int inv_eapd:1; /* inverted EAPD implementation */ #ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE struct hda_loopback_check loopback; struct hda_loopback_check loopback; Loading Loading @@ -458,7 +459,7 @@ static struct hda_codec_ops ad198x_patch_ops = { /* /* * EAPD control * EAPD control * the private value = nid | (invert << 8) * the private value = nid */ */ #define ad198x_eapd_info snd_ctl_boolean_mono_info #define ad198x_eapd_info snd_ctl_boolean_mono_info Loading @@ -467,8 +468,7 @@ static int ad198x_eapd_get(struct snd_kcontrol *kcontrol, { { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec; int invert = (kcontrol->private_value >> 8) & 1; if (spec->inv_eapd) if (invert) ucontrol->value.integer.value[0] = ! spec->cur_eapd; ucontrol->value.integer.value[0] = ! spec->cur_eapd; else else ucontrol->value.integer.value[0] = spec->cur_eapd; ucontrol->value.integer.value[0] = spec->cur_eapd; Loading @@ -480,11 +480,10 @@ static int ad198x_eapd_put(struct snd_kcontrol *kcontrol, { { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec; int invert = (kcontrol->private_value >> 8) & 1; hda_nid_t nid = kcontrol->private_value & 0xff; hda_nid_t nid = kcontrol->private_value & 0xff; unsigned int eapd; unsigned int eapd; eapd = !!ucontrol->value.integer.value[0]; eapd = !!ucontrol->value.integer.value[0]; if (invert) if (spec->inv_eapd) eapd = !eapd; eapd = !eapd; if (eapd == spec->cur_eapd) if (eapd == spec->cur_eapd) return 0; return 0; Loading Loading @@ -705,7 +704,7 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { .info = ad198x_eapd_info, .info = ad198x_eapd_info, .get = ad198x_eapd_get, .get = ad198x_eapd_get, .put = ad198x_eapd_put, .put = ad198x_eapd_put, .private_value = 0x1b | (1 << 8), /* port-D, inversed */ .private_value = 0x1b, /* port-D */ }, }, { } /* end */ { } /* end */ }; }; Loading Loading @@ -1074,6 +1073,7 @@ static int patch_ad1986a(struct hda_codec *codec) spec->loopback.amplist = ad1986a_loopbacks; spec->loopback.amplist = ad1986a_loopbacks; #endif #endif spec->vmaster_nid = 0x1b; spec->vmaster_nid = 0x1b; spec->inv_eapd = 1; /* AD1986A has the inverted EAPD implementation */ codec->patch_ops = ad198x_patch_ops; codec->patch_ops = ad198x_patch_ops; Loading Loading @@ -2124,7 +2124,7 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { .info = ad198x_eapd_info, .info = ad198x_eapd_info, .get = ad198x_eapd_get, .get = ad198x_eapd_get, .put = ad198x_eapd_put, .put = ad198x_eapd_put, .private_value = 0x12 | (1 << 8), /* port-D, inversed */ .private_value = 0x12, /* port-D */ }, }, { } /* end */ { } /* end */ Loading Loading @@ -3065,6 +3065,7 @@ static int patch_ad1988(struct hda_codec *codec) spec->input_mux = &ad1988_laptop_capture_source; spec->input_mux = &ad1988_laptop_capture_source; spec->num_mixers = 1; spec->num_mixers = 1; spec->mixers[0] = ad1988_laptop_mixers; spec->mixers[0] = ad1988_laptop_mixers; spec->inv_eapd = 1; /* inverted EAPD */ spec->num_init_verbs = 1; spec->num_init_verbs = 1; spec->init_verbs[0] = ad1988_laptop_init_verbs; spec->init_verbs[0] = ad1988_laptop_init_verbs; if (board_config == AD1988_LAPTOP_DIG) if (board_config == AD1988_LAPTOP_DIG) Loading sound/pci/hda/patch_realtek.c +126 −1 Original line number Original line Diff line number Diff line Loading @@ -208,6 +208,7 @@ enum { ALC885_MBP3, ALC885_MBP3, ALC885_MB5, ALC885_MB5, ALC885_IMAC24, ALC885_IMAC24, ALC885_IMAC91, ALC883_3ST_2ch_DIG, ALC883_3ST_2ch_DIG, ALC883_3ST_6ch_DIG, ALC883_3ST_6ch_DIG, ALC883_3ST_6ch, ALC883_3ST_6ch, Loading Loading @@ -2400,6 +2401,8 @@ static const char *alc_slave_sws[] = { "Speaker Playback Switch", "Speaker Playback Switch", "Mono Playback Switch", "Mono Playback Switch", "IEC958 Playback Switch", "IEC958 Playback Switch", "Line-Out Playback Switch", "PCM Playback Switch", NULL, NULL, }; }; Loading Loading @@ -7050,6 +7053,20 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = { { } /* end */ { } /* end */ }; }; static struct snd_kcontrol_new alc885_imac91_mixer[] = { HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT), HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT), HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), { } /* end */ }; static struct snd_kcontrol_new alc882_w2jc_mixer[] = { static struct snd_kcontrol_new alc882_w2jc_mixer[] = { HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), Loading Loading @@ -7505,6 +7522,66 @@ static struct hda_verb alc885_mbp3_init_verbs[] = { { } { } }; }; /* iMac 9,1 */ static struct hda_verb alc885_imac91_init_verbs[] = { /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */ {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Rear mixer */ {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* HP Pin: output 0 (0x0c) */ {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, /* Internal Speakers: output 0 (0x0d) */ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Mic (rear) pin: input vref at 80% */ {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Front Mic pin: input vref at 80% */ {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line In pin: use output 1 when in LineOut mode */ {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* FIXME: use matrix-type input source selection */ /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* Input mixer2 */ {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* Input mixer3 */ {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* ADC1: mute amp left and right */ {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, /* ADC2: mute amp left and right */ {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* ADC3: mute amp left and right */ {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, { } }; /* iMac 24 mixer. */ /* iMac 24 mixer. */ static struct snd_kcontrol_new alc885_imac24_mixer[] = { static struct snd_kcontrol_new alc885_imac24_mixer[] = { HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), Loading Loading @@ -7551,6 +7628,26 @@ static void alc885_mbp3_setup(struct hda_codec *codec) spec->autocfg.speaker_pins[0] = 0x14; spec->autocfg.speaker_pins[0] = 0x14; } } static void alc885_imac91_automute(struct hda_codec *codec) { unsigned int present; present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); } static void alc885_imac91_unsol_event(struct hda_codec *codec, unsigned int res) { /* Headphone insertion or removal. */ if ((res >> 26) == ALC880_HP_EVENT) alc885_imac91_automute(codec); } static struct hda_verb alc882_targa_verbs[] = { static struct hda_verb alc882_targa_verbs[] = { {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, Loading Loading @@ -8718,6 +8815,7 @@ static const char *alc882_models[ALC882_MODEL_LAST] = { [ALC885_MB5] = "mb5", [ALC885_MB5] = "mb5", [ALC885_MBP3] = "mbp3", [ALC885_MBP3] = "mbp3", [ALC885_IMAC24] = "imac24", [ALC885_IMAC24] = "imac24", [ALC885_IMAC91] = "imac91", [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", [ALC883_3ST_6ch] = "3stack-6ch", [ALC883_3ST_6ch] = "3stack-6ch", Loading Loading @@ -8891,6 +8989,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, * so apparently no perfect solution yet * so apparently no perfect solution yet Loading Loading @@ -9002,6 +9101,20 @@ static struct alc_config_preset alc882_presets[] = { .setup = alc885_imac24_setup, .setup = alc885_imac24_setup, .init_hook = alc885_imac24_init_hook, .init_hook = alc885_imac24_init_hook, }, }, [ALC885_IMAC91] = { .mixers = { alc885_imac91_mixer, alc882_chmode_mixer }, .init_verbs = { alc885_imac91_init_verbs, alc880_gpio1_init_verbs }, .num_dacs = ARRAY_SIZE(alc882_dac_nids), .dac_nids = alc882_dac_nids, .channel_mode = alc885_mbp_4ch_modes, .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), .input_mux = &alc882_capture_source, .dig_out_nid = ALC882_DIGOUT_NID, .dig_in_nid = ALC882_DIGIN_NID, .unsol_event = alc885_imac91_unsol_event, .init_hook = alc885_imac91_automute, }, [ALC882_TARGA] = { [ALC882_TARGA] = { .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, Loading Loading @@ -9908,10 +10021,12 @@ static int patch_alc882(struct hda_codec *codec) spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ if (!spec->adc_nids && spec->input_mux) { if (!spec->adc_nids && spec->input_mux) { int i; int i, j; spec->num_adc_nids = 0; spec->num_adc_nids = 0; for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { const struct hda_input_mux *imux = spec->input_mux; hda_nid_t cap; hda_nid_t cap; hda_nid_t items[16]; hda_nid_t nid = alc882_adc_nids[i]; hda_nid_t nid = alc882_adc_nids[i]; unsigned int wcap = get_wcaps(codec, nid); unsigned int wcap = get_wcaps(codec, nid); /* get type */ /* get type */ Loading @@ -9922,6 +10037,15 @@ static int patch_alc882(struct hda_codec *codec) err = snd_hda_get_connections(codec, nid, &cap, 1); err = snd_hda_get_connections(codec, nid, &cap, 1); if (err < 0) if (err < 0) continue; continue; err = snd_hda_get_connections(codec, cap, items, ARRAY_SIZE(items)); if (err < 0) continue; for (j = 0; j < imux->num_items; j++) if (imux->items[j].index >= err) break; if (j < imux->num_items) continue; spec->private_capsrc_nids[spec->num_adc_nids] = cap; spec->private_capsrc_nids[spec->num_adc_nids] = cap; spec->num_adc_nids++; spec->num_adc_nids++; } } Loading Loading @@ -16846,6 +16970,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { ALC662_3ST_6ch_DIG), ALC662_3ST_6ch_DIG), SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", ALC663_ASUS_H13), ALC663_ASUS_H13), SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG), {} {} }; }; Loading
Documentation/sound/alsa/HD-Audio-Models.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -126,6 +126,7 @@ ALC882/883/885/888/889 mb5 Macbook 5,1 mb5 Macbook 5,1 mbp3 Macbook Pro rev3 mbp3 Macbook Pro rev3 imac24 iMac 24'' with jack detection imac24 iMac 24'' with jack detection imac91 iMac 9,1 w2jc ASUS W2JC w2jc ASUS W2JC 3stack-2ch-dig 3-jack with SPDIF I/O (ALC883) 3stack-2ch-dig 3-jack with SPDIF I/O (ALC883) alc883-6stack-dig 6-jack digital with SPDIF I/O (ALC883) alc883-6stack-dig 6-jack digital with SPDIF I/O (ALC883) Loading
Documentation/sound/alsa/HD-Audio.txt +4 −2 Original line number Original line Diff line number Diff line Loading @@ -624,11 +624,13 @@ hda-verb. The program gives you an easy-to-use GUI stuff for showing the widget information and adjusting the amp values, as well as the the widget information and adjusting the amp values, as well as the proc-compatible output. proc-compatible output. The hda-analyzer is a part of alsa.git repository in The hda-analyzer: alsa-project.org: - http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer - http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer is a part of alsa.git repository in alsa-project.org: - git://git.alsa-project.org/alsa.git Codecgraph Codecgraph ~~~~~~~~~~ ~~~~~~~~~~ Loading
sound/pci/hda/hda_intel.c +5 −0 Original line number Original line Diff line number Diff line Loading @@ -2450,6 +2450,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, } } } } /* disable 64bit DMA address for Teradici */ /* it does not work with device 6549:1200 subsys e4a2:040b */ if (chip->driver_type == AZX_DRIVER_TERA) gcap &= ~ICH6_GCAP_64OK; /* allow 64bit DMA address if supported by H/W */ /* allow 64bit DMA address if supported by H/W */ if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); Loading
sound/pci/hda/patch_analog.c +9 −8 Original line number Original line Diff line number Diff line Loading @@ -72,7 +72,8 @@ struct ad198x_spec { hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; unsigned int jack_present :1; unsigned int jack_present :1; unsigned int inv_jack_detect:1; unsigned int inv_jack_detect:1; /* inverted jack-detection */ unsigned int inv_eapd:1; /* inverted EAPD implementation */ #ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE struct hda_loopback_check loopback; struct hda_loopback_check loopback; Loading Loading @@ -458,7 +459,7 @@ static struct hda_codec_ops ad198x_patch_ops = { /* /* * EAPD control * EAPD control * the private value = nid | (invert << 8) * the private value = nid */ */ #define ad198x_eapd_info snd_ctl_boolean_mono_info #define ad198x_eapd_info snd_ctl_boolean_mono_info Loading @@ -467,8 +468,7 @@ static int ad198x_eapd_get(struct snd_kcontrol *kcontrol, { { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec; int invert = (kcontrol->private_value >> 8) & 1; if (spec->inv_eapd) if (invert) ucontrol->value.integer.value[0] = ! spec->cur_eapd; ucontrol->value.integer.value[0] = ! spec->cur_eapd; else else ucontrol->value.integer.value[0] = spec->cur_eapd; ucontrol->value.integer.value[0] = spec->cur_eapd; Loading @@ -480,11 +480,10 @@ static int ad198x_eapd_put(struct snd_kcontrol *kcontrol, { { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct ad198x_spec *spec = codec->spec; struct ad198x_spec *spec = codec->spec; int invert = (kcontrol->private_value >> 8) & 1; hda_nid_t nid = kcontrol->private_value & 0xff; hda_nid_t nid = kcontrol->private_value & 0xff; unsigned int eapd; unsigned int eapd; eapd = !!ucontrol->value.integer.value[0]; eapd = !!ucontrol->value.integer.value[0]; if (invert) if (spec->inv_eapd) eapd = !eapd; eapd = !eapd; if (eapd == spec->cur_eapd) if (eapd == spec->cur_eapd) return 0; return 0; Loading Loading @@ -705,7 +704,7 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { .info = ad198x_eapd_info, .info = ad198x_eapd_info, .get = ad198x_eapd_get, .get = ad198x_eapd_get, .put = ad198x_eapd_put, .put = ad198x_eapd_put, .private_value = 0x1b | (1 << 8), /* port-D, inversed */ .private_value = 0x1b, /* port-D */ }, }, { } /* end */ { } /* end */ }; }; Loading Loading @@ -1074,6 +1073,7 @@ static int patch_ad1986a(struct hda_codec *codec) spec->loopback.amplist = ad1986a_loopbacks; spec->loopback.amplist = ad1986a_loopbacks; #endif #endif spec->vmaster_nid = 0x1b; spec->vmaster_nid = 0x1b; spec->inv_eapd = 1; /* AD1986A has the inverted EAPD implementation */ codec->patch_ops = ad198x_patch_ops; codec->patch_ops = ad198x_patch_ops; Loading Loading @@ -2124,7 +2124,7 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { .info = ad198x_eapd_info, .info = ad198x_eapd_info, .get = ad198x_eapd_get, .get = ad198x_eapd_get, .put = ad198x_eapd_put, .put = ad198x_eapd_put, .private_value = 0x12 | (1 << 8), /* port-D, inversed */ .private_value = 0x12, /* port-D */ }, }, { } /* end */ { } /* end */ Loading Loading @@ -3065,6 +3065,7 @@ static int patch_ad1988(struct hda_codec *codec) spec->input_mux = &ad1988_laptop_capture_source; spec->input_mux = &ad1988_laptop_capture_source; spec->num_mixers = 1; spec->num_mixers = 1; spec->mixers[0] = ad1988_laptop_mixers; spec->mixers[0] = ad1988_laptop_mixers; spec->inv_eapd = 1; /* inverted EAPD */ spec->num_init_verbs = 1; spec->num_init_verbs = 1; spec->init_verbs[0] = ad1988_laptop_init_verbs; spec->init_verbs[0] = ad1988_laptop_init_verbs; if (board_config == AD1988_LAPTOP_DIG) if (board_config == AD1988_LAPTOP_DIG) Loading
sound/pci/hda/patch_realtek.c +126 −1 Original line number Original line Diff line number Diff line Loading @@ -208,6 +208,7 @@ enum { ALC885_MBP3, ALC885_MBP3, ALC885_MB5, ALC885_MB5, ALC885_IMAC24, ALC885_IMAC24, ALC885_IMAC91, ALC883_3ST_2ch_DIG, ALC883_3ST_2ch_DIG, ALC883_3ST_6ch_DIG, ALC883_3ST_6ch_DIG, ALC883_3ST_6ch, ALC883_3ST_6ch, Loading Loading @@ -2400,6 +2401,8 @@ static const char *alc_slave_sws[] = { "Speaker Playback Switch", "Speaker Playback Switch", "Mono Playback Switch", "Mono Playback Switch", "IEC958 Playback Switch", "IEC958 Playback Switch", "Line-Out Playback Switch", "PCM Playback Switch", NULL, NULL, }; }; Loading Loading @@ -7050,6 +7053,20 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = { { } /* end */ { } /* end */ }; }; static struct snd_kcontrol_new alc885_imac91_mixer[] = { HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT), HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT), HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), { } /* end */ }; static struct snd_kcontrol_new alc882_w2jc_mixer[] = { static struct snd_kcontrol_new alc882_w2jc_mixer[] = { HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), Loading Loading @@ -7505,6 +7522,66 @@ static struct hda_verb alc885_mbp3_init_verbs[] = { { } { } }; }; /* iMac 9,1 */ static struct hda_verb alc885_imac91_init_verbs[] = { /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */ {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Rear mixer */ {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* HP Pin: output 0 (0x0c) */ {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, /* Internal Speakers: output 0 (0x0d) */ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Mic (rear) pin: input vref at 80% */ {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Front Mic pin: input vref at 80% */ {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line In pin: use output 1 when in LineOut mode */ {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* FIXME: use matrix-type input source selection */ /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* Input mixer2 */ {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* Input mixer3 */ {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* ADC1: mute amp left and right */ {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, /* ADC2: mute amp left and right */ {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* ADC3: mute amp left and right */ {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, { } }; /* iMac 24 mixer. */ /* iMac 24 mixer. */ static struct snd_kcontrol_new alc885_imac24_mixer[] = { static struct snd_kcontrol_new alc885_imac24_mixer[] = { HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), Loading Loading @@ -7551,6 +7628,26 @@ static void alc885_mbp3_setup(struct hda_codec *codec) spec->autocfg.speaker_pins[0] = 0x14; spec->autocfg.speaker_pins[0] = 0x14; } } static void alc885_imac91_automute(struct hda_codec *codec) { unsigned int present; present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); } static void alc885_imac91_unsol_event(struct hda_codec *codec, unsigned int res) { /* Headphone insertion or removal. */ if ((res >> 26) == ALC880_HP_EVENT) alc885_imac91_automute(codec); } static struct hda_verb alc882_targa_verbs[] = { static struct hda_verb alc882_targa_verbs[] = { {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, Loading Loading @@ -8718,6 +8815,7 @@ static const char *alc882_models[ALC882_MODEL_LAST] = { [ALC885_MB5] = "mb5", [ALC885_MB5] = "mb5", [ALC885_MBP3] = "mbp3", [ALC885_MBP3] = "mbp3", [ALC885_IMAC24] = "imac24", [ALC885_IMAC24] = "imac24", [ALC885_IMAC91] = "imac91", [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", [ALC883_3ST_6ch] = "3stack-6ch", [ALC883_3ST_6ch] = "3stack-6ch", Loading Loading @@ -8891,6 +8989,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, * so apparently no perfect solution yet * so apparently no perfect solution yet Loading Loading @@ -9002,6 +9101,20 @@ static struct alc_config_preset alc882_presets[] = { .setup = alc885_imac24_setup, .setup = alc885_imac24_setup, .init_hook = alc885_imac24_init_hook, .init_hook = alc885_imac24_init_hook, }, }, [ALC885_IMAC91] = { .mixers = { alc885_imac91_mixer, alc882_chmode_mixer }, .init_verbs = { alc885_imac91_init_verbs, alc880_gpio1_init_verbs }, .num_dacs = ARRAY_SIZE(alc882_dac_nids), .dac_nids = alc882_dac_nids, .channel_mode = alc885_mbp_4ch_modes, .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), .input_mux = &alc882_capture_source, .dig_out_nid = ALC882_DIGOUT_NID, .dig_in_nid = ALC882_DIGIN_NID, .unsol_event = alc885_imac91_unsol_event, .init_hook = alc885_imac91_automute, }, [ALC882_TARGA] = { [ALC882_TARGA] = { .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, Loading Loading @@ -9908,10 +10021,12 @@ static int patch_alc882(struct hda_codec *codec) spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ if (!spec->adc_nids && spec->input_mux) { if (!spec->adc_nids && spec->input_mux) { int i; int i, j; spec->num_adc_nids = 0; spec->num_adc_nids = 0; for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { const struct hda_input_mux *imux = spec->input_mux; hda_nid_t cap; hda_nid_t cap; hda_nid_t items[16]; hda_nid_t nid = alc882_adc_nids[i]; hda_nid_t nid = alc882_adc_nids[i]; unsigned int wcap = get_wcaps(codec, nid); unsigned int wcap = get_wcaps(codec, nid); /* get type */ /* get type */ Loading @@ -9922,6 +10037,15 @@ static int patch_alc882(struct hda_codec *codec) err = snd_hda_get_connections(codec, nid, &cap, 1); err = snd_hda_get_connections(codec, nid, &cap, 1); if (err < 0) if (err < 0) continue; continue; err = snd_hda_get_connections(codec, cap, items, ARRAY_SIZE(items)); if (err < 0) continue; for (j = 0; j < imux->num_items; j++) if (imux->items[j].index >= err) break; if (j < imux->num_items) continue; spec->private_capsrc_nids[spec->num_adc_nids] = cap; spec->private_capsrc_nids[spec->num_adc_nids] = cap; spec->num_adc_nids++; spec->num_adc_nids++; } } Loading Loading @@ -16846,6 +16970,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { ALC662_3ST_6ch_DIG), ALC662_3ST_6ch_DIG), SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", ALC663_ASUS_H13), ALC663_ASUS_H13), SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG), {} {} }; };