add support for udev
authorFrank Mori Hess <fmhess@speakeasy.net>
Wed, 29 Dec 2004 01:14:44 +0000 (01:14 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Wed, 29 Dec 2004 01:14:44 +0000 (01:14 +0000)
comedi/comedi_fops.c

index 92d0a825c54f1b2848e32ec79e7701379d939517..8531aae2930f5794ab637ae976d89db1036bef51 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/poll.h>
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 #include <linux/vmalloc.h>
 
 #include <linux/comedidev.h>
@@ -1761,6 +1762,8 @@ static struct file_operations comedi_fops={
 };
 #endif
 
+static struct class_simple *comedi_class;
+
 static int __init comedi_init(void)
 {
        int i;
@@ -1770,9 +1773,20 @@ static int __init comedi_init(void)
                printk("comedi: unable to get major %d\n",COMEDI_MAJOR);
                return -EIO;
        }
+       comedi_class = class_simple_create(THIS_MODULE, "comedi");
+       if(IS_ERR(comedi_class))
+       {
+               printk("comedi: failed to create class");
+               devfs_unregister_chrdev(COMEDI_MAJOR,"comedi");
+               return PTR_ERR(comedi_class);
+       }
        comedi_devices=(comedi_device *)kmalloc(sizeof(comedi_device)*COMEDI_NDEVICES,GFP_KERNEL);
        if(!comedi_devices)
+       {
+               class_simple_destroy(comedi_class);
+               devfs_unregister_chrdev(COMEDI_MAJOR,"comedi");
                return -ENOMEM;
+       }
        memset(comedi_devices,0,sizeof(comedi_device)*COMEDI_NDEVICES);
        for(i=0;i<COMEDI_NDEVICES;i++){
                comedi_devices[i].minor=i;
@@ -1787,6 +1801,7 @@ static int __init comedi_init(void)
                sprintf(name, "comedi%d", i);
                devfs_register(NULL, name, DEVFS_FL_DEFAULT,
                        COMEDI_MAJOR, i, 0666 | S_IFCHR, &comedi_fops, NULL);
+               class_simple_device_add(comedi_class, MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i", i);
        }
        
        comedi_rt_init();
@@ -1802,12 +1817,13 @@ static void __exit comedi_cleanup(void)
                printk("comedi: module in use -- remove delayed\n");
 
        for(i=0;i<COMEDI_NDEVICES;i++){
+               class_simple_device_remove(MKDEV(COMEDI_MAJOR, i));
                char name[20];
                sprintf(name, "comedi%d", i);
                devfs_unregister(devfs_find_handle(NULL, name,
                        COMEDI_MAJOR, i, DEVFS_SPECIAL_CHR, 0));
        }
-
+       class_simple_destroy(comedi_class);
        devfs_unregister_chrdev(COMEDI_MAJOR,"comedi");
 
        comedi_proc_cleanup();