Update of /cvsroot/alsa/alsa-kernel/pci/ac97
In directory sc8-pr-cvs1:/tmp/cvs-serv22079/pci/ac97

Modified Files:
        ac97_codec.c ac97_patch.c 
Log Message:
- added the detection of revision of ALC650 chip by 
  James Courtier-Dutton <[EMAIL PROTECTED]>
- fixed the patch_alc650() to refer to the detected revision.
- detect the availability of stereo mute bits in snd_ac97_cmute_new().



Index: ac97_codec.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_codec.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -r1.102 -r1.103
--- ac97_codec.c        27 Aug 2003 16:17:31 -0000      1.102
+++ ac97_codec.c        28 Aug 2003 15:36:44 -0000      1.103
@@ -64,7 +64,7 @@
 { 0x414b4d00, 0xffffff00, "Asahi Kasei",       NULL,   NULL },
 { 0x41445300, 0xffffff00, "Analog Devices",    NULL,   NULL },
 { 0x414c4300, 0xffffff00, "Realtek",           NULL,   NULL },
-{ 0x414c4700, 0xffffff00, "Avance Logic",      NULL,   NULL },
+{ 0x414c4700, 0xffffff00, "Realtek",           NULL,   NULL },
 { 0x434d4900, 0xffffff00, "C-Media Electronics", NULL, NULL },
 { 0x43525900, 0xffffff00, "Cirrus Logic",      NULL,   NULL },
 { 0x43585400, 0xffffff00, "Conexant",           NULL,  NULL },
@@ -109,6 +109,9 @@
 { 0x414c4320, 0xfffffff0, "RL5383",            NULL,           NULL },
 { 0x414c4710, 0xfffffff0, "ALC200/200P",       NULL,           NULL },
 { 0x414c4720, 0xfffffff0, "ALC650",            patch_alc650,   NULL },
+{ 0x414c4721, 0xfffffff0, "ALC650D",           patch_alc650,   NULL },
+{ 0x414c4722, 0xfffffff0, "ALC650E",           patch_alc650,   NULL },
+{ 0x414c4723, 0xfffffff0, "ALC650F",           patch_alc650,   NULL },
 { 0x414c4730, 0xffffffff, "ALC101",            NULL,           NULL },
 { 0x414c4740, 0xfffffff0, "ALC202",            NULL,           NULL },
 { 0x414c4750, 0xfffffff0, "ALC250",            NULL,           NULL },
@@ -1125,7 +1128,19 @@
 static int snd_ac97_cmute_new(snd_card_t *card, char *name, int reg, ac97_t *ac97)
 {
        snd_kcontrol_t *kctl;
+       int stereo = 0;
+
        if (ac97->flags & AC97_STEREO_MUTES) {
+               /* check whether both mute bits work */
+               unsigned short val, val1;
+               val = snd_ac97_read(ac97, reg);
+               val1 = val | 0x8080;
+               snd_ac97_write(ac97, reg, val1);
+               if (val1 == snd_ac97_read(ac97, reg))
+                       stereo = 1;
+               snd_ac97_write(ac97, reg, val);
+       }
+       if (stereo) {
                snd_kcontrol_new_t tmp = AC97_DOUBLE(name, reg, 15, 7, 1, 1);
                tmp.index = ac97->num;
                kctl = snd_ctl_new1(&tmp, ac97);
@@ -1622,6 +1637,7 @@
        ac97_t *ac97;
        char name[64];
        unsigned long end_time;
+       unsigned int reg;
        static snd_device_ops_t ops = {
                .dev_free =     snd_ac97_dev_free,
        };
@@ -1665,6 +1681,20 @@
                snd_ac97_free(ac97);
                return -EIO;
        }
+       /* AC97 audio codec chip revision detection. */
+       /* Currently only Realtek ALC650 detection implemented. */
+       switch(ac97->id & 0xfffffff0) {
+       case 0x414c4720:        /* ALC650 */
+               reg = snd_ac97_read(ac97, AC97_ALC650_REVISION);
+               if (((reg & 0x3f) >= 0) && ((reg & 0x3f) < 3))
+                       ac97->id = 0x414c4720;          /* Old version */
+               else if (((reg & 0x3f) >= 3) && ((reg & 0x3f) < 0x10))
+                       ac97->id = 0x414c4721;          /* D version */
+               else if ((reg&0x30) == 0x10)
+                       ac97->id = 0x414c4722;          /* E version */
+               else if ((reg&0x30) == 0x20)
+                       ac97->id = 0x414c4723;          /* F version */
+        }
        
        /* test for AC'97 */
        if (! (ac97->scaps & AC97_SCAP_AUDIO)) {

Index: ac97_patch.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_patch.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- ac97_patch.c        27 Aug 2003 16:17:32 -0000      1.20
+++ ac97_patch.c        28 Aug 2003 15:36:44 -0000      1.21
@@ -897,20 +897,22 @@
 
 int patch_alc650(ac97_t * ac97)
 {
-       unsigned short val;
+       unsigned short val, reg;
        int spdif = 0;
 
-       /* FIXME: set the below 1 if we can detect the chip rev.E correctly.
-        *        this is used for switching mic and center/lfe, which needs
-        *        resetting GPIO0 level on the older revision.
-        */
        ac97->build_ops = &patch_alc650_ops;
-       ac97->spec.dev_flags = 0;
+
+       /* revision E or F */
+       /* FIXME: what about revision D ? */
+       ac97->spec.dev_flags = (ac97->id == 0x414c4722 ||
+                               ac97->id == 0x414c4723);
 
        /* check spdif (should be only on rev.E) */
-       val = snd_ac97_read(ac97, AC97_EXTENDED_STATUS);
-       if (val & AC97_EA_SPCV)
-               spdif = 1;
+       if (ac97->spec.dev_flags) {
+               val = snd_ac97_read(ac97, AC97_EXTENDED_STATUS);
+               if (val & AC97_EA_SPCV)
+                       spdif = 1;
+       }
 
        if (spdif) {
                /* enable spdif in */



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to