Commit 9ccf0731 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/driver-2.6

into home.osdl.org:/home/torvalds/v2.5/linux
parents 90c9ddf6 8be9c8de
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
* *
* Copyright (c) 2002-3 Patrick Mochel * Copyright (c) 2002-3 Patrick Mochel
* Copyright (c) 2002-3 Open Source Development Labs * Copyright (c) 2002-3 Open Source Development Labs
* Copyright (c) 2003 Greg Kroah-Hartman * Copyright (c) 2003-2004 Greg Kroah-Hartman
* Copyright (c) 2003 IBM Corp. * Copyright (c) 2003-2004 IBM Corp.
* *
* This file is released under the GPLv2 * This file is released under the GPLv2
* *
...@@ -278,7 +278,6 @@ int class_device_add(struct class_device *class_dev) ...@@ -278,7 +278,6 @@ int class_device_add(struct class_device *class_dev)
{ {
struct class * parent; struct class * parent;
struct class_interface * class_intf; struct class_interface * class_intf;
struct list_head * entry;
int error; int error;
class_dev = class_device_get(class_dev); class_dev = class_device_get(class_dev);
...@@ -302,11 +301,9 @@ int class_device_add(struct class_device *class_dev) ...@@ -302,11 +301,9 @@ int class_device_add(struct class_device *class_dev)
if (parent) { if (parent) {
down_write(&parent->subsys.rwsem); down_write(&parent->subsys.rwsem);
list_add_tail(&class_dev->node, &parent->children); list_add_tail(&class_dev->node, &parent->children);
list_for_each(entry, &parent->interfaces) { list_for_each_entry(class_intf, &parent->interfaces, node)
class_intf = container_of(entry, struct class_interface, node);
if (class_intf->add) if (class_intf->add)
class_intf->add(class_dev); class_intf->add(class_dev);
}
up_write(&parent->subsys.rwsem); up_write(&parent->subsys.rwsem);
} }
...@@ -330,16 +327,13 @@ void class_device_del(struct class_device *class_dev) ...@@ -330,16 +327,13 @@ void class_device_del(struct class_device *class_dev)
{ {
struct class * parent = class_dev->class; struct class * parent = class_dev->class;
struct class_interface * class_intf; struct class_interface * class_intf;
struct list_head * entry;
if (parent) { if (parent) {
down_write(&parent->subsys.rwsem); down_write(&parent->subsys.rwsem);
list_del_init(&class_dev->node); list_del_init(&class_dev->node);
list_for_each(entry, &parent->interfaces) { list_for_each_entry(class_intf, &parent->interfaces, node)
class_intf = container_of(entry, struct class_interface, node);
if (class_intf->remove) if (class_intf->remove)
class_intf->remove(class_dev); class_intf->remove(class_dev);
}
up_write(&parent->subsys.rwsem); up_write(&parent->subsys.rwsem);
} }
...@@ -395,7 +389,6 @@ int class_interface_register(struct class_interface *class_intf) ...@@ -395,7 +389,6 @@ int class_interface_register(struct class_interface *class_intf)
{ {
struct class * parent; struct class * parent;
struct class_device * class_dev; struct class_device * class_dev;
struct list_head * entry;
if (!class_intf || !class_intf->class) if (!class_intf || !class_intf->class)
return -ENODEV; return -ENODEV;
...@@ -408,11 +401,9 @@ int class_interface_register(struct class_interface *class_intf) ...@@ -408,11 +401,9 @@ int class_interface_register(struct class_interface *class_intf)
list_add_tail(&class_intf->node, &parent->interfaces); list_add_tail(&class_intf->node, &parent->interfaces);
if (class_intf->add) { if (class_intf->add) {
list_for_each(entry, &parent->children) { list_for_each_entry(class_dev, &parent->children, node)
class_dev = container_of(entry, struct class_device, node);
class_intf->add(class_dev); class_intf->add(class_dev);
} }
}
up_write(&parent->subsys.rwsem); up_write(&parent->subsys.rwsem);
return 0; return 0;
...@@ -421,7 +412,7 @@ int class_interface_register(struct class_interface *class_intf) ...@@ -421,7 +412,7 @@ int class_interface_register(struct class_interface *class_intf)
void class_interface_unregister(struct class_interface *class_intf) void class_interface_unregister(struct class_interface *class_intf)
{ {
struct class * parent = class_intf->class; struct class * parent = class_intf->class;
struct list_head * entry; struct class_device *class_dev;
if (!parent) if (!parent)
return; return;
...@@ -430,11 +421,9 @@ void class_interface_unregister(struct class_interface *class_intf) ...@@ -430,11 +421,9 @@ void class_interface_unregister(struct class_interface *class_intf)
list_del_init(&class_intf->node); list_del_init(&class_intf->node);
if (class_intf->remove) { if (class_intf->remove) {
list_for_each(entry, &parent->children) { list_for_each_entry(class_dev, &parent->children, node)
struct class_device *class_dev = container_of(entry, struct class_device, node);
class_intf->remove(class_dev); class_intf->remove(class_dev);
} }
}
up_write(&parent->subsys.rwsem); up_write(&parent->subsys.rwsem);
class_put(parent); class_put(parent);
......
...@@ -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.
...@@ -179,12 +197,10 @@ EXPORT_SYMBOL(class_simple_device_add); ...@@ -179,12 +197,10 @@ EXPORT_SYMBOL(class_simple_device_add);
void class_simple_device_remove(dev_t dev) void class_simple_device_remove(dev_t dev)
{ {
struct simple_dev *s_dev = NULL; struct simple_dev *s_dev = NULL;
struct list_head *tmp;
int found = 0; int found = 0;
spin_lock(&simple_dev_list_lock); spin_lock(&simple_dev_list_lock);
list_for_each(tmp, &simple_dev_list) { list_for_each_entry(s_dev, &simple_dev_list, node) {
s_dev = list_entry(tmp, struct simple_dev, node);
if (s_dev->dev == dev) { if (s_dev->dev == dev) {
found = 1; found = 1;
break; break;
......
...@@ -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