Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4abdcf93 authored by Simon Arlott's avatar Simon Arlott Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5630): Dvb-core: Handle failures to create devices



dvb-core is not started early enough when device drivers that use dvb are
compiled in so dvb_register_device fails (silently) since dvb_class is
NULL, this runs dvb_init using subsys_initcall instead of module_init.

dvb_register_device will now check the return value of class_device_create.

Signed-off-by: default avatarSimon Arlott <simon@fire.lp0.eu>
Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent a6d76132
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
{
	struct dvb_device *dvbdev;
	struct file_operations *dvbdevfops;

	struct class_device *clsdev;
	int id;

	mutex_lock(&dvbdev_register_lock);
@@ -242,8 +242,15 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,

	mutex_unlock(&dvbdev_register_lock);

	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);
	clsdev = 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);
	if (IS_ERR(clsdev)) {
		printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n",
		       __FUNCTION__, adap->num, dnames[type], id, PTR_ERR(clsdev));
		return PTR_ERR(clsdev);
	}

	dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
		adap->num, dnames[type], id, nums2minor(adap->num, type, id),
@@ -431,7 +438,7 @@ static void __exit exit_dvbdev(void)
	unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
}

module_init(init_dvbdev);
subsys_initcall(init_dvbdev);
module_exit(exit_dvbdev);

MODULE_DESCRIPTION("DVB Core Driver");