diff options
| -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 | ||
