linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / sound / oss / cs4281 / cs4281m.c
index 0400a41..0720365 100644 (file)
@@ -245,9 +245,9 @@ struct cs4281_state {
        void *tmpbuff;          // tmp buffer for sample conversions
        unsigned ena;
        spinlock_t lock;
-       struct mutex open_sem;
-       struct mutex open_sem_adc;
-       struct mutex open_sem_dac;
+       struct semaphore open_sem;
+       struct semaphore open_sem_adc;
+       struct semaphore open_sem_dac;
        mode_t open_mode;
        wait_queue_head_t open_wait;
        wait_queue_head_t open_wait_adc;
@@ -3598,20 +3598,20 @@ static int cs4281_release(struct inode *inode, struct file *file)
 
        if (file->f_mode & FMODE_WRITE) {
                drain_dac(s, file->f_flags & O_NONBLOCK);
-               mutex_lock(&s->open_sem_dac);
+               down(&s->open_sem_dac);
                stop_dac(s);
                dealloc_dmabuf(s, &s->dma_dac);
                s->open_mode &= ~FMODE_WRITE;
-               mutex_unlock(&s->open_sem_dac);
+               up(&s->open_sem_dac);
                wake_up(&s->open_wait_dac);
        }
        if (file->f_mode & FMODE_READ) {
                drain_adc(s, file->f_flags & O_NONBLOCK);
-               mutex_lock(&s->open_sem_adc);
+               down(&s->open_sem_adc);
                stop_adc(s);
                dealloc_dmabuf(s, &s->dma_adc);
                s->open_mode &= ~FMODE_READ;
-               mutex_unlock(&s->open_sem_adc);
+               up(&s->open_sem_adc);
                wake_up(&s->open_wait_adc);
        }
        return 0;
@@ -3651,33 +3651,33 @@ static int cs4281_open(struct inode *inode, struct file *file)
                return -ENODEV;
        }
        if (file->f_mode & FMODE_WRITE) {
-               mutex_lock(&s->open_sem_dac);
+               down(&s->open_sem_dac);
                while (s->open_mode & FMODE_WRITE) {
                        if (file->f_flags & O_NONBLOCK) {
-                               mutex_unlock(&s->open_sem_dac);
+                               up(&s->open_sem_dac);
                                return -EBUSY;
                        }
-                       mutex_unlock(&s->open_sem_dac);
+                       up(&s->open_sem_dac);
                        interruptible_sleep_on(&s->open_wait_dac);
 
                        if (signal_pending(current))
                                return -ERESTARTSYS;
-                       mutex_lock(&s->open_sem_dac);
+                       down(&s->open_sem_dac);
                }
        }
        if (file->f_mode & FMODE_READ) {
-               mutex_lock(&s->open_sem_adc);
+               down(&s->open_sem_adc);
                while (s->open_mode & FMODE_READ) {
                        if (file->f_flags & O_NONBLOCK) {
-                               mutex_unlock(&s->open_sem_adc);
+                               up(&s->open_sem_adc);
                                return -EBUSY;
                        }
-                       mutex_unlock(&s->open_sem_adc);
+                       up(&s->open_sem_adc);
                        interruptible_sleep_on(&s->open_wait_adc);
 
                        if (signal_pending(current))
                                return -ERESTARTSYS;
-                       mutex_lock(&s->open_sem_adc);
+                       down(&s->open_sem_adc);
                }
        }
        s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
@@ -3691,7 +3691,7 @@ static int cs4281_open(struct inode *inode, struct file *file)
                s->ena &= ~FMODE_READ;
                s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
                    s->dma_adc.subdivision = 0;
-               mutex_unlock(&s->open_sem_adc);
+               up(&s->open_sem_adc);
 
                if (prog_dmabuf_adc(s)) {
                        CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
@@ -3711,7 +3711,7 @@ static int cs4281_open(struct inode *inode, struct file *file)
                s->ena &= ~FMODE_WRITE;
                s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
                    s->dma_dac.subdivision = 0;
-               mutex_unlock(&s->open_sem_dac);
+               up(&s->open_sem_dac);
 
                if (prog_dmabuf_dac(s)) {
                        CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
@@ -3978,17 +3978,17 @@ static int cs4281_midi_open(struct inode *inode, struct file *file)
        VALIDATE_STATE(s);
        file->private_data = s;
        // wait for device to become free 
-       mutex_lock(&s->open_sem);
+       down(&s->open_sem);
        while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
                if (file->f_flags & O_NONBLOCK) {
-                       mutex_unlock(&s->open_sem);
+                       up(&s->open_sem);
                        return -EBUSY;
                }
-               mutex_unlock(&s->open_sem);
+               up(&s->open_sem);
                interruptible_sleep_on(&s->open_wait);
                if (signal_pending(current))
                        return -ERESTARTSYS;
-               mutex_lock(&s->open_sem);
+               down(&s->open_sem);
        }
        spin_lock_irqsave(&s->lock, flags);
        if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
@@ -4018,7 +4018,7 @@ static int cs4281_midi_open(struct inode *inode, struct file *file)
            (file->
             f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ |
                                            FMODE_MIDI_WRITE);
-       mutex_unlock(&s->open_sem);
+       up(&s->open_sem);
        return nonseekable_open(inode, file);
 }
 
@@ -4057,7 +4057,7 @@ static int cs4281_midi_release(struct inode *inode, struct file *file)
                remove_wait_queue(&s->midi.owait, &wait);
                current->state = TASK_RUNNING;
        }
-       mutex_lock(&s->open_sem);
+       down(&s->open_sem);
        s->open_mode &=
            (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ |
                                                     FMODE_MIDI_WRITE);
@@ -4067,7 +4067,7 @@ static int cs4281_midi_release(struct inode *inode, struct file *file)
                del_timer(&s->midi.timer);
        }
        spin_unlock_irqrestore(&s->lock, flags);
-       mutex_unlock(&s->open_sem);
+       up(&s->open_sem);
        wake_up(&s->open_wait);
        return 0;
 }
@@ -4300,9 +4300,9 @@ static int __devinit cs4281_probe(struct pci_dev *pcidev,
        init_waitqueue_head(&s->open_wait_dac);
        init_waitqueue_head(&s->midi.iwait);
        init_waitqueue_head(&s->midi.owait);
-       mutex_init(&s->open_sem);
-       mutex_init(&s->open_sem_adc);
-       mutex_init(&s->open_sem_dac);
+       init_MUTEX(&s->open_sem);
+       init_MUTEX(&s->open_sem_adc);
+       init_MUTEX(&s->open_sem_dac);
        spin_lock_init(&s->lock);
        s->pBA0phys = pci_resource_start(pcidev, 0);
        s->pBA1phys = pci_resource_start(pcidev, 1);
@@ -4346,7 +4346,7 @@ static int __devinit cs4281_probe(struct pci_dev *pcidev,
        s->pcidev = pcidev;
        s->irq = pcidev->irq;
        if (request_irq
-           (s->irq, cs4281_interrupt, IRQF_SHARED, "Crystal CS4281", s)) {
+           (s->irq, cs4281_interrupt, SA_SHIRQ, "Crystal CS4281", s)) {
                CS_DBGOUT(CS_INIT | CS_ERROR, 1,
                          printk(KERN_ERR "cs4281: irq %u in use\n", s->irq));
                goto err_irq;