implement device_class to auto create /dev/3dfx
This commit is contained in:
@@ -79,6 +79,13 @@
|
|||||||
#else
|
#else
|
||||||
#define HAVE_DEVFS 0
|
#define HAVE_DEVFS 0
|
||||||
#endif
|
#endif
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/err.h>
|
||||||
|
#define HAVE_CLASS_DEVICE 1
|
||||||
|
#else
|
||||||
|
#define HAVE_CLASS_DEVICE 0
|
||||||
|
#endif
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
#include <asm/ioctl.h>
|
#include <asm/ioctl.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
@@ -256,6 +263,10 @@ static int numCards = 0;
|
|||||||
static devfs_handle_t devfs_handle;
|
static devfs_handle_t devfs_handle;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if HAVE_CLASS_DEVICE
|
||||||
|
static struct class *class_3dfx = NULL;
|
||||||
|
static struct device *device_3dfx = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
|
||||||
static void findCardType(int vendor, int device)
|
static void findCardType(int vendor, int device)
|
||||||
@@ -833,6 +844,44 @@ static struct pci_driver driver_3dfx = {
|
|||||||
};
|
};
|
||||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
|
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
|
||||||
|
|
||||||
|
#if HAVE_CLASS_DEVICE
|
||||||
|
static int create_device_3dfx(void)
|
||||||
|
{
|
||||||
|
class_3dfx = class_create(THIS_MODULE, "3dfx");
|
||||||
|
if (IS_ERR(class_3dfx)) {
|
||||||
|
int ret = PTR_ERR(class_3dfx);
|
||||||
|
class_3dfx = NULL;
|
||||||
|
printk("3dfx: class_create() failed, returned %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
device_3dfx = device_create(class_3dfx, NULL,
|
||||||
|
MKDEV(MAJOR_3DFX, DEVICE_VOODOO),
|
||||||
|
NULL, "3dfx");
|
||||||
|
if (IS_ERR(device_3dfx)) {
|
||||||
|
int ret = PTR_ERR(device_3dfx);
|
||||||
|
device_3dfx = NULL;
|
||||||
|
class_destroy(class_3dfx);
|
||||||
|
class_3dfx = NULL;
|
||||||
|
printk("3dfx: device_create() failed, returned %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroy_device_3dfx(void)
|
||||||
|
{
|
||||||
|
if (device_3dfx)
|
||||||
|
device_destroy(class_3dfx, MKDEV(MAJOR_3DFX, DEVICE_VOODOO));
|
||||||
|
if (class_3dfx)
|
||||||
|
class_destroy(class_3dfx);
|
||||||
|
|
||||||
|
device_3dfx = NULL;
|
||||||
|
class_3dfx = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MODULE
|
#ifdef MODULE
|
||||||
int init_module(void)
|
int init_module(void)
|
||||||
{
|
{
|
||||||
@@ -856,12 +905,23 @@ int init_module(void)
|
|||||||
S_IFCHR | S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP,
|
S_IFCHR | S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP,
|
||||||
&fops_3dfx, NULL);
|
&fops_3dfx, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAVE_CLASS_DEVICE
|
||||||
|
ret = create_device_3dfx();
|
||||||
|
if (ret < 0) {
|
||||||
|
unregister_chrdev(MAJOR_3DFX, "3dfx");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DEBUGMSG(("3dfx: Successfully registered device 3dfx\n"));
|
DEBUGMSG(("3dfx: Successfully registered device 3dfx\n"));
|
||||||
ret = findCards();
|
ret = findCards();
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
printk("3dfx: findCards() failed, returned %d\n", ret);
|
printk("3dfx: findCards() failed, returned %d\n", ret);
|
||||||
|
#if HAVE_CLASS_DEVICE
|
||||||
|
destroy_device_3dfx();
|
||||||
|
#endif
|
||||||
|
unregister_chrdev(MAJOR_3DFX, "3dfx");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -893,7 +953,9 @@ void cleanup_module(void)
|
|||||||
devfs_unregister(devfs_handle);
|
devfs_unregister(devfs_handle);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if HAVE_CLASS_DEVICE
|
||||||
|
destroy_device_3dfx();
|
||||||
|
#endif
|
||||||
unregister_chrdev(MAJOR_3DFX, "3dfx");
|
unregister_chrdev(MAJOR_3DFX, "3dfx");
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||||
|
|||||||
Reference in New Issue
Block a user