static struct class *udc_class;
 static LIST_HEAD(udc_list);
+static LIST_HEAD(gadget_driver_pending_list);
 static DEFINE_MUTEX(udc_lock);
 
+static int udc_bind_to_driver(struct usb_udc *udc,
+               struct usb_gadget_driver *driver);
+
 /* ------------------------------------------------------------------------- */
 
 #ifdef CONFIG_HAS_DMA
                void (*release)(struct device *dev))
 {
        struct usb_udc          *udc;
+       struct usb_gadget_driver *driver;
        int                     ret = -ENOMEM;
 
        udc = kzalloc(sizeof(*udc), GFP_KERNEL);
        usb_gadget_set_state(gadget, USB_STATE_NOTATTACHED);
        udc->vbus = true;
 
+       /* pick up one of pending gadget drivers */
+       list_for_each_entry(driver, &gadget_driver_pending_list, pending) {
+               if (!driver->udc_name || strcmp(driver->udc_name,
+                                               dev_name(&udc->dev)) == 0) {
+                       ret = udc_bind_to_driver(udc, driver);
+                       if (ret)
+                               goto err4;
+                       list_del(&driver->pending);
+                       break;
+               }
+       }
+
        mutex_unlock(&udc_lock);
 
        return 0;
 
        mutex_lock(&udc_lock);
        list_del(&udc->list);
-       mutex_unlock(&udc_lock);
 
-       if (udc->driver)
+       if (udc->driver) {
+               struct usb_gadget_driver *driver = udc->driver;
+
                usb_gadget_remove_driver(udc);
+               list_add(&driver->pending, &gadget_driver_pending_list);
+       }
+       mutex_unlock(&udc_lock);
 
        kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
        flush_work(&gadget->work);
                        if (!ret)
                                break;
                }
-               if (ret)
-                       ret = -ENODEV;
-               else if (udc->driver)
-                       ret = -EBUSY;
-               else
+               if (!ret && !udc->driver)
                        goto found;
        } else {
                list_for_each_entry(udc, &udc_list, list) {
                }
        }
 
-       pr_debug("couldn't find an available UDC\n");
+       list_add_tail(&driver->pending, &gadget_driver_pending_list);
+       pr_info("udc-core: couldn't find an available UDC - added [%s] to list of pending drivers\n",
+               driver->function);
        mutex_unlock(&udc_lock);
-       return ret;
+       return 0;
 found:
        ret = udc_bind_to_driver(udc, driver);
        mutex_unlock(&udc_lock);
                        break;
                }
 
+       if (ret) {
+               list_del(&driver->pending);
+               ret = 0;
+       }
        mutex_unlock(&udc_lock);
        return ret;
 }
 
  * @driver: Driver model state for this driver.
  * @udc_name: A name of UDC this driver should be bound to. If udc_name is NULL,
  *     this driver will be bound to any available UDC.
+ * @pending: UDC core private data used for deferred probe of this driver.
  *
  * Devices are disabled till a gadget driver successfully bind()s, which
  * means the driver will handle setup() requests needed to enumerate (and
        struct device_driver    driver;
 
        char                    *udc_name;
+       struct list_head        pending;
 };