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;
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;
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);
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
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
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))) {
(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);
}
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);
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;
}
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);
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;