Update of /cvsroot/alsa/alsa-kernel/pci/ac97 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12868/pci/ac97
Modified Files: ac97_patch.c Log Message: - fixed the mic gpio switch handling on the old ALC650. - fixed the wrong register initialization on ALC655/658. Index: ac97_patch.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_patch.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- ac97_patch.c 26 Jan 2004 09:22:23 -0000 1.33 +++ ac97_patch.c 9 Feb 2004 11:45:40 -0000 1.34 @@ -1014,8 +1014,7 @@ ucontrol->value.integer.value[0] ? (1 << 10) : 0); if (change) { /* GPIO0 write for mic */ - snd_ac97_update_bits(ac97, 0x76, 0x01, - ucontrol->value.integer.value[0] ? 0 : 0x01); + snd_ac97_update_bits(ac97, 0x76, 0x01, 0x01); /* GPIO0 high for mic */ snd_ac97_update_bits(ac97, 0x78, 0x100, ucontrol->value.integer.value[0] ? 0 : 0x100); @@ -1092,10 +1091,7 @@ mic_off = snd_ac97_read(ac97, AC97_ALC650_MULTICH) & (1 << 10); /* GPIO0 direction */ val = snd_ac97_read(ac97, AC97_ALC650_GPIO_SETUP); - if (mic_off) - val &= ~0x01; - else - val |= 0x01; + val |= 0x01; snd_ac97_write_cache(ac97, AC97_ALC650_GPIO_SETUP, val); val = snd_ac97_read(ac97, AC97_ALC650_GPIO_STATUS); if (mic_off) @@ -1111,10 +1107,36 @@ return 0; } +static int snd_ac97_alc655_mic_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t * ucontrol) +{ + ac97_t *ac97 = snd_kcontrol_chip(kcontrol); + ucontrol->value.integer.value[0] = (ac97->regs[AC97_ALC650_MULTICH] >> 10) & 1; + return 0; +} + +static int snd_ac97_alc655_mic_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t * ucontrol) +{ + ac97_t *ac97 = snd_kcontrol_chip(kcontrol); + int change; + + snd_ac97_update_bits(ac97, 0x7a, 1 << 12, /* misc control; vrefout disable */ + ucontrol->value.integer.value[0] ? (1 << 12) : 0); + change = snd_ac97_update_bits(ac97, AC97_ALC650_MULTICH, 1 << 10, + ucontrol->value.integer.value[0] ? (1 << 10) : 0); + return change; +} + + static const snd_kcontrol_new_t snd_ac97_controls_alc655[] = { AC97_SINGLE("Duplicate Front", AC97_ALC650_MULTICH, 0, 1, 0), AC97_SINGLE("Line-In As Surround", AC97_ALC650_MULTICH, 9, 1, 0), - AC97_SINGLE("Mic As Center/LFE", AC97_ALC650_MULTICH, 10, 1, 0), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Mic As Center/LFE", + .info = snd_ac97_info_single, + .get = snd_ac97_alc655_mic_get, + .put = snd_ac97_alc655_mic_put, + }, }; static int alc655_iec958_route_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) @@ -1187,15 +1209,21 @@ int patch_alc655(ac97_t * ac97) { + unsigned int val; + ac97->spec.dev_flags = (ac97->id == 0x414c4780); /* ALC658 */ ac97->build_ops = &patch_alc655_ops; - /* enable spdif in */ - snd_ac97_write_cache(ac97, AC97_ALC650_CLOCK, - snd_ac97_read(ac97, AC97_ALC650_MULTICH) | 0x8000); - snd_ac97_write_cache(ac97, AC97_ALC650_CLOCK, - snd_ac97_read(ac97, AC97_ALC650_CLOCK) | 0x02); + /* adjust default values */ + val = snd_ac97_read(ac97, 0x7a); /* misc control */ + val |= (1 << 1); /* spdif input pin */ + val &= ~(1 << 12); /* vref enable */ + snd_ac97_write_cache(ac97, 0x7a, val); + val = snd_ac97_read(ac97, AC97_ALC650_MULTICH); + val |= (1 << 15); /* enable spdif in */ + val &= ~(1 << 10); /* disable center on mic */ + snd_ac97_write_cache(ac97, AC97_ALC650_MULTICH, val); /* full DAC volume */ snd_ac97_write_cache(ac97, AC97_ALC650_SURR_DAC_VOL, 0x0808); ------------------------------------------------------- The SF.Net email is sponsored by EclipseCon 2004 Premiere Conference on Open Tools Development and Integration See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. http://www.eclipsecon.org/osdn _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog