[PATCH] Driver core: bus device event delay

split bus_add_device() and send device uevents after sysfs population

Signed-off-by: Kay Sievers <kay.sievers@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Kay Sievers 2006-04-04 20:42:26 +02:00 committed by Greg Kroah-Hartman
parent 27c0ff868f
commit 53877d06d5
3 changed files with 21 additions and 5 deletions

View File

@ -11,6 +11,7 @@ extern int cpu_dev_init(void);
extern int attribute_container_init(void); extern int attribute_container_init(void);
extern int bus_add_device(struct device * dev); extern int bus_add_device(struct device * dev);
extern void bus_attach_device(struct device * dev);
extern void bus_remove_device(struct device * dev); extern void bus_remove_device(struct device * dev);
extern int bus_add_driver(struct device_driver *); extern int bus_add_driver(struct device_driver *);

View File

@ -362,8 +362,7 @@ static void device_remove_attrs(struct bus_type * bus, struct device * dev)
* @dev: device being added * @dev: device being added
* *
* - Add the device to its bus's list of devices. * - Add the device to its bus's list of devices.
* - Try to attach to driver. * - Create link to device's bus.
* - Create link to device's physical location.
*/ */
int bus_add_device(struct device * dev) int bus_add_device(struct device * dev)
{ {
@ -372,8 +371,6 @@ int bus_add_device(struct device * dev)
if (bus) { if (bus) {
pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id); pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
device_attach(dev);
klist_add_tail(&dev->knode_bus, &bus->klist_devices);
error = device_add_attrs(bus, dev); error = device_add_attrs(bus, dev);
if (!error) { if (!error) {
sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id); sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
@ -383,6 +380,22 @@ int bus_add_device(struct device * dev)
return error; return error;
} }
/**
* bus_attach_device - add device to bus
* @dev: device tried to attach to a driver
*
* - Try to attach to driver.
*/
void bus_attach_device(struct device * dev)
{
struct bus_type * bus = dev->bus;
if (bus) {
device_attach(dev);
klist_add_tail(&dev->knode_bus, &bus->klist_devices);
}
}
/** /**
* bus_remove_device - remove device from bus * bus_remove_device - remove device from bus
* @dev: device to be removed * @dev: device to be removed
@ -733,6 +746,7 @@ EXPORT_SYMBOL_GPL(bus_find_device);
EXPORT_SYMBOL_GPL(bus_for_each_drv); EXPORT_SYMBOL_GPL(bus_for_each_drv);
EXPORT_SYMBOL_GPL(bus_add_device); EXPORT_SYMBOL_GPL(bus_add_device);
EXPORT_SYMBOL_GPL(bus_attach_device);
EXPORT_SYMBOL_GPL(bus_remove_device); EXPORT_SYMBOL_GPL(bus_remove_device);
EXPORT_SYMBOL_GPL(bus_register); EXPORT_SYMBOL_GPL(bus_register);
EXPORT_SYMBOL_GPL(bus_unregister); EXPORT_SYMBOL_GPL(bus_unregister);

View File

@ -274,11 +274,12 @@ int device_add(struct device *dev)
dev->uevent_attr.store = store_uevent; dev->uevent_attr.store = store_uevent;
device_create_file(dev, &dev->uevent_attr); device_create_file(dev, &dev->uevent_attr);
kobject_uevent(&dev->kobj, KOBJ_ADD);
if ((error = device_pm_add(dev))) if ((error = device_pm_add(dev)))
goto PMError; goto PMError;
if ((error = bus_add_device(dev))) if ((error = bus_add_device(dev)))
goto BusError; goto BusError;
kobject_uevent(&dev->kobj, KOBJ_ADD);
bus_attach_device(dev);
if (parent) if (parent)
klist_add_tail(&dev->knode_parent, &parent->klist_children); klist_add_tail(&dev->knode_parent, &parent->klist_children);