linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / media / dvb / dvb-core / dvbdev.c
index 40774fe..54f8b95 100644 (file)
@@ -86,7 +86,7 @@ static int dvb_device_open(struct inode *inode, struct file *file)
 
        if (dvbdev && dvbdev->fops) {
                int err = 0;
-               const struct file_operations *old_fops;
+               struct file_operations *old_fops;
 
                file->private_data = dvbdev;
                old_fops = file->f_op;
@@ -219,6 +219,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
                return -ENOMEM;
        }
 
+       mutex_unlock(&dvbdev_register_lock);
+
        memcpy(dvbdev, template, sizeof(struct dvb_device));
        dvbdev->type = type;
        dvbdev->id = id;
@@ -229,10 +231,12 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
 
        list_add_tail (&dvbdev->list_head, &adap->device_list);
 
-       mutex_unlock(&dvbdev_register_lock);
+       devfs_mk_cdev(MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
+                       S_IFCHR | S_IRUSR | S_IWUSR,
+                       "dvb/adapter%d/%s%d", adap->num, dnames[type], id);
 
        class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
-                           adap->device, "dvb%d.%s%d", adap->num, dnames[type], id);
+                           NULL, "dvb%d.%s%d", adap->num, dnames[type], id);
 
        dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
                adap->num, dnames[type], id, nums2minor(adap->num, type, id),
@@ -248,6 +252,9 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
        if (!dvbdev)
                return;
 
+       devfs_remove("dvb/adapter%d/%s%d", dvbdev->adapter->num,
+                       dnames[dvbdev->type], dvbdev->id);
+
        class_device_destroy(dvb_class, MKDEV(DVB_MAJOR, nums2minor(dvbdev->adapter->num,
                                        dvbdev->type, dvbdev->id)));
 
@@ -278,7 +285,7 @@ skip:
 }
 
 
-int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device)
+int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module)
 {
        int num;
 
@@ -295,10 +302,10 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
 
        printk ("DVB: registering new adapter (%s).\n", name);
 
+       devfs_mk_dir("dvb/adapter%d", num);
        adap->num = num;
        adap->name = name;
        adap->module = module;
-       adap->device = device;
 
        list_add_tail (&adap->list_head, &dvb_adapter_list);
 
@@ -311,6 +318,8 @@ EXPORT_SYMBOL(dvb_register_adapter);
 
 int dvb_unregister_adapter(struct dvb_adapter *adap)
 {
+       devfs_remove("dvb/adapter%d", adap->num);
+
        if (mutex_lock_interruptible(&dvbdev_register_lock))
                return -ERESTARTSYS;
        list_del (&adap->list_head);
@@ -400,6 +409,8 @@ static int __init init_dvbdev(void)
                goto error;
        }
 
+       devfs_mk_dir("dvb");
+
        dvb_class = class_create(THIS_MODULE, "dvb");
        if (IS_ERR(dvb_class)) {
                retval = PTR_ERR(dvb_class);
@@ -416,6 +427,7 @@ error:
 
 static void __exit exit_dvbdev(void)
 {
+       devfs_remove("dvb");
        class_destroy(dvb_class);
        cdev_del(&dvb_device_cdev);
        unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);