diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /arch/arm/mach-tegra/timerinfo.c | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'arch/arm/mach-tegra/timerinfo.c')
-rw-r--r-- | arch/arm/mach-tegra/timerinfo.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/timerinfo.c b/arch/arm/mach-tegra/timerinfo.c new file mode 100644 index 00000000000..b64ea821f4a --- /dev/null +++ b/arch/arm/mach-tegra/timerinfo.c | |||
@@ -0,0 +1,74 @@ | |||
1 | /* | ||
2 | * arch/arch/mach-tegra/timerinfo.c | ||
3 | * | ||
4 | * Copyright (C) 2012 NVIDIA Corporation. | ||
5 | * | ||
6 | * Author: | ||
7 | * Jon Mayo <jmayo@nvidia.com> | ||
8 | * | ||
9 | * Copyright (C) 2012 NVIDIA Corporation. | ||
10 | * | ||
11 | * This software is licensed under the terms of the GNU General Public | ||
12 | * License version 2, as published by the Free Software Foundation, and | ||
13 | * may be copied, distributed, and modified under those terms. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include <linux/init.h> | ||
23 | #include <linux/fs.h> | ||
24 | #include <linux/mm.h> | ||
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/miscdevice.h> | ||
27 | #include <mach/iomap.h> | ||
28 | |||
29 | #include "timer.h" | ||
30 | |||
31 | static int timerinfo_dev_mmap(struct file *file, struct vm_area_struct *vma); | ||
32 | |||
33 | static const struct file_operations timerinfo_dev_fops = { | ||
34 | .owner = THIS_MODULE, | ||
35 | .open = nonseekable_open, | ||
36 | .mmap = timerinfo_dev_mmap, | ||
37 | .llseek = noop_llseek, | ||
38 | }; | ||
39 | |||
40 | static struct miscdevice timerinfo_dev = { | ||
41 | .minor = MISC_DYNAMIC_MINOR, | ||
42 | .name = "timerinfo", | ||
43 | .fops = &timerinfo_dev_fops, | ||
44 | }; | ||
45 | |||
46 | static int timerinfo_dev_mmap(struct file *file, struct vm_area_struct *vma) | ||
47 | { | ||
48 | /* start at first page containing TIMERUS_CNTR_1US */ | ||
49 | phys_addr_t addr = TEGRA_TMR1_BASE; | ||
50 | |||
51 | if (vma->vm_end - vma->vm_start != PAGE_SIZE) | ||
52 | return -EINVAL; | ||
53 | |||
54 | if (vma->vm_flags & VM_WRITE) | ||
55 | return -EPERM; | ||
56 | |||
57 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | ||
58 | |||
59 | if (remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, PAGE_SIZE, | ||
60 | vma->vm_page_prot)) { | ||
61 | pr_err("%s:remap_pfn_range failed\n", timerinfo_dev.name); | ||
62 | return -EAGAIN; | ||
63 | } | ||
64 | |||
65 | return 0; | ||
66 | } | ||
67 | |||
68 | static int __init timerinfo_dev_init(void) | ||
69 | { | ||
70 | return misc_register(&timerinfo_dev); | ||
71 | } | ||
72 | |||
73 | module_init(timerinfo_dev_init); | ||
74 | MODULE_LICENSE("GPL"); | ||