git: 9d18115ca0ab - main - sound: Retire snd_mtx* wrappers

From: Christos Margiolis <christos_at_FreeBSD.org>
Date: Fri, 21 Nov 2025 16:15:03 UTC
The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=9d18115ca0ab0ef3f34173d4e2bdabec916d0b60

commit 9d18115ca0ab0ef3f34173d4e2bdabec916d0b60
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2025-11-21 16:14:33 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2025-11-21 16:14:47 +0000

    sound: Retire snd_mtx* wrappers
    
    Do not create mutexes with snd_mtxcreate(). It doesn't provide any
    value, plus it first allocates the mutex with malloc(9). Allocate
    mutexes in the stack and use mtx_* functions directly instead of the
    snd_mtx* wrappers.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Reviewed by:    kib, markj
    Differential Revision:  https://reviews.freebsd.org/D53855
---
 sys/arm/allwinner/a10_codec.c        |  10 ++--
 sys/arm/freescale/imx/imx6_ssi.c     |  20 +++----
 sys/arm/freescale/vybrid/vf_sai.c    |  20 +++----
 sys/dev/sound/dummy.c                |  29 +++++-----
 sys/dev/sound/pci/als4000.c          |  50 ++++++++---------
 sys/dev/sound/pci/atiixp.c           |  18 +++---
 sys/dev/sound/pci/cmi.c              |  54 +++++++++---------
 sys/dev/sound/pci/emu10k1.c          |  57 +++++++++----------
 sys/dev/sound/pci/emu10kx-pcm.c      |  47 ++++++++--------
 sys/dev/sound/pci/envy24.c           |  68 +++++++++++------------
 sys/dev/sound/pci/envy24ht.c         |  69 ++++++++++++-----------
 sys/dev/sound/pci/es137x.c           |  16 +++---
 sys/dev/sound/pci/hda/hdaa.c         |   6 +-
 sys/dev/sound/pci/hda/hdac.c         |  15 ++---
 sys/dev/sound/pci/hda/hdac_private.h |   2 +-
 sys/dev/sound/pci/hda/hdacc.c        |   6 +-
 sys/dev/sound/pci/hdsp-pcm.c         |  28 +++++-----
 sys/dev/sound/pci/hdsp.c             |  35 ++++++------
 sys/dev/sound/pci/hdsp.h             |   2 +-
 sys/dev/sound/pci/hdspe-pcm.c        |  28 +++++-----
 sys/dev/sound/pci/hdspe.c            |  35 ++++++------
 sys/dev/sound/pci/hdspe.h            |   2 +-
 sys/dev/sound/pci/ich.c              |  16 +++---
 sys/dev/sound/pci/maestro3.c         |  17 +++---
 sys/dev/sound/pci/solo.c             |  18 +++---
 sys/dev/sound/pci/spicds.c           |  34 ++++++------
 sys/dev/sound/pci/t4dwave.c          |  29 +++++-----
 sys/dev/sound/pci/via8233.c          | 101 +++++++++++++++++----------------
 sys/dev/sound/pci/via82c686.c        |  36 ++++++------
 sys/dev/sound/pcm/ac97.c             |  52 ++++++++---------
 sys/dev/sound/pcm/channel.c          |  16 +++---
 sys/dev/sound/pcm/channel.h          |  14 ++---
 sys/dev/sound/pcm/dsp.c              |   4 +-
 sys/dev/sound/pcm/mixer.c            | 105 +++++++++++++++++------------------
 sys/dev/sound/pcm/sound.c            |  33 +----------
 sys/dev/sound/pcm/sound.h            |  24 +++-----
 sys/dev/sound/usb/uaudio.c           |   2 +-
 37 files changed, 537 insertions(+), 581 deletions(-)

diff --git a/sys/arm/allwinner/a10_codec.c b/sys/arm/allwinner/a10_codec.c
index 0a4ba7aa31b2..d3920eddc1f1 100644
--- a/sys/arm/allwinner/a10_codec.c
+++ b/sys/arm/allwinner/a10_codec.c
@@ -159,7 +159,7 @@ struct a10codec_chinfo {
 struct a10codec_info {
 	device_t		dev;
 	struct resource		*res[2];
-	struct mtx		*lock;
+	struct mtx		lock;
 	bus_dma_tag_t		dmat;
 	unsigned		dmasize;
 	void			*ih;
@@ -949,7 +949,7 @@ a10codec_chan_trigger(kobj_t obj, void *data, int go)
 	if (!PCMTRIG_COMMON(go))
 		return (0);
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	switch (go) {
 	case PCMTRIG_START:
 		ch->run = 1;
@@ -964,7 +964,7 @@ a10codec_chan_trigger(kobj_t obj, void *data, int go)
 	default:
 		break;
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -1075,7 +1075,7 @@ a10codec_attach(device_t dev)
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
 	sc->cfg = (void *)ofw_bus_search_compatible(dev, compat_data)->ocd_data;
 	sc->dev = dev;
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "a10codec softc");
+	mtx_init(&sc->lock, device_get_nameunit(dev), "a10codec_softc", MTX_DEF);
 
 	if (bus_alloc_resources(dev, a10codec_spec, sc->res)) {
 		device_printf(dev, "cannot allocate resources for device\n");
@@ -1180,7 +1180,7 @@ a10codec_attach(device_t dev)
 
 fail:
 	bus_release_resources(dev, a10codec_spec, sc->res);
-	snd_mtxfree(sc->lock);
+	mtx_destroy(&sc->lock);
 	free(sc, M_DEVBUF);
 
 	return (ENXIO);
diff --git a/sys/arm/freescale/imx/imx6_ssi.c b/sys/arm/freescale/imx/imx6_ssi.c
index 5a0e671f15a2..76870cfb29c9 100644
--- a/sys/arm/freescale/imx/imx6_ssi.c
+++ b/sys/arm/freescale/imx/imx6_ssi.c
@@ -173,7 +173,7 @@ struct sc_info {
 	bus_space_tag_t		bst;
 	bus_space_handle_t	bsh;
 	device_t		dev;
-	struct mtx		*lock;
+	struct mtx		lock;
 	void			*ih;
 	int			pos;
 	int			dma_size;
@@ -242,10 +242,10 @@ ssimixer_init(struct snd_mixer *m)
 	mask = SOUND_MASK_PCM;
 	mask |= SOUND_MASK_VOLUME;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
 	mix_setdevs(m, mask);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -290,14 +290,14 @@ ssichan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
 	scp = (struct sc_pcminfo *)devinfo;
 	sc = scp->sc;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	ch = &scp->chan[0];
 	ch->dir = dir;
 	ch->run = 0;
 	ch->buffer = b;
 	ch->channel = c;
 	ch->parent = scp;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	if (sndbuf_setup(ch->buffer, sc->buf_base, sc->dma_size) != 0) {
 		device_printf(scp->dev, "Can't setup sndbuf.\n");
@@ -318,9 +318,9 @@ ssichan_free(kobj_t obj, void *data)
 	device_printf(scp->dev, "ssichan_free()\n");
 #endif
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	/* TODO: free channel buffer */
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -565,7 +565,7 @@ ssichan_trigger(kobj_t obj, void *data, int go)
 	scp = ch->parent;
 	sc = scp->sc;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 
 	switch (go) {
 	case PCMTRIG_START:
@@ -590,7 +590,7 @@ ssichan_trigger(kobj_t obj, void *data, int go)
 		break;
 	}
 
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -736,7 +736,7 @@ ssi_attach(device_t dev)
 	sc->pos = 0;
 	sc->conf = malloc(sizeof(struct sdma_conf), M_DEVBUF, M_WAITOK | M_ZERO);
 
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "ssi softc");
+	mtx_init(&sc->lock, device_get_nameunit(dev), "ssi softc");
 	if (sc->lock == NULL) {
 		device_printf(dev, "Can't create mtx\n");
 		return (ENXIO);
diff --git a/sys/arm/freescale/vybrid/vf_sai.c b/sys/arm/freescale/vybrid/vf_sai.c
index 9c0125768fee..6ccfcae2bc2e 100644
--- a/sys/arm/freescale/vybrid/vf_sai.c
+++ b/sys/arm/freescale/vybrid/vf_sai.c
@@ -138,7 +138,7 @@ struct sc_info {
 	bus_space_tag_t		bst;
 	bus_space_handle_t	bsh;
 	device_t		dev;
-	struct mtx		*lock;
+	struct mtx		lock;
 	uint32_t		speed;
 	uint32_t		period;
 	void			*ih;
@@ -206,10 +206,10 @@ saimixer_init(struct snd_mixer *m)
 
 	mask = SOUND_MASK_PCM;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
 	mix_setdevs(m, mask);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -252,14 +252,14 @@ saichan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
 	scp = (struct sc_pcminfo *)devinfo;
 	sc = scp->sc;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	ch = &scp->chan[0];
 	ch->dir = dir;
 	ch->run = 0;
 	ch->buffer = b;
 	ch->channel = c;
 	ch->parent = scp;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	if (sndbuf_setup(ch->buffer, sc->buf_base, sc->dma_size) != 0) {
 		device_printf(scp->dev, "Can't setup sndbuf.\n");
@@ -280,9 +280,9 @@ saichan_free(kobj_t obj, void *data)
 	device_printf(scp->dev, "saichan_free()\n");
 #endif
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	/* TODO: free channel buffer */
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -513,7 +513,7 @@ saichan_trigger(kobj_t obj, void *data, int go)
 	struct sc_pcminfo *scp = ch->parent;
 	struct sc_info *sc = scp->sc;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 
 	switch (go) {
 	case PCMTRIG_START:
@@ -532,7 +532,7 @@ saichan_trigger(kobj_t obj, void *data, int go)
 		break;
 	}
 
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -691,7 +691,7 @@ sai_attach(device_t dev)
 	sc->sr = &rate_map[0];
 	sc->pos = 0;
 
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "sai softc");
+	mtx_init(&sc->lock, device_get_nameunit(dev), "sai softc");
 	if (sc->lock == NULL) {
 		device_printf(dev, "Cant create mtx\n");
 		return (ENXIO);
diff --git a/sys/dev/sound/dummy.c b/sys/dev/sound/dummy.c
index 0a2717ec418c..74ca1d0c924c 100644
--- a/sys/dev/sound/dummy.c
+++ b/sys/dev/sound/dummy.c
@@ -64,7 +64,7 @@ struct dummy_softc {
 	int chnum;
 	struct dummy_chan chans[DUMMY_NCHAN];
 	struct callout callout;
-	struct mtx *lock;
+	struct mtx lock;
 	bool stopped;
 };
 
@@ -74,7 +74,7 @@ dummy_active(struct dummy_softc *sc)
 	struct dummy_chan *ch;
 	int i;
 
-	snd_mtxassert(sc->lock);
+	mtx_assert(&sc->lock, MA_OWNED);
 
 	for (i = 0; i < sc->chnum; i++) {
 		ch = &sc->chans[i];
@@ -109,9 +109,9 @@ dummy_chan_io(void *arg)
 			ch->ptr %= ch->buf->bufsize;
 		} else
 			sndbuf_fillsilence(ch->buf);
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		chn_intr(ch->chan);
-		snd_mtxlock(sc->lock);
+		mtx_lock(&sc->lock);
 	}
 	if (!sc->stopped)
 		callout_schedule(&sc->callout, 1);
@@ -141,7 +141,7 @@ dummy_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
 
 	sc = devinfo;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 
 	ch = &sc->chans[sc->chnum++];
 	ch->sc = sc;
@@ -150,7 +150,7 @@ dummy_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
 	ch->buf = b;
 	ch->caps = &sc->caps;
 
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	bufsz = pcm_getbuffersize(sc->dev, 2048, 2048, 65536);
 	buf = malloc(bufsz, M_DEVBUF, M_WAITOK | M_ZERO);
@@ -199,10 +199,10 @@ dummy_chan_trigger(kobj_t obj, void *data, int go)
 	struct dummy_chan *ch = data;
 	struct dummy_softc *sc = ch->sc;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 
 	if (sc->stopped) {
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		return (0);
 	}
 
@@ -222,7 +222,7 @@ dummy_chan_trigger(kobj_t obj, void *data, int go)
 		break;
 	}
 
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return (0);
 }
@@ -320,8 +320,9 @@ dummy_attach(device_t dev)
 
 	sc = device_get_softc(dev);
 	sc->dev = dev;
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_dummy softc");
-	callout_init_mtx(&sc->callout, sc->lock, 0);
+	mtx_init(&sc->lock, device_get_nameunit(dev), "snd_dummy softc",
+	    MTX_DEF);
+	callout_init_mtx(&sc->callout, &sc->lock, 0);
 
 	sc->cap_fmts[0] = SND_FORMAT(AFMT_S32_LE, 2, 0);
 	sc->cap_fmts[1] = SND_FORMAT(AFMT_S24_LE, 2, 0);
@@ -362,12 +363,12 @@ dummy_detach(device_t dev)
 	struct dummy_softc *sc = device_get_softc(dev);
 	int err;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	sc->stopped = true;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	callout_drain(&sc->callout);
 	err = pcm_unregister(dev);
-	snd_mtxfree(sc->lock);
+	mtx_destroy(&sc->lock);
 
 	return (err);
 }
diff --git a/sys/dev/sound/pci/als4000.c b/sys/dev/sound/pci/als4000.c
index a8c3303af74f..aea7cc6d3a64 100644
--- a/sys/dev/sound/pci/als4000.c
+++ b/sys/dev/sound/pci/als4000.c
@@ -79,7 +79,7 @@ struct sc_info {
 	struct resource		*reg, *irq;
 	int			regid, irqid;
 	void			*ih;
-	struct mtx		*lock;
+	struct mtx		lock;
 
 	unsigned int		bufsz;
 	struct sc_chinfo	pch, rch;
@@ -208,7 +208,7 @@ alschan_init(kobj_t obj, void *devinfo,
 	struct	sc_info	*sc = devinfo;
 	struct	sc_chinfo *ch;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (dir == PCMDIR_PLAY) {
 		ch = &sc->pch;
 		ch->gcr_fifo_status = ALS_GCR_FIFO0_STATUS;
@@ -223,7 +223,7 @@ alschan_init(kobj_t obj, void *devinfo,
 	ch->format = SND_FORMAT(AFMT_U8, 1, 0);
 	ch->speed = 8000;
 	ch->buffer = b;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
 		return NULL;
@@ -278,9 +278,9 @@ alschan_getptr(kobj_t obj, void *data)
 	struct sc_info *sc = ch->parent;
 	int32_t pos, sz;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	pos = als_gcr_rd(ch->parent, ch->gcr_fifo_status) & 0xffff;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	sz  = ch->buffer->bufsize;
 	return (2 * sz - pos - 1) % sz;
 }
@@ -397,7 +397,7 @@ alspchan_trigger(kobj_t obj, void *data, int go)
 	if (!PCMTRIG_COMMON(go))
 		return 0;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	switch(go) {
 	case PCMTRIG_START:
 		als_playback_start(ch);
@@ -409,7 +409,7 @@ alspchan_trigger(kobj_t obj, void *data, int go)
 	default:
 		break;
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
@@ -493,7 +493,7 @@ alsrchan_trigger(kobj_t obj, void *data, int go)
 	struct	sc_chinfo *ch = data;
 	struct sc_info *sc = ch->parent;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	switch(go) {
 	case PCMTRIG_START:
 		als_capture_start(ch);
@@ -503,7 +503,7 @@ alsrchan_trigger(kobj_t obj, void *data, int go)
 		als_capture_stop(ch);
 		break;
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
@@ -637,19 +637,19 @@ als_intr(void *p)
 	struct sc_info *sc = (struct sc_info *)p;
 	u_int8_t intr, sb_status;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	intr = als_intr_rd(sc);
 
 	if (intr & 0x80) {
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		chn_intr(sc->pch.channel);
-		snd_mtxlock(sc->lock);
+		mtx_lock(&sc->lock);
 	}
 
 	if (intr & 0x40) {
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		chn_intr(sc->rch.channel);
-		snd_mtxlock(sc->lock);
+		mtx_lock(&sc->lock);
 	}
 
 	/* ACK interrupt in PCI core */
@@ -667,7 +667,7 @@ als_intr(void *p)
 	if (sb_status & ALS_IRQ_CR1E)
 		als_ack_read(sc, ALS_CR1E_ACK_PORT);
 
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return;
 }
 
@@ -749,10 +749,7 @@ als_resource_free(device_t dev, struct sc_info *sc)
 		bus_dma_tag_destroy(sc->parent_dmat);
 		sc->parent_dmat = 0;
 	}
-	if (sc->lock) {
-		snd_mtxfree(sc->lock);
-		sc->lock = NULL;
-	}
+	mtx_destroy(&sc->lock);
 }
 
 static int
@@ -808,7 +805,8 @@ als_pci_attach(device_t dev)
 	char status[SND_STATUSLEN];
 
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_als4000 softc");
+	mtx_init(&sc->lock, device_get_nameunit(dev), "snd_als4000 softc",
+	    MTX_DEF);
 	sc->dev = dev;
 
 	pci_enable_busmaster(dev);
@@ -882,11 +880,11 @@ als_pci_suspend(device_t dev)
 {
 	struct sc_info *sc = pcm_getdevinfo(dev);
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	sc->pch.dma_was_active = als_playback_stop(&sc->pch);
 	sc->rch.dma_was_active = als_capture_stop(&sc->rch);
 	als_uninit(sc);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
@@ -895,16 +893,16 @@ als_pci_resume(device_t dev)
 {
 	struct sc_info *sc = pcm_getdevinfo(dev);
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (als_init(sc) != 0) {
 		device_printf(dev, "unable to reinitialize the card\n");
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		return ENXIO;
 	}
 
 	if (mixer_reinit(dev) != 0) {
 		device_printf(dev, "unable to reinitialize the mixer\n");
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		return ENXIO;
 	}
 
@@ -915,7 +913,7 @@ als_pci_resume(device_t dev)
 	if (sc->rch.dma_was_active) {
 		als_capture_start(&sc->rch);
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return 0;
 }
diff --git a/sys/dev/sound/pci/atiixp.c b/sys/dev/sound/pci/atiixp.c
index 30f061fd9388..12906ecc6253 100644
--- a/sys/dev/sound/pci/atiixp.c
+++ b/sys/dev/sound/pci/atiixp.c
@@ -129,7 +129,7 @@ struct atiixp_info {
 	uint32_t blkcnt;
 	int registered_channels;
 
-	struct mtx *lock;
+	struct mtx lock;
 	struct callout poll_timer;
 	int poll_ticks, polling;
 };
@@ -139,9 +139,9 @@ struct atiixp_info {
 #define atiixp_wr(_sc, _reg, _val)	\
 		bus_space_write_4((_sc)->st, (_sc)->sh, _reg, _val)
 
-#define atiixp_lock(_sc)	snd_mtxlock((_sc)->lock)
-#define atiixp_unlock(_sc)	snd_mtxunlock((_sc)->lock)
-#define atiixp_assert(_sc)	snd_mtxassert((_sc)->lock)
+#define atiixp_lock(_sc)	mtx_lock(&(_sc)->lock)
+#define atiixp_unlock(_sc)	mtx_unlock(&(_sc)->lock)
+#define atiixp_assert(_sc)	mtx_assert(&(_sc)->lock, MA_OWNED)
 
 static uint32_t atiixp_fmt_32bit[] = {
 	SND_FORMAT(AFMT_S16_LE, 2, 0),
@@ -1019,7 +1019,7 @@ atiixp_chip_post_init(void *arg)
 	if (sc->codec_not_ready_bits == 0) {
 		/* wait for the interrupts to happen */
 		do {
-			msleep(sc, sc->lock, PWAIT, "ixpslp", max(hz / 10, 1));
+			msleep(sc, &sc->lock, PWAIT, "ixpslp", max(hz / 10, 1));
 			if (sc->codec_not_ready_bits != 0)
 				break;
 		} while (--timeout);
@@ -1157,10 +1157,7 @@ atiixp_release_resource(struct atiixp_info *sc)
 		bus_dma_tag_destroy(sc->sgd_dmat);
 		sc->sgd_dmat = NULL;
 	}
-	if (sc->lock) {
-		snd_mtxfree(sc->lock);
-		sc->lock = NULL;
-	}
+	mtx_destroy(&sc->lock);
 	free(sc, M_DEVBUF);
 }
 
@@ -1190,7 +1187,8 @@ atiixp_pci_attach(device_t dev)
 	int i;
 
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_atiixp softc");
+	mtx_init(&sc->lock, device_get_nameunit(dev), "snd_atiixp softc",
+	    MTX_DEF);
 	sc->dev = dev;
 
 	callout_init(&sc->poll_timer, 1);
diff --git a/sys/dev/sound/pci/cmi.c b/sys/dev/sound/pci/cmi.c
index 28427d449c8d..99925d236c08 100644
--- a/sys/dev/sound/pci/cmi.c
+++ b/sys/dev/sound/pci/cmi.c
@@ -116,7 +116,7 @@ struct sc_info {
 	struct resource		*reg, *irq;
 	int			regid, irqid;
 	void 			*ih;
-	struct mtx		*lock;
+	struct mtx		lock;
 
 	int			spdif_enabled;
 	unsigned int		bufsz;
@@ -361,13 +361,13 @@ cmichan_init(kobj_t obj, void *devinfo,
 	}
 
 	ch->dir = dir;
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (ch->dir == PCMDIR_PLAY) {
 		cmi_dma_prog(sc, ch, CMPCI_REG_DMA0_BASE);
 	} else {
 		cmi_dma_prog(sc, ch, CMPCI_REG_DMA1_BASE);
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return ch;
 }
@@ -394,7 +394,7 @@ cmichan_setformat(kobj_t obj, void *data, u_int32_t format)
 		f |= CMPCI_REG_FORMAT_MONO;
 	}
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (ch->dir == PCMDIR_PLAY) {
 		cmi_partial_wr4(ch->parent,
 				CMPCI_REG_CHANNEL_FORMAT,
@@ -408,7 +408,7 @@ cmichan_setformat(kobj_t obj, void *data, u_int32_t format)
 				CMPCI_REG_CH1_FORMAT_MASK,
 				f);
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	ch->fmt = format;
 
 	return 0;
@@ -422,7 +422,7 @@ cmichan_setspeed(kobj_t obj, void *data, u_int32_t speed)
 	u_int32_t r, rsp __unused;
 
 	r = cmpci_rate_to_regvalue(speed);
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (ch->dir == PCMDIR_PLAY) {
 		if (speed < 44100) {
 			/* disable if req before rate change */
@@ -450,7 +450,7 @@ cmichan_setspeed(kobj_t obj, void *data, u_int32_t speed)
 		rsp >>= CMPCI_REG_ADC_FS_SHIFT;
 		rsp &= 	CMPCI_REG_ADC_FS_MASK;
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	ch->spd = cmpci_regvalue_to_rate(r);
 
 	DEB(printf("cmichan_setspeed (%s) %d -> %d (%d)\n",
@@ -484,7 +484,7 @@ cmichan_trigger(kobj_t obj, void *data, int go)
 	if (!PCMTRIG_COMMON(go))
 		return 0;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (ch->dir == PCMDIR_PLAY) {
 		switch(go) {
 		case PCMTRIG_START:
@@ -506,7 +506,7 @@ cmichan_trigger(kobj_t obj, void *data, int go)
 			break;
 		}
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
@@ -517,13 +517,13 @@ cmichan_getptr(kobj_t obj, void *data)
 	struct sc_info		*sc = ch->parent;
 	u_int32_t physptr, bufptr, sz;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (ch->dir == PCMDIR_PLAY) {
 		physptr = cmi_rd(sc, CMPCI_REG_DMA0_BASE, 4);
 	} else {
 		physptr = cmi_rd(sc, CMPCI_REG_DMA1_BASE, 4);
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	sz = ch->buffer->bufsize;
 	bufptr = (physptr - ch->phys_buf + sz - ch->bps) % sz;
@@ -538,7 +538,7 @@ cmi_intr(void *data)
 	u_int32_t intrstat;
 	u_int32_t toclear;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	intrstat = cmi_rd(sc, CMPCI_REG_INTR_STATUS, 4);
 	if ((intrstat & CMPCI_REG_ANY_INTR) != 0) {
 		toclear = 0;
@@ -554,7 +554,7 @@ cmi_intr(void *data)
 
 		if (toclear) {
 			cmi_clr4(sc, CMPCI_REG_INTR_CTRL, toclear);
-			snd_mtxunlock(sc->lock);
+			mtx_unlock(&sc->lock);
 
 			/* Signal interrupts to channel */
 			if (intrstat & CMPCI_REG_CH0_INTR) {
@@ -565,14 +565,14 @@ cmi_intr(void *data)
 				chn_intr(sc->rch.channel);
 			}
 
-			snd_mtxlock(sc->lock);
+			mtx_lock(&sc->lock);
 			cmi_set4(sc, CMPCI_REG_INTR_CTRL, toclear);
 		}
 	}
 	if(sc->mpu_intr) {
 		(sc->mpu_intr)(sc->mpu);
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return;
 }
 
@@ -799,10 +799,10 @@ cmi_muninit(struct mpu401 *arg, void *cookie)
 {
 	struct sc_info *sc = cookie;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	sc->mpu_intr = NULL;
 	sc->mpu = NULL;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return 0;
 }
@@ -933,7 +933,8 @@ cmi_attach(device_t dev)
 	char			status[SND_STATUSLEN];
 
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
-	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_cmi softc");
+	mtx_init(&sc->lock, device_get_nameunit(dev), "snd_cmi softc",
+	    MTX_DEF);
 	pci_enable_busmaster(dev);
 
 	sc->dev = dev;
@@ -1007,8 +1008,7 @@ cmi_attach(device_t dev)
 		bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
 	if (sc->reg)
 		bus_release_resource(dev, SYS_RES_IOPORT, sc->regid, sc->reg);
-	if (sc->lock)
-		snd_mtxfree(sc->lock);
+	mtx_destroy(&sc->lock);
 	if (sc)
 		free(sc, M_DEVBUF);
 
@@ -1037,7 +1037,7 @@ cmi_detach(device_t dev)
 	if (sc->mpu_reg)
 	    bus_release_resource(dev, SYS_RES_IOPORT, sc->mpu_regid, sc->mpu_reg);
 
-	snd_mtxfree(sc->lock);
+	mtx_destroy(&sc->lock);
 	free(sc, M_DEVBUF);
 
 	return 0;
@@ -1048,11 +1048,11 @@ cmi_suspend(device_t dev)
 {
 	struct sc_info *sc = pcm_getdevinfo(dev);
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	sc->pch.dma_was_active = cmi_ch0_stop(sc, &sc->pch);
 	sc->rch.dma_was_active = cmi_ch1_stop(sc, &sc->rch);
 	cmi_power(sc, 3);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
@@ -1061,17 +1061,17 @@ cmi_resume(device_t dev)
 {
 	struct sc_info *sc = pcm_getdevinfo(dev);
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	cmi_power(sc, 0);
 	if (cmi_init(sc) != 0) {
 		device_printf(dev, "unable to reinitialize the card\n");
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		return ENXIO;
 	}
 
 	if (mixer_reinit(dev) == -1) {
 		device_printf(dev, "unable to reinitialize the mixer\n");
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
                 return ENXIO;
         }
 
@@ -1086,7 +1086,7 @@ cmi_resume(device_t dev)
 		cmichan_setformat(NULL, &sc->rch, sc->rch.fmt);
 		cmi_ch1_start(sc, &sc->rch);
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
diff --git a/sys/dev/sound/pci/emu10k1.c b/sys/dev/sound/pci/emu10k1.c
index a85031977f4b..da2ddc99f5a1 100644
--- a/sys/dev/sound/pci/emu10k1.c
+++ b/sys/dev/sound/pci/emu10k1.c
@@ -218,7 +218,7 @@ struct sc_info {
 
 	struct resource *reg, *irq;
 	void		*ih;
-	struct mtx	*lock;
+	struct mtx	lock;
 
 	unsigned int bufsz;
 	int timer, timerinterval;
@@ -820,10 +820,10 @@ emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
 	ch->blksz = sc->bufsz / 2;
 	ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
 	ch->spd = 8000;
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	ch->master = emu_valloc(sc);
 	ch->slave = emu_valloc(sc);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))
 	    ? NULL : ch;
 
@@ -837,9 +837,9 @@ emupchan_free(kobj_t obj, void *data)
 	struct sc_info *sc = ch->parent;
 	int r;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	r = emu_memfree(sc, ch->buffer->buf);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return r;
 }
@@ -869,9 +869,9 @@ emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
 	struct sc_info *sc = ch->parent;
 
 	ch->blksz = blocksize;
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	emu_settimer(sc);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return blocksize;
 }
 
@@ -884,7 +884,7 @@ emupchan_trigger(kobj_t obj, void *data, int go)
 	if (!PCMTRIG_COMMON(go))
 		return 0;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	if (go == PCMTRIG_START) {
 		emu_vsetup(ch);
 		emu_vwrite(sc, ch->master);
@@ -901,7 +901,7 @@ emupchan_trigger(kobj_t obj, void *data, int go)
 	}
 	ch->run = (go == PCMTRIG_START) ? 1 : 0;
 	emu_vtrigger(sc, ch->master, ch->run);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return 0;
 }
 
@@ -912,9 +912,9 @@ emupchan_getptr(kobj_t obj, void *data)
 	struct sc_info *sc = ch->parent;
 	int r;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	r = emu_vpos(sc, ch->master);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return r;
 }
@@ -984,10 +984,10 @@ emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
 	if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
 		return NULL;
 	else {
-		snd_mtxlock(sc->lock);
+		mtx_lock(&sc->lock);
 		emu_wrptr(sc, 0, ch->basereg, ch->buffer->buf_addr);
 		emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
-		snd_mtxunlock(sc->lock);
+		mtx_unlock(&sc->lock);
 		return ch;
 	}
 }
@@ -1027,9 +1027,9 @@ emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
 	struct sc_info *sc = ch->parent;
 
 	ch->blksz = blocksize;
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	emu_settimer(sc);
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 	return blocksize;
 }
 
@@ -1069,7 +1069,7 @@ emurchan_trigger(kobj_t obj, void *data, int go)
 		sz = EMU_RECBS_BUFSIZE_4096;
 	}
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	switch(go) {
 	case PCMTRIG_START:
 		ch->run = 1;
@@ -1111,7 +1111,7 @@ emurchan_trigger(kobj_t obj, void *data, int go)
 	default:
 		break;
 	}
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return 0;
 }
@@ -1123,9 +1123,9 @@ emurchan_getptr(kobj_t obj, void *data)
 	struct sc_info *sc = ch->parent;
 	int r;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return r;
 }
@@ -1171,9 +1171,9 @@ emu_muninit(struct mpu401 *arg, void *cookie)
 {
 	struct sc_info *sc = cookie;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	sc->mpu_intr = NULL;
-	snd_mtxunlock(sc->lock);
+	mtx_unlock(&sc->lock);
 
 	return 0;
 }
@@ -1216,7 +1216,7 @@ emu_intr(void *data)
 	struct sc_info *sc = data;
 	u_int32_t stat, ack, i, x;
 
-	snd_mtxlock(sc->lock);
+	mtx_lock(&sc->lock);
 	while (1) {
 		stat = emu_rd(sc, EMU_IPR, 4);
 		if (stat == 0)
*** 3073 LINES SKIPPED ***