aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c103
1 files changed, 51 insertions, 52 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 3a8e58c483df..fea976793ae5 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -275,13 +275,13 @@ struct alc_spec {
275 */ 275 */
276 unsigned int num_init_verbs; 276 unsigned int num_init_verbs;
277 277
278 char stream_name_analog[16]; /* analog PCM stream */ 278 char stream_name_analog[32]; /* analog PCM stream */
279 struct hda_pcm_stream *stream_analog_playback; 279 struct hda_pcm_stream *stream_analog_playback;
280 struct hda_pcm_stream *stream_analog_capture; 280 struct hda_pcm_stream *stream_analog_capture;
281 struct hda_pcm_stream *stream_analog_alt_playback; 281 struct hda_pcm_stream *stream_analog_alt_playback;
282 struct hda_pcm_stream *stream_analog_alt_capture; 282 struct hda_pcm_stream *stream_analog_alt_capture;
283 283
284 char stream_name_digital[16]; /* digital PCM stream */ 284 char stream_name_digital[32]; /* digital PCM stream */
285 struct hda_pcm_stream *stream_digital_playback; 285 struct hda_pcm_stream *stream_digital_playback;
286 struct hda_pcm_stream *stream_digital_capture; 286 struct hda_pcm_stream *stream_digital_capture;
287 287
@@ -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;
@@ -4505,6 +4505,12 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
4505 &dig_nid, 1); 4505 &dig_nid, 1);
4506 if (err < 0) 4506 if (err < 0)
4507 continue; 4507 continue;
4508 if (dig_nid > 0x7f) {
4509 printk(KERN_ERR "alc880_auto: invalid dig_nid "
4510 "connection 0x%x for NID 0x%x\n", dig_nid,
4511 spec->autocfg.dig_out_pins[i]);
4512 continue;
4513 }
4508 if (!i) 4514 if (!i)
4509 spec->multiout.dig_out_nid = dig_nid; 4515 spec->multiout.dig_out_nid = dig_nid;
4510 else { 4516 else {
@@ -6919,9 +6925,6 @@ static struct hda_verb alc882_targa_verbs[] = {
6919 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 6925 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
6920 6926
6921 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 6927 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
6922 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
6923 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
6924 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
6925 { } /* end */ 6928 { } /* end */
6926}; 6929};
6927 6930
@@ -7241,7 +7244,8 @@ static struct alc_config_preset alc882_presets[] = {
7241 }, 7244 },
7242 [ALC882_TARGA] = { 7245 [ALC882_TARGA] = {
7243 .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, 7246 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
7244 .init_verbs = { alc882_init_verbs, alc882_targa_verbs}, 7247 .init_verbs = { alc882_init_verbs, alc880_gpio3_init_verbs,
7248 alc882_targa_verbs},
7245 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 7249 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
7246 .dac_nids = alc882_dac_nids, 7250 .dac_nids = alc882_dac_nids,
7247 .dig_out_nid = ALC882_DIGOUT_NID, 7251 .dig_out_nid = ALC882_DIGOUT_NID,
@@ -9238,7 +9242,8 @@ static struct alc_config_preset alc883_presets[] = {
9238 }, 9242 },
9239 [ALC883_TARGA_DIG] = { 9243 [ALC883_TARGA_DIG] = {
9240 .mixers = { alc883_targa_mixer, alc883_chmode_mixer }, 9244 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9241 .init_verbs = { alc883_init_verbs, alc883_targa_verbs}, 9245 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9246 alc883_targa_verbs},
9242 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9247 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9243 .dac_nids = alc883_dac_nids, 9248 .dac_nids = alc883_dac_nids,
9244 .dig_out_nid = ALC883_DIGOUT_NID, 9249 .dig_out_nid = ALC883_DIGOUT_NID,
@@ -9251,7 +9256,8 @@ static struct alc_config_preset alc883_presets[] = {
9251 }, 9256 },
9252 [ALC883_TARGA_2ch_DIG] = { 9257 [ALC883_TARGA_2ch_DIG] = {
9253 .mixers = { alc883_targa_2ch_mixer}, 9258 .mixers = { alc883_targa_2ch_mixer},
9254 .init_verbs = { alc883_init_verbs, alc883_targa_verbs}, 9259 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9260 alc883_targa_verbs},
9255 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9261 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9256 .dac_nids = alc883_dac_nids, 9262 .dac_nids = alc883_dac_nids,
9257 .adc_nids = alc883_adc_nids_alt, 9263 .adc_nids = alc883_adc_nids_alt,
@@ -10625,6 +10631,18 @@ static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10625 alc262_lenovo_3000_automute(codec, 1); 10631 alc262_lenovo_3000_automute(codec, 1);
10626} 10632}
10627 10633
10634static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10635 int dir, int idx, long *valp)
10636{
10637 int i, change = 0;
10638
10639 for (i = 0; i < 2; i++, valp++)
10640 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10641 HDA_AMP_MUTE,
10642 *valp ? 0 : HDA_AMP_MUTE);
10643 return change;
10644}
10645
10628/* bind hp and internal speaker mute (with plug check) */ 10646/* bind hp and internal speaker mute (with plug check) */
10629static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, 10647static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10630 struct snd_ctl_elem_value *ucontrol) 10648 struct snd_ctl_elem_value *ucontrol)
@@ -10633,13 +10651,8 @@ static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10633 long *valp = ucontrol->value.integer.value; 10651 long *valp = ucontrol->value.integer.value;
10634 int change; 10652 int change;
10635 10653
10636 change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10654 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
10637 HDA_AMP_MUTE, 10655 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10638 valp ? 0 : HDA_AMP_MUTE);
10639 change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
10640 HDA_AMP_MUTE,
10641 valp ? 0 : HDA_AMP_MUTE);
10642
10643 if (change) 10656 if (change)
10644 alc262_fujitsu_automute(codec, 0); 10657 alc262_fujitsu_automute(codec, 0);
10645 return change; 10658 return change;
@@ -10674,10 +10687,7 @@ static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
10674 long *valp = ucontrol->value.integer.value; 10687 long *valp = ucontrol->value.integer.value;
10675 int change; 10688 int change;
10676 10689
10677 change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 10690 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10678 HDA_AMP_MUTE,
10679 valp ? 0 : HDA_AMP_MUTE);
10680
10681 if (change) 10691 if (change)
10682 alc262_lenovo_3000_automute(codec, 0); 10692 alc262_lenovo_3000_automute(codec, 0);
10683 return change; 10693 return change;
@@ -11848,12 +11858,7 @@ static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
11848 long *valp = ucontrol->value.integer.value; 11858 long *valp = ucontrol->value.integer.value;
11849 int change; 11859 int change;
11850 11860
11851 change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, 11861 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11852 HDA_AMP_MUTE,
11853 valp[0] ? 0 : HDA_AMP_MUTE);
11854 change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0,
11855 HDA_AMP_MUTE,
11856 valp[1] ? 0 : HDA_AMP_MUTE);
11857 if (change) 11862 if (change)
11858 alc268_acer_automute(codec, 0); 11863 alc268_acer_automute(codec, 0);
11859 return change; 11864 return change;
@@ -12876,20 +12881,11 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
12876 { } 12881 { }
12877}; 12882};
12878 12883
12879/* bind volumes of both NID 0x0c and 0x0d */
12880static struct hda_bind_ctls alc269_epc_bind_vol = {
12881 .ops = &snd_hda_bind_vol,
12882 .values = {
12883 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12884 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12885 0
12886 },
12887};
12888
12889static struct snd_kcontrol_new alc269_eeepc_mixer[] = { 12884static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
12890 HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12885 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12891 HDA_BIND_VOL("LineOut Playback Volume", &alc269_epc_bind_vol), 12886 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12892 HDA_CODEC_MUTE("LineOut Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12887 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12888 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12893 { } /* end */ 12889 { } /* end */
12894}; 12890};
12895 12891
@@ -12902,12 +12898,7 @@ static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
12902}; 12898};
12903 12899
12904/* FSC amilo */ 12900/* FSC amilo */
12905static struct snd_kcontrol_new alc269_fujitsu_mixer[] = { 12901#define alc269_fujitsu_mixer alc269_eeepc_mixer
12906 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12907 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12908 HDA_BIND_VOL("PCM Playback Volume", &alc269_epc_bind_vol),
12909 { } /* end */
12910};
12911 12902
12912static struct hda_verb alc269_quanta_fl1_verbs[] = { 12903static struct hda_verb alc269_quanta_fl1_verbs[] = {
12913 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 12904 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
@@ -13572,6 +13563,8 @@ static int patch_alc269(struct hda_codec *codec)
13572 set_capture_mixer(spec); 13563 set_capture_mixer(spec);
13573 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 13564 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
13574 13565
13566 spec->vmaster_nid = 0x02;
13567
13575 codec->patch_ops = alc_patch_ops; 13568 codec->patch_ops = alc_patch_ops;
13576 if (board_config == ALC269_AUTO) 13569 if (board_config == ALC269_AUTO)
13577 spec->init_hook = alc269_auto_init; 13570 spec->init_hook = alc269_auto_init;
@@ -15166,7 +15159,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15166 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), 15159 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15167 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), 15160 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15168 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ 15161 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15169 SND_PCI_QUIRK(0x1179, 0xff01, "DALLAS", ALC861VD_DALLAS), 15162 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15170 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), 15163 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15171 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), 15164 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15172 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), 15165 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
@@ -15586,9 +15579,12 @@ static int patch_alc861vd(struct hda_codec *codec)
15586 spec->stream_digital_playback = &alc861vd_pcm_digital_playback; 15579 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
15587 spec->stream_digital_capture = &alc861vd_pcm_digital_capture; 15580 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
15588 15581
15589 spec->adc_nids = alc861vd_adc_nids; 15582 if (!spec->adc_nids) {
15590 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); 15583 spec->adc_nids = alc861vd_adc_nids;
15591 spec->capsrc_nids = alc861vd_capsrc_nids; 15584 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15585 }
15586 if (!spec->capsrc_nids)
15587 spec->capsrc_nids = alc861vd_capsrc_nids;
15592 15588
15593 set_capture_mixer(spec); 15589 set_capture_mixer(spec);
15594 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 15590 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
@@ -17505,9 +17501,12 @@ static int patch_alc662(struct hda_codec *codec)
17505 spec->stream_digital_playback = &alc662_pcm_digital_playback; 17501 spec->stream_digital_playback = &alc662_pcm_digital_playback;
17506 spec->stream_digital_capture = &alc662_pcm_digital_capture; 17502 spec->stream_digital_capture = &alc662_pcm_digital_capture;
17507 17503
17508 spec->adc_nids = alc662_adc_nids; 17504 if (!spec->adc_nids) {
17509 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); 17505 spec->adc_nids = alc662_adc_nids;
17510 spec->capsrc_nids = alc662_capsrc_nids; 17506 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
17507 }
17508 if (!spec->capsrc_nids)
17509 spec->capsrc_nids = alc662_capsrc_nids;
17511 17510
17512 if (!spec->cap_mixer) 17511 if (!spec->cap_mixer)
17513 set_capture_mixer(spec); 17512 set_capture_mixer(spec);