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)
 {

Reply via email to