]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blobdiff - drivers/base/driver.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
[mirror_ubuntu-focal-kernel.git] / drivers / base / driver.c
index b631f7c59453c2a51f1ce4d65c6fec458cde51e3..3ec3896c83a659ac069a4d27a98f0bcdd193f78e 100644 (file)
@@ -123,64 +123,6 @@ void driver_remove_file(struct device_driver *drv,
 }
 EXPORT_SYMBOL_GPL(driver_remove_file);
 
-/**
- * driver_add_kobj - add a kobject below the specified driver
- * @drv: requesting device driver
- * @kobj: kobject to add below this driver
- * @fmt: format string that names the kobject
- *
- * You really don't want to do this, this is only here due to one looney
- * iseries driver, go poke those developers if you are annoyed about
- * this...
- */
-int driver_add_kobj(struct device_driver *drv, struct kobject *kobj,
-                   const char *fmt, ...)
-{
-       va_list args;
-       char *name;
-       int ret;
-
-       va_start(args, fmt);
-       name = kvasprintf(GFP_KERNEL, fmt, args);
-       va_end(args);
-
-       if (!name)
-               return -ENOMEM;
-
-       ret = kobject_add(kobj, &drv->p->kobj, "%s", name);
-       kfree(name);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(driver_add_kobj);
-
-/**
- * get_driver - increment driver reference count.
- * @drv: driver.
- */
-struct device_driver *get_driver(struct device_driver *drv)
-{
-       if (drv) {
-               struct driver_private *priv;
-               struct kobject *kobj;
-
-               kobj = kobject_get(&drv->p->kobj);
-               priv = to_driver(kobj);
-               return priv->driver;
-       }
-       return NULL;
-}
-EXPORT_SYMBOL_GPL(get_driver);
-
-/**
- * put_driver - decrement driver's refcount.
- * @drv: driver.
- */
-void put_driver(struct device_driver *drv)
-{
-       kobject_put(&drv->p->kobj);
-}
-EXPORT_SYMBOL_GPL(put_driver);
-
 static int driver_add_groups(struct device_driver *drv,
                             const struct attribute_group **groups)
 {
@@ -234,7 +176,6 @@ int driver_register(struct device_driver *drv)
 
        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 -EBUSY;
@@ -275,7 +216,9 @@ EXPORT_SYMBOL_GPL(driver_unregister);
  * Call kset_find_obj() to iterate over list of drivers on
  * a bus to find driver by name. Return driver if found.
  *
- * Note that kset_find_obj increments driver's reference count.
+ * This routine provides no locking to prevent the driver it returns
+ * from being unregistered or unloaded while the caller is using it.
+ * The caller is responsible for preventing this.
  */
 struct device_driver *driver_find(const char *name, struct bus_type *bus)
 {
@@ -283,6 +226,8 @@ struct device_driver *driver_find(const char *name, struct bus_type *bus)
        struct driver_private *priv;
 
        if (k) {
+               /* Drop reference added by kset_find_obj() */
+               kobject_put(k);
                priv = to_driver(k);
                return priv->driver;
        }