Commit 97018fa9 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge kroah.com:/home/greg/linux/BK/bleed-2.6

into kroah.com:/home/greg/linux/BK/driver-2.6
parents 7b51a623 d4f63c8a
...@@ -169,6 +169,24 @@ struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev, ...@@ -169,6 +169,24 @@ struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev,
} }
EXPORT_SYMBOL(class_simple_device_add); 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() * 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. * @dev: the dev_t of the device that was previously registered.
......
...@@ -76,7 +76,6 @@ static struct sysfs_ops dev_sysfs_ops = { ...@@ -76,7 +76,6 @@ static struct sysfs_ops dev_sysfs_ops = {
static void device_release(struct kobject * kobj) static void device_release(struct kobject * kobj)
{ {
struct device * dev = to_dev(kobj); struct device * dev = to_dev(kobj);
struct completion * c = dev->complete;
if (dev->release) if (dev->release)
dev->release(dev); dev->release(dev);
...@@ -86,8 +85,6 @@ static void device_release(struct kobject * kobj) ...@@ -86,8 +85,6 @@ static void device_release(struct kobject * kobj)
dev->bus_id); dev->bus_id);
WARN_ON(1); WARN_ON(1);
} }
if (c)
complete(c);
} }
static struct kobj_type ktype_device = { static struct kobj_type ktype_device = {
...@@ -354,25 +351,6 @@ void device_unregister(struct device * dev) ...@@ -354,25 +351,6 @@ void device_unregister(struct device * dev)
} }
/**
* 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. * device_for_each_child - device child iterator.
* @dev: parent struct device. * @dev: parent struct device.
...@@ -421,7 +399,6 @@ EXPORT_SYMBOL(device_register); ...@@ -421,7 +399,6 @@ EXPORT_SYMBOL(device_register);
EXPORT_SYMBOL(device_del); EXPORT_SYMBOL(device_del);
EXPORT_SYMBOL(device_unregister); EXPORT_SYMBOL(device_unregister);
EXPORT_SYMBOL(device_unregister_wait);
EXPORT_SYMBOL(get_device); EXPORT_SYMBOL(get_device);
EXPORT_SYMBOL(put_device); EXPORT_SYMBOL(put_device);
EXPORT_SYMBOL(device_find); EXPORT_SYMBOL(device_find);
......
...@@ -2264,7 +2264,6 @@ int tty_unregister_driver(struct tty_driver *driver) ...@@ -2264,7 +2264,6 @@ int tty_unregister_driver(struct tty_driver *driver)
if (driver->refcount) if (driver->refcount)
return -EBUSY; return -EBUSY;
cdev_unmap(MKDEV(driver->major, driver->minor_start), driver->num);
unregister_chrdev_region(MKDEV(driver->major, driver->minor_start), unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
driver->num); driver->num);
......
...@@ -1308,7 +1308,6 @@ static void __exit amdtp_exit_module (void) ...@@ -1308,7 +1308,6 @@ static void __exit amdtp_exit_module (void)
hpsb_unregister_highlevel(&amdtp_highlevel); hpsb_unregister_highlevel(&amdtp_highlevel);
devfs_remove("amdtp"); devfs_remove("amdtp");
cdev_unmap(IEEE1394_AMDTP_DEV, 16);
cdev_del(&amdtp_cdev); cdev_del(&amdtp_cdev);
HPSB_INFO("Unloaded AMDTP driver"); HPSB_INFO("Unloaded AMDTP driver");
......
...@@ -2609,7 +2609,6 @@ static void __exit dv1394_exit_module(void) ...@@ -2609,7 +2609,6 @@ static void __exit dv1394_exit_module(void)
hpsb_unregister_protocol(&dv1394_driver); hpsb_unregister_protocol(&dv1394_driver);
hpsb_unregister_highlevel(&dv1394_highlevel); hpsb_unregister_highlevel(&dv1394_highlevel);
cdev_unmap(IEEE1394_DV1394_DEV, 16);
cdev_del(&dv1394_cdev); cdev_del(&dv1394_cdev);
devfs_remove("ieee1394/dv"); devfs_remove("ieee1394/dv");
} }
......
...@@ -2682,7 +2682,6 @@ static int __init init_raw1394(void) ...@@ -2682,7 +2682,6 @@ static int __init init_raw1394(void)
static void __exit cleanup_raw1394(void) static void __exit cleanup_raw1394(void)
{ {
hpsb_unregister_protocol(&raw1394_driver); hpsb_unregister_protocol(&raw1394_driver);
cdev_unmap(IEEE1394_RAW1394_DEV, 1);
cdev_del(&raw1394_cdev); cdev_del(&raw1394_cdev);
devfs_remove(RAW1394_DEVICE_NAME); devfs_remove(RAW1394_DEVICE_NAME);
hpsb_unregister_highlevel(&raw1394_highlevel); hpsb_unregister_highlevel(&raw1394_highlevel);
......
...@@ -1447,7 +1447,6 @@ static void __exit video1394_exit_module (void) ...@@ -1447,7 +1447,6 @@ static void __exit video1394_exit_module (void)
hpsb_unregister_highlevel(&video1394_highlevel); hpsb_unregister_highlevel(&video1394_highlevel);
devfs_remove(VIDEO1394_DRIVER_NAME); devfs_remove(VIDEO1394_DRIVER_NAME);
cdev_unmap(IEEE1394_VIDEO1394_DEV, 16);
cdev_del(&video1394_cdev); cdev_del(&video1394_cdev);
PRINT_G(KERN_INFO, "Removed " VIDEO1394_DRIVER_NAME " module"); PRINT_G(KERN_INFO, "Removed " VIDEO1394_DRIVER_NAME " module");
......
...@@ -1521,7 +1521,6 @@ sg_remove(struct class_device *cl_dev) ...@@ -1521,7 +1521,6 @@ sg_remove(struct class_device *cl_dev)
if (sdp) { if (sdp) {
sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic"); sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic");
class_simple_device_remove(MKDEV(SCSI_GENERIC_MAJOR, k)); class_simple_device_remove(MKDEV(SCSI_GENERIC_MAJOR, k));
cdev_unmap(MKDEV(SCSI_GENERIC_MAJOR, k), 1);
cdev_del(sdp->cdev); cdev_del(sdp->cdev);
sdp->cdev = NULL; sdp->cdev = NULL;
devfs_remove("%s/generic", scsidp->devfs_name); devfs_remove("%s/generic", scsidp->devfs_name);
......
...@@ -3946,8 +3946,6 @@ static int st_probe(struct device *dev) ...@@ -3946,8 +3946,6 @@ static int st_probe(struct device *dev)
if (cdev == STm->cdevs[j]) if (cdev == STm->cdevs[j])
cdev = NULL; cdev = NULL;
sysfs_remove_link(&STm->cdevs[j]->kobj, "device"); 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]); cdev_del(STm->cdevs[j]);
} }
} }
...@@ -3990,8 +3988,6 @@ static int st_remove(struct device *dev) ...@@ -3990,8 +3988,6 @@ static int st_remove(struct device *dev)
for (j=0; j < 2; j++) { for (j=0; j < 2; j++) {
sysfs_remove_link(&tpnt->modes[mode].cdevs[j]->kobj, sysfs_remove_link(&tpnt->modes[mode].cdevs[j]->kobj,
"device"); "device");
cdev_unmap(MKDEV(SCSI_TAPE_MAJOR,
TAPE_MINOR(i, mode, j)), 1);
cdev_del(tpnt->modes[mode].cdevs[j]); cdev_del(tpnt->modes[mode].cdevs[j]);
tpnt->modes[mode].cdevs[j] = NULL; tpnt->modes[mode].cdevs[j] = NULL;
} }
......
...@@ -240,7 +240,6 @@ void unregister_chrdev_region(dev_t from, unsigned count) ...@@ -240,7 +240,6 @@ void unregister_chrdev_region(dev_t from, unsigned count)
int unregister_chrdev(unsigned int major, const char *name) int unregister_chrdev(unsigned int major, const char *name)
{ {
struct char_device_struct *cd; struct char_device_struct *cd;
cdev_unmap(MKDEV(major, 0), 256);
cd = __unregister_chrdev_region(major, 0, 256); cd = __unregister_chrdev_region(major, 0, 256);
if (cd && cd->cdev) if (cd && cd->cdev)
cdev_del(cd->cdev); cdev_del(cd->cdev);
...@@ -347,16 +346,19 @@ int cdev_add(struct cdev *p, dev_t dev, unsigned count) ...@@ -347,16 +346,19 @@ int cdev_add(struct cdev *p, dev_t dev, unsigned count)
err = kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p); err = kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);
if (err) if (err)
kobject_del(&p->kobj); kobject_del(&p->kobj);
p->dev = dev;
p->count = count;
return err; 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); kobj_unmap(cdev_map, dev, count);
} }
void cdev_del(struct cdev *p) void cdev_del(struct cdev *p)
{ {
cdev_unmap(p->dev, p->count);
kobject_del(&p->kobj); kobject_del(&p->kobj);
kobject_put(&p->kobj); kobject_put(&p->kobj);
} }
...@@ -458,6 +460,5 @@ EXPORT_SYMBOL(cdev_get); ...@@ -458,6 +460,5 @@ EXPORT_SYMBOL(cdev_get);
EXPORT_SYMBOL(cdev_put); EXPORT_SYMBOL(cdev_put);
EXPORT_SYMBOL(cdev_del); EXPORT_SYMBOL(cdev_del);
EXPORT_SYMBOL(cdev_add); EXPORT_SYMBOL(cdev_add);
EXPORT_SYMBOL(cdev_unmap);
EXPORT_SYMBOL(register_chrdev); EXPORT_SYMBOL(register_chrdev);
EXPORT_SYMBOL(unregister_chrdev); EXPORT_SYMBOL(unregister_chrdev);
...@@ -7,6 +7,8 @@ struct cdev { ...@@ -7,6 +7,8 @@ struct cdev {
struct module *owner; struct module *owner;
struct file_operations *ops; struct file_operations *ops;
struct list_head list; struct list_head list;
dev_t dev;
unsigned int count;
}; };
void cdev_init(struct cdev *, struct file_operations *); void cdev_init(struct cdev *, struct file_operations *);
...@@ -21,8 +23,6 @@ int cdev_add(struct cdev *, dev_t, unsigned); ...@@ -21,8 +23,6 @@ int cdev_add(struct cdev *, dev_t, unsigned);
void cdev_del(struct cdev *); void cdev_del(struct cdev *);
void cdev_unmap(dev_t, unsigned);
void cd_forget(struct inode *); void cd_forget(struct inode *);
#endif #endif
......
...@@ -253,6 +253,8 @@ extern struct class_simple *class_simple_create(struct module *owner, char *name ...@@ -253,6 +253,8 @@ extern struct class_simple *class_simple_create(struct module *owner, char *name
extern void class_simple_destroy(struct class_simple *cs); 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, ...) 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))); __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); extern void class_simple_device_remove(dev_t dev);
...@@ -263,7 +265,6 @@ struct device { ...@@ -263,7 +265,6 @@ struct device {
struct list_head children; struct list_head children;
struct device * parent; struct device * parent;
struct completion * complete; /* Notification for freeing device. */
struct kobject kobj; struct kobject kobj;
char bus_id[BUS_ID_SIZE]; /* position on parent bus */ char bus_id[BUS_ID_SIZE]; /* position on parent bus */
...@@ -311,7 +312,6 @@ dev_set_drvdata (struct device *dev, void *data) ...@@ -311,7 +312,6 @@ dev_set_drvdata (struct device *dev, void *data)
*/ */
extern int device_register(struct device * dev); extern int device_register(struct device * dev);
extern void device_unregister(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 void device_initialize(struct device * dev);
extern int device_add(struct device * dev); extern int device_add(struct device * dev);
extern void device_del(struct device * dev); extern void device_del(struct device * dev);
......
...@@ -630,6 +630,9 @@ EXPORT_SYMBOL(kobject_register); ...@@ -630,6 +630,9 @@ EXPORT_SYMBOL(kobject_register);
EXPORT_SYMBOL(kobject_unregister); EXPORT_SYMBOL(kobject_unregister);
EXPORT_SYMBOL(kobject_get); EXPORT_SYMBOL(kobject_get);
EXPORT_SYMBOL(kobject_put); EXPORT_SYMBOL(kobject_put);
EXPORT_SYMBOL(kobject_add);
EXPORT_SYMBOL(kobject_del);
EXPORT_SYMBOL(kobject_rename);
EXPORT_SYMBOL(kobject_hotplug); EXPORT_SYMBOL(kobject_hotplug);
EXPORT_SYMBOL(kset_register); EXPORT_SYMBOL(kset_register);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment