summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorkent <kent@NetBSD.org>2002-10-09 12:06:17 +0000
committerkent <kent@NetBSD.org>2002-10-09 12:06:17 +0000
commitdd7455ebdcec8a81d9ca87e7534865b9031e5b9a (patch)
treea686b59f0a28e7d966298bc69344e444390e13ea /sys/dev
parent6dee53867d42a35e86534e61970034e8698905cf (diff)
Add 'mask' member to the struct ac97_codecid.
Cirrus Logic Crystal codec uses lower three bits in ID for a revision number. We should mask an actual ID value before matching to this table.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/ac97.c146
1 files changed, 102 insertions, 44 deletions
diff --git a/sys/dev/ic/ac97.c b/sys/dev/ic/ac97.c
index 28ef0fbd75d..2c668fa8883 100644
--- a/sys/dev/ic/ac97.c
+++ b/sys/dev/ic/ac97.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ac97.c,v 1.30 2002/10/08 21:40:04 pooka Exp $ */
+/* $NetBSD: ac97.c,v 1.31 2002/10/09 12:06:17 kent Exp $ */
/* $OpenBSD: ac97.c,v 1.8 2000/07/19 09:01:35 csapuntz Exp $ */
/*
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ac97.c,v 1.30 2002/10/08 21:40:04 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ac97.c,v 1.31 2002/10/09 12:06:17 kent Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -298,49 +298,107 @@ struct ac97_codec_if_vtbl ac97civ = {
static const struct ac97_codecid {
u_int32_t id;
+ u_int32_t mask;
const char *name;
} ac97codecid[] = {
- { AC97_CODEC_ID('A', 'D', 'S', 3), "Analog Devices AD1819B" },
- { AC97_CODEC_ID('A', 'D', 'S', 64), "Analog Devices AD1881" },
- { AC97_CODEC_ID('A', 'D', 'S', 72), "Analog Devices AD1881A" },
- { AC97_CODEC_ID('A', 'D', 'S', 96), "Analog Devices AD1885" },
- { AC97_CODEC_ID('A', 'D', 'S', 99), "Analog Devices AD1886A" },
- { AC97_CODEC_ID('A', 'K', 'M', 0), "Asahi Kasei AK4540" },
- { AC97_CODEC_ID('A', 'K', 'M', 2), "Asahi Kasei AK4543" },
- { AC97_CODEC_ID('A', 'L', 'G', 16), "Advance Logic ALC200" },
- { AC97_CODEC_ID('A', 'L', 'G', 32), "Advance Logic ALC650" },
- { AC97_CODEC_ID('A', 'L', 'G', 48), "Advance Logic ALC101" },
- { AC97_CODEC_ID('A', 'L', 'G', 64), "Advance Logic ALC202" },
- { AC97_CODEC_ID('A', 'L', 'G', 80), "Advance Logic ALC250" },
- { AC97_CODEC_ID('C', 'R', 'Y', 0), "Crystal CS4297" },
- { AC97_CODEC_ID('C', 'R', 'Y', 3), "Crystal CS4297" },
- { AC97_CODEC_ID('C', 'R', 'Y', 19), "Crystal CS4297A" },
- { AC97_CODEC_ID('C', 'R', 'Y', 35), "Crystal CS4298", },
- { AC97_CODEC_ID('C', 'R', 'Y', 43), "Crystal CS4294", },
- { AC97_CODEC_ID('C', 'R', 'Y', 49), "Crystal CS4299", },
- { AC97_CODEC_ID('C', 'R', 'Y', 51), "Crystal CS4298A", },
- { AC97_CODEC_ID('C', 'R', 'Y', 52), "Crystal CS4299", },
- { AC97_CODEC_ID('N', 'S', 'C', 49), "National Semiconductor LM4549", },
- { AC97_CODEC_ID('S', 'I', 'L', 34), "Silicon Laboratory Si3036", },
- { AC97_CODEC_ID('S', 'I', 'L', 35), "Silicon Laboratory Si3038", },
- { AC97_CODEC_ID('T', 'R', 'A', 2), "TriTech TR28022", },
- { AC97_CODEC_ID('T', 'R', 'A', 3), "TriTech TR28023", },
- { AC97_CODEC_ID('T', 'R', 'A', 6), "TriTech TR28026", },
- { AC97_CODEC_ID('T', 'R', 'A', 8), "TriTech TR28028", },
- { AC97_CODEC_ID('T', 'R', 'A', 35), "TriTech TR28602", },
- { AC97_CODEC_ID('W', 'M', 'L', 0), "Wolfson WM9704", },
- { AC97_CODEC_ID('W', 'M', 'L', 3), "Wolfson WM9707", },
- { AC97_CODEC_ID('Y', 'M', 'H', 0), "Yamaha YMF743-S", },
- { AC97_CODEC_ID('Y', 'M', 'H', 3), "Yamaha YMF753-S", },
- { 0x45838308, "ESS Technology ES1921", },
- { 0x83847600, "SigmaTel STAC9700", },
- { 0x83847604, "SigmaTel STAC9701/3/4/5", },
- { 0x83847605, "SigmaTel STAC9704", },
- { 0x83847608, "SigmaTel STAC9708", },
- { 0x83847609, "SigmaTel STAC9721/23", },
- { 0x83847644, "SigmaTel STAC9744/45", },
- { 0x83847684, "SigmaTel STAC9783/84", },
- { 0, NULL, }
+ { AC97_CODEC_ID('A', 'D', 'S', 3),
+ 0xffffffff, "Analog Devices AD1819B" },
+ { AC97_CODEC_ID('A', 'D', 'S', 64),
+ 0xffffffff, "Analog Devices AD1881" },
+ { AC97_CODEC_ID('A', 'D', 'S', 72),
+ 0xffffffff, "Analog Devices AD1881A" },
+ { AC97_CODEC_ID('A', 'D', 'S', 96),
+ 0xffffffff, "Analog Devices AD1885" },
+ { AC97_CODEC_ID('A', 'D', 'S', 99),
+ 0xffffffff, "Analog Devices AD1886A" },
+
+ { AC97_CODEC_ID('A', 'K', 'M', 0),
+ 0xffffffff, "Asahi Kasei AK4540" },
+ { AC97_CODEC_ID('A', 'K', 'M', 2),
+ 0xffffffff, "Asahi Kasei AK4543" },
+
+ { AC97_CODEC_ID('A', 'L', 'G', 0x10),
+ 0xffffffff, "Advance Logic ALC200" },
+ { AC97_CODEC_ID('A', 'L', 'G', 0x20),
+ 0xffffffff, "Advance Logic ALC650" },
+ { AC97_CODEC_ID('A', 'L', 'G', 0x30),
+ 0xffffffff, "Advance Logic ALC101" },
+ { AC97_CODEC_ID('A', 'L', 'G', 0x40),
+ 0xffffffff, "Advance Logic ALC202" },
+ { AC97_CODEC_ID('A', 'L', 'G', 0x50),
+ 0xffffffff, "Advance Logic ALC250" },
+
+ /* Cirrus Logic, Crystal series:
+ * 'C' 'R' 'Y' 0x0[0-7] - CS4297
+ * 0x1[0-7] - CS4297A
+ * 0x2[0-7] - CS4298
+ * 0x2[8-f] - CS4294
+ * 0x3[0-7] - CS4299
+ * 0x4[8-f] - CS4201
+ * 0x5[8-f] - CS4205
+ * 0x6[0-7] - CS4291
+ * 0x7[0-7] - CS4202
+ * Datasheets:
+ * http://www.cirrus.com/pubs/cs4297A-5.pdf?DocumentID=593
+ * http://www.cirrus.com/pubs/cs4294.pdf?DocumentID=32
+ * http://www.cirrus.com/pubs/cs4299-5.pdf?DocumentID=594
+ * http://www.cirrus.com/pubs/cs4201-2.pdf?DocumentID=492
+ * http://www.cirrus.com/pubs/cs4205-2.pdf?DocumentID=492
+ * http://www.cirrus.com/pubs/cs4202-1.pdf?DocumentID=852
+ */
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x00),
+ 0xfffffff8, "Crystal CS4297", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x10),
+ 0xfffffff8, "Crystal CS4297A", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x20),
+ 0xfffffff8, "Crystal CS4298", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x28),
+ 0xfffffff8, "Crystal CS4294", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x30),
+ 0xfffffff8, "Crystal CS4299", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x48),
+ 0xfffffff8, "Crystal CS4201", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x58),
+ 0xfffffff8, "Crystal CS4205", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x60),
+ 0xfffffff8, "Crystal CS4291", },
+ { AC97_CODEC_ID('C', 'R', 'Y', 0x70),
+ 0xfffffff8, "Crystal CS4202", },
+
+ { AC97_CODEC_ID('N', 'S', 'C', 49),
+ 0xffffffff, "National Semiconductor LM4549", },
+ { AC97_CODEC_ID('S', 'I', 'L', 34),
+ 0xffffffff, "Silicon Laboratory Si3036", },
+ { AC97_CODEC_ID('S', 'I', 'L', 35),
+ 0xffffffff, "Silicon Laboratory Si3038", },
+ { AC97_CODEC_ID('T', 'R', 'A', 2),
+ 0xffffffff, "TriTech TR28022", },
+ { AC97_CODEC_ID('T', 'R', 'A', 3),
+ 0xffffffff, "TriTech TR28023", },
+ { AC97_CODEC_ID('T', 'R', 'A', 6),
+ 0xffffffff, "TriTech TR28026", },
+ { AC97_CODEC_ID('T', 'R', 'A', 8),
+ 0xffffffff, "TriTech TR28028", },
+ { AC97_CODEC_ID('T', 'R', 'A', 35),
+ 0xffffffff, "TriTech TR28602", },
+ { AC97_CODEC_ID('W', 'M', 'L', 0),
+ 0xffffffff, "Wolfson WM9704", },
+ { AC97_CODEC_ID('W', 'M', 'L', 3),
+ 0xffffffff, "Wolfson WM9707", },
+ { AC97_CODEC_ID('Y', 'M', 'H', 0),
+ 0xffffffff, "Yamaha YMF743-S", },
+ { AC97_CODEC_ID('Y', 'M', 'H', 3),
+ 0xffffffff, "Yamaha YMF753-S", },
+ { 0x45838308, 0xffffffff, "ESS Technology ES1921", },
+ { 0x83847600, 0xffffffff, "SigmaTel STAC9700", },
+ { 0x83847604, 0xffffffff, "SigmaTel STAC9701/3/4/5", },
+ { 0x83847605, 0xffffffff, "SigmaTel STAC9704", },
+ { 0x83847608, 0xffffffff, "SigmaTel STAC9708", },
+ { 0x83847609, 0xffffffff, "SigmaTel STAC9721/23", },
+ { 0x83847644, 0xffffffff, "SigmaTel STAC9744/45", },
+ { 0x83847684, 0xffffffff, "SigmaTel STAC9783/84", },
+ { 0,
+ 0, NULL, }
};
static const char * const ac97enhancement[] = {
@@ -633,7 +691,7 @@ ac97_attach(host_if)
printf("unknown (0x%08x)", id);
break;
}
- if (ac97codecid[i].id == id) {
+ if (ac97codecid[i].id == (id & ac97codecid[i].mask)) {
printf("%s", ac97codecid[i].name);
break;
}