aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2005-05-25 12:11:40 -0400
committerJaroslav Kysela <perex@suse.cz>2005-05-29 04:14:56 -0400
commit71fe7b82db923e0f71b05deeb54fce75d5a4d08d (patch)
tree3067daf15929d6f51f964ee929935f327e3d8a75 /sound
parent033a1f10923bdc3646750eef471a618f9d4c074b (diff)
[ALSA] Fix ALC880 capture problems
HDA Codec driver Fixed the capture on some ALC880 devices. The node 0x07 is sometimes invalid as an ADC. Also, the intialization of ADC nodes are fixed on some models. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/patch_realtek.c86
1 files changed, 67 insertions, 19 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 9f12d1fd02dc..ee1c4cd7f00a 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -97,10 +97,20 @@ static hda_nid_t alc880_z71v_dac_nids[1] = {
97 0x02 97 0x02
98}; 98};
99 99
100#if 0
101/* The datasheet says the node 0x07 is connected from inputs,
102 * but it shows zero connection in the real implementation.
103 */
100static hda_nid_t alc880_adc_nids[3] = { 104static hda_nid_t alc880_adc_nids[3] = {
101 /* ADC0-2 */ 105 /* ADC0-2 */
102 0x07, 0x08, 0x09, 106 0x07, 0x08, 0x09,
103}; 107};
108#else
109static hda_nid_t alc880_adc_nids[2] = {
110 /* ADC1-2 */
111 0x08, 0x09,
112};
113#endif
104 114
105#define ALC880_DIGOUT_NID 0x06 115#define ALC880_DIGOUT_NID 0x06
106#define ALC880_DIGIN_NID 0x0a 116#define ALC880_DIGIN_NID 0x0a
@@ -380,10 +390,11 @@ static snd_kcontrol_new_t alc880_base_mixer[] = {
380 HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), 390 HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
381 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 391 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
382 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT), 392 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
383 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), 393 /* We don't use NID 0x07 - see above */
384 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 394 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
385 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), 395 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
386 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), 396 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
397 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
387 { 398 {
388 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 399 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
389 /* The multiple "Capture Source" controls confuse alsamixer 400 /* The multiple "Capture Source" controls confuse alsamixer
@@ -434,10 +445,11 @@ static snd_kcontrol_new_t alc880_five_stack_mixer[] = {
434 HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), 445 HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
435 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 446 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
436 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT), 447 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
437 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), 448 /* We don't use NID 0x07 - see above */
438 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 449 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
439 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), 450 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
440 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), 451 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
452 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
441 { 453 {
442 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 454 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
443 /* The multiple "Capture Source" controls confuse alsamixer 455 /* The multiple "Capture Source" controls confuse alsamixer
@@ -506,6 +518,8 @@ static snd_kcontrol_new_t alc880_z71v_mixer[] = {
506 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 518 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
507 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), 519 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
508 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), 520 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
521 HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
522 HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
509 { 523 {
510 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 524 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
511 /* The multiple "Capture Source" controls confuse alsamixer 525 /* The multiple "Capture Source" controls confuse alsamixer
@@ -514,7 +528,7 @@ static snd_kcontrol_new_t alc880_z71v_mixer[] = {
514 */ 528 */
515 /* .name = "Capture Source", */ 529 /* .name = "Capture Source", */
516 .name = "Input Source", 530 .name = "Input Source",
517 .count = 2, 531 .count = 3,
518 .info = alc_mux_enum_info, 532 .info = alc_mux_enum_info,
519 .get = alc_mux_enum_get, 533 .get = alc_mux_enum_get,
520 .put = alc_mux_enum_put, 534 .put = alc_mux_enum_put,
@@ -564,8 +578,16 @@ static struct hda_verb alc880_init_verbs_three_stack[] = {
564 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 578 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
565 /* unmute amp left and right */ 579 /* unmute amp left and right */
566 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 580 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
567 /* set connection select to line in (default select for this ADC) */ 581 /* set connection select to mic in */
568 {0x07, AC_VERB_SET_CONNECT_SEL, 0x02}, 582 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
583 /* unmute amp left and right */
584 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
585 /* set connection select to mic in */
586 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
587 /* unmute amp left and right */
588 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
589 /* set connection select to mic in */
590 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
569 /* unmute front mixer amp left (volume = 0) */ 591 /* unmute front mixer amp left (volume = 0) */
570 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 592 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
571 /* mute pin widget amp left and right (no gain on this amp) */ 593 /* mute pin widget amp left and right (no gain on this amp) */
@@ -639,8 +661,16 @@ static struct hda_verb alc880_init_verbs_five_stack[] = {
639 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 661 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
640 /* unmute amp left and right */ 662 /* unmute amp left and right */
641 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 663 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
642 /* set connection select to line in (default select for this ADC) */ 664 /* set connection select to mic in */
643 {0x07, AC_VERB_SET_CONNECT_SEL, 0x02}, 665 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
666 /* unmute amp left and right */
667 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
668 /* set connection select to mic in */
669 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
670 /* unmute amp left and right */
671 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
672 /* set connection select to mic in */
673 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
644 /* unmute front mixer amp left and right (volume = 0) */ 674 /* unmute front mixer amp left and right (volume = 0) */
645 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 675 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
646 /* mute pin widget amp left and right (no gain on this amp) */ 676 /* mute pin widget amp left and right (no gain on this amp) */
@@ -798,9 +828,16 @@ static struct hda_verb alc880_z71v_init_verbs[] = {
798 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 828 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
799 /* unmute amp left and right */ 829 /* unmute amp left and right */
800 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 830 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
801 /* set connection select to line in (default select for this ADC) */ 831 /* set connection select to mic in */
802 {0x07, AC_VERB_SET_CONNECT_SEL, 0x02}, 832 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
803 833 /* unmute amp left and right */
834 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
835 /* set connection select to mic in */
836 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
837 /* unmute amp left and right */
838 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
839 /* set connection select to mic in */
840 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
804 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) for mixer 841 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) for mixer
805 * widget(nid=0x0B) to support the input path of analog loopback 842 * widget(nid=0x0B) to support the input path of analog loopback
806 */ 843 */
@@ -941,7 +978,9 @@ static struct hda_pcm_stream alc880_pcm_analog_capture = {
941 .substreams = 2, 978 .substreams = 2,
942 .channels_min = 2, 979 .channels_min = 2,
943 .channels_max = 2, 980 .channels_max = 2,
944 .nid = 0x07, /* NID to query formats and rates */ 981 .nid = 0x08, /* NID to query formats and rates
982 * (0x07 might be broken on some devices)
983 */
945 .ops = { 984 .ops = {
946 .prepare = alc880_capture_pcm_prepare, 985 .prepare = alc880_capture_pcm_prepare,
947 .cleanup = alc880_capture_pcm_cleanup 986 .cleanup = alc880_capture_pcm_cleanup
@@ -1261,6 +1300,13 @@ static struct hda_verb alc880_test_init_verbs[] = {
1261 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, 1300 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1262 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, 1301 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1263 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, 1302 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1303 /* ADC set up */
1304 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
1305 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1306 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
1307 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1308 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
1309 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1264 { } 1310 { }
1265}; 1311};
1266#endif 1312#endif
@@ -1822,11 +1868,13 @@ static struct hda_verb alc882_init_verbs[] = {
1822 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 1868 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
1823 /* ADC1: unmute amp left and right */ 1869 /* ADC1: unmute amp left and right */
1824 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 1870 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
1871 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1825 /* ADC2: unmute amp left and right */ 1872 /* ADC2: unmute amp left and right */
1826 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 1873 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
1874 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1827 /* ADC3: unmute amp left and right */ 1875 /* ADC3: unmute amp left and right */
1828 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 1876 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
1829 1877 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1830 /* Unmute front loopback */ 1878 /* Unmute front loopback */
1831 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 1879 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1832 /* Unmute rear loopback */ 1880 /* Unmute rear loopback */