diff options
Diffstat (limited to 'drivers/char/genrtc.c')
-rw-r--r-- | drivers/char/genrtc.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/char/genrtc.c b/drivers/char/genrtc.c index b6c2cc167c11..f773a9dd14f3 100644 --- a/drivers/char/genrtc.c +++ b/drivers/char/genrtc.c | |||
@@ -52,7 +52,7 @@ | |||
52 | #include <linux/init.h> | 52 | #include <linux/init.h> |
53 | #include <linux/poll.h> | 53 | #include <linux/poll.h> |
54 | #include <linux/proc_fs.h> | 54 | #include <linux/proc_fs.h> |
55 | #include <linux/smp_lock.h> | 55 | #include <linux/mutex.h> |
56 | #include <linux/workqueue.h> | 56 | #include <linux/workqueue.h> |
57 | 57 | ||
58 | #include <asm/uaccess.h> | 58 | #include <asm/uaccess.h> |
@@ -66,6 +66,7 @@ | |||
66 | * ioctls. | 66 | * ioctls. |
67 | */ | 67 | */ |
68 | 68 | ||
69 | static DEFINE_MUTEX(gen_rtc_mutex); | ||
69 | static DECLARE_WAIT_QUEUE_HEAD(gen_rtc_wait); | 70 | static DECLARE_WAIT_QUEUE_HEAD(gen_rtc_wait); |
70 | 71 | ||
71 | /* | 72 | /* |
@@ -337,9 +338,9 @@ static long gen_rtc_unlocked_ioctl(struct file *file, unsigned int cmd, | |||
337 | { | 338 | { |
338 | int ret; | 339 | int ret; |
339 | 340 | ||
340 | lock_kernel(); | 341 | mutex_lock(&gen_rtc_mutex); |
341 | ret = gen_rtc_ioctl(file, cmd, arg); | 342 | ret = gen_rtc_ioctl(file, cmd, arg); |
342 | unlock_kernel(); | 343 | mutex_unlock(&gen_rtc_mutex); |
343 | 344 | ||
344 | return ret; | 345 | return ret; |
345 | } | 346 | } |
@@ -352,16 +353,16 @@ static long gen_rtc_unlocked_ioctl(struct file *file, unsigned int cmd, | |||
352 | 353 | ||
353 | static int gen_rtc_open(struct inode *inode, struct file *file) | 354 | static int gen_rtc_open(struct inode *inode, struct file *file) |
354 | { | 355 | { |
355 | lock_kernel(); | 356 | mutex_lock(&gen_rtc_mutex); |
356 | if (gen_rtc_status & RTC_IS_OPEN) { | 357 | if (gen_rtc_status & RTC_IS_OPEN) { |
357 | unlock_kernel(); | 358 | mutex_unlock(&gen_rtc_mutex); |
358 | return -EBUSY; | 359 | return -EBUSY; |
359 | } | 360 | } |
360 | 361 | ||
361 | gen_rtc_status |= RTC_IS_OPEN; | 362 | gen_rtc_status |= RTC_IS_OPEN; |
362 | gen_rtc_irq_data = 0; | 363 | gen_rtc_irq_data = 0; |
363 | irq_active = 0; | 364 | irq_active = 0; |
364 | unlock_kernel(); | 365 | mutex_unlock(&gen_rtc_mutex); |
365 | 366 | ||
366 | return 0; | 367 | return 0; |
367 | } | 368 | } |
@@ -497,6 +498,7 @@ static const struct file_operations gen_rtc_fops = { | |||
497 | .unlocked_ioctl = gen_rtc_unlocked_ioctl, | 498 | .unlocked_ioctl = gen_rtc_unlocked_ioctl, |
498 | .open = gen_rtc_open, | 499 | .open = gen_rtc_open, |
499 | .release = gen_rtc_release, | 500 | .release = gen_rtc_release, |
501 | .llseek = noop_llseek, | ||
500 | }; | 502 | }; |
501 | 503 | ||
502 | static struct miscdevice rtc_gen_dev = | 504 | static struct miscdevice rtc_gen_dev = |