diff options
author | cg <cg@FreeBSD.org> | 2000-12-24 03:33:21 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2000-12-24 03:33:21 +0000 |
commit | 97cafaa0df50e0efefa1ccd2c2b73dcb88b82bb4 (patch) | |
tree | 79288887e3dcbc683a226aa4f40ab0531d8f1511 /sys/dev/sound/pcm/ac97.c | |
parent | d756562577e8b141634ac47c750c15faf6e1646d (diff) | |
download | FreeBSD-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/dev/sound/pcm/ac97.c')
-rw-r--r-- | sys/dev/sound/pcm/ac97.c | 19 |
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; } |