#include <linux/reboot.h>
#include <linux/bitops.h>
#include <linux/wait.h>
-#include <linux/mutex.h>
-
#include <asm/current.h>
#include <asm/dma.h>
/* this locks around the oss state in the driver */
spinlock_t lock;
/* only let 1 be opening at a time */
- struct mutex open_mutex;
+ struct semaphore open_sem;
wait_queue_head_t open_wait;
mode_t open_mode;
VALIDATE_STATE(s);
file->private_data = s;
/* wait for device to become free */
- mutex_lock(&s->open_mutex);
+ down(&s->open_sem);
while (s->open_mode & file->f_mode) {
if (file->f_flags & O_NONBLOCK) {
- mutex_unlock(&s->open_mutex);
+ up(&s->open_sem);
return -EWOULDBLOCK;
}
- mutex_unlock(&s->open_mutex);
+ up(&s->open_sem);
interruptible_sleep_on(&s->open_wait);
if (signal_pending(current))
return -ERESTARTSYS;
- mutex_lock(&s->open_mutex);
+ down(&s->open_sem);
}
/* under semaphore.. */
if ((s->card->dmapages==NULL) && allocate_buffers(s)) {
- mutex_unlock(&s->open_mutex);
+ up(&s->open_sem);
return -ENOMEM;
}
- /* we're covered by the open_mutex */
+ /* we're covered by the open_sem */
if( ! s->card->dsps_open ) {
maestro_power(s->card,ACPI_D0);
start_bob(s);
set_fmt(s, fmtm, fmts);
s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
- mutex_unlock(&s->open_mutex);
+ up(&s->open_sem);
return nonseekable_open(inode, file);
}
lock_kernel();
if (file->f_mode & FMODE_WRITE)
drain_dac(s, file->f_flags & O_NONBLOCK);
- mutex_lock(&s->open_mutex);
+ down(&s->open_sem);
if (file->f_mode & FMODE_WRITE) {
stop_dac(s);
}
}
s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
- /* we're covered by the open_mutex */
+ /* we're covered by the open_sem */
M_printk("maestro: %d dsps now alive\n",s->card->dsps_open-1);
if( --s->card->dsps_open <= 0) {
s->card->dsps_open = 0;
free_buffers(s);
maestro_power(s->card,ACPI_D2);
}
- mutex_unlock(&s->open_mutex);
+ up(&s->open_sem);
wake_up(&s->open_wait);
unlock_kernel();
return 0;
init_waitqueue_head(&s->dma_dac.wait);
init_waitqueue_head(&s->open_wait);
spin_lock_init(&s->lock);
- mutex_init(&s->open_mutex);
+ init_MUTEX(&s->open_sem);
s->magic = ESS_STATE_MAGIC;
s->apu[0] = 6*i;