[PATCH] 5/41 sound/oss/sscape.c - convert cli to spinlocks

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


--- vanilla-2.5.32/sound/oss/sscape.c Sat Apr 20 18:25:21 2002
+++ linux-2.5-cli-oss/sound/oss/sscape.c Tue Aug 13 15:36:38 2002
@@ -40,6 +40,7 @@
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
 #include <linux/wrapper.h>
+#include <linux/spinlock.h>
 
 #include "coproc.h"
 
@@ -115,7 +116,7 @@
         char* raw_buf;
         unsigned long raw_buf_phys;
         int buffsize; /* -------------------------- */
-
+ spinlock_t lock;
         int ok; /* Properly detected */
         int failed;
         int dma_allocated;
@@ -164,11 +165,10 @@
         unsigned long flags;
         unsigned char val;
 
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         outb(reg, PORT(ODIE_ADDR));
         val = inb(PORT(ODIE_DATA));
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         return val;
 }
 
@@ -176,11 +176,10 @@
 {
         unsigned long flags;
 
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         outb(reg, PORT(ODIE_ADDR));
         outb(data, PORT(ODIE_DATA));
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
 }
 
 static unsigned char sscape_pnp_read_codec(sscape_info* devc, unsigned char reg)
@@ -188,11 +187,10 @@
         unsigned char res;
         unsigned long flags;
 
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         outb( reg, devc -> codec);
         res = inb (devc -> codec + 1);
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         return res;
 
 }
@@ -201,11 +199,10 @@
 {
         unsigned long flags;
         
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         outb( reg, devc -> codec);
         outb( data, devc -> codec + 1);
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
 }
 
 static void host_open(struct sscape_info *devc)
@@ -223,9 +220,7 @@
         unsigned long flags;
         int i, timeout_val;
 
- save_flags(flags);
- cli();
-
+ spin_lock_irqsave(&devc->lock,flags);
         /*
          * Send the command and data bytes
          */
@@ -238,12 +233,12 @@
 
                 if (timeout_val <= 0)
                 {
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
                             return 0;
                 }
                 outb(data[i], PORT(HOST_DATA));
         }
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         return 1;
 }
 
@@ -253,9 +248,7 @@
         int timeout_val;
         unsigned char data;
 
- save_flags(flags);
- cli();
-
+ spin_lock_irqsave(&devc->lock,flags);
         /*
          * Read a byte
          */
@@ -266,11 +259,11 @@
 
         if (timeout_val <= 0)
         {
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
                 return -1;
         }
         data = inb(PORT(HOST_DATA));
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         return data;
 }
 
@@ -391,14 +384,13 @@
         struct sscape_info *devc = dev_info;
         unsigned long flags;
 
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         if (devc->dma_allocated)
         {
                 sscape_write(devc, GA_DMAA_REG, 0x20); /* DMA channel disabled */
                 devc->dma_allocated = 0;
         }
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         return;
 }
 
@@ -420,14 +412,13 @@
                  * before continuing.
                  */
 
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
                 codec_dma_bits = sscape_read(devc, GA_CDCFG_REG);
 
                 if (devc->dma_allocated == 0)
                         devc->dma_allocated = 1;
 
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
 
                 sscape_write(devc, GA_HMCTL_REG,
                         (temp = sscape_read(devc, GA_HMCTL_REG)) & 0x3f); /*Reset */
@@ -449,8 +440,7 @@
         }
         memcpy(audio_devs[devc->codec_audiodev]->dmap_out->raw_buf, block, size);
 
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         
         /******** INTERRUPTS DISABLED NOW ********/
         
@@ -475,7 +465,7 @@
                         done = 1;
         }
 
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         if (!done)
                 return 0;
 
@@ -494,9 +484,7 @@
                 /*
                  * Wait until the ODB wakes up
                  */
-
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
                 done = 0;
                 timeout_val = 5 * HZ;
                 while (!done && timeout_val-- > 0)
@@ -513,14 +501,13 @@
                 }
                 sscape_write(devc, GA_CDCFG_REG, codec_dma_bits);
 
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
                 if (!done)
                 {
                         printk(KERN_ERR "soundscape: The OBP didn't respond after code download\n");
                         return 0;
                 }
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
                 done = 0;
                 timeout_val = 5 * HZ;
                 while (!done && timeout_val-- > 0)
@@ -529,7 +516,7 @@
                         if (inb(PORT(HOST_DATA)) == 0xfe) /* Host startup acknowledge */
                                 done = 1;
                 }
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
                 if (!done)
                 {
                         printk(KERN_ERR "soundscape: OBP Initialization failed.\n");
@@ -675,8 +662,7 @@
         
         if (!sscape_is_pnp) {
         
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
             for (i = 1; i < 10; i++)
             {
                 switch (i)
@@ -710,7 +696,7 @@
                                 sscape_write(devc, i, regs[i]);
                 }
             }
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         }
 #ifdef SSCAPE_DEBUG2
         /*
@@ -960,8 +946,7 @@
                     return 0;
         }
         dt = data;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&devc->lock,flags);
         while ( len > 0 ) {
                 if (len > devc -> buffsize) l = devc->buffsize;
                 else l = len;
@@ -970,12 +955,12 @@
                 sscape_start_dma(devc->dma, devc->raw_buf_phys, l, 0x48);
                 sscape_pnp_start_dma ( devc, 0 );
                 if (sscape_pnp_wait_dma ( devc, 0 ) == 0) {
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
                         return 0;
                 }
         }
         
- restore_flags(flags);
+ spin_unlock_irqrestore(&devc->lock,flags);
         vfree(data);
         
         outb(0, devc -> base + 2);
@@ -1469,6 +1454,7 @@
         devc->codec_type = 0;
         devc->ic_type = 0;
         devc->raw_buf = NULL;
+ spin_lock_init(&devc->lock);
 
         if (cfg.dma == -1 || cfg.irq == -1 || cfg.io_base == -1) {
                 printk(KERN_ERR "DMA, IRQ, and IO port must be specified.\n");

-
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 : Sat Aug 31 2002 - 22:00:28 EST