]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/base/dd.c
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[karo-tx-linux.git] / drivers / base / dd.c
index c4da2df62e02525617a23ebe68fff4af0bb69350..16688f50729cfac7112a740804c00b226680ca4a 100644 (file)
@@ -560,6 +560,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
        struct device_attach_data *data = _data;
        struct device *dev = data->dev;
        bool async_allowed;
+       int ret;
 
        /*
         * Check if device has already been claimed. This may
@@ -570,8 +571,17 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
        if (dev->driver)
                return -EBUSY;
 
-       if (!driver_match_device(drv, dev))
+       ret = driver_match_device(drv, dev);
+       if (ret == 0) {
+               /* no match */
                return 0;
+       } else if (ret == -EPROBE_DEFER) {
+               dev_dbg(dev, "Device match requests probe deferral\n");
+               driver_deferred_probe_add(dev);
+       } else if (ret < 0) {
+               dev_dbg(dev, "Bus failed to match device: %d", ret);
+               return ret;
+       } /* ret > 0 means positive match */
 
        async_allowed = driver_allows_async_probing(drv);
 
@@ -691,6 +701,7 @@ void device_initial_probe(struct device *dev)
 static int __driver_attach(struct device *dev, void *data)
 {
        struct device_driver *drv = data;
+       int ret;
 
        /*
         * Lock device and try to bind to it. We drop the error
@@ -702,8 +713,17 @@ static int __driver_attach(struct device *dev, void *data)
         * is an error.
         */
 
-       if (!driver_match_device(drv, dev))
+       ret = driver_match_device(drv, dev);
+       if (ret == 0) {
+               /* no match */
                return 0;
+       } else if (ret == -EPROBE_DEFER) {
+               dev_dbg(dev, "Device match requests probe deferral\n");
+               driver_deferred_probe_add(dev);
+       } else if (ret < 0) {
+               dev_dbg(dev, "Bus failed to match device: %d", ret);
+               return ret;
+       } /* ret > 0 means positive match */
 
        if (dev->parent)        /* Needed for USB */
                device_lock(dev->parent);