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