diff options
Diffstat (limited to 'sound/oss/sh_dac_audio.c')
-rw-r--r-- | sound/oss/sh_dac_audio.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index 4153752507e3..fdb58eb83d4e 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c | |||
@@ -15,7 +15,9 @@ | |||
15 | #include <linux/linkage.h> | 15 | #include <linux/linkage.h> |
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/smp_lock.h> | ||
18 | #include <linux/sound.h> | 19 | #include <linux/sound.h> |
20 | #include <linux/smp_lock.h> | ||
19 | #include <linux/soundcard.h> | 21 | #include <linux/soundcard.h> |
20 | #include <linux/interrupt.h> | 22 | #include <linux/interrupt.h> |
21 | #include <linux/hrtimer.h> | 23 | #include <linux/hrtimer.h> |
@@ -92,7 +94,7 @@ static void dac_audio_set_rate(void) | |||
92 | wakeups_per_second = ktime_set(0, 1000000000 / rate); | 94 | wakeups_per_second = ktime_set(0, 1000000000 / rate); |
93 | } | 95 | } |
94 | 96 | ||
95 | static int dac_audio_ioctl(struct inode *inode, struct file *file, | 97 | static int dac_audio_ioctl(struct file *file, |
96 | unsigned int cmd, unsigned long arg) | 98 | unsigned int cmd, unsigned long arg) |
97 | { | 99 | { |
98 | int val; | 100 | int val; |
@@ -158,6 +160,17 @@ static int dac_audio_ioctl(struct inode *inode, struct file *file, | |||
158 | return -EINVAL; | 160 | return -EINVAL; |
159 | } | 161 | } |
160 | 162 | ||
163 | static long dac_audio_unlocked_ioctl(struct file *file, u_int cmd, u_long arg) | ||
164 | { | ||
165 | int ret; | ||
166 | |||
167 | lock_kernel(); | ||
168 | ret = dac_audio_ioctl(file, cmd, arg); | ||
169 | unlock_kernel(); | ||
170 | |||
171 | return ret; | ||
172 | } | ||
173 | |||
161 | static ssize_t dac_audio_write(struct file *file, const char *buf, size_t count, | 174 | static ssize_t dac_audio_write(struct file *file, const char *buf, size_t count, |
162 | loff_t * ppos) | 175 | loff_t * ppos) |
163 | { | 176 | { |
@@ -216,13 +229,17 @@ static int dac_audio_open(struct inode *inode, struct file *file) | |||
216 | { | 229 | { |
217 | if (file->f_mode & FMODE_READ) | 230 | if (file->f_mode & FMODE_READ) |
218 | return -ENODEV; | 231 | return -ENODEV; |
219 | if (in_use) | 232 | |
233 | lock_kernel(); | ||
234 | if (in_use) { | ||
235 | unlock_kernel(); | ||
220 | return -EBUSY; | 236 | return -EBUSY; |
237 | } | ||
221 | 238 | ||
222 | in_use = 1; | 239 | in_use = 1; |
223 | 240 | ||
224 | dac_audio_start(); | 241 | dac_audio_start(); |
225 | 242 | unlock_kernel(); | |
226 | return 0; | 243 | return 0; |
227 | } | 244 | } |
228 | 245 | ||
@@ -237,8 +254,8 @@ static int dac_audio_release(struct inode *inode, struct file *file) | |||
237 | 254 | ||
238 | const struct file_operations dac_audio_fops = { | 255 | const struct file_operations dac_audio_fops = { |
239 | .read = dac_audio_read, | 256 | .read = dac_audio_read, |
240 | .write = dac_audio_write, | 257 | .write = dac_audio_write, |
241 | .ioctl = dac_audio_ioctl, | 258 | .unlocked_ioctl = dac_audio_unlocked_ioctl, |
242 | .open = dac_audio_open, | 259 | .open = dac_audio_open, |
243 | .release = dac_audio_release, | 260 | .release = dac_audio_release, |
244 | }; | 261 | }; |