1 /* timskmod.h
2 *
3 * Copyright (C) 2010 - 2013 UNISYS CORPORATION
4 * All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or (at
9 * your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
14 * NON INFRINGEMENT. See the GNU General Public License for more
15 * details.
16 */
17
18 #ifndef __TIMSKMOD_H__
19 #define __TIMSKMOD_H__
20
21 #include <linux/version.h>
22 #include <linux/init.h>
23 #include <linux/kernel.h>
24 #include <linux/device.h>
25 #include <linux/kobject.h>
26 #include <linux/sysfs.h>
27 #include <linux/fs.h>
28 #include <linux/string.h>
29 #include <linux/sched.h>
30 #include <linux/spinlock.h>
31 #include <linux/slab.h>
32 #include <linux/errno.h>
33 #include <linux/interrupt.h>
34 #include <linux/sched.h>
35 #include <linux/wait.h>
36 #include <linux/vmalloc.h>
37 #include <linux/proc_fs.h>
38 #include <linux/cdev.h>
39 #include <linux/types.h>
40 #include <asm/irq.h>
41 #include <linux/io.h>
42 #include <asm/dma.h>
43 #include <linux/uaccess.h>
44 #include <linux/list.h>
45 #include <linux/poll.h>
46 /* #define EXPORT_SYMTAB */
47 #include <linux/module.h>
48 #include <linux/moduleparam.h>
49 #include <linux/fcntl.h>
50 #include <linux/aio.h>
51 #include <linux/workqueue.h>
52 #include <linux/kthread.h>
53 #include <linux/seq_file.h>
54 #include <linux/mm.h>
55
56 /* #define DEBUG */
57 #ifndef BOOL
58 #define BOOL int
59 #endif
60 #define FALSE 0
61 #define TRUE 1
62 #if !defined SUCCESS
63 #define SUCCESS 0
64 #endif
65 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
66 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
67 #define STRUCTSEQUAL(x, y) (memcmp(&x, &y, sizeof(x)) == 0)
68 #ifndef HOSTADDRESS
69 #define HOSTADDRESS unsigned long long
70 #endif
71
72 /** Try to evaulate the provided expression, and do a RETINT(x) iff
73 * the expression evaluates to < 0.
74 * @param x the expression to try
75 */
76 #define ASSERT(cond) \
77 do { if (!(cond)) \
78 HUHDRV("ASSERT failed - %s", \
79 __stringify(cond)); \
80 } while (0)
81
82 #define sizeofmember(TYPE, MEMBER) (sizeof(((TYPE *)0)->MEMBER))
83 /** "Covered quotient" function */
84 #define COVQ(v, d) (((v) + (d) - 1) / (d))
85 #define SWAPPOINTERS(p1, p2) \
86 do { \
87 void *SWAPPOINTERS_TEMP = (void *)p1; \
88 (void *)(p1) = (void *)(p2); \
89 (void *)(p2) = SWAPPOINTERS_TEMP; \
90 } while (0)
91
92 /**
93 * @addtogroup driverlogging
94 * @{
95 */
96
97 #define PRINTKDRV(fmt, args...) LOGINF(fmt, ## args)
98 #define TBDDRV(fmt, args...) LOGERR(fmt, ## args)
99 #define HUHDRV(fmt, args...) LOGERR(fmt, ## args)
100 #define ERRDRV(fmt, args...) LOGERR(fmt, ## args)
101 #define WARNDRV(fmt, args...) LOGWRN(fmt, ## args)
102 #define SECUREDRV(fmt, args...) LOGWRN(fmt, ## args)
103 #define INFODRV(fmt, args...) LOGINF(fmt, ## args)
104 #define DEBUGDRV(fmt, args...) DBGINF(fmt, ## args)
105
106 #define PRINTKDEV(devname, fmt, args...) LOGINFDEV(devname, fmt, ## args)
107 #define TBDDEV(devname, fmt, args...) LOGERRDEV(devname, fmt, ## args)
108 #define HUHDEV(devname, fmt, args...) LOGERRDEV(devname, fmt, ## args)
109 #define ERRDEV(devname, fmt, args...) LOGERRDEV(devname, fmt, ## args)
110 #define ERRDEVX(devno, fmt, args...) LOGERRDEVX(devno, fmt, ## args)
111 #define WARNDEV(devname, fmt, args...) LOGWRNDEV(devname, fmt, ## args)
112 #define SECUREDEV(devname, fmt, args...) LOGWRNDEV(devname, fmt, ## args)
113 #define INFODEV(devname, fmt, args...) LOGINFDEV(devname, fmt, ## args)
114 #define INFODEVX(devno, fmt, args...) LOGINFDEVX(devno, fmt, ## args)
115 #define DEBUGDEV(devname, fmt, args...) DBGINFDEV(devname, fmt, ## args)
116
117 /* @} */
118
119 /** Verifies the consistency of your PRIVATEDEVICEDATA structure using
120 * conventional "signature" fields:
121 * <p>
122 * - sig1 should contain the size of the structure
123 * - sig2 should contain a pointer to the beginning of the structure
124 */
125 #define DDLOOKSVALID(dd) \
126 ((dd != NULL) && \
127 ((dd)->sig1 == sizeof(PRIVATEDEVICEDATA)) && \
128 ((dd)->sig2 == dd))
129
130 /** Verifies the consistency of your PRIVATEFILEDATA structure using
131 * conventional "signature" fields:
132 * <p>
133 * - sig1 should contain the size of the structure
134 * - sig2 should contain a pointer to the beginning of the structure
135 */
136 #define FDLOOKSVALID(fd) \
137 ((fd != NULL) && \
138 ((fd)->sig1 == sizeof(PRIVATEFILEDATA)) && \
139 ((fd)->sig2 == fd))
140
141 /** Sleep for an indicated number of seconds (for use in kernel mode).
142 * @param x the number of seconds to sleep.
143 */
144 #define SLEEP(x) \
145 do { current->state = TASK_INTERRUPTIBLE; \
146 schedule_timeout((x)*HZ); \
147 } while (0)
148
149 /** Sleep for an indicated number of jiffies (for use in kernel mode).
150 * @param x the number of jiffies to sleep.
151 */
152 #define SLEEPJIFFIES(x) \
153 do { current->state = TASK_INTERRUPTIBLE; \
154 schedule_timeout(x); \
155 } while (0)
156
157 #ifndef max
158 #define max(a, b) (((a) > (b)) ? (a) : (b))
159 #endif
160
cdev_alloc_init(struct module * owner,const struct file_operations * fops)161 static inline struct cdev *cdev_alloc_init(struct module *owner,
162 const struct file_operations *fops)
163 {
164 struct cdev *cdev = NULL;
165
166 cdev = cdev_alloc();
167 if (!cdev)
168 return NULL;
169 cdev->ops = fops;
170 cdev->owner = owner;
171
172 /* Note that the memory allocated for cdev will be deallocated
173 * when the usage count drops to 0, because it is controlled
174 * by a kobject of type ktype_cdev_dynamic. (This
175 * deallocation could very well happen outside of our kernel
176 * module, like via the cdev_put in __fput() for example.)
177 */
178 return cdev;
179 }
180
181 extern int unisys_spar_platform;
182
183 #endif
184