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: Simon Arlott <simon@fire.lp0.eu> Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
a6d7613226
commit
4abdcf933f
1 changed files with 11 additions and 4 deletions
|
@ -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");
|
||||
|
|
Loading…
Reference in a new issue