linux/drivers/base/dd.c
<<
>>
Prefs
   1/*
   2 * drivers/base/dd.c - The core device/driver interactions.
   3 *
   4 * This file contains the (sometimes tricky) code that controls the
   5 * interactions between devices and drivers, which primarily includes
   6 * driver binding and unbinding.
   7 *
   8 * All of this code used to exist in drivers/base/bus.c, but was
   9 * relocated to here in the name of compartmentalization (since it wasn't
  10 * strictly code just for the 'struct bus_type'.
  11 *
  12 * Copyright (c) 2002-5 Patrick Mochel
  13 * Copyright (c) 2002-3 Open Source Development Labs
  14 * Copyright (c) 2007-2009 Greg Kroah-Hartman <gregkh@suse.de>
  15 * Copyright (c) 2007-2009 Novell Inc.
  16 *
  17 * This file is released under the GPLv2
  18 */
  19
  20#include <linux/device.h>
  21#include <linux/delay.h>
  22#include <linux/module.h>
  23#include <linux/kthread.h>
  24#include <linux/wait.h>
  25#include <linux/async.h>
  26#include <linux/pm_runtime.h>
  27
  28#include "base.h"
  29#include "power/power.h"
  30
  31
  32static void driver_bound(struct device *dev)
  33{
  34        if (klist_node_attached(&dev->p->knode_driver)) {
  35                printk(KERN_WARNING "%s: device %s already bound\n",
  36                        __func__, kobject_name(&dev->kobj));
  37                return;
  38        }
  39
  40        pr_debug("driver: '%s': %s: bound to device '%s'\n", dev_name(dev),
  41                 __func__, dev->driver->name);
  42
  43        klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
  44
  45        if (dev->bus)
  46                blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
  47                                             BUS_NOTIFY_BOUND_DRIVER, dev);
  48}
  49
  50static int driver_sysfs_add(struct device *dev)
  51{
  52        int ret;
  53
  54        if (dev->bus)
  55                blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
  56                                             BUS_NOTIFY_BIND_DRIVER, dev);
  57
  58        ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj,
  59                          kobject_name(&dev->kobj));
  60        if (ret == 0) {
  61                ret = sysfs_create_link(&dev->kobj, &dev->driver->p->kobj,
  62                                        "driver");
  63                if (ret)
  64                        sysfs_remove_link(&dev->driver->p->kobj,
  65                                        kobject_name(&dev->kobj));
  66        }
  67        return ret;
  68}
  69
  70static void driver_sysfs_remove(struct device *dev)
  71{
  72        struct device_driver *drv = dev->driver;
  73
  74        if (drv) {
  75                sysfs_remove_link(&drv->p->kobj, kobject_name(&dev->kobj));
  76                sysfs_remove_link(&dev->kobj, "driver");
  77        }
  78}
  79
  80/**
  81 * device_bind_driver - bind a driver to one device.
  82 * @dev: device.
  83 *
  84 * Allow manual attachment of a driver to a device.
  85 * Caller must have already set @dev->driver.
  86 *
  87 * Note that this does not modify the bus reference count
  88 * nor take the bus's rwsem. Please verify those are accounted
  89 * for before calling this. (It is ok to call with no other effort
  90 * from a driver's probe() method.)
  91 *
  92 * This function must be called with the device lock held.
  93 */
  94int device_bind_driver(struct device *dev)
  95{
  96        int ret;
  97
  98        ret = driver_sysfs_add(dev);
  99        if (!ret)
 100                driver_bound(dev);
 101        return ret;
 102}
 103EXPORT_SYMBOL_GPL(device_bind_driver);
 104
 105static atomic_t probe_count = ATOMIC_INIT(0);
 106static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue);
 107
 108static int really_probe(struct device *dev, struct device_driver *drv)
 109{
 110        int ret = 0;
 111
 112        atomic_inc(&probe_count);
 113        pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
 114                 drv->bus->name, __func__, drv->name, dev_name(dev));
 115        WARN_ON(!list_empty(&dev->devres_head));
 116
 117        dev->driver = drv;
 118        if (driver_sysfs_add(dev)) {
 119                printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
 120                        __func__, dev_name(dev));
 121                goto probe_failed;
 122        }
 123
 124        if (dev->bus->probe) {
 125                ret = dev->bus->probe(dev);
 126                if (ret)
 127                        goto probe_failed;
 128        } else if (drv->probe) {
 129                ret = drv->probe(dev);
 130                if (ret)
 131                        goto probe_failed;
 132        }
 133
 134        driver_bound(dev);
 135        ret = 1;
 136        pr_debug("bus: '%s': %s: bound device %s to driver %s\n",
 137                 drv->bus->name, __func__, dev_name(dev), drv->name);
 138        goto done;
 139
 140probe_failed:
 141        devres_release_all(dev);
 142        driver_sysfs_remove(dev);
 143        dev->driver = NULL;
 144
 145        if (ret != -ENODEV && ret != -ENXIO) {
 146                /* driver matched but the probe failed */
 147                printk(KERN_WARNING
 148                       "%s: probe of %s failed with error %d\n",
 149                       drv->name, dev_name(dev), ret);
 150        } else {
 151                pr_debug("%s: probe of %s rejects match %d\n",
 152                       drv->name, dev_name(dev), ret);
 153        }
 154        /*
 155         * Ignore errors returned by ->probe so that the next driver can try
 156         * its luck.
 157         */
 158        ret = 0;
 159done:
 160        atomic_dec(&probe_count);
 161        wake_up(&probe_waitqueue);
 162        return ret;
 163}
 164
 165/**
 166 * driver_probe_done
 167 * Determine if the probe sequence is finished or not.
 168 *
 169 * Should somehow figure out how to use a semaphore, not an atomic variable...
 170 */
 171int driver_probe_done(void)
 172{
 173        pr_debug("%s: probe_count = %d\n", __func__,
 174                 atomic_read(&probe_count));
 175        if (atomic_read(&probe_count))
 176                return -EBUSY;
 177        return 0;
 178}
 179
 180/**
 181 * wait_for_device_probe
 182 * Wait for device probing to be completed.
 183 */
 184void wait_for_device_probe(void)
 185{
 186        /* wait for the known devices to complete their probing */
 187        wait_event(probe_waitqueue, atomic_read(&probe_count) == 0);
 188        async_synchronize_full();
 189}
 190EXPORT_SYMBOL_GPL(wait_for_device_probe);
 191
 192/**
 193 * driver_probe_device - attempt to bind device & driver together
 194 * @drv: driver to bind a device to
 195 * @dev: device to try to bind to the driver
 196 *
 197 * This function returns -ENODEV if the device is not registered,
 198 * 1 if the device is bound successfully and 0 otherwise.
 199 *
 200 * This function must be called with @dev lock held.  When called for a
 201 * USB interface, @dev->parent lock must be held as well.
 202 */
 203int driver_probe_device(struct device_driver *drv, struct device *dev)
 204{
 205        int ret = 0;
 206
 207        if (!device_is_registered(dev))
 208                return -ENODEV;
 209
 210        pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
 211                 drv->bus->name, __func__, dev_name(dev), drv->name);
 212
 213        pm_runtime_get_noresume(dev);
 214        pm_runtime_barrier(dev);
 215        ret = really_probe(dev, drv);
 216        pm_runtime_put_sync(dev);
 217
 218        return ret;
 219}
 220
 221static int __device_attach(struct device_driver *drv, void *data)
 222{
 223        struct device *dev = data;
 224
 225        if (!driver_match_device(drv, dev))
 226                return 0;
 227
 228        return driver_probe_device(drv, dev);
 229}
 230
 231/**
 232 * device_attach - try to attach device to a driver.
 233 * @dev: device.
 234 *
 235 * Walk the list of drivers that the bus has and call
 236 * driver_probe_device() for each pair. If a compatible
 237 * pair is found, break out and return.
 238 *
 239 * Returns 1 if the device was bound to a driver;
 240 * 0 if no matching driver was found;
 241 * -ENODEV if the device is not registered.
 242 *
 243 * When called for a USB interface, @dev->parent lock must be held.
 244 */
 245int device_attach(struct device *dev)
 246{
 247        int ret = 0;
 248
 249        device_lock(dev);
 250        if (dev->driver) {
 251                if (klist_node_attached(&dev->p->knode_driver)) {
 252                        ret = 1;
 253                        goto out_unlock;
 254                }
 255                ret = device_bind_driver(dev);
 256                if (ret == 0)
 257                        ret = 1;
 258                else {
 259                        dev->driver = NULL;
 260                        ret = 0;
 261                }
 262        } else {
 263                pm_runtime_get_noresume(dev);
 264                ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
 265                pm_runtime_put_sync(dev);
 266        }
 267out_unlock:
 268        device_unlock(dev);
 269        return ret;
 270}
 271EXPORT_SYMBOL_GPL(device_attach);
 272
 273static int __driver_attach(struct device *dev, void *data)
 274{
 275        struct device_driver *drv = data;
 276
 277        /*
 278         * Lock device and try to bind to it. We drop the error
 279         * here and always return 0, because we need to keep trying
 280         * to bind to devices and some drivers will return an error
 281         * simply if it didn't support the device.
 282         *
 283         * driver_probe_device() will spit a warning if there
 284         * is an error.
 285         */
 286
 287        if (!driver_match_device(drv, dev))
 288                return 0;
 289
 290        if (dev->parent)        /* Needed for USB */
 291                device_lock(dev->parent);
 292        device_lock(dev);
 293        if (!dev->driver)
 294                driver_probe_device(drv, dev);
 295        device_unlock(dev);
 296        if (dev->parent)
 297                device_unlock(dev->parent);
 298
 299        return 0;
 300}
 301
 302/**
 303 * driver_attach - try to bind driver to devices.
 304 * @drv: driver.
 305 *
 306 * Walk the list of devices that the bus has on it and try to
 307 * match the driver with each one.  If driver_probe_device()
 308 * returns 0 and the @dev->driver is set, we've found a
 309 * compatible pair.
 310 */
 311int driver_attach(struct device_driver *drv)
 312{
 313        return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
 314}
 315EXPORT_SYMBOL_GPL(driver_attach);
 316
 317/*
 318 * __device_release_driver() must be called with @dev lock held.
 319 * When called for a USB interface, @dev->parent lock must be held as well.
 320 */
 321static void __device_release_driver(struct device *dev)
 322{
 323        struct device_driver *drv;
 324
 325        drv = dev->driver;
 326        if (drv) {
 327                pm_runtime_get_sync(dev);
 328
 329                driver_sysfs_remove(dev);
 330
 331                if (dev->bus)
 332                        blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
 333                                                     BUS_NOTIFY_UNBIND_DRIVER,
 334                                                     dev);
 335
 336                pm_runtime_put_sync(dev);
 337
 338                if (dev->bus && dev->bus->remove)
 339                        dev->bus->remove(dev);
 340                else if (drv->remove)
 341                        drv->remove(dev);
 342                devres_release_all(dev);
 343                dev->driver = NULL;
 344                klist_remove(&dev->p->knode_driver);
 345                if (dev->bus)
 346                        blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
 347                                                     BUS_NOTIFY_UNBOUND_DRIVER,
 348                                                     dev);
 349
 350        }
 351}
 352
 353/**
 354 * device_release_driver - manually detach device from driver.
 355 * @dev: device.
 356 *
 357 * Manually detach device from driver.
 358 * When called for a USB interface, @dev->parent lock must be held.
 359 */
 360void device_release_driver(struct device *dev)
 361{
 362        /*
 363         * If anyone calls device_release_driver() recursively from
 364         * within their ->remove callback for the same device, they
 365         * will deadlock right here.
 366         */
 367        device_lock(dev);
 368        __device_release_driver(dev);
 369        device_unlock(dev);
 370}
 371EXPORT_SYMBOL_GPL(device_release_driver);
 372
 373/**
 374 * driver_detach - detach driver from all devices it controls.
 375 * @drv: driver.
 376 */
 377void driver_detach(struct device_driver *drv)
 378{
 379        struct device_private *dev_prv;
 380        struct device *dev;
 381
 382        for (;;) {
 383                spin_lock(&drv->p->klist_devices.k_lock);
 384                if (list_empty(&drv->p->klist_devices.k_list)) {
 385                        spin_unlock(&drv->p->klist_devices.k_lock);
 386                        break;
 387                }
 388                dev_prv = list_entry(drv->p->klist_devices.k_list.prev,
 389                                     struct device_private,
 390                                     knode_driver.n_node);
 391                dev = dev_prv->device;
 392                get_device(dev);
 393                spin_unlock(&drv->p->klist_devices.k_lock);
 394
 395                if (dev->parent)        /* Needed for USB */
 396                        device_lock(dev->parent);
 397                device_lock(dev);
 398                if (dev->driver == drv)
 399                        __device_release_driver(dev);
 400                device_unlock(dev);
 401                if (dev->parent)
 402                        device_unlock(dev->parent);
 403                put_device(dev);
 404        }
 405}
 406
 407/*
 408 * These exports can't be _GPL due to .h files using this within them, and it
 409 * might break something that was previously working...
 410 */
 411void *dev_get_drvdata(const struct device *dev)
 412{
 413        if (dev && dev->p)
 414                return dev->p->driver_data;
 415        return NULL;
 416}
 417EXPORT_SYMBOL(dev_get_drvdata);
 418
 419int dev_set_drvdata(struct device *dev, void *data)
 420{
 421        int error;
 422
 423        if (!dev->p) {
 424                error = device_private_init(dev);
 425                if (error)
 426                        return error;
 427        }
 428        dev->p->driver_data = data;
 429        return 0;
 430}
 431EXPORT_SYMBOL(dev_set_drvdata);
 432
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.