Module Name: src
Committed By: mrg
Date: Sun Nov 20 11:41:53 UTC 2011
Modified Files:
src/sys/dev/ebus [jmcneill-audiomp3]: cs4231_ebus.c
src/sys/dev/sbus [jmcneill-audiomp3]: cs4231_sbus.c
Log Message:
complete the port to audiomp: don't forget to take sc_intr_lock in the
hardware interrupt routines.
To generate a diff of this commit:
cvs rdiff -u -r1.34.4.1 -r1.34.4.2 src/sys/dev/ebus/cs4231_ebus.c
cvs rdiff -u -r1.48.4.1 -r1.48.4.2 src/sys/dev/sbus/cs4231_sbus.c
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/ebus/cs4231_ebus.c
diff -u src/sys/dev/ebus/cs4231_ebus.c:1.34.4.1 src/sys/dev/ebus/cs4231_ebus.c:1.34.4.2
--- src/sys/dev/ebus/cs4231_ebus.c:1.34.4.1 Sun Nov 20 09:40:19 2011
+++ src/sys/dev/ebus/cs4231_ebus.c Sun Nov 20 11:41:53 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: cs4231_ebus.c,v 1.34.4.1 2011/11/20 09:40:19 mrg Exp $ */
+/* $NetBSD: cs4231_ebus.c,v 1.34.4.2 2011/11/20 11:41:53 mrg Exp $ */
/*
* Copyright (c) 2002 Valeriy E. Ushakov
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cs4231_ebus.c,v 1.34.4.1 2011/11/20 09:40:19 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cs4231_ebus.c,v 1.34.4.2 2011/11/20 11:41:53 mrg Exp $");
#ifdef _KERNEL_OPT
#include "opt_sparc_arch.h"
@@ -542,6 +542,8 @@ cs4231_ebus_intr(void *arg)
ebsc = arg;
sc = &ebsc->sc_cs4231;
+ mutex_spin_enter(&sc->sc_ad1848.sc_intr_lock);
+
status = ADREAD(&sc->sc_ad1848, AD1848_STATUS);
#ifdef AUDIO_DEBUG
@@ -582,6 +584,7 @@ cs4231_ebus_intr(void *arg)
ret = 1;
}
+ mutex_spin_exit(&sc->sc_ad1848.sc_intr_lock);
return ret;
}
@@ -592,10 +595,10 @@ cs4231_ebus_pint(void *cookie)
struct cs4231_softc *sc = cookie;
struct cs_transfer *t = &sc->sc_playback;
- KERNEL_LOCK(1, NULL);
+ mutex_spin_enter(&sc->sc_ad1848.sc_intr_lock);
if (t->t_intr != NULL)
(*t->t_intr)(t->t_arg);
- KERNEL_UNLOCK_ONE(NULL);
+ mutex_spin_exit(&sc->sc_ad1848.sc_intr_lock);
return 0;
}
@@ -605,9 +608,9 @@ cs4231_ebus_rint(void *cookie)
struct cs4231_softc *sc = cookie;
struct cs_transfer *t = &sc->sc_capture;
- KERNEL_LOCK(1, NULL);
+ mutex_spin_enter(&sc->sc_ad1848.sc_intr_lock);
if (t->t_intr != NULL)
(*t->t_intr)(t->t_arg);
- KERNEL_UNLOCK_ONE(NULL);
+ mutex_spin_exit(&sc->sc_ad1848.sc_intr_lock);
return 0;
}
Index: src/sys/dev/sbus/cs4231_sbus.c
diff -u src/sys/dev/sbus/cs4231_sbus.c:1.48.4.1 src/sys/dev/sbus/cs4231_sbus.c:1.48.4.2
--- src/sys/dev/sbus/cs4231_sbus.c:1.48.4.1 Sun Nov 20 09:40:19 2011
+++ src/sys/dev/sbus/cs4231_sbus.c Sun Nov 20 11:41:53 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: cs4231_sbus.c,v 1.48.4.1 2011/11/20 09:40:19 mrg Exp $ */
+/* $NetBSD: cs4231_sbus.c,v 1.48.4.2 2011/11/20 11:41:53 mrg Exp $ */
/*-
* Copyright (c) 1998, 1999, 2002, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cs4231_sbus.c,v 1.48.4.1 2011/11/20 09:40:19 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cs4231_sbus.c,v 1.48.4.2 2011/11/20 11:41:53 mrg Exp $");
#include "audio.h"
#if NAUDIO > 0
@@ -516,6 +516,8 @@ cs4231_sbus_intr(void *arg)
if ((csr & APC_INTR_MASK) == 0) /* any interrupt pedning? */
return 0;
+ mutex_spin_enter(&sc->sc_ad1848.sc_intr_lock);
+
/* write back DMA status to clear interrupt */
bus_space_write_4(sbsc->sc_bt, sbsc->sc_bh, APC_DMA_CSR, csr);
++sc->sc_intrcnt.ev_count;
@@ -596,6 +598,8 @@ cs4231_sbus_intr(void *arg)
/* evcnt? */
}
+ mutex_spin_exit(&sc->sc_ad1848.sc_intr_lock);
+
return 1;
}
@@ -605,11 +609,11 @@ cs4231_sbus_pint(void *cookie)
struct cs4231_softc *sc = cookie;
struct cs_transfer *t;
- KERNEL_LOCK(1, NULL);
+ mutex_spin_enter(&sc->sc_ad1848.sc_intr_lock);
t = &sc->sc_playback;
if (t->t_intr != NULL)
(*t->t_intr)(t->t_arg);
- KERNEL_UNLOCK_ONE(NULL);
+ mutex_spin_exit(&sc->sc_ad1848.sc_intr_lock);
return 0;
}
@@ -619,11 +623,11 @@ cs4231_sbus_rint(void *cookie)
struct cs4231_softc *sc = cookie;
struct cs_transfer *t;
- KERNEL_LOCK(1, NULL);
+ mutex_spin_enter(&sc->sc_ad1848.sc_intr_lock);
t = &sc->sc_capture;
if (t->t_intr != NULL)
(*t->t_intr)(t->t_arg);
- KERNEL_UNLOCK_ONE(NULL);
+ mutex_spin_exit(&sc->sc_ad1848.sc_intr_lock);
return 0;
}