diff options
Diffstat (limited to 'sound/oss/cmpci.c')
| -rw-r--r-- | sound/oss/cmpci.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/sound/oss/cmpci.c b/sound/oss/cmpci.c index 7cfbb08db537..1fbd5137f6d7 100644 --- a/sound/oss/cmpci.c +++ b/sound/oss/cmpci.c | |||
| @@ -138,6 +138,8 @@ | |||
| 138 | #endif | 138 | #endif |
| 139 | #ifdef CONFIG_SOUND_CMPCI_JOYSTICK | 139 | #ifdef CONFIG_SOUND_CMPCI_JOYSTICK |
| 140 | #include <linux/gameport.h> | 140 | #include <linux/gameport.h> |
| 141 | #include <linux/mutex.h> | ||
| 142 | |||
| 141 | #endif | 143 | #endif |
| 142 | 144 | ||
| 143 | /* --------------------------------------------------------------------- */ | 145 | /* --------------------------------------------------------------------- */ |
| @@ -392,7 +394,7 @@ struct cm_state { | |||
| 392 | unsigned char fmt, enable; | 394 | unsigned char fmt, enable; |
| 393 | 395 | ||
| 394 | spinlock_t lock; | 396 | spinlock_t lock; |
| 395 | struct semaphore open_sem; | 397 | struct mutex open_mutex; |
| 396 | mode_t open_mode; | 398 | mode_t open_mode; |
| 397 | wait_queue_head_t open_wait; | 399 | wait_queue_head_t open_wait; |
| 398 | 400 | ||
| @@ -2825,21 +2827,21 @@ static int cm_open(struct inode *inode, struct file *file) | |||
| 2825 | VALIDATE_STATE(s); | 2827 | VALIDATE_STATE(s); |
| 2826 | file->private_data = s; | 2828 | file->private_data = s; |
| 2827 | /* wait for device to become free */ | 2829 | /* wait for device to become free */ |
| 2828 | down(&s->open_sem); | 2830 | mutex_lock(&s->open_mutex); |
| 2829 | while (s->open_mode & file->f_mode) { | 2831 | while (s->open_mode & file->f_mode) { |
| 2830 | if (file->f_flags & O_NONBLOCK) { | 2832 | if (file->f_flags & O_NONBLOCK) { |
| 2831 | up(&s->open_sem); | 2833 | mutex_unlock(&s->open_mutex); |
| 2832 | return -EBUSY; | 2834 | return -EBUSY; |
| 2833 | } | 2835 | } |
| 2834 | add_wait_queue(&s->open_wait, &wait); | 2836 | add_wait_queue(&s->open_wait, &wait); |
| 2835 | __set_current_state(TASK_INTERRUPTIBLE); | 2837 | __set_current_state(TASK_INTERRUPTIBLE); |
| 2836 | up(&s->open_sem); | 2838 | mutex_unlock(&s->open_mutex); |
| 2837 | schedule(); | 2839 | schedule(); |
| 2838 | remove_wait_queue(&s->open_wait, &wait); | 2840 | remove_wait_queue(&s->open_wait, &wait); |
| 2839 | set_current_state(TASK_RUNNING); | 2841 | set_current_state(TASK_RUNNING); |
| 2840 | if (signal_pending(current)) | 2842 | if (signal_pending(current)) |
| 2841 | return -ERESTARTSYS; | 2843 | return -ERESTARTSYS; |
| 2842 | down(&s->open_sem); | 2844 | mutex_lock(&s->open_mutex); |
| 2843 | } | 2845 | } |
| 2844 | if (file->f_mode & FMODE_READ) { | 2846 | if (file->f_mode & FMODE_READ) { |
| 2845 | s->status &= ~DO_BIGENDIAN_R; | 2847 | s->status &= ~DO_BIGENDIAN_R; |
| @@ -2867,7 +2869,7 @@ static int cm_open(struct inode *inode, struct file *file) | |||
| 2867 | } | 2869 | } |
| 2868 | set_fmt(s, fmtm, fmts); | 2870 | set_fmt(s, fmtm, fmts); |
| 2869 | s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); | 2871 | s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); |
| 2870 | up(&s->open_sem); | 2872 | mutex_unlock(&s->open_mutex); |
| 2871 | return nonseekable_open(inode, file); | 2873 | return nonseekable_open(inode, file); |
| 2872 | } | 2874 | } |
| 2873 | 2875 | ||
| @@ -2879,7 +2881,7 @@ static int cm_release(struct inode *inode, struct file *file) | |||
| 2879 | lock_kernel(); | 2881 | lock_kernel(); |
| 2880 | if (file->f_mode & FMODE_WRITE) | 2882 | if (file->f_mode & FMODE_WRITE) |
| 2881 | drain_dac(s, file->f_flags & O_NONBLOCK); | 2883 | drain_dac(s, file->f_flags & O_NONBLOCK); |
| 2882 | down(&s->open_sem); | 2884 | mutex_lock(&s->open_mutex); |
| 2883 | if (file->f_mode & FMODE_WRITE) { | 2885 | if (file->f_mode & FMODE_WRITE) { |
| 2884 | stop_dac(s); | 2886 | stop_dac(s); |
| 2885 | 2887 | ||
| @@ -2903,7 +2905,7 @@ static int cm_release(struct inode *inode, struct file *file) | |||
| 2903 | s->status &= ~DO_BIGENDIAN_R; | 2905 | s->status &= ~DO_BIGENDIAN_R; |
| 2904 | } | 2906 | } |
| 2905 | s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE)); | 2907 | s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE)); |
| 2906 | up(&s->open_sem); | 2908 | mutex_unlock(&s->open_mutex); |
| 2907 | wake_up(&s->open_wait); | 2909 | wake_up(&s->open_wait); |
| 2908 | unlock_kernel(); | 2910 | unlock_kernel(); |
| 2909 | return 0; | 2911 | return 0; |
| @@ -3080,7 +3082,7 @@ static int __devinit cm_probe(struct pci_dev *pcidev, const struct pci_device_id | |||
| 3080 | init_waitqueue_head(&s->dma_adc.wait); | 3082 | init_waitqueue_head(&s->dma_adc.wait); |
| 3081 | init_waitqueue_head(&s->dma_dac.wait); | 3083 | init_waitqueue_head(&s->dma_dac.wait); |
| 3082 | init_waitqueue_head(&s->open_wait); | 3084 | init_waitqueue_head(&s->open_wait); |
| 3083 | init_MUTEX(&s->open_sem); | 3085 | mutex_init(&s->open_mutex); |
| 3084 | spin_lock_init(&s->lock); | 3086 | spin_lock_init(&s->lock); |
| 3085 | s->magic = CM_MAGIC; | 3087 | s->magic = CM_MAGIC; |
| 3086 | s->dev = pcidev; | 3088 | s->dev = pcidev; |
