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;
return -ENOMEM;
}
+ mutex_unlock(&dvbdev_register_lock);
+
memcpy(dvbdev, template, sizeof(struct dvb_device));
dvbdev->type = type;
dvbdev->id = id;
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),
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)));
}
-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;
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);
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);
goto error;
}
+ devfs_mk_dir("dvb");
+
dvb_class = class_create(THIS_MODULE, "dvb");
if (IS_ERR(dvb_class)) {
retval = PTR_ERR(dvb_class);
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);