public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] 10/10 sound/oss/dmasound/dmasound_q40.c
@ 2002-08-29 19:56 pwaechtler
       [not found] ` <20020911234500.B4476@linux-m68k.org>
  0 siblings, 1 reply; 7+ messages in thread
From: pwaechtler @ 2002-08-29 19:56 UTC (permalink / raw)
  To: linux-kernel; +Cc: torvalds

--- vanilla-2.5.33/sound/oss/dmasound/dmasound_q40.c	Sun Sep  8 21:52:50 2002
+++ linux-2.5-cli-oss/sound/oss/dmasound/dmasound_q40.c	Mon Sep  9 00:41:06 2002
@@ -18,7 +18,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/soundcard.h>
-
+#include <linux/spinlock.h>
 #include <asm/uaccess.h>
 #include <asm/q40ints.h>
 #include <asm/q40_master.h>
@@ -49,8 +49,7 @@
 static int Q40SetVolume(int volume);
 static void Q40PlayNextFrame(int index);
 static void Q40Play(void);
-static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp);
-static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp);
+static void Q40InterruptHandler(int irq, void *dummy, struct pt_regs *fp);
 static void Q40Interrupt(void);
 
 
@@ -384,7 +383,7 @@
 static int __init Q40IrqInit(void)
 {
 	/* Register interrupt handler. */
-	request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0,
+	request_irq(Q40_IRQ_SAMPLE, Q40InterruptHandler, 0,
 		    "DMA sound", Q40Interrupt);
 
 	return(1);
@@ -430,23 +429,13 @@
 	speed=(dmasound.hard.speed==10000 ? 0 : 1);
 
 	master_outb( 0,SAMPLE_ENABLE_REG);
-	free_irq(Q40_IRQ_SAMPLE, Q40Interrupt);
-	if (dmasound.soft.stereo)
-	  	request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0,
-		    "Q40 sound", Q40Interrupt);
-	  else
-	        request_irq(Q40_IRQ_SAMPLE, Q40MonoInterrupt, 0,
-		    "Q40 sound", Q40Interrupt);
-
 	master_outb( speed, SAMPLE_RATE_REG);
 	master_outb( 1,SAMPLE_CLEAR_REG);
 	master_outb( 1,SAMPLE_ENABLE_REG);
 }
 
-static void Q40Play(void)
+static void __Q40Play(void)
 {
-        unsigned long flags;
-
 	if (write_sq.active || write_sq.count<=0 ) {
 		/* There's already a frame loaded */
 		return;
@@ -459,29 +448,35 @@
 		  */
 	         return;
 	}
-	save_flags(flags); cli();
 	Q40PlayNextFrame(1);
-	restore_flags(flags);
 }
 
-static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp)
-{
-        if (q40_sc>1){
-            *DAC_LEFT=*q40_pp++;
-	    *DAC_RIGHT=*q40_pp++;
-	    q40_sc -=2;
-	    master_outb(1,SAMPLE_CLEAR_REG);
-	}else Q40Interrupt();
-}
-static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp)
+static void Q40Play(void)
 {
-        if (q40_sc>0){
-            *DAC_LEFT=*q40_pp;
-	    *DAC_RIGHT=*q40_pp++;
-	    q40_sc --;
+	unsigned long flags;
+	spin_lock_irqsave(&dmasound.lock, flags);
+	__Q40Play();
+	spin_unlock_irqrestore(&dmasound.lock, flags);
+}
+
+static void Q40InterruptHandler(int irq, void *dummy, struct pt_regs *fp)
+{
+	spin_lock(&dmasound.lock);
+	if (q40_sc>1){
+		if (dmasound.soft.stereo){
+			*DAC_LEFT=*q40_pp++;
+			*DAC_RIGHT=*q40_pp++;
+			q40_sc -=2;
+		} else {
+			*DAC_LEFT=*q40_pp;
+			*DAC_RIGHT=*q40_pp++;
+			q40_sc --;
+		}
 	    master_outb(1,SAMPLE_CLEAR_REG);
 	}else Q40Interrupt();
+	spin_unlock(&dmasound.lock);
 }
+
 static void Q40Interrupt(void)
 {
 	if (!write_sq.active) {
@@ -493,7 +488,7 @@
 		   goto exit;
 	} else write_sq.active=0;
 	write_sq.count--;
-	Q40Play();
+	__Q40Play();
 
 	if (q40_sc<2)
 	      { /* there was nothing to play, disable irq */

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2002-09-12  8:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <200209091007.g89A7dZH010390@smtp-relay02.mac.com>
2002-09-09 16:07 ` [PATCH] 10/10 sound/oss/dmasound/dmasound_q40.c Linus Torvalds
2002-09-09 17:20   ` Tomas Szepe
2002-09-09 17:32   ` Andreas Dilger
2002-09-09 17:32     ` David S. Miller
2002-09-09 19:47   ` pwaechtler
2002-08-29 19:56 pwaechtler
     [not found] ` <20020911234500.B4476@linux-m68k.org>
2002-09-12  8:26   ` Richard Zidlicky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox