summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2000-12-24 03:33:21 +0000
committercg <cg@FreeBSD.org>2000-12-24 03:33:21 +0000
commit97cafaa0df50e0efefa1ccd2c2b73dcb88b82bb4 (patch)
tree79288887e3dcbc683a226aa4f40ab0531d8f1511 /sys
parentd756562577e8b141634ac47c750c15faf6e1646d (diff)
downloadFreeBSD-src-97cafaa0df50e0efefa1ccd2c2b73dcb88b82bb4.zip
FreeBSD-src-97cafaa0df50e0efefa1ccd2c2b73dcb88b82bb4.tar.gz
compensate for broken codecs that return 0xffff on unimplemented registers
instead of 0.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/sound/pcm/ac97.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/sys/dev/sound/pcm/ac97.c b/sys/dev/sound/pcm/ac97.c
index a4020e8..e1c331c 100644
--- a/sys/dev/sound/pcm/ac97.c
+++ b/sys/dev/sound/pcm/ac97.c
@@ -320,15 +320,16 @@ ac97_initmixer(struct ac97_info *codec)
}
}
- if (codec->noext) {
- codec->extcaps = 0;
- codec->extid = 0;
- codec->extstat = 0;
- } else {
+ codec->extcaps = 0;
+ codec->extid = 0;
+ codec->extstat = 0;
+ if (!codec->noext) {
i = rdcd(codec, AC97_REGEXT_ID);
- codec->extcaps = i & 0x3fff;
- codec->extid = (i & 0xc000) >> 14;
- codec->extstat = rdcd(codec, AC97_REGEXT_STAT) & AC97_EXTCAPS;
+ if (i != 0xffff) {
+ codec->extcaps = i & 0x3fff;
+ codec->extid = (i & 0xc000) >> 14;
+ codec->extstat = rdcd(codec, AC97_REGEXT_STAT) & AC97_EXTCAPS;
+ }
}
for (i = 0; i < 32; i++) {
@@ -338,7 +339,7 @@ ac97_initmixer(struct ac97_info *codec)
wrcd(codec, codec->mix[i].reg, 0x3f);
j = rdcd(codec, codec->mix[i].reg);
wrcd(codec, codec->mix[i].reg, old);
- codec->mix[i].enable = j? 1 : 0;
+ codec->mix[i].enable = (j != 0 && j != old)? 1 : 0;
for (k = 1; j & (1 << k); k++);
codec->mix[i].bits = j? k - codec->mix[i].ofs : 0;
}
OpenPOWER on IntegriCloud