summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortruckman <truckman@FreeBSD.org>2004-05-13 11:32:54 +0000
committertruckman <truckman@FreeBSD.org>2004-05-13 11:32:54 +0000
commit305fdebeb32934840c996fe567234d265b03da04 (patch)
tree89cc28bc9f80dee94d8c608e4f6414e1b5f01466
parent3aa9288a48ca6d866ef3eb1b40a5eaf98e32f8d5 (diff)
downloadFreeBSD-src-305fdebeb32934840c996fe567234d265b03da04.zip
FreeBSD-src-305fdebeb32934840c996fe567234d265b03da04.tar.gz
Implement sbc_lockassert() and sb_lockassert() functions to allow
proper locking to be checked at runtime. Remove sb_lock() and sb_unlock() calls from sb_reset_dsp() because the latter is called from sb_setup() with the lock already held. Add a call to sb_lockassert(). Surround the call to sb_reset_dsp() in sb16_attach() with sb_lock() and sb_unlock() calls. Tested by: Bartek Marcinkiewicz <junior AT p233.if.pwr.wroc.pl>
-rw-r--r--sys/dev/sound/isa/sb.h1
-rw-r--r--sys/dev/sound/isa/sb16.c15
-rw-r--r--sys/dev/sound/isa/sbc.c6
3 files changed, 19 insertions, 3 deletions
diff --git a/sys/dev/sound/isa/sb.h b/sys/dev/sound/isa/sb.h
index ff09ef2..ddcb863 100644
--- a/sys/dev/sound/isa/sb.h
+++ b/sys/dev/sound/isa/sb.h
@@ -8,6 +8,7 @@
struct sbc_softc;
void sbc_lock(struct sbc_softc *);
+void sbc_lockassert(struct sbc_softc *);
void sbc_unlock(struct sbc_softc *);
/*
diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c
index 87683ce..66fe122 100644
--- a/sys/dev/sound/isa/sb16.c
+++ b/sys/dev/sound/isa/sb16.c
@@ -124,6 +124,12 @@ sb_lock(struct sb_info *sb) {
}
static void
+sb_lockassert(struct sb_info *sb) {
+
+ sbc_lockassert(device_get_softc(sb->parent_dev));
+}
+
+static void
sb_unlock(struct sb_info *sb) {
sbc_unlock(device_get_softc(sb->parent_dev));
@@ -266,12 +272,11 @@ sb_reset_dsp(struct sb_info *sb)
{
u_char b;
- sb_lock(sb);
+ sb_lockassert(sb);
sb_wr(sb, SBDSP_RST, 3);
DELAY(100);
sb_wr(sb, SBDSP_RST, 0);
b = sb_get_byte(sb);
- sb_unlock(sb);
if (b != 0xAA) {
DEB(printf("sb_reset_dsp 0x%lx failed\n",
rman_get_start(sb->io_base)));
@@ -799,8 +804,12 @@ sb16_attach(device_t dev)
if (sb16_alloc_resources(sb, dev))
goto no;
- if (sb_reset_dsp(sb))
+ sb_lock(sb);
+ if (sb_reset_dsp(sb)) {
+ sb_unlock(sb);
goto no;
+ }
+ sb_unlock(sb);
if (mixer_init(dev, &sb16mix_mixer_class, sb))
goto no;
if (snd_setup_intr(dev, sb->irq, 0, sb_intr, sb, &sb->ih))
diff --git a/sys/dev/sound/isa/sbc.c b/sys/dev/sound/isa/sbc.c
index 3badd65..bd06b69 100644
--- a/sys/dev/sound/isa/sbc.c
+++ b/sys/dev/sound/isa/sbc.c
@@ -132,6 +132,12 @@ sbc_lock(struct sbc_softc *scp)
}
void
+sbc_lockassert(struct sbc_softc *scp)
+{
+ snd_mtxassert(scp->lock);
+}
+
+void
sbc_unlock(struct sbc_softc *scp)
{
snd_mtxunlock(scp->lock);
OpenPOWER on IntegriCloud