diff options
Diffstat (limited to 'sound/oss/swarm_cs4297a.c')
-rw-r--r-- | sound/oss/swarm_cs4297a.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c index df4d3771fa84..dce9016cbcfd 100644 --- a/sound/oss/swarm_cs4297a.c +++ b/sound/oss/swarm_cs4297a.c | |||
@@ -76,6 +76,7 @@ | |||
76 | #include <linux/init.h> | 76 | #include <linux/init.h> |
77 | #include <linux/poll.h> | 77 | #include <linux/poll.h> |
78 | #include <linux/smp_lock.h> | 78 | #include <linux/smp_lock.h> |
79 | #include <linux/mutex.h> | ||
79 | 80 | ||
80 | #include <asm/byteorder.h> | 81 | #include <asm/byteorder.h> |
81 | #include <asm/dma.h> | 82 | #include <asm/dma.h> |
@@ -291,9 +292,9 @@ struct cs4297a_state { | |||
291 | unsigned conversion:1; // conversion from 16 to 8 bit in progress | 292 | unsigned conversion:1; // conversion from 16 to 8 bit in progress |
292 | unsigned ena; | 293 | unsigned ena; |
293 | spinlock_t lock; | 294 | spinlock_t lock; |
294 | struct semaphore open_sem; | 295 | struct mutex open_mutex; |
295 | struct semaphore open_sem_adc; | 296 | struct mutex open_sem_adc; |
296 | struct semaphore open_sem_dac; | 297 | struct mutex open_sem_dac; |
297 | mode_t open_mode; | 298 | mode_t open_mode; |
298 | wait_queue_head_t open_wait; | 299 | wait_queue_head_t open_wait; |
299 | wait_queue_head_t open_wait_adc; | 300 | wait_queue_head_t open_wait_adc; |
@@ -2352,20 +2353,20 @@ static int cs4297a_release(struct inode *inode, struct file *file) | |||
2352 | 2353 | ||
2353 | if (file->f_mode & FMODE_WRITE) { | 2354 | if (file->f_mode & FMODE_WRITE) { |
2354 | drain_dac(s, file->f_flags & O_NONBLOCK); | 2355 | drain_dac(s, file->f_flags & O_NONBLOCK); |
2355 | down(&s->open_sem_dac); | 2356 | mutex_lock(&s->open_sem_dac); |
2356 | stop_dac(s); | 2357 | stop_dac(s); |
2357 | dealloc_dmabuf(s, &s->dma_dac); | 2358 | dealloc_dmabuf(s, &s->dma_dac); |
2358 | s->open_mode &= ~FMODE_WRITE; | 2359 | s->open_mode &= ~FMODE_WRITE; |
2359 | up(&s->open_sem_dac); | 2360 | mutex_unlock(&s->open_sem_dac); |
2360 | wake_up(&s->open_wait_dac); | 2361 | wake_up(&s->open_wait_dac); |
2361 | } | 2362 | } |
2362 | if (file->f_mode & FMODE_READ) { | 2363 | if (file->f_mode & FMODE_READ) { |
2363 | drain_adc(s, file->f_flags & O_NONBLOCK); | 2364 | drain_adc(s, file->f_flags & O_NONBLOCK); |
2364 | down(&s->open_sem_adc); | 2365 | mutex_lock(&s->open_sem_adc); |
2365 | stop_adc(s); | 2366 | stop_adc(s); |
2366 | dealloc_dmabuf(s, &s->dma_adc); | 2367 | dealloc_dmabuf(s, &s->dma_adc); |
2367 | s->open_mode &= ~FMODE_READ; | 2368 | s->open_mode &= ~FMODE_READ; |
2368 | up(&s->open_sem_adc); | 2369 | mutex_unlock(&s->open_sem_adc); |
2369 | wake_up(&s->open_wait_adc); | 2370 | wake_up(&s->open_wait_adc); |
2370 | } | 2371 | } |
2371 | return 0; | 2372 | return 0; |
@@ -2413,37 +2414,37 @@ static int cs4297a_open(struct inode *inode, struct file *file) | |||
2413 | ; | 2414 | ; |
2414 | } | 2415 | } |
2415 | 2416 | ||
2416 | down(&s->open_sem_dac); | 2417 | mutex_lock(&s->open_sem_dac); |
2417 | while (s->open_mode & FMODE_WRITE) { | 2418 | while (s->open_mode & FMODE_WRITE) { |
2418 | if (file->f_flags & O_NONBLOCK) { | 2419 | if (file->f_flags & O_NONBLOCK) { |
2419 | up(&s->open_sem_dac); | 2420 | mutex_unlock(&s->open_sem_dac); |
2420 | return -EBUSY; | 2421 | return -EBUSY; |
2421 | } | 2422 | } |
2422 | up(&s->open_sem_dac); | 2423 | mutex_unlock(&s->open_sem_dac); |
2423 | interruptible_sleep_on(&s->open_wait_dac); | 2424 | interruptible_sleep_on(&s->open_wait_dac); |
2424 | 2425 | ||
2425 | if (signal_pending(current)) { | 2426 | if (signal_pending(current)) { |
2426 | printk("open - sig pending\n"); | 2427 | printk("open - sig pending\n"); |
2427 | return -ERESTARTSYS; | 2428 | return -ERESTARTSYS; |
2428 | } | 2429 | } |
2429 | down(&s->open_sem_dac); | 2430 | mutex_lock(&s->open_sem_dac); |
2430 | } | 2431 | } |
2431 | } | 2432 | } |
2432 | if (file->f_mode & FMODE_READ) { | 2433 | if (file->f_mode & FMODE_READ) { |
2433 | down(&s->open_sem_adc); | 2434 | mutex_lock(&s->open_sem_adc); |
2434 | while (s->open_mode & FMODE_READ) { | 2435 | while (s->open_mode & FMODE_READ) { |
2435 | if (file->f_flags & O_NONBLOCK) { | 2436 | if (file->f_flags & O_NONBLOCK) { |
2436 | up(&s->open_sem_adc); | 2437 | mutex_unlock(&s->open_sem_adc); |
2437 | return -EBUSY; | 2438 | return -EBUSY; |
2438 | } | 2439 | } |
2439 | up(&s->open_sem_adc); | 2440 | mutex_unlock(&s->open_sem_adc); |
2440 | interruptible_sleep_on(&s->open_wait_adc); | 2441 | interruptible_sleep_on(&s->open_wait_adc); |
2441 | 2442 | ||
2442 | if (signal_pending(current)) { | 2443 | if (signal_pending(current)) { |
2443 | printk("open - sig pending\n"); | 2444 | printk("open - sig pending\n"); |
2444 | return -ERESTARTSYS; | 2445 | return -ERESTARTSYS; |
2445 | } | 2446 | } |
2446 | down(&s->open_sem_adc); | 2447 | mutex_lock(&s->open_sem_adc); |
2447 | } | 2448 | } |
2448 | } | 2449 | } |
2449 | s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); | 2450 | s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); |
@@ -2456,7 +2457,7 @@ static int cs4297a_open(struct inode *inode, struct file *file) | |||
2456 | s->ena &= ~FMODE_READ; | 2457 | s->ena &= ~FMODE_READ; |
2457 | s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = | 2458 | s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = |
2458 | s->dma_adc.subdivision = 0; | 2459 | s->dma_adc.subdivision = 0; |
2459 | up(&s->open_sem_adc); | 2460 | mutex_unlock(&s->open_sem_adc); |
2460 | 2461 | ||
2461 | if (prog_dmabuf_adc(s)) { | 2462 | if (prog_dmabuf_adc(s)) { |
2462 | CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR | 2463 | CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR |
@@ -2474,7 +2475,7 @@ static int cs4297a_open(struct inode *inode, struct file *file) | |||
2474 | s->ena &= ~FMODE_WRITE; | 2475 | s->ena &= ~FMODE_WRITE; |
2475 | s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = | 2476 | s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = |
2476 | s->dma_dac.subdivision = 0; | 2477 | s->dma_dac.subdivision = 0; |
2477 | up(&s->open_sem_dac); | 2478 | mutex_unlock(&s->open_sem_dac); |
2478 | 2479 | ||
2479 | if (prog_dmabuf_dac(s)) { | 2480 | if (prog_dmabuf_dac(s)) { |
2480 | CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR | 2481 | CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR |
@@ -2631,8 +2632,8 @@ static int __init cs4297a_init(void) | |||
2631 | init_waitqueue_head(&s->open_wait); | 2632 | init_waitqueue_head(&s->open_wait); |
2632 | init_waitqueue_head(&s->open_wait_adc); | 2633 | init_waitqueue_head(&s->open_wait_adc); |
2633 | init_waitqueue_head(&s->open_wait_dac); | 2634 | init_waitqueue_head(&s->open_wait_dac); |
2634 | init_MUTEX(&s->open_sem_adc); | 2635 | mutex_init(&s->open_sem_adc); |
2635 | init_MUTEX(&s->open_sem_dac); | 2636 | mutex_init(&s->open_sem_dac); |
2636 | spin_lock_init(&s->lock); | 2637 | spin_lock_init(&s->lock); |
2637 | 2638 | ||
2638 | s->irq = K_INT_SER_1; | 2639 | s->irq = K_INT_SER_1; |