diff options
Diffstat (limited to 'drivers/char/mmtimer.c')
-rw-r--r-- | drivers/char/mmtimer.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/char/mmtimer.c b/drivers/char/mmtimer.c index 192961fd7173..918711aa56f3 100644 --- a/drivers/char/mmtimer.c +++ b/drivers/char/mmtimer.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
33 | #include <linux/time.h> | 33 | #include <linux/time.h> |
34 | #include <linux/math64.h> | 34 | #include <linux/math64.h> |
35 | #include <linux/smp_lock.h> | ||
35 | 36 | ||
36 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
37 | #include <asm/sn/addrs.h> | 38 | #include <asm/sn/addrs.h> |
@@ -57,8 +58,8 @@ extern unsigned long sn_rtc_cycles_per_second; | |||
57 | 58 | ||
58 | #define rtc_time() (*RTC_COUNTER_ADDR) | 59 | #define rtc_time() (*RTC_COUNTER_ADDR) |
59 | 60 | ||
60 | static int mmtimer_ioctl(struct inode *inode, struct file *file, | 61 | static long mmtimer_ioctl(struct file *file, unsigned int cmd, |
61 | unsigned int cmd, unsigned long arg); | 62 | unsigned long arg); |
62 | static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma); | 63 | static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma); |
63 | 64 | ||
64 | /* | 65 | /* |
@@ -67,9 +68,9 @@ static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma); | |||
67 | static unsigned long mmtimer_femtoperiod = 0; | 68 | static unsigned long mmtimer_femtoperiod = 0; |
68 | 69 | ||
69 | static const struct file_operations mmtimer_fops = { | 70 | static const struct file_operations mmtimer_fops = { |
70 | .owner = THIS_MODULE, | 71 | .owner = THIS_MODULE, |
71 | .mmap = mmtimer_mmap, | 72 | .mmap = mmtimer_mmap, |
72 | .ioctl = mmtimer_ioctl, | 73 | .unlocked_ioctl = mmtimer_ioctl, |
73 | }; | 74 | }; |
74 | 75 | ||
75 | /* | 76 | /* |
@@ -339,7 +340,6 @@ restart: | |||
339 | 340 | ||
340 | /** | 341 | /** |
341 | * mmtimer_ioctl - ioctl interface for /dev/mmtimer | 342 | * mmtimer_ioctl - ioctl interface for /dev/mmtimer |
342 | * @inode: inode of the device | ||
343 | * @file: file structure for the device | 343 | * @file: file structure for the device |
344 | * @cmd: command to execute | 344 | * @cmd: command to execute |
345 | * @arg: optional argument to command | 345 | * @arg: optional argument to command |
@@ -365,11 +365,13 @@ restart: | |||
365 | * %MMTIMER_GETCOUNTER - Gets the current value in the counter and places it | 365 | * %MMTIMER_GETCOUNTER - Gets the current value in the counter and places it |
366 | * in the address specified by @arg. | 366 | * in the address specified by @arg. |
367 | */ | 367 | */ |
368 | static int mmtimer_ioctl(struct inode *inode, struct file *file, | 368 | static long mmtimer_ioctl(struct file *file, unsigned int cmd, |
369 | unsigned int cmd, unsigned long arg) | 369 | unsigned long arg) |
370 | { | 370 | { |
371 | int ret = 0; | 371 | int ret = 0; |
372 | 372 | ||
373 | lock_kernel(); | ||
374 | |||
373 | switch (cmd) { | 375 | switch (cmd) { |
374 | case MMTIMER_GETOFFSET: /* offset of the counter */ | 376 | case MMTIMER_GETOFFSET: /* offset of the counter */ |
375 | /* | 377 | /* |
@@ -384,15 +386,14 @@ static int mmtimer_ioctl(struct inode *inode, struct file *file, | |||
384 | case MMTIMER_GETRES: /* resolution of the clock in 10^-15 s */ | 386 | case MMTIMER_GETRES: /* resolution of the clock in 10^-15 s */ |
385 | if(copy_to_user((unsigned long __user *)arg, | 387 | if(copy_to_user((unsigned long __user *)arg, |
386 | &mmtimer_femtoperiod, sizeof(unsigned long))) | 388 | &mmtimer_femtoperiod, sizeof(unsigned long))) |
387 | return -EFAULT; | 389 | ret = -EFAULT; |
388 | break; | 390 | break; |
389 | 391 | ||
390 | case MMTIMER_GETFREQ: /* frequency in Hz */ | 392 | case MMTIMER_GETFREQ: /* frequency in Hz */ |
391 | if(copy_to_user((unsigned long __user *)arg, | 393 | if(copy_to_user((unsigned long __user *)arg, |
392 | &sn_rtc_cycles_per_second, | 394 | &sn_rtc_cycles_per_second, |
393 | sizeof(unsigned long))) | 395 | sizeof(unsigned long))) |
394 | return -EFAULT; | 396 | ret = -EFAULT; |
395 | ret = 0; | ||
396 | break; | 397 | break; |
397 | 398 | ||
398 | case MMTIMER_GETBITS: /* number of bits in the clock */ | 399 | case MMTIMER_GETBITS: /* number of bits in the clock */ |
@@ -406,13 +407,13 @@ static int mmtimer_ioctl(struct inode *inode, struct file *file, | |||
406 | case MMTIMER_GETCOUNTER: | 407 | case MMTIMER_GETCOUNTER: |
407 | if(copy_to_user((unsigned long __user *)arg, | 408 | if(copy_to_user((unsigned long __user *)arg, |
408 | RTC_COUNTER_ADDR, sizeof(unsigned long))) | 409 | RTC_COUNTER_ADDR, sizeof(unsigned long))) |
409 | return -EFAULT; | 410 | ret = -EFAULT; |
410 | break; | 411 | break; |
411 | default: | 412 | default: |
412 | ret = -ENOSYS; | 413 | ret = -ENOTTY; |
413 | break; | 414 | break; |
414 | } | 415 | } |
415 | 416 | unlock_kernel(); | |
416 | return ret; | 417 | return ret; |
417 | } | 418 | } |
418 | 419 | ||