]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/ofed/include/linux/cdev.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / ofed / include / linux / cdev.h
1 /*-
2  * Copyright (c) 2010 Isilon Systems, Inc.
3  * Copyright (c) 2010 iX Systems, Inc.
4  * Copyright (c) 2010 Panasas, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice unmodified, this list of conditions, and the following
12  *    disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef _LINUX_CDEV_H_
30 #define _LINUX_CDEV_H_
31
32 #include <linux/kobject.h>
33 #include <linux/kdev_t.h>
34 #include <linux/list.h>
35
36 struct file_operations;
37 struct inode;
38 struct module;
39
40 extern struct cdevsw linuxcdevsw;
41
42 struct linux_cdev {
43         struct kobject  kobj;
44         struct module   *owner;
45         struct cdev     *cdev;
46         dev_t           dev;
47         const struct file_operations *ops;
48 };
49
50 static inline void
51 cdev_release(struct kobject *kobj)
52 {
53         struct linux_cdev *cdev;
54
55         cdev = container_of(kobj, struct linux_cdev, kobj);
56         if (cdev->cdev)
57                 destroy_dev(cdev->cdev);
58         kfree(cdev);
59 }
60
61 static inline void
62 cdev_static_release(struct kobject *kobj)
63 {
64         struct linux_cdev *cdev;
65
66         cdev = container_of(kobj, struct linux_cdev, kobj);
67         if (cdev->cdev)
68                 destroy_dev(cdev->cdev);
69 }
70
71 static struct kobj_type cdev_ktype = {
72         .release = cdev_release,
73 };
74
75 static struct kobj_type cdev_static_ktype = {
76         .release = cdev_static_release,
77 };
78
79 static inline void
80 cdev_init(struct linux_cdev *cdev, const struct file_operations *ops)
81 {
82
83         kobject_init(&cdev->kobj, &cdev_static_ktype);
84         cdev->ops = ops;
85 }
86
87 static inline struct linux_cdev *
88 cdev_alloc(void)
89 {
90         struct linux_cdev *cdev;
91
92         cdev = kzalloc(sizeof(struct linux_cdev), M_WAITOK);
93         if (cdev)
94                 kobject_init(&cdev->kobj, &cdev_ktype);
95         return (cdev);
96 }
97
98 static inline void
99 cdev_put(struct linux_cdev *p)
100 {
101         kobject_put(&p->kobj);
102 }
103
104 static inline int
105 cdev_add(struct linux_cdev *cdev, dev_t dev, unsigned count)
106 {
107         if (count != 1)
108                 panic("cdev_add: Unsupported count: %d", count);
109         cdev->cdev = make_dev(&linuxcdevsw, MINOR(dev), 0, 0, 0700, 
110             "%s", kobject_name(&cdev->kobj));
111         cdev->dev = dev;
112         cdev->cdev->si_drv1 = cdev;
113
114         return (0);
115 }
116
117 static inline void
118 cdev_del(struct linux_cdev *cdev)
119 {
120         if (cdev->cdev) {
121                 destroy_dev(cdev->cdev);
122                 cdev->cdev = NULL;
123         }
124         kobject_put(&cdev->kobj);
125 }
126
127 #define cdev    linux_cdev
128
129 #endif  /* _LINUX_CDEV_H_ */