fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / sound / oss / btaudio.c
index 4007a56..ad7210a 100644 (file)
@@ -32,6 +32,8 @@
 #include <linux/soundcard.h>
 #include <linux/slab.h>
 #include <linux/kdev_t.h>
+#include <linux/mutex.h>
+
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
@@ -108,7 +110,7 @@ struct btaudio {
 
        /* locking */
        int            users;
-       struct semaphore lock;
+       struct mutex lock;
 
        /* risc instructions */
        unsigned int   risc_size;
@@ -440,7 +442,7 @@ static struct file_operations btaudio_mixer_fops = {
 static int btaudio_dsp_open(struct inode *inode, struct file *file,
                            struct btaudio *bta, int analog)
 {
-       down(&bta->lock);
+       mutex_lock(&bta->lock);
        if (bta->users)
                goto busy;
        bta->users++;
@@ -452,11 +454,11 @@ static int btaudio_dsp_open(struct inode *inode, struct file *file,
        bta->read_count = 0;
        bta->sampleshift = 0;
 
-       up(&bta->lock);
+       mutex_unlock(&bta->lock);
        return 0;
 
  busy:
-       up(&bta->lock);
+       mutex_unlock(&bta->lock);
        return -EBUSY;
 }
 
@@ -496,11 +498,11 @@ static int btaudio_dsp_release(struct inode *inode, struct file *file)
 {
        struct btaudio *bta = file->private_data;
 
-       down(&bta->lock);
+       mutex_lock(&bta->lock);
        if (bta->recording)
                stop_recording(bta);
        bta->users--;
-       up(&bta->lock);
+       mutex_unlock(&bta->lock);
        return 0;
 }
 
@@ -513,7 +515,7 @@ static ssize_t btaudio_dsp_read(struct file *file, char __user *buffer,
        DECLARE_WAITQUEUE(wait, current);
 
        add_wait_queue(&bta->readq, &wait);
-       down(&bta->lock);
+       mutex_lock(&bta->lock);
        while (swcount > 0) {
                if (0 == bta->read_count) {
                        if (!bta->recording) {
@@ -528,10 +530,10 @@ static ssize_t btaudio_dsp_read(struct file *file, char __user *buffer,
                                        ret = -EAGAIN;
                                break;
                        }
-                       up(&bta->lock);
+                       mutex_unlock(&bta->lock);
                        current->state = TASK_INTERRUPTIBLE;
                        schedule();
-                       down(&bta->lock);
+                       mutex_lock(&bta->lock);
                        if(signal_pending(current)) {
                                if (0 == ret)
                                        ret = -EINTR;
@@ -604,7 +606,7 @@ static ssize_t btaudio_dsp_read(struct file *file, char __user *buffer,
                if (bta->read_offset == bta->buf_size)
                        bta->read_offset = 0;
        }
-       up(&bta->lock);
+       mutex_unlock(&bta->lock);
        remove_wait_queue(&bta->readq, &wait);
        current->state = TASK_RUNNING;
        return ret;
@@ -651,10 +653,10 @@ static int btaudio_dsp_ioctl(struct inode *inode, struct file *file,
                        bta->decimation  = 0;
                }
                if (bta->recording) {
-                       down(&bta->lock);
+                       mutex_lock(&bta->lock);
                        stop_recording(bta);
                        start_recording(bta);
-                       up(&bta->lock);
+                       mutex_unlock(&bta->lock);
                }
                /* fall through */
         case SOUND_PCM_READ_RATE:
@@ -716,10 +718,10 @@ static int btaudio_dsp_ioctl(struct inode *inode, struct file *file,
                        else
                                bta->bits = 16;
                        if (bta->recording) {
-                               down(&bta->lock);
+                               mutex_lock(&bta->lock);
                                stop_recording(bta);
                                start_recording(bta);
-                               up(&bta->lock);
+                               mutex_unlock(&bta->lock);
                        }
                }
                if (debug)
@@ -736,9 +738,9 @@ static int btaudio_dsp_ioctl(struct inode *inode, struct file *file,
 
         case SNDCTL_DSP_RESET:
                if (bta->recording) {
-                       down(&bta->lock);
+                       mutex_lock(&bta->lock);
                        stop_recording(bta);
-                       up(&bta->lock);
+                       mutex_unlock(&bta->lock);
                }
                return 0;
         case SNDCTL_DSP_GETBLKSIZE:
@@ -822,7 +824,7 @@ static char *irq_name[] = { "", "", "", "OFLOW", "", "", "", "", "", "", "",
                            "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
                            "RIPERR", "PABORT", "OCERR", "SCERR" };
 
-static irqreturn_t btaudio_irq(int irq, void *dev_id, struct pt_regs * regs)
+static irqreturn_t btaudio_irq(int irq, void *dev_id)
 {
        int count = 0;
        u32 stat,astat;
@@ -941,7 +943,7 @@ static int __devinit btaudio_probe(struct pci_dev *pci_dev,
        if (rate)
                bta->rate = rate;
        
-       init_MUTEX(&bta->lock);
+       mutex_init(&bta->lock);
         init_waitqueue_head(&bta->readq);
 
        if (-1 != latency) {
@@ -964,7 +966,7 @@ static int __devinit btaudio_probe(struct pci_dev *pci_dev,
         btwrite(~0U, REG_INT_STAT);
        pci_set_master(pci_dev);
 
-       if ((rc = request_irq(bta->irq, btaudio_irq, SA_SHIRQ|SA_INTERRUPT,
+       if ((rc = request_irq(bta->irq, btaudio_irq, IRQF_SHARED|IRQF_DISABLED,
                              "btaudio",(void *)bta)) < 0) {
                printk(KERN_WARNING
                       "btaudio: can't request irq (rc=%d)\n",rc);
@@ -1018,6 +1020,7 @@ static int __devinit btaudio_probe(struct pci_dev *pci_dev,
  fail2:
         free_irq(bta->irq,bta);        
  fail1:
+       iounmap(bta->mmio);
        kfree(bta);
  fail0:
        release_mem_region(pci_resource_start(pci_dev,0),
@@ -1049,6 +1052,7 @@ static void __devexit btaudio_remove(struct pci_dev *pci_dev)
         free_irq(bta->irq,bta);
        release_mem_region(pci_resource_start(pci_dev,0),
                           pci_resource_len(pci_dev,0));
+       iounmap(bta->mmio);
 
        /* remove from linked list */
        if (bta == btaudios) {