diff -Nru a/drivers/base/class_simple.c b/drivers/base/class_simple.c --- a/drivers/base/class_simple.c Sun Feb 8 20:45:44 2004 +++ b/drivers/base/class_simple.c Sun Feb 8 20:45:44 2004 @@ -170,6 +170,24 @@ EXPORT_SYMBOL(class_simple_device_add); /** + * class_simple_set_hotplug - set the hotplug callback in the embedded struct class + * @cs: pointer to the struct class_simple to hold the pointer + * @hotplug: function pointer to the hotplug function + * + * Implement and set a hotplug function to add environment variables specific to this + * class on the hotplug event. + */ +int class_simple_set_hotplug(struct class_simple *cs, + int (*hotplug)(struct class_device *dev, char **envp, int num_envp, char *buffer, int buffer_size)) +{ + if ((cs == NULL) || (IS_ERR(cs))) + return -ENODEV; + cs->class.hotplug = hotplug; + return 0; +} +EXPORT_SYMBOL(class_simple_set_hotplug); + +/** * class_simple_device_remove - removes a class device that was created with class_simple_device_add() * @dev: the dev_t of the device that was previously registered. * diff -Nru a/drivers/base/core.c b/drivers/base/core.c --- a/drivers/base/core.c Sun Feb 8 20:45:44 2004 +++ b/drivers/base/core.c Sun Feb 8 20:45:44 2004 @@ -76,7 +76,6 @@ static void device_release(struct kobject * kobj) { struct device * dev = to_dev(kobj); - struct completion * c = dev->complete; if (dev->release) dev->release(dev); @@ -86,8 +85,6 @@ dev->bus_id); WARN_ON(1); } - if (c) - complete(c); } static struct kobj_type ktype_device = { @@ -355,25 +352,6 @@ /** - * device_unregister_wait - Unregister device and wait for it to be freed. - * @dev: Device to unregister. - * - * For the cases where the caller needs to wait for all references to - * be dropped from the device before continuing (e.g. modules with - * statically allocated devices), this function uses a completion struct - * to wait, along with a matching complete() in device_release() above. - */ - -void device_unregister_wait(struct device * dev) -{ - struct completion c; - init_completion(&c); - dev->complete = &c; - device_unregister(dev); - wait_for_completion(&c); -} - -/** * device_for_each_child - device child iterator. * @dev: parent struct device. * @data: data for the callback. @@ -421,7 +399,6 @@ EXPORT_SYMBOL(device_del); EXPORT_SYMBOL(device_unregister); -EXPORT_SYMBOL(device_unregister_wait); EXPORT_SYMBOL(get_device); EXPORT_SYMBOL(put_device); EXPORT_SYMBOL(device_find); diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c --- a/drivers/char/tty_io.c Sun Feb 8 20:45:45 2004 +++ b/drivers/char/tty_io.c Sun Feb 8 20:45:45 2004 @@ -2264,7 +2264,6 @@ if (driver->refcount) return -EBUSY; - cdev_unmap(MKDEV(driver->major, driver->minor_start), driver->num); unregister_chrdev_region(MKDEV(driver->major, driver->minor_start), driver->num); diff -Nru a/drivers/ieee1394/amdtp.c b/drivers/ieee1394/amdtp.c --- a/drivers/ieee1394/amdtp.c Sun Feb 8 20:45:45 2004 +++ b/drivers/ieee1394/amdtp.c Sun Feb 8 20:45:45 2004 @@ -1308,7 +1308,6 @@ hpsb_unregister_highlevel(&amdtp_highlevel); devfs_remove("amdtp"); - cdev_unmap(IEEE1394_AMDTP_DEV, 16); cdev_del(&amdtp_cdev); HPSB_INFO("Unloaded AMDTP driver"); diff -Nru a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c --- a/drivers/ieee1394/dv1394.c Sun Feb 8 20:45:45 2004 +++ b/drivers/ieee1394/dv1394.c Sun Feb 8 20:45:45 2004 @@ -2609,7 +2609,6 @@ hpsb_unregister_protocol(&dv1394_driver); hpsb_unregister_highlevel(&dv1394_highlevel); - cdev_unmap(IEEE1394_DV1394_DEV, 16); cdev_del(&dv1394_cdev); devfs_remove("ieee1394/dv"); } diff -Nru a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c --- a/drivers/ieee1394/raw1394.c Sun Feb 8 20:45:44 2004 +++ b/drivers/ieee1394/raw1394.c Sun Feb 8 20:45:44 2004 @@ -2682,7 +2682,6 @@ static void __exit cleanup_raw1394(void) { hpsb_unregister_protocol(&raw1394_driver); - cdev_unmap(IEEE1394_RAW1394_DEV, 1); cdev_del(&raw1394_cdev); devfs_remove(RAW1394_DEVICE_NAME); hpsb_unregister_highlevel(&raw1394_highlevel); diff -Nru a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c --- a/drivers/ieee1394/video1394.c Sun Feb 8 20:45:44 2004 +++ b/drivers/ieee1394/video1394.c Sun Feb 8 20:45:44 2004 @@ -1447,7 +1447,6 @@ hpsb_unregister_highlevel(&video1394_highlevel); devfs_remove(VIDEO1394_DRIVER_NAME); - cdev_unmap(IEEE1394_VIDEO1394_DEV, 16); cdev_del(&video1394_cdev); PRINT_G(KERN_INFO, "Removed " VIDEO1394_DRIVER_NAME " module"); diff -Nru a/drivers/scsi/sg.c b/drivers/scsi/sg.c --- a/drivers/scsi/sg.c Sun Feb 8 20:45:44 2004 +++ b/drivers/scsi/sg.c Sun Feb 8 20:45:44 2004 @@ -1521,7 +1521,6 @@ if (sdp) { sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic"); class_simple_device_remove(MKDEV(SCSI_GENERIC_MAJOR, k)); - cdev_unmap(MKDEV(SCSI_GENERIC_MAJOR, k), 1); cdev_del(sdp->cdev); sdp->cdev = NULL; devfs_remove("%s/generic", scsidp->devfs_name); diff -Nru a/drivers/scsi/st.c b/drivers/scsi/st.c --- a/drivers/scsi/st.c Sun Feb 8 20:45:45 2004 +++ b/drivers/scsi/st.c Sun Feb 8 20:45:45 2004 @@ -3946,8 +3946,6 @@ if (cdev == STm->cdevs[j]) cdev = NULL; sysfs_remove_link(&STm->cdevs[j]->kobj, "device"); - cdev_unmap(MKDEV(SCSI_TAPE_MAJOR, - TAPE_MINOR(dev_num, mode, j)), 1); cdev_del(STm->cdevs[j]); } } @@ -3990,8 +3988,6 @@ for (j=0; j < 2; j++) { sysfs_remove_link(&tpnt->modes[mode].cdevs[j]->kobj, "device"); - cdev_unmap(MKDEV(SCSI_TAPE_MAJOR, - TAPE_MINOR(i, mode, j)), 1); cdev_del(tpnt->modes[mode].cdevs[j]); tpnt->modes[mode].cdevs[j] = NULL; } diff -Nru a/fs/char_dev.c b/fs/char_dev.c --- a/fs/char_dev.c Sun Feb 8 20:45:44 2004 +++ b/fs/char_dev.c Sun Feb 8 20:45:44 2004 @@ -240,7 +240,6 @@ int unregister_chrdev(unsigned int major, const char *name) { struct char_device_struct *cd; - cdev_unmap(MKDEV(major, 0), 256); cd = __unregister_chrdev_region(major, 0, 256); if (cd && cd->cdev) cdev_del(cd->cdev); @@ -347,16 +346,19 @@ err = kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p); if (err) kobject_del(&p->kobj); + p->dev = dev; + p->count = count; return err; } -void cdev_unmap(dev_t dev, unsigned count) +static void cdev_unmap(dev_t dev, unsigned count) { kobj_unmap(cdev_map, dev, count); } void cdev_del(struct cdev *p) { + cdev_unmap(p->dev, p->count); kobject_del(&p->kobj); kobject_put(&p->kobj); } @@ -458,6 +460,5 @@ EXPORT_SYMBOL(cdev_put); EXPORT_SYMBOL(cdev_del); EXPORT_SYMBOL(cdev_add); -EXPORT_SYMBOL(cdev_unmap); EXPORT_SYMBOL(register_chrdev); EXPORT_SYMBOL(unregister_chrdev); diff -Nru a/include/linux/cdev.h b/include/linux/cdev.h --- a/include/linux/cdev.h Sun Feb 8 20:45:45 2004 +++ b/include/linux/cdev.h Sun Feb 8 20:45:45 2004 @@ -7,6 +7,8 @@ struct module *owner; struct file_operations *ops; struct list_head list; + dev_t dev; + unsigned int count; }; void cdev_init(struct cdev *, struct file_operations *); @@ -20,8 +22,6 @@ int cdev_add(struct cdev *, dev_t, unsigned); void cdev_del(struct cdev *); - -void cdev_unmap(dev_t, unsigned); void cd_forget(struct inode *); diff -Nru a/include/linux/device.h b/include/linux/device.h --- a/include/linux/device.h Sun Feb 8 20:45:45 2004 +++ b/include/linux/device.h Sun Feb 8 20:45:45 2004 @@ -253,6 +253,8 @@ extern void class_simple_destroy(struct class_simple *cs); extern struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev, struct device *device, const char *fmt, ...) __attribute__((format(printf,4,5))); +extern int class_simple_set_hotplug(struct class_simple *, + int (*hotplug)(struct class_device *dev, char **envp, int num_envp, char *buffer, int buffer_size)); extern void class_simple_device_remove(dev_t dev); @@ -263,7 +265,6 @@ struct list_head children; struct device * parent; - struct completion * complete; /* Notification for freeing device. */ struct kobject kobj; char bus_id[BUS_ID_SIZE]; /* position on parent bus */ @@ -311,7 +312,6 @@ */ extern int device_register(struct device * dev); extern void device_unregister(struct device * dev); -extern void device_unregister_wait(struct device * dev); extern void device_initialize(struct device * dev); extern int device_add(struct device * dev); extern void device_del(struct device * dev); diff -Nru a/lib/kobject.c b/lib/kobject.c --- a/lib/kobject.c Sun Feb 8 20:45:45 2004 +++ b/lib/kobject.c Sun Feb 8 20:45:45 2004 @@ -630,6 +630,9 @@ EXPORT_SYMBOL(kobject_unregister); EXPORT_SYMBOL(kobject_get); EXPORT_SYMBOL(kobject_put); +EXPORT_SYMBOL(kobject_add); +EXPORT_SYMBOL(kobject_del); +EXPORT_SYMBOL(kobject_rename); EXPORT_SYMBOL(kobject_hotplug); EXPORT_SYMBOL(kset_register);