introdue following udc apis which will forbid lower gadget driver operate upper layer usb gadget driver directly. void usb_gadget_udc_disconnect(struct usb_gadget *); void usb_gadget_udc_suspend(struct usb_gadget *); void usb_gadget_udc_resume(struct usb_gadget *); int usb_gadget_udc_setup(struct usb_gadget *, const struct usb_ctrlrequest *); dwc3 is first driver to use these apis. Linyu Yuan (2): usb: udc: core: hide struct usb_gadget_driver to gadget driver usb: dwc3: fix race of usb_gadget_driver operation drivers/usb/dwc3/core.h | 2 -- drivers/usb/dwc3/ep0.c | 6 +--- drivers/usb/dwc3/gadget.c | 53 +++++++++-------------------------- drivers/usb/gadget/udc/core.c | 47 ++++++++++++++++++++++++++++++- include/linux/usb/gadget.h | 6 ++++ 5 files changed, 66 insertions(+), 48 deletions(-) -- 2.25.1