misc:cryptodev: fix null_check coverity issue
[linux-3.10.git] / drivers / misc / tegra_timerinfo.c
1 /*
2  * drivers/misc/tegra_timerinfo.c
3  *
4  * Copyright (c) 2012-2014, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * Author:
7  *      Jon Mayo <jmayo@nvidia.com>
8  *
9  * This software is licensed under the terms of the GNU General Public
10  * License version 2, as published by the Free Software Foundation, and
11  * may be copied, distributed, and modified under those terms.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  */
19
20 #include <linux/init.h>
21 #include <linux/fs.h>
22 #include <linux/mm.h>
23 #include <linux/platform_device.h>
24 #include <linux/miscdevice.h>
25 #include <linux/export.h>
26 #include <linux/module.h>
27 #include <linux/tegra-timer.h>
28
29 static int timerinfo_dev_mmap(struct file *file, struct vm_area_struct *vma);
30
31 static const struct file_operations timerinfo_dev_fops = {
32         .owner = THIS_MODULE,
33         .open = nonseekable_open,
34         .mmap = timerinfo_dev_mmap,
35         .llseek = noop_llseek,
36 };
37
38 static struct miscdevice timerinfo_dev = {
39         .minor = MISC_DYNAMIC_MINOR,
40         .name = "timerinfo",
41         .fops = &timerinfo_dev_fops,
42 };
43
44 static int timerinfo_dev_mmap(struct file *file, struct vm_area_struct *vma)
45 {
46         /* start at first page containing TIMERUS_CNTR_1US */
47         if (vma->vm_end  - vma->vm_start != PAGE_SIZE)
48                 return -EINVAL;
49
50         if (vma->vm_flags & VM_WRITE)
51                 return -EPERM;
52
53         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
54
55         if (remap_pfn_range(vma, vma->vm_start, timer_reg_base_pa >> PAGE_SHIFT,
56                                                 PAGE_SIZE, vma->vm_page_prot)) {
57                 pr_err("%s: remap_pfn_range failed\n", timerinfo_dev.name);
58                 return -EAGAIN;
59         }
60
61         return 0;
62 }
63
64 static int __init timerinfo_dev_init(void)
65 {
66         if (!timer_reg_base_pa) {
67                 pr_err("%s: Timer not registered\n", __func__);
68                 return 0;
69         }
70         return misc_register(&timerinfo_dev);
71 }
72
73 module_init(timerinfo_dev_init);
74 MODULE_LICENSE("GPL");