Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
[ALSA] hda - COMPAL IFL90/JFL-92 laptop quirk
[ALSA] hda - Fix resume of auto-config mode with Realtek codecs
[ALSA] hda - Fix model for LG LS75 laptop
[ALSA] hda - Fix mic input on HP2133
[ALSA] ac97 - Fix ASUS A9T laptop output

+65 -37
+1
include/sound/ac97_codec.h
··· 505 505 unsigned short pcmreg[3]; // PCM registers 506 506 unsigned short codec_cfg[3]; // CODEC_CFG bits 507 507 unsigned char swap_mic_linein; // AD1986/AD1986A only 508 + unsigned char lo_as_master; /* LO as master */ 508 509 } ad18xx; 509 510 unsigned int dev_flags; /* device specific */ 510 511 } spec;
+34 -14
sound/pci/ac97/ac97_patch.c
··· 1971 1971 1972 1972 val = ac97->regs[AC97_AD_MISC]; 1973 1973 ucontrol->value.integer.value[0] = !(val & AC97_AD198X_LOSEL); 1974 + if (ac97->spec.ad18xx.lo_as_master) 1975 + ucontrol->value.integer.value[0] = 1976 + !ucontrol->value.integer.value[0]; 1974 1977 return 0; 1975 1978 } 1976 1979 ··· 1982 1979 struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 1983 1980 unsigned short val; 1984 1981 1985 - val = !ucontrol->value.integer.value[0] 1986 - ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0; 1982 + val = !ucontrol->value.integer.value[0]; 1983 + if (ac97->spec.ad18xx.lo_as_master) 1984 + val = !val; 1985 + val = val ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0; 1987 1986 return snd_ac97_update_bits(ac97, AC97_AD_MISC, 1988 1987 AC97_AD198X_LOSEL | AC97_AD198X_HPSEL, val); 1989 1988 } ··· 2036 2031 { 2037 2032 unsigned short val = 0; 2038 2033 /* clear LODIS if shared jack is to be used for Surround out */ 2039 - if (is_shared_linein(ac97)) 2034 + if (!ac97->spec.ad18xx.lo_as_master && is_shared_linein(ac97)) 2040 2035 val |= (1 << 12); 2041 2036 /* clear CLDIS if shared jack is to be used for C/LFE out */ 2042 2037 if (is_shared_micin(ac97)) ··· 2072 2067 2073 2068 static int patch_ad1888_specific(struct snd_ac97 *ac97) 2074 2069 { 2075 - /* rename 0x04 as "Master" and 0x02 as "Master Surround" */ 2076 - snd_ac97_rename_vol_ctl(ac97, "Master Playback", "Master Surround Playback"); 2077 - snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback"); 2070 + if (!ac97->spec.ad18xx.lo_as_master) { 2071 + /* rename 0x04 as "Master" and 0x02 as "Master Surround" */ 2072 + snd_ac97_rename_vol_ctl(ac97, "Master Playback", 2073 + "Master Surround Playback"); 2074 + snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", 2075 + "Master Playback"); 2076 + } 2078 2077 return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls)); 2079 2078 } 2080 2079 ··· 2097 2088 2098 2089 patch_ad1881(ac97); 2099 2090 ac97->build_ops = &patch_ad1888_build_ops; 2100 - /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */ 2101 - /* it seems that most vendors connect line-out connector to headphone out of AC'97 */ 2091 + 2092 + /* 2093 + * LO can be used as a real line-out on some devices, 2094 + * and we need to revert the front/surround mixer switches 2095 + */ 2096 + if (ac97->subsystem_vendor == 0x1043 && 2097 + ac97->subsystem_device == 0x1193) /* ASUS A9T laptop */ 2098 + ac97->spec.ad18xx.lo_as_master = 1; 2099 + 2100 + misc = snd_ac97_read(ac97, AC97_AD_MISC); 2102 2101 /* AD-compatible mode */ 2103 2102 /* Stereo mutes enabled */ 2104 - misc = snd_ac97_read(ac97, AC97_AD_MISC); 2105 - snd_ac97_write_cache(ac97, AC97_AD_MISC, misc | 2106 - AC97_AD198X_LOSEL | 2107 - AC97_AD198X_HPSEL | 2108 - AC97_AD198X_MSPLT | 2109 - AC97_AD198X_AC97NC); 2103 + misc |= AC97_AD198X_MSPLT | AC97_AD198X_AC97NC; 2104 + if (!ac97->spec.ad18xx.lo_as_master) 2105 + /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */ 2106 + /* it seems that most vendors connect line-out connector to 2107 + * headphone out of AC'97 2108 + */ 2109 + misc |= AC97_AD198X_LOSEL | AC97_AD198X_HPSEL; 2110 + 2111 + snd_ac97_write_cache(ac97, AC97_AD_MISC, misc); 2110 2112 ac97->flags |= AC97_STEREO_MUTES; 2111 2113 return 0; 2112 2114 }
+28 -22
sound/pci/hda/patch_analog.c
··· 3644 3644 { } /* end */ 3645 3645 }; 3646 3646 3647 - static struct hda_input_mux ad1884a_mobile_capture_source = { 3648 - .num_items = 2, 3649 - .items = { 3650 - { "Mic", 0x1 }, /* port-C */ 3651 - { "Mix", 0x3 }, 3652 - }, 3653 - }; 3654 - 3655 3647 static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { 3656 3648 HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), 3657 3649 HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), 3658 3650 HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), 3659 3651 HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), 3660 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT), 3661 - HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), 3662 3652 HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), 3663 3653 HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), 3664 - HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), 3654 + HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT), 3655 + HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT), 3665 3656 HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), 3666 3657 HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), 3667 - { 3668 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3669 - .name = "Capture Source", 3670 - .info = ad198x_mux_enum_info, 3671 - .get = ad198x_mux_enum_get, 3672 - .put = ad198x_mux_enum_put, 3673 - }, 3674 3658 { } /* end */ 3675 3659 }; 3676 3660 ··· 3671 3687 present ? 0x00 : 0x02); 3672 3688 } 3673 3689 3690 + /* switch to external mic if plugged */ 3691 + static void ad1884a_hp_automic(struct hda_codec *codec) 3692 + { 3693 + unsigned int present; 3694 + 3695 + present = snd_hda_codec_read(codec, 0x14, 0, 3696 + AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 3697 + snd_hda_codec_write(codec, 0x0c, 0, AC_VERB_SET_CONNECT_SEL, 3698 + present ? 0 : 1); 3699 + } 3700 + 3674 3701 #define AD1884A_HP_EVENT 0x37 3702 + #define AD1884A_MIC_EVENT 0x36 3675 3703 3676 3704 /* unsolicited event for HP jack sensing */ 3677 3705 static void ad1884a_hp_unsol_event(struct hda_codec *codec, unsigned int res) 3678 3706 { 3679 - if ((res >> 26) != AD1884A_HP_EVENT) 3680 - return; 3681 - ad1884a_hp_automute(codec); 3707 + switch (res >> 26) { 3708 + case AD1884A_HP_EVENT: 3709 + ad1884a_hp_automute(codec); 3710 + break; 3711 + case AD1884A_MIC_EVENT: 3712 + ad1884a_hp_automic(codec); 3713 + break; 3714 + } 3682 3715 } 3683 3716 3684 3717 /* initialize jack-sensing, too */ ··· 3703 3702 { 3704 3703 ad198x_init(codec); 3705 3704 ad1884a_hp_automute(codec); 3705 + ad1884a_hp_automic(codec); 3706 3706 return 0; 3707 3707 } 3708 3708 ··· 3717 3715 /* Port-F pin */ 3718 3716 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3719 3717 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3718 + /* Port-C pin - internal mic-in */ 3719 + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3720 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ 3721 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ 3720 3722 /* analog mix */ 3721 3723 {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 3722 3724 /* unsolicited event for pin-sense */ 3723 3725 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, 3726 + {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, 3724 3727 { } /* end */ 3725 3728 }; 3726 3729 ··· 3885 3878 spec->mixers[0] = ad1884a_mobile_mixers; 3886 3879 spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs; 3887 3880 spec->multiout.dig_out_nid = 0; 3888 - spec->input_mux = &ad1884a_mobile_capture_source; 3889 3881 codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; 3890 3882 codec->patch_ops.init = ad1884a_hp_init; 3891 3883 break;
+1
sound/pci/hda/patch_cmedia.c
··· 611 611 612 612 static struct snd_pci_quirk cmi9880_cfg_tbl[] = { 613 613 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", CMI_FULL_DIG), 614 + SND_PCI_QUIRK(0x1854, 0x002b, "LG LS75", CMI_MINIMAL), 614 615 SND_PCI_QUIRK(0x1854, 0x0032, "LG", CMI_FULL_DIG), 615 616 {} /* terminator */ 616 617 };
+1 -1
sound/pci/hda/patch_realtek.c
··· 942 942 AC_VERB_SET_UNSOLICITED_ENABLE, 943 943 AC_USRSP_EN | ALC880_HP_EVENT); 944 944 spec->unsol_event = alc_sku_unsol_event; 945 - spec->init_hook = alc_sku_automute; 946 945 } 947 946 948 947 /* ··· 10512 10513 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), 10513 10514 SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA), 10514 10515 SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA), 10516 + SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), 10515 10517 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), 10516 10518 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), 10517 10519 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),