Lines Matching full:dwc
35 * @dwc: pointer to our context structure
41 int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode) in dwc3_gadget_set_test_mode() argument
45 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_set_test_mode()
60 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_set_test_mode()
67 * @dwc: pointer to our context structure
72 int dwc3_gadget_get_link_state(struct dwc3 *dwc) in dwc3_gadget_get_link_state() argument
76 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_get_link_state()
83 * @dwc: pointer to our context structure
89 int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state) in dwc3_gadget_set_link_state() argument
100 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_set_link_state()
111 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_set_link_state()
115 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_set_link_state()
119 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_set_link_state()
131 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_set_link_state()
178 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_del_and_unmap_request() local
189 usb_gadget_unmap_request_by_dev(dwc->sysdev, in dwc3_gadget_del_and_unmap_request()
196 pm_runtime_put(dwc->dev); in dwc3_gadget_del_and_unmap_request()
212 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_giveback() local
217 spin_unlock(&dwc->lock); in dwc3_gadget_giveback()
219 spin_lock(&dwc->lock); in dwc3_gadget_giveback()
224 * @dwc: pointer to the controller context
228 * Caller should take care of locking. Issue @cmd with a given @param to @dwc
231 int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned int cmd, in dwc3_send_gadget_generic_command() argument
239 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param); in dwc3_send_gadget_generic_command()
240 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT); in dwc3_send_gadget_generic_command()
243 reg = dwc3_readl(dwc->regs, DWC3_DGCMD); in dwc3_send_gadget_generic_command()
262 static int __dwc3_gadget_wakeup(struct dwc3 *dwc);
277 struct dwc3 *dwc = dep->dwc; in dwc3_send_gadget_ep_cmd() local
295 if (dwc->gadget->speed <= USB_SPEED_HIGH || in dwc3_send_gadget_ep_cmd()
297 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
309 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
321 link_state = dwc3_gadget_get_link_state(dwc); in dwc3_send_gadget_ep_cmd()
324 if (dwc->gadget->speed >= USB_SPEED_SUPER) in dwc3_send_gadget_ep_cmd()
329 ret = __dwc3_gadget_wakeup(dwc); in dwc3_send_gadget_ep_cmd()
330 dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n", in dwc3_send_gadget_ep_cmd()
372 dev_WARN(dwc->dev, "No resource for %s\n", in dwc3_send_gadget_ep_cmd()
391 dev_WARN(dwc->dev, "UNKNOWN cmd status\n"); in dwc3_send_gadget_ep_cmd()
414 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
416 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
424 struct dwc3 *dwc = dep->dwc; in dwc3_send_clear_stall_ep_cmd() local
438 (dwc->gadget->speed >= USB_SPEED_SUPER)) in dwc3_send_clear_stall_ep_cmd()
456 struct dwc3 *dwc = dep->dwc; in dwc3_alloc_trb_pool() local
461 dep->trb_pool = dma_alloc_coherent(dwc->sysdev, in dwc3_alloc_trb_pool()
465 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n", in dwc3_alloc_trb_pool()
475 struct dwc3 *dwc = dep->dwc; in dwc3_free_trb_pool() local
477 dma_free_coherent(dwc->sysdev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM, in dwc3_free_trb_pool()
532 struct dwc3 *dwc; in dwc3_gadget_start_config() local
542 dwc = dep->dwc; in dwc3_gadget_start_config()
549 struct dwc3_ep *dep = dwc->eps[i]; in dwc3_gadget_start_config()
567 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_set_ep_config() local
578 if (dwc->gadget->speed >= USB_SPEED_SUPER) { in dwc3_gadget_set_ep_config()
633 dwc->gadget->speed == USB_SPEED_FULL) in dwc3_gadget_set_ep_config()
658 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_enable() local
680 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_enable()
682 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_enable()
757 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep, int status) in dwc3_remove_requests() argument
795 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_disable() local
804 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_disable()
806 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_disable()
808 dwc3_remove_requests(dwc, dep, -ESHUTDOWN); in __dwc3_gadget_ep_disable()
842 struct dwc3 *dwc; in dwc3_gadget_ep_enable() local
857 dwc = dep->dwc; in dwc3_gadget_ep_enable()
859 if (dev_WARN_ONCE(dwc->dev, dep->flags & DWC3_EP_ENABLED, in dwc3_gadget_ep_enable()
864 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_enable()
866 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_enable()
874 struct dwc3 *dwc; in dwc3_gadget_ep_disable() local
884 dwc = dep->dwc; in dwc3_gadget_ep_disable()
886 if (dev_WARN_ONCE(dwc->dev, !(dep->flags & DWC3_EP_ENABLED), in dwc3_gadget_ep_disable()
891 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_disable()
893 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_disable()
996 struct dwc3 *dwc = dep->dwc; in dwc3_prepare_one_trb() local
997 struct usb_gadget *gadget = dwc->gadget; in dwc3_prepare_one_trb()
1001 dma = dep->dwc->bounce_addr; in dwc3_prepare_one_trb()
1082 dev_WARN(dwc->dev, "Unknown endpoint type %d\n", in dwc3_prepare_one_trb()
1325 struct dwc3 *dwc = dep->dwc; in dwc3_prepare_trbs() local
1327 ret = usb_gadget_map_request_by_dev(dwc->sysdev, &req->request, in dwc3_prepare_trbs()
1436 static int __dwc3_gadget_get_frame(struct dwc3 *dwc) in __dwc3_gadget_get_frame() argument
1440 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_get_frame()
1457 struct dwc3 *dwc = dep->dwc; in __dwc3_stop_active_transfer() local
1543 params.param0 = upper_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1544 params.param1 = lower_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1600 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_start_isoc() local
1610 if (!dwc->dis_start_transfer_quirk && in __dwc3_gadget_start_isoc()
1613 if (dwc->gadget->speed <= USB_SPEED_HIGH && dep->direction) in __dwc3_gadget_start_isoc()
1618 dwc->gadget->speed >= USB_SPEED_HIGH) { in __dwc3_gadget_start_isoc()
1619 u32 frame = __dwc3_gadget_get_frame(dwc); in __dwc3_gadget_start_isoc()
1659 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_queue() local
1661 if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) { in __dwc3_gadget_ep_queue()
1662 dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n", in __dwc3_gadget_ep_queue()
1676 pm_runtime_get(dwc->dev); in __dwc3_gadget_ep_queue()
1729 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_queue() local
1735 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1737 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1789 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_dequeue() local
1796 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1830 dev_err(dwc->dev, "request %pK was not queued to %s\n", in dwc3_gadget_ep_dequeue()
1834 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1842 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_set_halt() local
1848 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); in __dwc3_gadget_ep_set_halt()
1863 trb = &dwc->ep0_trb[dep->trb_enqueue]; in __dwc3_gadget_ep_set_halt()
1876 dev_err(dwc->dev, "failed to set STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1905 dev_err(dwc->dev, "failed to clear STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1925 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_halt() local
1931 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1933 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1941 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_wedge() local
1945 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1952 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1991 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_get_frame() local
1993 return __dwc3_gadget_get_frame(dwc); in dwc3_gadget_get_frame()
1996 static int __dwc3_gadget_wakeup(struct dwc3 *dwc) in __dwc3_gadget_wakeup() argument
2011 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
2027 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); in __dwc3_gadget_wakeup()
2029 dev_err(dwc->dev, "failed to put link in Recovery\n"); in __dwc3_gadget_wakeup()
2036 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in __dwc3_gadget_wakeup()
2038 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in __dwc3_gadget_wakeup()
2045 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
2053 dev_err(dwc->dev, "failed to send remote wakeup\n"); in __dwc3_gadget_wakeup()
2062 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_wakeup() local
2066 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_wakeup()
2067 ret = __dwc3_gadget_wakeup(dwc); in dwc3_gadget_wakeup()
2068 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_wakeup()
2076 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_selfpowered() local
2079 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2081 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2086 static void dwc3_stop_active_transfers(struct dwc3 *dwc) in dwc3_stop_active_transfers() argument
2090 for (epnum = 2; epnum < dwc->num_eps; epnum++) { in dwc3_stop_active_transfers()
2093 dep = dwc->eps[epnum]; in dwc3_stop_active_transfers()
2097 dwc3_remove_requests(dwc, dep, -ESHUTDOWN); in dwc3_stop_active_transfers()
2101 static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) in dwc3_gadget_run_stop() argument
2106 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_run_stop()
2109 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_run_stop()
2120 if (dwc->has_hibernation) in dwc3_gadget_run_stop()
2123 dwc->pullups_connected = true; in dwc3_gadget_run_stop()
2127 if (dwc->has_hibernation && !suspend) in dwc3_gadget_run_stop()
2130 dwc->pullups_connected = false; in dwc3_gadget_run_stop()
2133 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_run_stop()
2136 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_run_stop()
2146 static void dwc3_gadget_disable_irq(struct dwc3 *dwc);
2147 static void __dwc3_gadget_stop(struct dwc3 *dwc);
2148 static int __dwc3_gadget_start(struct dwc3 *dwc);
2150 static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) in dwc3_gadget_soft_disconnect() argument
2154 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_soft_disconnect()
2155 dwc->connected = false; in dwc3_gadget_soft_disconnect()
2164 dwc3_stop_active_transfers(dwc); in dwc3_gadget_soft_disconnect()
2165 __dwc3_gadget_stop(dwc); in dwc3_gadget_soft_disconnect()
2166 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_soft_disconnect()
2175 return dwc3_gadget_run_stop(dwc, false, false); in dwc3_gadget_soft_disconnect()
2180 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_pullup() local
2185 dwc->softconnect = is_on; in dwc3_gadget_pullup()
2190 if (!is_on && dwc->ep0state != EP0_SETUP_PHASE) { in dwc3_gadget_pullup()
2191 reinit_completion(&dwc->ep0_in_setup); in dwc3_gadget_pullup()
2193 ret = wait_for_completion_timeout(&dwc->ep0_in_setup, in dwc3_gadget_pullup()
2196 dev_warn(dwc->dev, "timed out waiting for SETUP phase\n"); in dwc3_gadget_pullup()
2205 pm_runtime_barrier(dwc->dev); in dwc3_gadget_pullup()
2206 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_pullup()
2215 ret = pm_runtime_get_sync(dwc->dev); in dwc3_gadget_pullup()
2217 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2219 pm_runtime_set_suspended(dwc->dev); in dwc3_gadget_pullup()
2223 if (dwc->pullups_connected == is_on) { in dwc3_gadget_pullup()
2224 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2229 ret = dwc3_gadget_soft_disconnect(dwc); in dwc3_gadget_pullup()
2237 dwc3_core_soft_reset(dwc); in dwc3_gadget_pullup()
2239 dwc3_event_buffers_setup(dwc); in dwc3_gadget_pullup()
2240 __dwc3_gadget_start(dwc); in dwc3_gadget_pullup()
2241 ret = dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_pullup()
2244 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2249 static void dwc3_gadget_enable_irq(struct dwc3 *dwc) in dwc3_gadget_enable_irq() argument
2270 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); in dwc3_gadget_enable_irq()
2273 static void dwc3_gadget_disable_irq(struct dwc3 *dwc) in dwc3_gadget_disable_irq() argument
2276 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00); in dwc3_gadget_disable_irq()
2284 * @dwc: pointer to our context structure
2303 static void dwc3_gadget_setup_nump(struct dwc3 *dwc) in dwc3_gadget_setup_nump() argument
2310 ram2_depth = DWC3_GHWPARAMS7_RAM2_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_setup_nump()
2311 mdwidth = DWC3_GHWPARAMS0_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_setup_nump()
2313 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6); in dwc3_gadget_setup_nump()
2319 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_setup_nump()
2322 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_setup_nump()
2325 static int __dwc3_gadget_start(struct dwc3 *dwc) in __dwc3_gadget_start() argument
2332 * Use IMOD if enabled via dwc->imod_interval. Otherwise, if in __dwc3_gadget_start()
2335 if (dwc->imod_interval) { in __dwc3_gadget_start()
2336 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in __dwc3_gadget_start()
2337 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in __dwc3_gadget_start()
2338 } else if (dwc3_has_imod(dwc)) { in __dwc3_gadget_start()
2339 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), 0); in __dwc3_gadget_start()
2349 reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG); in __dwc3_gadget_start()
2355 dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg); in __dwc3_gadget_start()
2357 dwc3_gadget_setup_nump(dwc); in __dwc3_gadget_start()
2362 dep = dwc->eps[0]; in __dwc3_gadget_start()
2365 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2369 dep = dwc->eps[1]; in __dwc3_gadget_start()
2372 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2377 dwc->ep0state = EP0_SETUP_PHASE; in __dwc3_gadget_start()
2378 dwc->link_state = DWC3_LINK_STATE_SS_DIS; in __dwc3_gadget_start()
2379 dwc->delayed_status = false; in __dwc3_gadget_start()
2380 dwc3_ep0_out_start(dwc); in __dwc3_gadget_start()
2382 dwc3_gadget_enable_irq(dwc); in __dwc3_gadget_start()
2387 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_start()
2396 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_start() local
2401 irq = dwc->irq_gadget; in dwc3_gadget_start()
2403 IRQF_SHARED, "dwc3", dwc->ev_buf); in dwc3_gadget_start()
2405 dev_err(dwc->dev, "failed to request irq #%d --> %d\n", in dwc3_gadget_start()
2410 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_start()
2411 if (dwc->gadget_driver) { in dwc3_gadget_start()
2412 dev_err(dwc->dev, "%s is already bound to %s\n", in dwc3_gadget_start()
2413 dwc->gadget->name, in dwc3_gadget_start()
2414 dwc->gadget_driver->driver.name); in dwc3_gadget_start()
2419 dwc->gadget_driver = driver; in dwc3_gadget_start()
2420 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2425 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2426 free_irq(irq, dwc); in dwc3_gadget_start()
2432 static void __dwc3_gadget_stop(struct dwc3 *dwc) in __dwc3_gadget_stop() argument
2434 dwc3_gadget_disable_irq(dwc); in __dwc3_gadget_stop()
2435 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_stop()
2436 __dwc3_gadget_ep_disable(dwc->eps[1]); in __dwc3_gadget_stop()
2441 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_stop() local
2444 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_stop()
2445 dwc->gadget_driver = NULL; in dwc3_gadget_stop()
2446 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
2448 free_irq(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_stop()
2456 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_config_params() local
2462 if (!dwc->dis_enblslpm_quirk) { in dwc3_gadget_config_params()
2473 if (dwc->is_utmi_l1_suspend) in dwc3_gadget_config_params()
2475 clamp_t(u8, dwc->hird_threshold, 2, 15); in dwc3_gadget_config_params()
2479 if (dwc->dis_u1_entry_quirk) in dwc3_gadget_config_params()
2485 if (dwc->dis_u2_entry_quirk) in dwc3_gadget_config_params()
2495 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_speed() local
2499 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_speed()
2500 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_set_speed()
2517 !dwc->dis_metastability_quirk) { in dwc3_gadget_set_speed()
2540 dev_err(dwc->dev, "invalid speed (%d)\n", speed); in dwc3_gadget_set_speed()
2548 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_set_speed()
2550 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_speed()
2568 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_control_endpoint() local
2574 dwc->gadget->ep0 = &dep->endpoint; in dwc3_gadget_init_control_endpoint()
2583 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_in_endpoint() local
2587 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_init_in_endpoint()
2589 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6); in dwc3_gadget_init_in_endpoint()
2594 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1)); in dwc3_gadget_init_in_endpoint()
2610 if (dwc->maximum_speed >= USB_SPEED_SUPER) in dwc3_gadget_init_in_endpoint()
2620 &dwc->gadget->ep_list); in dwc3_gadget_init_in_endpoint()
2630 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_out_endpoint() local
2634 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_init_out_endpoint()
2636 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6); in dwc3_gadget_init_out_endpoint()
2642 size = dwc3_readl(dwc->regs, DWC3_GRXFIFOSIZ(0)); in dwc3_gadget_init_out_endpoint()
2669 &dwc->gadget->ep_list); in dwc3_gadget_init_out_endpoint()
2677 static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum) in dwc3_gadget_init_endpoint() argument
2688 dep->dwc = dwc; in dwc3_gadget_init_endpoint()
2691 dep->regs = dwc->regs + DWC3_DEP_BASE(epnum); in dwc3_gadget_init_endpoint()
2692 dwc->eps[epnum] = dep; in dwc3_gadget_init_endpoint()
2728 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc, u8 total) in dwc3_gadget_init_endpoints() argument
2732 INIT_LIST_HEAD(&dwc->gadget->ep_list); in dwc3_gadget_init_endpoints()
2737 ret = dwc3_gadget_init_endpoint(dwc, epnum); in dwc3_gadget_init_endpoints()
2745 static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) in dwc3_gadget_free_endpoints() argument
2751 dep = dwc->eps[epnum]; in dwc3_gadget_free_endpoints()
2768 debugfs_remove_recursive(debugfs_lookup(dep->name, dwc->root)); in dwc3_gadget_free_endpoints()
2817 if (trb->bpl == lower_32_bits(dep->dwc->bounce_addr) && in dwc3_gadget_ep_reclaim_completed_trb()
2818 trb->bph == upper_32_bits(dep->dwc->bounce_addr)) { in dwc3_gadget_ep_reclaim_completed_trb()
2986 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_trbs_complete() local
3015 dep = dwc->eps[i]; in dwc3_gadget_endpoint_trbs_complete()
3024 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_endpoint_trbs_complete()
3025 reg |= dwc->u1u2; in dwc3_gadget_endpoint_trbs_complete()
3026 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_endpoint_trbs_complete()
3028 dwc->u1u2 = 0; in dwc3_gadget_endpoint_trbs_complete()
3108 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_command_complete() local
3112 struct usb_ep *ep0 = &dwc->eps[0]->endpoint; in dwc3_gadget_endpoint_command_complete()
3114 dev_err(dwc->dev, "failed to clear STALL on %s\n", dep->name); in dwc3_gadget_endpoint_command_complete()
3115 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
3121 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
3122 dwc3_ep0_send_delayed_status(dwc); in dwc3_gadget_endpoint_command_complete()
3135 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_stream_event() local
3183 dwc3_send_gadget_generic_command(dwc, cmd, dep->number); in dwc3_gadget_endpoint_stream_event()
3196 static void dwc3_endpoint_interrupt(struct dwc3 *dwc, in dwc3_endpoint_interrupt() argument
3202 dep = dwc->eps[epnum]; in dwc3_endpoint_interrupt()
3214 dwc3_ep0_interrupt(dwc, event); in dwc3_endpoint_interrupt()
3239 static void dwc3_disconnect_gadget(struct dwc3 *dwc) in dwc3_disconnect_gadget() argument
3241 if (dwc->gadget_driver && dwc->gadget_driver->disconnect) { in dwc3_disconnect_gadget()
3242 spin_unlock(&dwc->lock); in dwc3_disconnect_gadget()
3243 dwc->gadget_driver->disconnect(dwc->gadget); in dwc3_disconnect_gadget()
3244 spin_lock(&dwc->lock); in dwc3_disconnect_gadget()
3248 static void dwc3_suspend_gadget(struct dwc3 *dwc) in dwc3_suspend_gadget() argument
3250 if (dwc->gadget_driver && dwc->gadget_driver->suspend) { in dwc3_suspend_gadget()
3251 spin_unlock(&dwc->lock); in dwc3_suspend_gadget()
3252 dwc->gadget_driver->suspend(dwc->gadget); in dwc3_suspend_gadget()
3253 spin_lock(&dwc->lock); in dwc3_suspend_gadget()
3257 static void dwc3_resume_gadget(struct dwc3 *dwc) in dwc3_resume_gadget() argument
3259 if (dwc->gadget_driver && dwc->gadget_driver->resume) { in dwc3_resume_gadget()
3260 spin_unlock(&dwc->lock); in dwc3_resume_gadget()
3261 dwc->gadget_driver->resume(dwc->gadget); in dwc3_resume_gadget()
3262 spin_lock(&dwc->lock); in dwc3_resume_gadget()
3266 static void dwc3_reset_gadget(struct dwc3 *dwc) in dwc3_reset_gadget() argument
3268 if (!dwc->gadget_driver) in dwc3_reset_gadget()
3271 if (dwc->gadget->speed != USB_SPEED_UNKNOWN) { in dwc3_reset_gadget()
3272 spin_unlock(&dwc->lock); in dwc3_reset_gadget()
3273 usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver); in dwc3_reset_gadget()
3274 spin_lock(&dwc->lock); in dwc3_reset_gadget()
3319 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) in dwc3_clear_stall_all_ep() argument
3327 dep = dwc->eps[epnum]; in dwc3_clear_stall_all_ep()
3341 static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) in dwc3_gadget_disconnect_interrupt() argument
3345 dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET); in dwc3_gadget_disconnect_interrupt()
3347 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_disconnect_interrupt()
3350 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_disconnect_interrupt()
3352 dwc3_disconnect_gadget(dwc); in dwc3_gadget_disconnect_interrupt()
3354 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_disconnect_interrupt()
3355 dwc->setup_packet_pending = false; in dwc3_gadget_disconnect_interrupt()
3356 usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED); in dwc3_gadget_disconnect_interrupt()
3358 dwc->connected = false; in dwc3_gadget_disconnect_interrupt()
3361 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) in dwc3_gadget_reset_interrupt() argument
3372 dwc->connected = false; in dwc3_gadget_reset_interrupt()
3401 if (dwc->setup_packet_pending) in dwc3_gadget_reset_interrupt()
3402 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_reset_interrupt()
3405 dwc3_reset_gadget(dwc); in dwc3_gadget_reset_interrupt()
3412 dwc3_stop_active_transfers(dwc); in dwc3_gadget_reset_interrupt()
3413 dwc->connected = true; in dwc3_gadget_reset_interrupt()
3415 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_reset_interrupt()
3417 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_reset_interrupt()
3418 dwc->test_mode = false; in dwc3_gadget_reset_interrupt()
3419 dwc3_clear_stall_all_ep(dwc); in dwc3_gadget_reset_interrupt()
3422 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_reset_interrupt()
3424 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_reset_interrupt()
3427 static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) in dwc3_gadget_conndone_interrupt() argument
3434 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_conndone_interrupt()
3436 dwc->speed = speed; in dwc3_gadget_conndone_interrupt()
3450 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
3451 dwc->gadget->speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_conndone_interrupt()
3468 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_conndone_interrupt()
3471 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
3472 dwc->gadget->speed = USB_SPEED_SUPER; in dwc3_gadget_conndone_interrupt()
3476 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
3477 dwc->gadget->speed = USB_SPEED_HIGH; in dwc3_gadget_conndone_interrupt()
3481 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
3482 dwc->gadget->speed = USB_SPEED_FULL; in dwc3_gadget_conndone_interrupt()
3486 dwc->gadget->ep0->maxpacket = 8; in dwc3_gadget_conndone_interrupt()
3487 dwc->gadget->speed = USB_SPEED_LOW; in dwc3_gadget_conndone_interrupt()
3491 dwc->eps[1]->endpoint.maxpacket = dwc->gadget->ep0->maxpacket; in dwc3_gadget_conndone_interrupt()
3496 !dwc->usb2_gadget_lpm_disable && in dwc3_gadget_conndone_interrupt()
3499 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
3501 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
3503 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
3506 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold | in dwc3_gadget_conndone_interrupt()
3507 (dwc->is_utmi_l1_suspend << 4)); in dwc3_gadget_conndone_interrupt()
3515 WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum, in dwc3_gadget_conndone_interrupt()
3518 if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) in dwc3_gadget_conndone_interrupt()
3519 reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold); in dwc3_gadget_conndone_interrupt()
3521 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
3523 if (dwc->usb2_gadget_lpm_disable) { in dwc3_gadget_conndone_interrupt()
3524 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
3526 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
3529 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
3531 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
3534 dep = dwc->eps[0]; in dwc3_gadget_conndone_interrupt()
3537 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
3541 dep = dwc->eps[1]; in dwc3_gadget_conndone_interrupt()
3544 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
3557 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) in dwc3_gadget_wakeup_interrupt() argument
3564 if (dwc->gadget_driver && dwc->gadget_driver->resume) { in dwc3_gadget_wakeup_interrupt()
3565 spin_unlock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
3566 dwc->gadget_driver->resume(dwc->gadget); in dwc3_gadget_wakeup_interrupt()
3567 spin_lock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
3571 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, in dwc3_gadget_linksts_change_interrupt() argument
3594 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1); in dwc3_gadget_linksts_change_interrupt()
3597 if ((dwc->link_state == DWC3_LINK_STATE_U3) && in dwc3_gadget_linksts_change_interrupt()
3626 switch (dwc->link_state) { in dwc3_gadget_linksts_change_interrupt()
3629 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_linksts_change_interrupt()
3635 if (!dwc->u1u2) in dwc3_gadget_linksts_change_interrupt()
3636 dwc->u1u2 = reg & u1u2; in dwc3_gadget_linksts_change_interrupt()
3640 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_linksts_change_interrupt()
3651 if (dwc->speed == USB_SPEED_SUPER) in dwc3_gadget_linksts_change_interrupt()
3652 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3656 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3659 dwc3_resume_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3666 dwc->link_state = next; in dwc3_gadget_linksts_change_interrupt()
3669 static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc, in dwc3_gadget_suspend_interrupt() argument
3674 if (dwc->link_state != next && next == DWC3_LINK_STATE_U3) in dwc3_gadget_suspend_interrupt()
3675 dwc3_suspend_gadget(dwc); in dwc3_gadget_suspend_interrupt()
3677 dwc->link_state = next; in dwc3_gadget_suspend_interrupt()
3680 static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, in dwc3_gadget_hibernation_interrupt() argument
3698 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) in dwc3_gadget_hibernation_interrupt()
3704 static void dwc3_gadget_interrupt(struct dwc3 *dwc, in dwc3_gadget_interrupt() argument
3709 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_interrupt()
3712 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_interrupt()
3715 dwc3_gadget_conndone_interrupt(dwc); in dwc3_gadget_interrupt()
3718 dwc3_gadget_wakeup_interrupt(dwc); in dwc3_gadget_interrupt()
3721 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation, in dwc3_gadget_interrupt()
3725 dwc3_gadget_hibernation_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
3728 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
3737 if (dwc->gadget->state >= USB_STATE_CONFIGURED) in dwc3_gadget_interrupt()
3738 dwc3_gadget_suspend_interrupt(dwc, in dwc3_gadget_interrupt()
3748 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type); in dwc3_gadget_interrupt()
3752 static void dwc3_process_event_entry(struct dwc3 *dwc, in dwc3_process_event_entry() argument
3755 trace_dwc3_event(event->raw, dwc); in dwc3_process_event_entry()
3758 dwc3_endpoint_interrupt(dwc, &event->depevt); in dwc3_process_event_entry()
3760 dwc3_gadget_interrupt(dwc, &event->devt); in dwc3_process_event_entry()
3762 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw); in dwc3_process_event_entry()
3767 struct dwc3 *dwc = evt->dwc; in dwc3_process_event_buf() local
3782 dwc3_process_event_entry(dwc, &event); in dwc3_process_event_buf()
3801 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0)); in dwc3_process_event_buf()
3803 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg); in dwc3_process_event_buf()
3805 if (dwc->imod_interval) { in dwc3_process_event_buf()
3806 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in dwc3_process_event_buf()
3807 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in dwc3_process_event_buf()
3819 struct dwc3 *dwc = evt->dwc; in dwc3_thread_interrupt() local
3824 spin_lock_irqsave(&dwc->lock, flags); in dwc3_thread_interrupt()
3826 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_thread_interrupt()
3834 struct dwc3 *dwc = evt->dwc; in dwc3_check_event_buf() local
3839 if (pm_runtime_suspended(dwc->dev)) { in dwc3_check_event_buf()
3840 dwc->pending_events = true; in dwc3_check_event_buf()
3846 pm_runtime_get(dwc->dev); in dwc3_check_event_buf()
3847 disable_irq_nosync(dwc->irq_gadget); in dwc3_check_event_buf()
3860 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); in dwc3_check_event_buf()
3869 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0)); in dwc3_check_event_buf()
3871 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg); in dwc3_check_event_buf()
3879 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); in dwc3_check_event_buf()
3891 static int dwc3_gadget_get_irq(struct dwc3 *dwc) in dwc3_gadget_get_irq() argument
3893 struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); in dwc3_gadget_get_irq()
3930 * @dwc: pointer to our controller context structure
3934 int dwc3_gadget_init(struct dwc3 *dwc) in dwc3_gadget_init() argument
3940 irq = dwc3_gadget_get_irq(dwc); in dwc3_gadget_init()
3946 dwc->irq_gadget = irq; in dwc3_gadget_init()
3948 dwc->ep0_trb = dma_alloc_coherent(dwc->sysdev, in dwc3_gadget_init()
3949 sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
3950 &dwc->ep0_trb_addr, GFP_KERNEL); in dwc3_gadget_init()
3951 if (!dwc->ep0_trb) { in dwc3_gadget_init()
3952 dev_err(dwc->dev, "failed to allocate ep0 trb\n"); in dwc3_gadget_init()
3957 dwc->setup_buf = kzalloc(DWC3_EP0_SETUP_SIZE, GFP_KERNEL); in dwc3_gadget_init()
3958 if (!dwc->setup_buf) { in dwc3_gadget_init()
3963 dwc->bounce = dma_alloc_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, in dwc3_gadget_init()
3964 &dwc->bounce_addr, GFP_KERNEL); in dwc3_gadget_init()
3965 if (!dwc->bounce) { in dwc3_gadget_init()
3970 init_completion(&dwc->ep0_in_setup); in dwc3_gadget_init()
3971 dwc->gadget = kzalloc(sizeof(struct usb_gadget), GFP_KERNEL); in dwc3_gadget_init()
3972 if (!dwc->gadget) { in dwc3_gadget_init()
3978 usb_initialize_gadget(dwc->dev, dwc->gadget, dwc_gadget_release); in dwc3_gadget_init()
3979 dev = &dwc->gadget->dev; in dwc3_gadget_init()
3980 dev->platform_data = dwc; in dwc3_gadget_init()
3981 dwc->gadget->ops = &dwc3_gadget_ops; in dwc3_gadget_init()
3982 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_init()
3983 dwc->gadget->sg_supported = true; in dwc3_gadget_init()
3984 dwc->gadget->name = "dwc3-gadget"; in dwc3_gadget_init()
3985 dwc->gadget->lpm_capable = !dwc->usb2_gadget_lpm_disable; in dwc3_gadget_init()
4004 !dwc->dis_metastability_quirk) in dwc3_gadget_init()
4005 dev_info(dwc->dev, "changing max_speed on rev %08x\n", in dwc3_gadget_init()
4006 dwc->revision); in dwc3_gadget_init()
4008 dwc->gadget->max_speed = dwc->maximum_speed; in dwc3_gadget_init()
4015 ret = dwc3_gadget_init_endpoints(dwc, dwc->num_eps); in dwc3_gadget_init()
4019 ret = usb_add_gadget(dwc->gadget); in dwc3_gadget_init()
4021 dev_err(dwc->dev, "failed to add gadget\n"); in dwc3_gadget_init()
4025 dwc3_gadget_set_speed(dwc->gadget, dwc->maximum_speed); in dwc3_gadget_init()
4030 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_init()
4032 usb_put_gadget(dwc->gadget); in dwc3_gadget_init()
4033 dwc->gadget = NULL; in dwc3_gadget_init()
4035 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_init()
4036 dwc->bounce_addr); in dwc3_gadget_init()
4039 kfree(dwc->setup_buf); in dwc3_gadget_init()
4042 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
4043 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_init()
4051 void dwc3_gadget_exit(struct dwc3 *dwc) in dwc3_gadget_exit() argument
4053 if (!dwc->gadget) in dwc3_gadget_exit()
4056 usb_del_gadget(dwc->gadget); in dwc3_gadget_exit()
4057 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_exit()
4058 usb_put_gadget(dwc->gadget); in dwc3_gadget_exit()
4059 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_exit()
4060 dwc->bounce_addr); in dwc3_gadget_exit()
4061 kfree(dwc->setup_buf); in dwc3_gadget_exit()
4062 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_exit()
4063 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_exit()
4066 int dwc3_gadget_suspend(struct dwc3 *dwc) in dwc3_gadget_suspend() argument
4068 if (!dwc->gadget_driver) in dwc3_gadget_suspend()
4071 dwc3_gadget_run_stop(dwc, false, false); in dwc3_gadget_suspend()
4072 dwc3_disconnect_gadget(dwc); in dwc3_gadget_suspend()
4073 __dwc3_gadget_stop(dwc); in dwc3_gadget_suspend()
4078 int dwc3_gadget_resume(struct dwc3 *dwc) in dwc3_gadget_resume() argument
4082 if (!dwc->gadget_driver || !dwc->softconnect) in dwc3_gadget_resume()
4085 ret = __dwc3_gadget_start(dwc); in dwc3_gadget_resume()
4089 ret = dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_resume()
4096 __dwc3_gadget_stop(dwc); in dwc3_gadget_resume()
4102 void dwc3_gadget_process_pending_events(struct dwc3 *dwc) in dwc3_gadget_process_pending_events() argument
4104 if (dwc->pending_events) { in dwc3_gadget_process_pending_events()
4105 dwc3_interrupt(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_process_pending_events()
4106 dwc3_thread_interrupt(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_process_pending_events()
4107 pm_runtime_put(dwc->dev); in dwc3_gadget_process_pending_events()
4108 dwc->pending_events = false; in dwc3_gadget_process_pending_events()
4109 enable_irq(dwc->irq_gadget); in dwc3_gadget_process_pending_events()