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 @@
*
* 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);
......
......@@ -169,6 +169,24 @@ struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev,
}
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;
......
......@@ -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 = {
......@@ -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.
* @dev: parent struct device.
......@@ -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);
......
......@@ -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);
......
......@@ -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");
......
......@@ -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");
}
......
......@@ -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);
......
......@@ -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");
......
......@@ -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);
......
......@@ -3946,8 +3946,6 @@ static int st_probe(struct device *dev)
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;
}
......
......@@ -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);
......@@ -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
......
......@@ -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);
......
......@@ -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);
......
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