I attach two diff files that add ALC650 revision detection.
We could also do revision detection on a lot of other Realtek chips if needed.
My ALC650 chip is revision 3 or Rev.F.
Cheers James
--- ac97_codec.c.org 2003-08-28 12:59:49.991709168 +0100 +++ ac97_codec.c 2003-08-28 13:35:52.254995184 +0100 @@ -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 }, @@ -1598,6 +1601,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, }; @@ -1641,6 +1645,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)) {
--- ac97_codec.h.org 2003-08-28 13:16:33.621134304 +0100 +++ ac97_codec.h 2003-08-28 13:15:38.556505400 +0100 @@ -217,6 +217,7 @@ #define AC97_ALC650_SURR_DAC_VOL 0x64 #define AC97_ALC650_LFE_DAC_VOL 0x66 #define AC97_ALC650_MULTICH 0x6a +#define AC97_ALC650_REVISION 0x6e #define AC97_ALC650_CLOCK 0x7a /* specific - Yamaha YMF753 */