]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/base/dd.c
device model: Do a quickcheck for driver binding before doing an expensive check
[linux-2.6-omap-h63xx.git] / drivers / base / dd.c
index a5cde94bb982aacc2b111e0c65773d8be8378351..20febc00a5258e253aeb9a309a9447660df40a38 100644 (file)
@@ -30,12 +30,12 @@ static void driver_bound(struct device *dev)
 {
        if (klist_node_attached(&dev->knode_driver)) {
                printk(KERN_WARNING "%s: device %s already bound\n",
-                       __FUNCTION__, kobject_name(&dev->kobj));
+                       __func__, kobject_name(&dev->kobj));
                return;
        }
 
        pr_debug("driver: '%s': %s: bound to device '%s'\n", dev->bus_id,
-                __FUNCTION__, dev->driver->name);
+                __func__, dev->driver->name);
 
        if (dev->bus)
                blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
@@ -104,13 +104,13 @@ static int really_probe(struct device *dev, struct device_driver *drv)
 
        atomic_inc(&probe_count);
        pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
-                drv->bus->name, __FUNCTION__, drv->name, dev->bus_id);
+                drv->bus->name, __func__, drv->name, dev->bus_id);
        WARN_ON(!list_empty(&dev->devres_head));
 
        dev->driver = drv;
        if (driver_sysfs_add(dev)) {
                printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
-                       __FUNCTION__, dev->bus_id);
+                       __func__, dev->bus_id);
                goto probe_failed;
        }
 
@@ -127,7 +127,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
        driver_bound(dev);
        ret = 1;
        pr_debug("bus: '%s': %s: bound device %s to driver %s\n",
-                drv->bus->name, __FUNCTION__, dev->bus_id, drv->name);
+                drv->bus->name, __func__, dev->bus_id, drv->name);
        goto done;
 
 probe_failed:
@@ -160,7 +160,7 @@ done:
  */
 int driver_probe_done(void)
 {
-       pr_debug("%s: probe_count = %d\n", __FUNCTION__,
+       pr_debug("%s: probe_count = %d\n", __func__,
                 atomic_read(&probe_count));
        if (atomic_read(&probe_count))
                return -EBUSY;
@@ -194,7 +194,7 @@ int driver_probe_device(struct device_driver *drv, struct device *dev)
                goto done;
 
        pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
-                drv->bus->name, __FUNCTION__, dev->bus_id, drv->name);
+                drv->bus->name, __func__, dev->bus_id, drv->name);
 
        ret = really_probe(dev, drv);
 
@@ -257,6 +257,9 @@ static int __driver_attach(struct device *dev, void *data)
         * is an error.
         */
 
+       if (drv->bus->match && !drv->bus->match(dev, drv))
+               return 0;
+
        if (dev->parent)        /* Needed for USB */
                down(&dev->parent->sem);
        down(&dev->sem);