403 lines
9.7 KiB
C
403 lines
9.7 KiB
C
|
/* $Id: kcompat.h,v 5.44 2009/03/22 08:45:47 lirc Exp $ */
|
||
|
|
||
|
#ifndef _KCOMPAT_H
|
||
|
#define _KCOMPAT_H
|
||
|
|
||
|
#include <linux/version.h>
|
||
|
|
||
|
#ifndef __func__
|
||
|
#define __func__ __FUNCTION__
|
||
|
#endif
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
|
||
|
#define LIRC_THIS_MODULE(x) x,
|
||
|
#else /* >= 2.6.16 */
|
||
|
#define LIRC_THIS_MODULE(x)
|
||
|
#endif
|
||
|
|
||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
|
||
|
|
||
|
#include <linux/device.h>
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
|
||
|
#define LIRC_HAVE_DEVFS
|
||
|
#define LIRC_HAVE_DEVFS_26
|
||
|
#endif
|
||
|
|
||
|
#define LIRC_HAVE_SYSFS
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
|
||
|
|
||
|
typedef struct class_simple lirc_class_t;
|
||
|
|
||
|
static inline lirc_class_t *class_create(struct module *owner, char *name)
|
||
|
{
|
||
|
return class_simple_create(owner, name);
|
||
|
}
|
||
|
|
||
|
static inline void class_destroy(lirc_class_t *cls)
|
||
|
{
|
||
|
class_simple_destroy(cls);
|
||
|
}
|
||
|
|
||
|
#define lirc_device_create(cs, parent, dev, drvdata, fmt, args...) \
|
||
|
class_simple_device_add(cs, dev, parent, fmt, ## args)
|
||
|
|
||
|
static inline void lirc_device_destroy(lirc_class_t *cls, dev_t devt)
|
||
|
{
|
||
|
class_simple_device_remove(devt);
|
||
|
}
|
||
|
|
||
|
#else /* >= 2.6.13 */
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 15)
|
||
|
|
||
|
#define lirc_device_create(cs, parent, dev, drvdata, fmt, args...) \
|
||
|
class_device_create(cs, dev, parent, fmt, ## args)
|
||
|
|
||
|
#else /* >= 2.6.15 */
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)
|
||
|
|
||
|
#define lirc_device_create(cs, parent, dev, drvdata, fmt, args...) \
|
||
|
class_device_create(cs, NULL, dev, parent, fmt, ## args)
|
||
|
|
||
|
#else /* >= 2.6.26 */
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 27)
|
||
|
|
||
|
#define lirc_device_create(cs, parent, dev, drvdata, fmt, args...) \
|
||
|
device_create(cs, parent, dev, fmt, ## args)
|
||
|
|
||
|
#else /* >= 2.6.27 */
|
||
|
|
||
|
#define lirc_device_create device_create
|
||
|
|
||
|
#endif /* >= 2.6.27 */
|
||
|
|
||
|
#endif /* >= 2.6.26 */
|
||
|
|
||
|
#define LIRC_DEVFS_PREFIX
|
||
|
|
||
|
#endif /* >= 2.6.15 */
|
||
|
|
||
|
typedef struct class lirc_class_t;
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)
|
||
|
|
||
|
#define lirc_device_destroy class_device_destroy
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define lirc_device_destroy device_destroy
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif /* >= 2.6.13 */
|
||
|
|
||
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
|
||
|
#define LIRC_HAVE_DEVFS
|
||
|
#define LIRC_HAVE_DEVFS_24
|
||
|
#endif
|
||
|
|
||
|
#ifndef LIRC_DEVFS_PREFIX
|
||
|
#define LIRC_DEVFS_PREFIX "usb/"
|
||
|
#endif
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)
|
||
|
#include <linux/timer.h>
|
||
|
#include <linux/interrupt.h>
|
||
|
static inline void del_timer_sync(struct timer_list *timerlist)
|
||
|
{
|
||
|
start_bh_atomic();
|
||
|
del_timer(timerlist);
|
||
|
end_bh_atomic();
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
|
||
|
#ifdef daemonize
|
||
|
#undef daemonize
|
||
|
#endif
|
||
|
#define daemonize(name) do { \
|
||
|
\
|
||
|
lock_kernel(); \
|
||
|
\
|
||
|
exit_mm(current); \
|
||
|
exit_files(current); \
|
||
|
exit_fs(current); \
|
||
|
current->session = 1; \
|
||
|
current->pgrp = 1; \
|
||
|
current->euid = 0; \
|
||
|
current->tty = NULL; \
|
||
|
sigfillset(¤t->blocked); \
|
||
|
\
|
||
|
strcpy(current->comm, name); \
|
||
|
\
|
||
|
unlock_kernel(); \
|
||
|
\
|
||
|
} while (0)
|
||
|
|
||
|
/* Not sure when this was introduced, sometime during 2.5.X */
|
||
|
#define MODULE_PARM_int(x) MODULE_PARM(x, "i")
|
||
|
#define MODULE_PARM_bool(x) MODULE_PARM(x, "i")
|
||
|
#define MODULE_PARM_long(x) MODULE_PARM(x, "l")
|
||
|
#define module_param(x, y, z) MODULE_PARM_##y(x)
|
||
|
#else
|
||
|
#include <linux/moduleparam.h>
|
||
|
#endif /* Linux < 2.6.0 */
|
||
|
|
||
|
/* DevFS header */
|
||
|
#if defined(LIRC_HAVE_DEVFS)
|
||
|
#include <linux/devfs_fs_kernel.h>
|
||
|
#endif
|
||
|
|
||
|
#ifdef LIRC_HAVE_DEVFS_24
|
||
|
#ifdef register_chrdev
|
||
|
#undef register_chrdev
|
||
|
#endif
|
||
|
#define register_chrdev devfs_register_chrdev
|
||
|
#ifdef unregister_chrdev
|
||
|
#undef unregister_chrdev
|
||
|
#endif
|
||
|
#define unregister_chrdev devfs_unregister_chrdev
|
||
|
#endif /* DEVFS 2.4 */
|
||
|
|
||
|
#ifndef LIRC_HAVE_SYSFS
|
||
|
#define class_destroy(x) do { } while (0)
|
||
|
#define class_create(x, y) NULL
|
||
|
#define lirc_device_destroy(x, y) do { } while (0)
|
||
|
#define lirc_device_create(x, y, z, xx, yy, zz) 0
|
||
|
#define IS_ERR(x) 0
|
||
|
typedef struct class_simple
|
||
|
{
|
||
|
int notused;
|
||
|
} lirc_class_t;
|
||
|
#endif /* No SYSFS */
|
||
|
|
||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)
|
||
|
#define KERNEL_2_5
|
||
|
|
||
|
/*
|
||
|
* We still are using MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT in the set_use_inc
|
||
|
* function of all modules for 2.4 kernel compatibility.
|
||
|
*
|
||
|
* For 2.6 kernels reference counting is done in lirc_dev by
|
||
|
* try_module_get()/module_put() because the old approach is racy.
|
||
|
*
|
||
|
*/
|
||
|
#ifdef MOD_INC_USE_COUNT
|
||
|
#undef MOD_INC_USE_COUNT
|
||
|
#endif
|
||
|
#define MOD_INC_USE_COUNT
|
||
|
|
||
|
#ifdef MOD_DEC_USE_COUNT
|
||
|
#undef MOD_DEC_USE_COUNT
|
||
|
#endif
|
||
|
#define MOD_DEC_USE_COUNT
|
||
|
|
||
|
#ifdef EXPORT_NO_SYMBOLS
|
||
|
#undef EXPORT_NO_SYMBOLS
|
||
|
#endif
|
||
|
#define EXPORT_NO_SYMBOLS
|
||
|
|
||
|
#else /* Kernel < 2.5.0 */
|
||
|
|
||
|
static inline int try_module_get(struct module *module)
|
||
|
{
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
static inline void module_put(struct module *module)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
#endif /* Kernel >= 2.5.0 */
|
||
|
|
||
|
#ifndef MODULE_LICENSE
|
||
|
#define MODULE_LICENSE(x)
|
||
|
#endif
|
||
|
|
||
|
#ifndef MODULE_PARM_DESC
|
||
|
#define MODULE_PARM_DESC(x, y)
|
||
|
#endif
|
||
|
|
||
|
#ifndef MODULE_ALIAS_CHARDEV_MAJOR
|
||
|
#define MODULE_ALIAS_CHARDEV_MAJOR(x)
|
||
|
#endif
|
||
|
|
||
|
#ifndef MODULE_DEVICE_TABLE
|
||
|
#define MODULE_DEVICE_TABLE(x, y)
|
||
|
#endif
|
||
|
|
||
|
#include <linux/interrupt.h>
|
||
|
#ifndef IRQ_RETVAL
|
||
|
typedef void irqreturn_t;
|
||
|
#define IRQ_NONE
|
||
|
#define IRQ_HANDLED
|
||
|
#define IRQ_RETVAL(x)
|
||
|
#endif
|
||
|
|
||
|
#ifndef MOD_IN_USE
|
||
|
#ifdef CONFIG_MODULE_UNLOAD
|
||
|
#define MOD_IN_USE module_refcount(THIS_MODULE)
|
||
|
#else
|
||
|
#error "LIRC modules currently require"
|
||
|
#error " 'Loadable module support ---> Module unloading'"
|
||
|
#error "to be enabled in the kernel"
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
|
||
|
#if !defined(local_irq_save)
|
||
|
#define local_irq_save(flags) do { save_flags(flags); cli(); } while (0)
|
||
|
#endif
|
||
|
#if !defined(local_irq_restore)
|
||
|
#define local_irq_restore(flags) do { restore_flags(flags); } while (0)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if KERNEL_VERSION(2, 4, 0) <= LINUX_VERSION_CODE
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 22)
|
||
|
#include <linux/pci.h>
|
||
|
static inline char *pci_name(struct pci_dev *pdev)
|
||
|
{
|
||
|
return pdev->slot_name;
|
||
|
}
|
||
|
#endif /* kernel < 2.4.22 */
|
||
|
#endif /* kernel >= 2.4.0 */
|
||
|
|
||
|
/*************************** I2C specific *****************************/
|
||
|
#include <linux/i2c.h>
|
||
|
|
||
|
#ifndef I2C_CLIENT_END
|
||
|
#error "********************************************************"
|
||
|
#error " Sorry, this driver needs the new I2C stack. "
|
||
|
#error " You can get it at http://www2.lm-sensors.nu/~lm78/. "
|
||
|
#error "********************************************************"
|
||
|
#endif
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
|
||
|
|
||
|
#undef i2c_get_clientdata
|
||
|
#define i2c_get_clientdata(client) ((client)->data)
|
||
|
|
||
|
|
||
|
#undef i2c_set_clientdata
|
||
|
#define i2c_set_clientdata(client_ptr, new_data) do { \
|
||
|
(client_ptr)->data = new_data; \
|
||
|
} while (0)
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/* removed in 2.6.14 */
|
||
|
#ifndef I2C_ALGO_BIT
|
||
|
# define I2C_ALGO_BIT 0
|
||
|
#endif
|
||
|
|
||
|
/* removed in 2.6.16 */
|
||
|
#ifndef I2C_DRIVERID_EXP3
|
||
|
# define I2C_DRIVERID_EXP3 0xf003
|
||
|
#endif
|
||
|
|
||
|
/*************************** USB specific *****************************/
|
||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
|
||
|
#include <linux/usb.h>
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 8)
|
||
|
static inline int usb_kill_urb(struct urb *urb)
|
||
|
{
|
||
|
return usb_unlink_urb(urb);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* removed in 2.6.14 */
|
||
|
#ifndef URB_ASYNC_UNLINK
|
||
|
#define URB_ASYNC_UNLINK 0
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/*************************** bttv specific ****************************/
|
||
|
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 15) /* BTTV_* -> BTTV_BOARD_* */
|
||
|
#define BTTV_BOARD_UNKNOWN BTTV_UNKNOWN
|
||
|
#define BTTV_BOARD_PXELVWPLTVPAK BTTV_PXELVWPLTVPAK
|
||
|
#define BTTV_BOARD_PXELVWPLTVPRO BTTV_PXELVWPLTVPRO
|
||
|
#define BTTV_BOARD_PV_BT878P_9B BTTV_PV_BT878P_9B
|
||
|
#define BTTV_BOARD_PV_BT878P_PLUS BTTV_PV_BT878P_PLUS
|
||
|
#define BTTV_BOARD_AVERMEDIA BTTV_AVERMEDIA
|
||
|
#define BTTV_BOARD_AVPHONE98 BTTV_AVPHONE98
|
||
|
#define BTTV_BOARD_AVERMEDIA98 BTTV_AVERMEDIA98
|
||
|
#define BTTV_BOARD_CHRONOS_VS2 BTTV_CHRONOS_VS2
|
||
|
#define BTTV_BOARD_MIRO BTTV_MIRO
|
||
|
#define BTTV_BOARD_DYNALINK BTTV_DYNALINK
|
||
|
#define BTTV_BOARD_WINVIEW_601 BTTV_WINVIEW_601
|
||
|
#ifdef BTTV_KWORLD
|
||
|
#define BTTV_BOARD_KWORLD BTTV_KWORLD
|
||
|
#endif
|
||
|
#define BTTV_BOARD_MAGICTVIEW061 BTTV_MAGICTVIEW061
|
||
|
#define BTTV_BOARD_MAGICTVIEW063 BTTV_MAGICTVIEW063
|
||
|
#define BTTV_BOARD_PHOEBE_TVMAS BTTV_PHOEBE_TVMAS
|
||
|
#ifdef BTTV_BESTBUY_EASYTV2
|
||
|
#define BTTV_BOARD_BESTBUY_EASYTV BTTV_BESTBUY_EASYTV
|
||
|
#define BTTV_BOARD_BESTBUY_EASYTV2 BTTV_BESTBUY_EASYTV2
|
||
|
#endif
|
||
|
#define BTTV_BOARD_FLYVIDEO BTTV_FLYVIDEO
|
||
|
#define BTTV_BOARD_FLYVIDEO_98 BTTV_FLYVIDEO_98
|
||
|
#define BTTV_BOARD_TYPHOON_TVIEW BTTV_TYPHOON_TVIEW
|
||
|
#ifdef BTTV_FLYVIDEO_98FM
|
||
|
#define BTTV_BOARD_FLYVIDEO_98FM BTTV_FLYVIDEO_98FM
|
||
|
#endif
|
||
|
#define BTTV_BOARD_WINFAST2000 BTTV_WINFAST2000
|
||
|
#ifdef BTTV_GVBCTV5PCI
|
||
|
#define BTTV_BOARD_GVBCTV5PCI BTTV_GVBCTV5PCI
|
||
|
#endif
|
||
|
#endif /* end BTTV_* -> BTTV_BOARD_* */
|
||
|
|
||
|
|
||
|
/******************************* pm.h *********************************/
|
||
|
|
||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
|
||
|
typedef u32 pm_message_t;
|
||
|
#endif /* kernel < 2.6.11 */
|
||
|
#endif /* kernel >= 2.6.0 */
|
||
|
|
||
|
/*************************** interrupt.h ******************************/
|
||
|
/* added in 2.6.18, old defines removed in 2.6.24 */
|
||
|
#ifndef IRQF_DISABLED
|
||
|
#define IRQF_DISABLED SA_INTERRUPT
|
||
|
#endif
|
||
|
#ifndef IRQF_SHARED
|
||
|
#define IRQF_SHARED SA_SHIRQ
|
||
|
#endif
|
||
|
|
||
|
/*************************** spinlock.h *******************************/
|
||
|
/* added in 2.6.11 */
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
|
||
|
#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED
|
||
|
#endif
|
||
|
|
||
|
/***************************** slab.h *********************************/
|
||
|
/* added in 2.6.14 */
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
|
||
|
static inline void *kzalloc(size_t size, gfp_t flags)
|
||
|
{
|
||
|
void *ret = kmalloc(size, flags);
|
||
|
if (ret)
|
||
|
memset(ret, 0, size);
|
||
|
return ret;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/****************************** fs.h **********************************/
|
||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
|
||
|
static inline unsigned iminor(struct inode *inode)
|
||
|
{
|
||
|
return MINOR(inode->i_rdev);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _KCOMPAT_H */
|