--- drivers/char/misc.orig.c 2007-08-05 16:56:59.000000000 +0200 +++ drivers/char/misc.c 2007-09-06 11:07:51.000000000 +0200 @@ -56,6 +56,8 @@ static LIST_HEAD(misc_list); static DEFINE_MUTEX(misc_mtx); +static struct cdev misc_cdev; + /* * Assigned numbers, used for dynamic minors */ @@ -273,6 +275,31 @@ EXPORT_SYMBOL(misc_register); EXPORT_SYMBOL(misc_deregister); +static int misc_register_chrdev(void) +{ + dev_t from=MKDEV(MISC_MAJOR,0); + int rv; + int err = -ENOMEM; + char *s; + + if ((rv=register_chrdev_region(from,MINORMASK,"misc")) != 0) + return rv; + + cdev_init(&misc_cdev, &misc_fops); + misc_cdev.owner=misc_fops.owner; + kobject_set_name(&misc_cdev.kobj, "%s", "misc"); + for (s = strchr(kobject_name(&misc_cdev.kobj),'/'); s; s = strchr(s, '/')) + *s = '!'; + err = cdev_add(&misc_cdev, from, MINORMASK); + if (err) + goto out; + return 0; +out: + kobject_put(&misc_cdev.kobj); + unregister_chrdev_region(from,MINORMASK); + return err; +} + static int __init misc_init(void) { #ifdef CONFIG_PROC_FS @@ -286,7 +313,7 @@ if (IS_ERR(misc_class)) return PTR_ERR(misc_class); - if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) { + if (misc_register_chrdev()) { printk("unable to get major %d for misc devices\n", MISC_MAJOR); class_destroy(misc_class);