--- zzzz-none-000/linux-4.4.60/drivers/usb/dwc3/gadget.c 2017-04-08 07:53:53.000000000 +0000 +++ scorpion-7490-727/linux-4.4.60/drivers/usb/dwc3/gadget.c 2021-02-04 17:41:59.000000000 +0000 @@ -349,6 +349,7 @@ udelay(1); } while (1); } +EXPORT_SYMBOL(dwc3_send_gadget_ep_cmd); static dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep, struct dwc3_trb *trb) @@ -1585,8 +1586,13 @@ u32 reg; irq = platform_get_irq(to_platform_device(dwc->dev), 0); - ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt, - IRQF_SHARED, "dwc3", dwc); + if (dwc->emulation) + ret = request_irq(irq, dwc3_interrupt, IRQF_SHARED, "dwc3", + dwc); + else + ret = request_threaded_irq(irq, dwc3_interrupt, + dwc3_thread_interrupt, + IRQF_SHARED, "dwc3", dwc); if (ret) { dev_err(dwc->dev, "failed to request irq #%d --> %d\n", irq, ret); @@ -1708,6 +1714,15 @@ return 0; } +static int dwc3_gadget_restart_usb_session(struct usb_gadget *g) +{ + struct dwc3 *dwc = gadget_to_dwc(g); + + dev_warn(dwc->dev, "%s not supported\n",__func__); + + return -EINVAL; +} + static const struct usb_gadget_ops dwc3_gadget_ops = { .get_frame = dwc3_gadget_get_frame, .wakeup = dwc3_gadget_wakeup, @@ -1715,6 +1730,7 @@ .pullup = dwc3_gadget_pullup, .udc_start = dwc3_gadget_start, .udc_stop = dwc3_gadget_stop, + .restart = dwc3_gadget_restart_usb_session, }; /* -------------------------------------------------------------------------- */ @@ -2737,8 +2753,12 @@ irqreturn_t status; status = dwc3_check_event_buf(dwc, i); - if (status == IRQ_WAKE_THREAD) - ret = status; + if (status == IRQ_WAKE_THREAD) { + if (dwc->emulation) + ret = dwc3_thread_interrupt(irq, _dwc); + else + ret = status; + } } return ret;