--- o/drivers/usb/gadget/udc/core.c +++ p/drivers/usb/gadget/udc/core.c @@ -1534,6 +1534,8 @@ void usb_del_gadget(struct usb_gadget *g ida_free(&gadget_id_numbers, gadget->id_number); cancel_work_sync(&udc->vbus_work); device_unregister(&udc->dev); + if (udc->driver && udc->driver->unbind) + udc->driver->unbind(gadget); } EXPORT_SYMBOL_GPL(usb_del_gadget); @@ -1646,7 +1648,6 @@ static void gadget_unbind_driver(struct synchronize_irq(gadget->irq); mutex_unlock(&udc->connect_lock); - udc->driver->unbind(gadget); mutex_lock(&udc->connect_lock); usb_gadget_udc_stop_locked(udc); @@ -1654,7 +1655,6 @@ static void gadget_unbind_driver(struct mutex_lock(&udc_lock); driver->is_bound = false; - udc->driver = NULL; mutex_unlock(&udc_lock); }