[PATCH] 10/10 sound/oss/dmasound/dmasound_q40.c

From: pwaechtler@mac.com
Date: Thu Aug 29 2002 - 14:56:27 EST


--- 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 */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Sep 15 2002 - 22:00:16 EST