1
2/*
3 * mtd/include/compatmac.h
4 *
5 * $Id: compatmac.h,v 1.1.1.1 2008/10/15 03:27:31 james26_jang Exp $
6 *
7 * Extensions and omissions from the normal 'linux/compatmac.h'
8 * files. hopefully this will end up empty as the 'real' one
9 * becomes fully-featured.
10 */
11
12
13/* First, include the parts which the kernel is good enough to provide
14 * to us
15 */
16
17#ifndef __LINUX_MTD_COMPATMAC_H__
18#define __LINUX_MTD_COMPATMAC_H__
19
20#include <linux/compatmac.h>
21#include <linux/types.h> /* used later in this header */
22#include <linux/module.h>
23#ifndef LINUX_VERSION_CODE
24#include <linux/version.h>
25#endif
26
27#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
28#include <linux/vmalloc.h>
29#endif
30
31#if LINUX_VERSION_CODE < KERNEL_VERSION(2,0,0)
32#  error "This kernel is too old: not supported by this file"
33#endif
34
35/* Modularization issues */
36#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,18)
37#  define __USE_OLD_SYMTAB__
38#  define EXPORT_NO_SYMBOLS register_symtab(NULL);
39#  define REGISTER_SYMTAB(tab) register_symtab(tab)
40#else
41#  define REGISTER_SYMTAB(tab) /* nothing */
42#endif
43
44#ifdef __USE_OLD_SYMTAB__
45#  define __MODULE_STRING(s)         /* nothing */
46#  define MODULE_PARM(v,t)           /* nothing */
47#  define MODULE_PARM_DESC(v,t)      /* nothing */
48#  define MODULE_AUTHOR(n)           /* nothing */
49#  define MODULE_DESCRIPTION(d)      /* nothing */
50#  define MODULE_SUPPORTED_DEVICE(n) /* nothing */
51#endif
52
53/*
54 * "select" changed in 2.1.23. The implementation is twin, but this
55 * header is new
56 */
57#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,22)
58#  include <linux/poll.h>
59#else
60#  define __USE_OLD_SELECT__
61#endif
62
63/* Other change in the fops are solved using pseudo-types */
64#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
65#  define lseek_t      long long
66#  define lseek_off_t  long long
67#else
68#  define lseek_t      int
69#  define lseek_off_t  off_t
70#endif
71
72/* changed the prototype of read/write */
73
74#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) || defined(__alpha__)
75# define count_t unsigned long
76# define read_write_t long
77#else
78# define count_t int
79# define read_write_t int
80#endif
81
82
83#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,31)
84# define release_t void
85#  define release_return(x) return
86#else
87#  define release_t int
88#  define release_return(x) return (x)
89#endif
90
91#if LINUX_VERSION_CODE < 0x20300
92#define __exit
93#endif
94#if LINUX_VERSION_CODE < 0x20200
95#define __init
96#else
97#include <linux/init.h>
98#endif
99
100#if LINUX_VERSION_CODE < 0x20300
101#define init_MUTEX(x) do {*(x) = MUTEX;} while (0)
102#define RQFUNC_ARG void
103#define blkdev_dequeue_request(req) do {CURRENT = req->next;} while (0)
104#else
105#define RQFUNC_ARG request_queue_t *q
106#endif
107
108#if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,0)
109#define __MOD_INC_USE_COUNT(mod)                                        \
110        (atomic_inc(&(mod)->uc.usecount), (mod)->flags |= MOD_VISITED|MOD_USED_ONCE)
111#define __MOD_DEC_USE_COUNT(mod)                                        \
112        (atomic_dec(&(mod)->uc.usecount), (mod)->flags |= MOD_VISITED)
113#endif
114
115
116
117#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
118
119#define DECLARE_WAIT_QUEUE_HEAD(x) struct wait_queue *x = NULL
120#define init_waitqueue_head init_waitqueue
121
122static inline int try_inc_mod_count(struct module *mod)
123{
124	if (mod)
125		__MOD_INC_USE_COUNT(mod);
126	return 1;
127}
128#endif
129
130
131/* Yes, I'm aware that it's a fairly ugly hack.
132   Until the __constant_* macros appear in Linus' own kernels, this is
133   the way it has to be done.
134 DW 19/1/00
135 */
136
137#include <asm/byteorder.h>
138
139#ifndef __constant_cpu_to_le16
140
141#ifdef __BIG_ENDIAN
142#define __constant_cpu_to_le64(x) ___swab64((x))
143#define __constant_le64_to_cpu(x) ___swab64((x))
144#define __constant_cpu_to_le32(x) ___swab32((x))
145#define __constant_le32_to_cpu(x) ___swab32((x))
146#define __constant_cpu_to_le16(x) ___swab16((x))
147#define __constant_le16_to_cpu(x) ___swab16((x))
148#define __constant_cpu_to_be64(x) ((__u64)(x))
149#define __constant_be64_to_cpu(x) ((__u64)(x))
150#define __constant_cpu_to_be32(x) ((__u32)(x))
151#define __constant_be32_to_cpu(x) ((__u32)(x))
152#define __constant_cpu_to_be16(x) ((__u16)(x))
153#define __constant_be16_to_cpu(x) ((__u16)(x))
154#else
155#ifdef __LITTLE_ENDIAN
156#define __constant_cpu_to_le64(x) ((__u64)(x))
157#define __constant_le64_to_cpu(x) ((__u64)(x))
158#define __constant_cpu_to_le32(x) ((__u32)(x))
159#define __constant_le32_to_cpu(x) ((__u32)(x))
160#define __constant_cpu_to_le16(x) ((__u16)(x))
161#define __constant_le16_to_cpu(x) ((__u16)(x))
162#define __constant_cpu_to_be64(x) ___swab64((x))
163#define __constant_be64_to_cpu(x) ___swab64((x))
164#define __constant_cpu_to_be32(x) ___swab32((x))
165#define __constant_be32_to_cpu(x) ___swab32((x))
166#define __constant_cpu_to_be16(x) ___swab16((x))
167#define __constant_be16_to_cpu(x) ___swab16((x))
168#else
169#error No (recognised) endianness defined (unless it,s PDP)
170#endif /* __LITTLE_ENDIAN */
171#endif /* __BIG_ENDIAN */
172
173#endif /* ifndef __constant_cpu_to_le16 */
174
175#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
176  #define mod_init_t int  __init
177  #define mod_exit_t void
178#else
179  #define mod_init_t static int __init
180  #define mod_exit_t static void __exit
181#endif
182
183#ifndef THIS_MODULE
184#ifdef MODULE
185#define THIS_MODULE (&__this_module)
186#else
187#define THIS_MODULE (NULL)
188#endif
189#endif
190
191#if LINUX_VERSION_CODE < 0x20300
192#include <linux/interrupt.h>
193#define spin_lock_bh(lock) do {start_bh_atomic();spin_lock(lock);} while(0)
194#define spin_unlock_bh(lock) do {spin_unlock(lock);end_bh_atomic();} while(0)
195#else
196#include <asm/softirq.h>
197#include <linux/spinlock.h>
198#endif
199
200#endif /* __LINUX_MTD_COMPATMAC_H__ */
201
202
203