X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fbase%2Fcore.c;h=4e6cce8e6d3512a9344d7142fa05879861bf724e;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=153cdc48bed747324d47fb1b8d4ab90e3ea92b04;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/base/core.c b/drivers/base/core.c index 153cdc48b..4e6cce8e6 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -116,8 +116,29 @@ static int dev_hotplug(struct kset *kset, struct kobject *kobj, char **envp, int num_envp, char *buffer, int buffer_size) { struct device *dev = to_dev(kobj); + int i = 0; + int length = 0; int retval = 0; + /* add bus name of physical device */ + if (dev->bus) + add_hotplug_env_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVBUS=%s", dev->bus->name); + + /* add driver name of physical device */ + if (dev->driver) + add_hotplug_env_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVDRIVER=%s", dev->driver->name); + + /* terminate, set to next free slot, shrink available space */ + envp[i] = NULL; + envp = &envp[i]; + num_envp -= i; + buffer = &buffer[length]; + buffer_size -= length; + if (dev->bus->hotplug) { /* have the bus specific function add its stuff */ retval = dev->bus->hotplug (dev, envp, num_envp, buffer, buffer_size); @@ -209,19 +230,19 @@ void device_initialize(struct device *dev) */ int device_add(struct device *dev) { - struct device * parent; - int error; + struct device *parent = NULL; + int error = -EINVAL; dev = get_device(dev); if (!dev || !strlen(dev->bus_id)) - return -EINVAL; + goto Error; parent = get_device(dev->parent); pr_debug("DEV: registering device: ID = '%s'\n", dev->bus_id); /* first, register with generic layer. */ - kobject_set_name(&dev->kobj, dev->bus_id); + kobject_set_name(&dev->kobj, "%s", dev->bus_id); if (parent) dev->kobj.parent = &parent->kobj; @@ -293,7 +314,8 @@ struct device * get_device(struct device * dev) */ void put_device(struct device * dev) { - kobject_put(&dev->kobj); + if (dev) + kobject_put(&dev->kobj); } @@ -401,17 +423,17 @@ int __init devices_init(void) return subsystem_register(&devices_subsys); } -EXPORT_SYMBOL(device_for_each_child); +EXPORT_SYMBOL_GPL(device_for_each_child); -EXPORT_SYMBOL(device_initialize); -EXPORT_SYMBOL(device_add); -EXPORT_SYMBOL(device_register); +EXPORT_SYMBOL_GPL(device_initialize); +EXPORT_SYMBOL_GPL(device_add); +EXPORT_SYMBOL_GPL(device_register); -EXPORT_SYMBOL(device_del); -EXPORT_SYMBOL(device_unregister); -EXPORT_SYMBOL(get_device); -EXPORT_SYMBOL(put_device); -EXPORT_SYMBOL(device_find); +EXPORT_SYMBOL_GPL(device_del); +EXPORT_SYMBOL_GPL(device_unregister); +EXPORT_SYMBOL_GPL(get_device); +EXPORT_SYMBOL_GPL(put_device); +EXPORT_SYMBOL_GPL(device_find); -EXPORT_SYMBOL(device_create_file); -EXPORT_SYMBOL(device_remove_file); +EXPORT_SYMBOL_GPL(device_create_file); +EXPORT_SYMBOL_GPL(device_remove_file);