diff options
Diffstat (limited to 'sound/oss/maestro3.c')
| -rw-r--r-- | sound/oss/maestro3.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/sound/oss/maestro3.c b/sound/oss/maestro3.c index f3dec70fcb9b..66044aff2586 100644 --- a/sound/oss/maestro3.c +++ b/sound/oss/maestro3.c | |||
| @@ -144,6 +144,8 @@ | |||
| 144 | #include <linux/spinlock.h> | 144 | #include <linux/spinlock.h> |
| 145 | #include <linux/ac97_codec.h> | 145 | #include <linux/ac97_codec.h> |
| 146 | #include <linux/wait.h> | 146 | #include <linux/wait.h> |
| 147 | #include <linux/mutex.h> | ||
| 148 | |||
| 147 | 149 | ||
| 148 | #include <asm/io.h> | 150 | #include <asm/io.h> |
| 149 | #include <asm/dma.h> | 151 | #include <asm/dma.h> |
| @@ -205,7 +207,7 @@ struct m3_state { | |||
| 205 | when irqhandler uses s->lock | 207 | when irqhandler uses s->lock |
| 206 | and m3_assp_read uses card->lock ? | 208 | and m3_assp_read uses card->lock ? |
| 207 | */ | 209 | */ |
| 208 | struct semaphore open_sem; | 210 | struct mutex open_mutex; |
| 209 | wait_queue_head_t open_wait; | 211 | wait_queue_head_t open_wait; |
| 210 | mode_t open_mode; | 212 | mode_t open_mode; |
| 211 | 213 | ||
| @@ -2013,17 +2015,17 @@ static int m3_open(struct inode *inode, struct file *file) | |||
| 2013 | file->private_data = s; | 2015 | file->private_data = s; |
| 2014 | 2016 | ||
| 2015 | /* wait for device to become free */ | 2017 | /* wait for device to become free */ |
| 2016 | down(&s->open_sem); | 2018 | mutex_lock(&s->open_mutex); |
| 2017 | while (s->open_mode & file->f_mode) { | 2019 | while (s->open_mode & file->f_mode) { |
| 2018 | if (file->f_flags & O_NONBLOCK) { | 2020 | if (file->f_flags & O_NONBLOCK) { |
| 2019 | up(&s->open_sem); | 2021 | mutex_unlock(&s->open_mutex); |
| 2020 | return -EWOULDBLOCK; | 2022 | return -EWOULDBLOCK; |
| 2021 | } | 2023 | } |
| 2022 | up(&s->open_sem); | 2024 | mutex_unlock(&s->open_mutex); |
| 2023 | interruptible_sleep_on(&s->open_wait); | 2025 | interruptible_sleep_on(&s->open_wait); |
| 2024 | if (signal_pending(current)) | 2026 | if (signal_pending(current)) |
| 2025 | return -ERESTARTSYS; | 2027 | return -ERESTARTSYS; |
| 2026 | down(&s->open_sem); | 2028 | mutex_lock(&s->open_mutex); |
| 2027 | } | 2029 | } |
| 2028 | 2030 | ||
| 2029 | spin_lock_irqsave(&c->lock, flags); | 2031 | spin_lock_irqsave(&c->lock, flags); |
| @@ -2047,7 +2049,7 @@ static int m3_open(struct inode *inode, struct file *file) | |||
| 2047 | set_fmt(s, fmtm, fmts); | 2049 | set_fmt(s, fmtm, fmts); |
| 2048 | s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); | 2050 | s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); |
| 2049 | 2051 | ||
| 2050 | up(&s->open_sem); | 2052 | mutex_unlock(&s->open_mutex); |
| 2051 | spin_unlock_irqrestore(&c->lock, flags); | 2053 | spin_unlock_irqrestore(&c->lock, flags); |
| 2052 | return nonseekable_open(inode, file); | 2054 | return nonseekable_open(inode, file); |
| 2053 | } | 2055 | } |
| @@ -2062,7 +2064,7 @@ static int m3_release(struct inode *inode, struct file *file) | |||
| 2062 | if (file->f_mode & FMODE_WRITE) | 2064 | if (file->f_mode & FMODE_WRITE) |
| 2063 | drain_dac(s, file->f_flags & O_NONBLOCK); | 2065 | drain_dac(s, file->f_flags & O_NONBLOCK); |
| 2064 | 2066 | ||
| 2065 | down(&s->open_sem); | 2067 | mutex_lock(&s->open_mutex); |
| 2066 | spin_lock_irqsave(&card->lock, flags); | 2068 | spin_lock_irqsave(&card->lock, flags); |
| 2067 | 2069 | ||
| 2068 | if (file->f_mode & FMODE_WRITE) { | 2070 | if (file->f_mode & FMODE_WRITE) { |
| @@ -2083,7 +2085,7 @@ static int m3_release(struct inode *inode, struct file *file) | |||
| 2083 | s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); | 2085 | s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); |
| 2084 | 2086 | ||
| 2085 | spin_unlock_irqrestore(&card->lock, flags); | 2087 | spin_unlock_irqrestore(&card->lock, flags); |
| 2086 | up(&s->open_sem); | 2088 | mutex_unlock(&s->open_mutex); |
| 2087 | wake_up(&s->open_wait); | 2089 | wake_up(&s->open_wait); |
| 2088 | 2090 | ||
| 2089 | return 0; | 2091 | return 0; |
| @@ -2679,7 +2681,7 @@ static int __devinit m3_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
| 2679 | init_waitqueue_head(&s->dma_adc.wait); | 2681 | init_waitqueue_head(&s->dma_adc.wait); |
| 2680 | init_waitqueue_head(&s->dma_dac.wait); | 2682 | init_waitqueue_head(&s->dma_dac.wait); |
| 2681 | init_waitqueue_head(&s->open_wait); | 2683 | init_waitqueue_head(&s->open_wait); |
| 2682 | init_MUTEX(&(s->open_sem)); | 2684 | mutex_init(&(s->open_mutex)); |
| 2683 | s->magic = M3_STATE_MAGIC; | 2685 | s->magic = M3_STATE_MAGIC; |
| 2684 | 2686 | ||
| 2685 | m3_assp_client_init(s); | 2687 | m3_assp_client_init(s); |
