diff options
| author | Linus Torvalds <torvalds@home.osdl.org> | 2004-02-08 23:39:44 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2004-02-08 23:39:44 -0800 |
| commit | 9ccf07316dc2a21d829a5226cd70731206bc3e30 (patch) | |
| tree | d71ddb44f369e5d7e2382756276b37c2a7f11340 | |
| parent | 90c9ddf63e118c842c9e401cd11a779cdc08a374 (diff) | |
| parent | 8be9c8deeca2eebf6dbc55fa2b0a19517d47ff1a (diff) | |
Merge bk://kernel.bkbits.net/gregkh/linux/driver-2.6
into home.osdl.org:/home/torvalds/v2.5/linux
| -rw-r--r-- | drivers/base/class.c | 25 | ||||
| -rw-r--r-- | drivers/base/class_simple.c | 22 | ||||
| -rw-r--r-- | drivers/base/core.c | 23 | ||||
| -rw-r--r-- | drivers/char/tty_io.c | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/amdtp.c | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/dv1394.c | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/raw1394.c | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/video1394.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/sg.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/st.c | 4 | ||||
| -rw-r--r-- | fs/char_dev.c | 7 | ||||
| -rw-r--r-- | include/linux/cdev.h | 4 | ||||
| -rw-r--r-- | include/linux/device.h | 4 | ||||
| -rw-r--r-- | lib/kobject.c | 3 |
14 files changed, 37 insertions, 61 deletions
diff --git a/drivers/base/class.c b/drivers/base/class.c index a4c2487abb4c..d9dbf7eea4d0 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c @@ -3,8 +3,8 @@ * * Copyright (c) 2002-3 Patrick Mochel * Copyright (c) 2002-3 Open Source Development Labs - * Copyright (c) 2003 Greg Kroah-Hartman - * Copyright (c) 2003 IBM Corp. + * Copyright (c) 2003-2004 Greg Kroah-Hartman + * Copyright (c) 2003-2004 IBM Corp. * * This file is released under the GPLv2 * @@ -278,7 +278,6 @@ int class_device_add(struct class_device *class_dev) { struct class * parent; struct class_interface * class_intf; - struct list_head * entry; int error; class_dev = class_device_get(class_dev); @@ -302,11 +301,9 @@ int class_device_add(struct class_device *class_dev) if (parent) { down_write(&parent->subsys.rwsem); list_add_tail(&class_dev->node, &parent->children); - list_for_each(entry, &parent->interfaces) { - class_intf = container_of(entry, struct class_interface, node); + list_for_each_entry(class_intf, &parent->interfaces, node) if (class_intf->add) class_intf->add(class_dev); - } up_write(&parent->subsys.rwsem); } @@ -330,16 +327,13 @@ void class_device_del(struct class_device *class_dev) { struct class * parent = class_dev->class; struct class_interface * class_intf; - struct list_head * entry; if (parent) { down_write(&parent->subsys.rwsem); list_del_init(&class_dev->node); - list_for_each(entry, &parent->interfaces) { - class_intf = container_of(entry, struct class_interface, node); + list_for_each_entry(class_intf, &parent->interfaces, node) if (class_intf->remove) class_intf->remove(class_dev); - } up_write(&parent->subsys.rwsem); } @@ -395,7 +389,6 @@ int class_interface_register(struct class_interface *class_intf) { struct class * parent; struct class_device * class_dev; - struct list_head * entry; if (!class_intf || !class_intf->class) return -ENODEV; @@ -408,10 +401,8 @@ int class_interface_register(struct class_interface *class_intf) list_add_tail(&class_intf->node, &parent->interfaces); if (class_intf->add) { - list_for_each(entry, &parent->children) { - class_dev = container_of(entry, struct class_device, node); + list_for_each_entry(class_dev, &parent->children, node) class_intf->add(class_dev); - } } up_write(&parent->subsys.rwsem); @@ -421,7 +412,7 @@ int class_interface_register(struct class_interface *class_intf) void class_interface_unregister(struct class_interface *class_intf) { struct class * parent = class_intf->class; - struct list_head * entry; + struct class_device *class_dev; if (!parent) return; @@ -430,10 +421,8 @@ void class_interface_unregister(struct class_interface *class_intf) list_del_init(&class_intf->node); if (class_intf->remove) { - list_for_each(entry, &parent->children) { - struct class_device *class_dev = container_of(entry, struct class_device, node); + list_for_each_entry(class_dev, &parent->children, node) class_intf->remove(class_dev); - } } up_write(&parent->subsys.rwsem); diff --git a/drivers/base/class_simple.c b/drivers/base/class_simple.c index bb29e34bd2e5..3ea8ada88d14 100644 --- a/drivers/base/class_simple.c +++ b/drivers/base/class_simple.c @@ -170,6 +170,24 @@ error: 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. * @@ -179,12 +197,10 @@ EXPORT_SYMBOL(class_simple_device_add); void class_simple_device_remove(dev_t dev) { struct simple_dev *s_dev = NULL; - struct list_head *tmp; int found = 0; spin_lock(&simple_dev_list_lock); - list_for_each(tmp, &simple_dev_list) { - s_dev = list_entry(tmp, struct simple_dev, node); + list_for_each_entry(s_dev, &simple_dev_list, node) { if (s_dev->dev == dev) { found = 1; break; diff --git a/drivers/base/core.c b/drivers/base/core.c index 84bc01e0ce59..6c84ff06026b 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -76,7 +76,6 @@ static struct sysfs_ops dev_sysfs_ops = { 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 @@ static void device_release(struct kobject * kobj) dev->bus_id); WARN_ON(1); } - if (c) - complete(c); } static struct kobj_type ktype_device = { @@ -355,25 +352,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. * @dev: parent struct device. * @data: data for the callback. @@ -421,7 +399,6 @@ EXPORT_SYMBOL(device_register); 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 --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 963f6fb2b5dd..33a9c5cb4ecd 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c @@ -2264,7 +2264,6 @@ int tty_unregister_driver(struct tty_driver *driver) 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 --git a/drivers/ieee1394/amdtp.c b/drivers/ieee1394/amdtp.c index 3fc004d47884..94630dcaac2d 100644 --- a/drivers/ieee1394/amdtp.c +++ b/drivers/ieee1394/amdtp.c @@ -1308,7 +1308,6 @@ static void __exit amdtp_exit_module (void) hpsb_unregister_highlevel(&amdtp_highlevel); devfs_remove("amdtp"); - cdev_unmap(IEEE1394_AMDTP_DEV, 16); cdev_del(&amdtp_cdev); HPSB_INFO("Unloaded AMDTP driver"); diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c index dd16cccc2eb1..881340aa52ac 100644 --- a/drivers/ieee1394/dv1394.c +++ b/drivers/ieee1394/dv1394.c @@ -2609,7 +2609,6 @@ static void __exit dv1394_exit_module(void) 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 --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index 83e5a7c5149b..405c6d59bcd9 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c @@ -2682,7 +2682,6 @@ static int __init init_raw1394(void) 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 --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c index 6353ef25628d..d66d517d0187 100644 --- a/drivers/ieee1394/video1394.c +++ b/drivers/ieee1394/video1394.c @@ -1447,7 +1447,6 @@ static void __exit video1394_exit_module (void) 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 --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 6c210f52c5e0..9141152f33ce 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1521,7 +1521,6 @@ sg_remove(struct class_device *cl_dev) 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 --git a/drivers/scsi/st.c b/drivers/scsi/st.c index fc5b890e6f80..d566897fecbe 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -3946,8 +3946,6 @@ out_free_tape: 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 @@ static int st_remove(struct device *dev) 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 --git a/fs/char_dev.c b/fs/char_dev.c index 50ab4cf8e8e1..7a1d47c3157a 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c @@ -240,7 +240,6 @@ void unregister_chrdev_region(dev_t from, unsigned count) 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 @@ int cdev_add(struct cdev *p, dev_t dev, unsigned count) 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_get); 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 --git a/include/linux/cdev.h b/include/linux/cdev.h index 191c800fa127..f1996ec09e96 100644 --- a/include/linux/cdev.h +++ b/include/linux/cdev.h @@ -7,6 +7,8 @@ struct cdev { 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 *); @@ -21,8 +23,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 *); #endif diff --git a/include/linux/device.h b/include/linux/device.h index 367b21888ad4..6da63dac06b0 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -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 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 device { 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 @@ dev_set_drvdata (struct device *dev, void *data) */ 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 --git a/lib/kobject.c b/lib/kobject.c index 5bc00c5b6ec3..e38d31e4e156 100644 --- a/lib/kobject.c +++ b/lib/kobject.c @@ -630,6 +630,9 @@ EXPORT_SYMBOL(kobject_register); 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); |
