Module Name:    src
Committed By:   jakllsch
Date:           Mon Nov 21 21:39:44 UTC 2011

Modified Files:
        src/sys/dev [jmcneill-audiomp3]: TODO.audiomp
        src/sys/dev/pci [jmcneill-audiomp3]: emuxki.c emuxkivar.h

Log Message:
Make emuxki(4) work w/ audiomp changes.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.19 -r1.1.2.20 src/sys/dev/TODO.audiomp
cvs rdiff -u -r1.59.14.2 -r1.59.14.3 src/sys/dev/pci/emuxki.c
cvs rdiff -u -r1.12.14.1 -r1.12.14.2 src/sys/dev/pci/emuxkivar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/TODO.audiomp
diff -u src/sys/dev/TODO.audiomp:1.1.2.19 src/sys/dev/TODO.audiomp:1.1.2.20
--- src/sys/dev/TODO.audiomp:1.1.2.19	Mon Nov 21 18:35:20 2011
+++ src/sys/dev/TODO.audiomp	Mon Nov 21 21:39:44 2011
@@ -41,7 +41,7 @@ dev/pci/cmpci.c			done
 dev/pci/cs4280.c		done
 dev/pci/cs4281.c		done
 dev/pci/eap.c			done		port-i386
-dev/pci/emuxki.c		done
+dev/pci/emuxki.c		done		port-amd64
 dev/pci/esa.c			done
 dev/pci/esm.c			done
 dev/pci/eso.c			done

Index: src/sys/dev/pci/emuxki.c
diff -u src/sys/dev/pci/emuxki.c:1.59.14.2 src/sys/dev/pci/emuxki.c:1.59.14.3
--- src/sys/dev/pci/emuxki.c:1.59.14.2	Sat Nov 19 23:19:00 2011
+++ src/sys/dev/pci/emuxki.c	Mon Nov 21 21:39:44 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: emuxki.c,v 1.59.14.2 2011/11/19 23:19:00 jmcneill Exp $	*/
+/*	$NetBSD: emuxki.c,v 1.59.14.3 2011/11/21 21:39:44 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2007 The NetBSD Foundation, Inc.
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.59.14.2 2011/11/19 23:19:00 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.59.14.3 2011/11/21 21:39:44 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -416,6 +416,8 @@ emuxki_attach(device_t parent, device_t 
 
 	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
 	mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+	mutex_init(&sc->sc_index_lock, MUTEX_DEFAULT, IPL_SCHED);
+	mutex_init(&sc->sc_ac97_index_lock, MUTEX_DEFAULT, IPL_SCHED);
 
 	if (pci_mapreg_map(pa, EMU_PCI_CBIO, PCI_MAPREG_TYPE_IO, 0,
 	    &(sc->sc_iot), &(sc->sc_ioh), &(sc->sc_iob),
@@ -511,6 +513,8 @@ emuxki_detach(device_t self, int flags)
 
 	mutex_destroy(&sc->sc_lock);
 	mutex_destroy(&sc->sc_intr_lock);
+	mutex_destroy(&sc->sc_index_lock);
+	mutex_destroy(&sc->sc_ac97_index_lock);
 
 	return 0;
 }
@@ -598,11 +602,11 @@ emuxki_read(struct emuxki_softc *sc, uin
 		mask = ((1 << size) - 1) << offset;
 	}
 
-	mutex_spin_enter(&sc->sc_intr_lock);
+	mutex_spin_enter(&sc->sc_index_lock);
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr);
 	ptr = (bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_DATA) & mask)
 		>> offset;
-	mutex_spin_exit(&sc->sc_intr_lock);
+	mutex_spin_exit(&sc->sc_index_lock);
 
 	return ptr;
 }
@@ -626,10 +630,10 @@ emuxki_write(struct emuxki_softc *sc, ui
 			(emuxki_read(sc, chano, reg & 0xffff) & ~mask);
 	}
 
-	mutex_spin_enter(&sc->sc_intr_lock);
+	mutex_spin_enter(&sc->sc_index_lock);
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr);
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_DATA, data);
-	mutex_spin_exit(&sc->sc_intr_lock);
+	mutex_spin_exit(&sc->sc_index_lock);
 }
 
 /* Microcode should this go in /sys/dev/microcode ? */
@@ -1245,7 +1249,7 @@ emuxki_channel_commit_parms(struct emuxk
 		(voice->stereo ? 28 : 30) * (voice->b16 + 1);
 	mapval = DMAADDR(sc->silentpage) << 1 | EMU_CHAN_MAP_PTI_MASK;
 
-	mutex_spin_enter(&sc->sc_intr_lock);
+	KASSERT(mutex_owned(&sc->sc_intr_lock));
 	emuxki_write(sc, chano, EMU_CHAN_CPF_STEREO, voice->stereo);
 
 	emuxki_channel_commit_fx(chan);
@@ -1290,7 +1294,6 @@ emuxki_channel_commit_parms(struct emuxk
 	emuxki_write(sc, chano, EMU_CHAN_PEFE,
 		(chan->pitch.envelope_amount << 8) |
 		chan->filter.envelope_amount);
-	mutex_spin_exit(&sc->sc_intr_lock);
 }
 
 static void
@@ -1308,7 +1311,7 @@ emuxki_channel_start(struct emuxki_chann
 	sample = voice->b16 ? 0x00000000 : 0x80808080;
 	cache_invalid_size = (voice->stereo ? 28 : 30) * (voice->b16 + 1);
 
-	mutex_spin_enter(&sc->sc_intr_lock);
+	KASSERT(mutex_owned(&sc->sc_intr_lock));
 	while (cache_sample--) {
 		emuxki_write(sc, chano, EMU_CHAN_CD0 + cache_sample,
 			sample);
@@ -1338,7 +1341,6 @@ emuxki_channel_start(struct emuxki_chann
 	emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH,
 		chan->pitch.current);
 	emuxki_write(sc, chano, EMU_CHAN_IP, chan->pitch.initial);
-	mutex_spin_exit(&sc->sc_intr_lock);
 }
 
 static void
@@ -1349,14 +1351,13 @@ emuxki_channel_stop(struct emuxki_channe
 
 	sc = chan->voice->sc;
 	chano = chan->num;
-	mutex_spin_enter(&sc->sc_intr_lock);
+	KASSERT(mutex_owned(&sc->sc_intr_lock));
 	emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 0);
 	emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 0);
 	emuxki_write(sc, chano, EMU_CHAN_IFATN_ATTENUATION, 0xff);
 	emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 0);
 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 0);
 	emuxki_write(sc, chano, EMU_CHAN_IP, 0);
-	mutex_spin_exit(&sc->sc_intr_lock);
 }
 
 /*
@@ -1477,19 +1478,21 @@ emuxki_voice_new(struct emuxki_softc *sc
 {
 	struct emuxki_voice *voice;
 
+	KASSERT(mutex_owned(&sc->sc_intr_lock));
+
 	voice = sc->lvoice;
 	sc->lvoice = NULL;
 
 	if (!voice) {
-		mutex_exit(&sc->sc_lock);
+		mutex_exit(&sc->sc_intr_lock);
 		voice = kmem_alloc(sizeof(*voice), KM_SLEEP);
-		mutex_enter(&sc->sc_lock);
+		mutex_enter(&sc->sc_intr_lock);
 		if (!voice)
 			return NULL;
 	} else if (voice->use != use) {
-		mutex_exit(&sc->sc_lock);
+		mutex_exit(&sc->sc_intr_lock);
 		emuxki_voice_dataloc_destroy(voice);
-		mutex_enter(&sc->sc_lock);
+		mutex_enter(&sc->sc_intr_lock);
 	} else
 		goto skip_initialize;
 
@@ -1511,9 +1514,7 @@ emuxki_voice_new(struct emuxki_softc *sc
 	voice->use = use;
 
 skip_initialize:
-	mutex_spin_enter(&sc->sc_intr_lock);
 	LIST_INSERT_HEAD((&sc->voices), voice, next);
-	mutex_spin_exit(&sc->sc_intr_lock);
 
 	return voice;
 }
@@ -1771,7 +1772,7 @@ emuxki_resched_timer(struct emuxki_softc
 
 	timerate = 1024;
 	active = 0;
-	mutex_spin_enter(&sc->sc_intr_lock);
+	KASSERT(mutex_owned(&sc->sc_intr_lock));
 	LIST_FOREACH(voice, &sc->voices, next) {
 		if ((voice->state & EMU_VOICE_STATE_STARTED) == 0)
 			continue;
@@ -1779,7 +1780,6 @@ emuxki_resched_timer(struct emuxki_softc
 		if (voice->timerate < timerate)
 			timerate = voice->timerate;
 	}
-	mutex_spin_exit(&sc->sc_intr_lock);
 
 	if (timerate & ~EMU_TIMER_RATE_MASK)
 		timerate = 0;
@@ -1900,11 +1900,10 @@ emuxki_voice_start(struct emuxki_voice *
 		case EMU_RECSRC_FX:
 		case EMU_RECSRC_MIC:
 			/* DMA completion interrupt is useless; use timer */
-			mutex_spin_enter(&sc->sc_intr_lock);
+			KASSERT(mutex_owned(&sc->sc_intr_lock));
 			val = emu_rd(sc, INTE, 4);
 			val |= emuxki_recsrc_intrmasks[voice->dataloc.source];
 			emu_wr(sc, INTE, val, 4);
-			mutex_spin_exit(&sc->sc_intr_lock);
 			break;
 		default:
 			break;
@@ -1948,11 +1947,10 @@ emuxki_voice_halt(struct emuxki_voice *v
 			    emuxki_recsrc_szreg[voice->dataloc.source],
 			    EMU_RECBS_BUFSIZE_NONE);
 #if 0
-			mutex_spin_enter(&sc->sc_intr_lock);
+			KASSERT(mutex_owned(&sc->sc_intr_lock));
 			val = emu_rd(sc, INTE, 4);
 			val &= ~emuxki_recsrc_intrmasks[voice->dataloc.source];
 			emu_wr(sc, INTE, val, 4);
-			mutex_spin_exit(&sc->sc_intr_lock);
 #endif
 			break;
 		default:
@@ -2484,10 +2482,10 @@ emuxki_ac97_read(void *arg, uint8_t reg,
 	struct emuxki_softc *sc;
 
 	sc = arg;
-	mutex_spin_enter(&sc->sc_intr_lock);
+	mutex_spin_enter(&sc->sc_ac97_index_lock);
 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg);
 	*val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA);
-	mutex_spin_exit(&sc->sc_intr_lock);
+	mutex_spin_exit(&sc->sc_ac97_index_lock);
 
 	return 0;
 }
@@ -2498,10 +2496,10 @@ emuxki_ac97_write(void *arg, uint8_t reg
 	struct emuxki_softc *sc;
 
 	sc = arg;
-	mutex_spin_enter(&sc->sc_intr_lock);
+	mutex_spin_enter(&sc->sc_ac97_index_lock);
 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg);
 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA, val);
-	mutex_spin_exit(&sc->sc_intr_lock);
+	mutex_spin_exit(&sc->sc_ac97_index_lock);
 
 	return 0;
 }

Index: src/sys/dev/pci/emuxkivar.h
diff -u src/sys/dev/pci/emuxkivar.h:1.12.14.1 src/sys/dev/pci/emuxkivar.h:1.12.14.2
--- src/sys/dev/pci/emuxkivar.h:1.12.14.1	Sat Nov 19 21:49:42 2011
+++ src/sys/dev/pci/emuxkivar.h	Mon Nov 21 21:39:44 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: emuxkivar.h,v 1.12.14.1 2011/11/19 21:49:42 jmcneill Exp $	*/
+/*	$NetBSD: emuxkivar.h,v 1.12.14.2 2011/11/21 21:39:44 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -235,6 +235,8 @@ struct emuxki_softc {
 	void			*sc_ih;		/* interrupt handler */
 	kmutex_t		sc_intr_lock;
 	kmutex_t		sc_lock;
+	kmutex_t		sc_index_lock;
+	kmutex_t		sc_ac97_index_lock;
 
 	/* EMU10K1 device structures */
 	LIST_HEAD(, emuxki_mem) mem;

Reply via email to