|
@@ -274,6 +274,8 @@ static struct class uio_class = {
|
|
|
.dev_groups = uio_groups,
|
|
|
};
|
|
|
|
|
|
+bool uio_class_registered;
|
|
|
+
|
|
|
/*
|
|
|
* device functions
|
|
|
*/
|
|
@@ -876,6 +878,9 @@ static int init_uio_class(void)
|
|
|
printk(KERN_ERR "class_register failed for uio\n");
|
|
|
goto err_class_register;
|
|
|
}
|
|
|
+
|
|
|
+ uio_class_registered = true;
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_class_register:
|
|
@@ -886,6 +891,7 @@ exit:
|
|
|
|
|
|
static void release_uio_class(void)
|
|
|
{
|
|
|
+ uio_class_registered = false;
|
|
|
class_unregister(&uio_class);
|
|
|
uio_major_cleanup();
|
|
|
}
|
|
@@ -912,6 +918,9 @@ int __uio_register_device(struct module *owner,
|
|
|
struct uio_device *idev;
|
|
|
int ret = 0;
|
|
|
|
|
|
+ if (!uio_class_registered)
|
|
|
+ return -EPROBE_DEFER;
|
|
|
+
|
|
|
if (!parent || !info || !info->name || !info->version)
|
|
|
return -EINVAL;
|
|
|
|