aboutsummaryrefslogtreecommitdiffstats
path: root/sound/oss/sh_dac_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/oss/sh_dac_audio.c')
-rw-r--r--sound/oss/sh_dac_audio.c27
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
95static int dac_audio_ioctl(struct inode *inode, struct file *file, 97static 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
163static 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
161static ssize_t dac_audio_write(struct file *file, const char *buf, size_t count, 174static 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
238const struct file_operations dac_audio_fops = { 255const 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};