Module Name: src
Committed By: mrg
Date: Sun Nov 20 12:41:59 UTC 2011
Modified Files:
src/sys/arch/amiga/dev [jmcneill-audiomp3]: aucc.c toccata.c
Log Message:
port these to audiomp: support get_locks, and take the intr_lock
in the interrupt handler.
To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.40.104.1 src/sys/arch/amiga/dev/aucc.c
cvs rdiff -u -r1.14 -r1.14.4.1 src/sys/arch/amiga/dev/toccata.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/arch/amiga/dev/aucc.c
diff -u src/sys/arch/amiga/dev/aucc.c:1.40 src/sys/arch/amiga/dev/aucc.c:1.40.104.1
--- src/sys/arch/amiga/dev/aucc.c:1.40 Wed Mar 8 23:46:22 2006
+++ src/sys/arch/amiga/dev/aucc.c Sun Nov 20 12:41:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: aucc.c,v 1.40 2006/03/08 23:46:22 lukem Exp $ */
+/* $NetBSD: aucc.c,v 1.40.104.1 2011/11/20 12:41:59 mrg Exp $ */
/*
* Copyright (c) 1999 Bernardo Innocenti
@@ -53,7 +53,7 @@
#if NAUCC > 0
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: aucc.c,v 1.40 2006/03/08 23:46:22 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: aucc.c,v 1.40.104.1 2011/11/20 12:41:59 mrg Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -91,12 +91,6 @@ int auccdebug = 1;
#define DPRINTF(x)
#endif
-#ifdef splaudio
-#undef splaudio
-#endif
-
-#define splaudio() spl4();
-
/* clock frequency.. */
extern int eclockfreq;
@@ -122,6 +116,9 @@ struct aucc_softc {
int sc_channelmask; /* which channels are used ? */
void (*sc_decodefunc)(u_char **, u_char *, int);
/* pointer to format conversion routine */
+
+ kmutex_t sc_lock;
+ kmutex_t sc_intr_lock;
};
/* interrupt interfaces */
@@ -205,6 +202,7 @@ void aucc_encode(int, int, int, int, u_c
int aucc_set_params(void *, int, int, audio_params_t *, audio_params_t *,
stream_filter_list_t *, stream_filter_list_t *);
int aucc_get_props(void *);
+void aucc_get_locks(void *, kmutex_t **, kmutex_t **);
static void aucc_decode_slinear8_1ch(u_char **, u_char *, int);
@@ -262,6 +260,8 @@ const struct audio_hw_if sa_hw_if = {
NULL,
NULL,
NULL,
+ NULL,
+ aucc_get_locks,
};
/* autoconfig routines */
@@ -343,6 +343,9 @@ init_aucc(struct aucc_softc *sc)
custom.intena = AUCC_ALLINTF;
custom.dmacon = AUCC_ALLDMAF;
+ mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+ mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+
return err;
}
@@ -907,6 +910,16 @@ aucc_get_props(void *addr)
return 0;
}
+
+void
+aucc_get_locks(void *opaque, kmutex_t **intr, kmutex_t **thread)
+{
+ struct aucc_softc *sc = opaque;
+
+ *intr = &sc->sc_intr_lock;
+ *thread = &sc->sc_lock;
+}
+
int
aucc_query_devinfo(void *addr, register mixer_devinfo_t *dip)
{
@@ -958,6 +971,7 @@ aucc_inthdl(int ch)
int i;
int mask;
+ mutex_spin_enter(&aucc->sc_intr_lock);
mask = aucc->sc_channel[ch].nd_mask;
/*
* for all channels in this maskgroup:
@@ -991,6 +1005,7 @@ aucc_inthdl(int ch)
(aucc->sc_channel[ch].nd_intrdata);
} else
DPRINTF(("zero int handler\n"));
+ mutex_spin_exit(&aucc->sc_intr_lock);
DPRINTF(("ints done\n"));
}
Index: src/sys/arch/amiga/dev/toccata.c
diff -u src/sys/arch/amiga/dev/toccata.c:1.14 src/sys/arch/amiga/dev/toccata.c:1.14.4.1
--- src/sys/arch/amiga/dev/toccata.c:1.14 Tue Jul 19 15:55:27 2011
+++ src/sys/arch/amiga/dev/toccata.c Sun Nov 20 12:41:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: toccata.c,v 1.14 2011/07/19 15:55:27 dyoung Exp $ */
+/* $NetBSD: toccata.c,v 1.14.4.1 2011/11/20 12:41:59 mrg Exp $ */
/*-
* Copyright (c) 1998, 1999, 2001, 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: toccata.c,v 1.14 2011/07/19 15:55:27 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: toccata.c,v 1.14.4.1 2011/11/20 12:41:59 mrg Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -174,6 +174,8 @@ int toccata_set_port(void *, mixer_ctrl_
int toccata_get_port(void *, mixer_ctrl_t *);
int toccata_query_devinfo(void *, mixer_devinfo_t *);
+void toccata_get_locks(void *, kmutex_t **, kmutex_t **);
+
const struct audio_hw_if audiocs_hw_if = {
toccata_open,
toccata_close,
@@ -205,6 +207,9 @@ const struct audio_hw_if audiocs_hw_if =
toccata_get_props,
0, /* trigger_output */
0,
+ 0,
+ 0,
+ toccata_get_locks,
};
struct toccata_softc {
@@ -219,6 +224,9 @@ struct toccata_softc {
void (*sc_playmore)(void *);
void *sc_playarg;
+
+ kmutex_t sc_lock;
+ kmutex_t sc_intr_lock;
};
int toccata_match(device_t, cfdata_t, void *);
@@ -275,6 +283,9 @@ toccata_attach(device_t parent, device_t
sc->sc_captbuf = 0;
sc->sc_playmore = 0;
+ mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+ mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+
sc->sc_isr.isr_ipl = 6;
sc->sc_isr.isr_arg = sc;
sc->sc_isr.isr_intr = toccata_intr;
@@ -294,14 +305,20 @@ toccata_intr(void *tag) {
int i;
sc = tag;
+
+ mutex_spin_enter(&sc->sc_intr_lock);
+
status = *(sc->sc_boardp);
- if (status & TOCC_FIFO_INT) /* active low */
+ if (status & TOCC_FIFO_INT) { /* active low */
+ mutex_spin_exit(&sc->sc_intr_lock);
return 0;
+ }
if (status & TOCC_FIFO_PBHE) {
if (sc->sc_playmore) {
(*sc->sc_playmore)(sc->sc_playarg);
+ mutex_spin_exit(&sc->sc_intr_lock);
return 1;
}
} else if (status & TOCC_FIFO_CPHF) {
@@ -318,6 +335,7 @@ toccata_intr(void *tag) {
/* XXX if (sc->sc_captmore) { */
(*sc->sc_captmore)(sc->sc_captarg);
+ mutex_spin_exit(&sc->sc_intr_lock);
return 1;
}
}
@@ -333,6 +351,7 @@ toccata_intr(void *tag) {
device_xname(sc->sc_ad.sc_dev), status);
#endif
*sc->sc_boardp = TOCC_ACT;
+ mutex_spin_exit(&sc->sc_intr_lock);
return 1;
}
@@ -442,6 +461,15 @@ toccata_get_props(void *addr)
return 0;
}
+void
+toccata_get_locks(void *opaque, kmutex_t **intr, kmutex_t **thread)
+{
+ struct toccata_softc *sc = opaque;
+
+ *intr = &sc->sc_intr_lock;
+ *thread = &sc->sc_lock;
+}
+
int
toccata_halt_input(void *addr)
{