]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/base/driver.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6-omap-h63xx.git] / drivers / base / driver.c
index bf31a0170a486b08dd61827fa1baef4f58c8df7c..2ef5acf4368b9e8deef4440d865a87cef8d0b0a6 100644 (file)
@@ -133,6 +133,7 @@ int driver_add_kobj(struct device_driver *drv, struct kobject *kobj,
 {
        va_list args;
        char *name;
+       int ret;
 
        va_start(args, fmt);
        name = kvasprintf(GFP_KERNEL, fmt, args);
@@ -141,7 +142,9 @@ int driver_add_kobj(struct device_driver *drv, struct kobject *kobj,
        if (!name)
                return -ENOMEM;
 
-       return kobject_add(kobj, &drv->p->kobj, "%s", name);
+       ret = kobject_add(kobj, &drv->p->kobj, "%s", name);
+       kfree(name);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(driver_add_kobj);
 
@@ -214,12 +217,22 @@ static void driver_remove_groups(struct device_driver *drv,
 int driver_register(struct device_driver *drv)
 {
        int ret;
+       struct device_driver *other;
 
        if ((drv->bus->probe && drv->probe) ||
            (drv->bus->remove && drv->remove) ||
            (drv->bus->shutdown && drv->shutdown))
                printk(KERN_WARNING "Driver '%s' needs updating - please use "
                        "bus_type methods\n", drv->name);
+
+       other = driver_find(drv->name, drv->bus);
+       if (other) {
+               put_driver(other);
+               printk(KERN_ERR "Error: Driver '%s' is already registered, "
+                       "aborting...\n", drv->name);
+               return -EEXIST;
+       }
+
        ret = bus_add_driver(drv);
        if (ret)
                return ret;