Lines Matching refs:dwc

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()
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()
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
188 usb_gadget_unmap_request_by_dev(dwc->sysdev, in dwc3_gadget_del_and_unmap_request()
195 pm_runtime_put(dwc->dev); in dwc3_gadget_del_and_unmap_request()
211 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_giveback() local
216 spin_unlock(&dwc->lock); in dwc3_gadget_giveback()
218 spin_lock(&dwc->lock); in dwc3_gadget_giveback()
230 int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned int cmd, in dwc3_send_gadget_generic_command() argument
238 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param); in dwc3_send_gadget_generic_command()
239 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT); in dwc3_send_gadget_generic_command()
242 reg = dwc3_readl(dwc->regs, DWC3_DGCMD); in dwc3_send_gadget_generic_command()
261 static int __dwc3_gadget_wakeup(struct dwc3 *dwc);
276 struct dwc3 *dwc = dep->dwc; in dwc3_send_gadget_ep_cmd() local
294 if (dwc->gadget->speed <= USB_SPEED_HIGH) { in dwc3_send_gadget_ep_cmd()
295 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
307 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
313 needs_wakeup = (dwc->link_state == DWC3_LINK_STATE_U1 || in dwc3_send_gadget_ep_cmd()
314 dwc->link_state == DWC3_LINK_STATE_U2 || in dwc3_send_gadget_ep_cmd()
315 dwc->link_state == DWC3_LINK_STATE_U3); in dwc3_send_gadget_ep_cmd()
318 ret = __dwc3_gadget_wakeup(dwc); in dwc3_send_gadget_ep_cmd()
319 dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n", in dwc3_send_gadget_ep_cmd()
360 dev_WARN(dwc->dev, "No resource for %s\n", in dwc3_send_gadget_ep_cmd()
379 dev_WARN(dwc->dev, "UNKNOWN cmd status\n"); in dwc3_send_gadget_ep_cmd()
402 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
404 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
412 struct dwc3 *dwc = dep->dwc; in dwc3_send_clear_stall_ep_cmd() local
426 (dwc->gadget->speed >= USB_SPEED_SUPER)) in dwc3_send_clear_stall_ep_cmd()
444 struct dwc3 *dwc = dep->dwc; in dwc3_alloc_trb_pool() local
449 dep->trb_pool = dma_alloc_coherent(dwc->sysdev, in dwc3_alloc_trb_pool()
453 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n", in dwc3_alloc_trb_pool()
463 struct dwc3 *dwc = dep->dwc; in dwc3_free_trb_pool() local
465 dma_free_coherent(dwc->sysdev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM, in dwc3_free_trb_pool()
520 struct dwc3 *dwc; in dwc3_gadget_start_config() local
530 dwc = dep->dwc; in dwc3_gadget_start_config()
537 struct dwc3_ep *dep = dwc->eps[i]; in dwc3_gadget_start_config()
555 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_set_ep_config() local
566 if (dwc->gadget->speed >= USB_SPEED_SUPER) { in dwc3_gadget_set_ep_config()
629 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_enable() local
651 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_enable()
653 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_enable()
728 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_remove_requests() argument
766 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_disable() local
771 dwc3_remove_requests(dwc, dep); in __dwc3_gadget_ep_disable()
777 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_disable()
779 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_disable()
813 struct dwc3 *dwc; in dwc3_gadget_ep_enable() local
828 dwc = dep->dwc; in dwc3_gadget_ep_enable()
830 if (dev_WARN_ONCE(dwc->dev, dep->flags & DWC3_EP_ENABLED, in dwc3_gadget_ep_enable()
835 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_enable()
837 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_enable()
845 struct dwc3 *dwc; in dwc3_gadget_ep_disable() local
855 dwc = dep->dwc; in dwc3_gadget_ep_disable()
857 if (dev_WARN_ONCE(dwc->dev, !(dep->flags & DWC3_EP_ENABLED), in dwc3_gadget_ep_disable()
862 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_disable()
864 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_disable()
952 struct dwc3 *dwc = dep->dwc; in __dwc3_prepare_one_trb() local
953 struct usb_gadget *gadget = dwc->gadget; in __dwc3_prepare_one_trb()
1021 dev_WARN(dwc->dev, "Unknown endpoint type %d\n", in __dwc3_prepare_one_trb()
1078 dma = dep->dwc->bounce_addr; in dwc3_prepare_one_trb()
1294 struct dwc3 *dwc = dep->dwc; in dwc3_prepare_trbs() local
1296 ret = usb_gadget_map_request_by_dev(dwc->sysdev, &req->request, in dwc3_prepare_trbs()
1405 static int __dwc3_gadget_get_frame(struct dwc3 *dwc) in __dwc3_gadget_get_frame() argument
1409 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_get_frame()
1474 params.param0 = upper_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1475 params.param1 = lower_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1531 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_start_isoc() local
1541 if (!dwc->dis_start_transfer_quirk && in __dwc3_gadget_start_isoc()
1544 if (dwc->gadget->speed <= USB_SPEED_HIGH && dep->direction) in __dwc3_gadget_start_isoc()
1549 dwc->gadget->speed >= USB_SPEED_HIGH) { in __dwc3_gadget_start_isoc()
1550 u32 frame = __dwc3_gadget_get_frame(dwc); in __dwc3_gadget_start_isoc()
1603 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_queue() local
1605 if (!dep->endpoint.desc || !dwc->pullups_connected) { in __dwc3_gadget_ep_queue()
1606 dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n", in __dwc3_gadget_ep_queue()
1620 pm_runtime_get(dwc->dev); in __dwc3_gadget_ep_queue()
1671 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_queue() local
1677 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1679 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1731 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_dequeue() local
1738 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1770 dev_err(dwc->dev, "request %pK was not queued to %s\n", in dwc3_gadget_ep_dequeue()
1774 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1782 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_set_halt() local
1788 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); in __dwc3_gadget_ep_set_halt()
1803 trb = &dwc->ep0_trb[dep->trb_enqueue]; in __dwc3_gadget_ep_set_halt()
1816 dev_err(dwc->dev, "failed to set STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1845 dev_err(dwc->dev, "failed to clear STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1865 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_halt() local
1871 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1873 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1881 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_wedge() local
1885 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1892 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1931 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_get_frame() local
1933 return __dwc3_gadget_get_frame(dwc); in dwc3_gadget_get_frame()
1936 static int __dwc3_gadget_wakeup(struct dwc3 *dwc) in __dwc3_gadget_wakeup() argument
1951 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
1965 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); in __dwc3_gadget_wakeup()
1967 dev_err(dwc->dev, "failed to put link in Recovery\n"); in __dwc3_gadget_wakeup()
1974 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in __dwc3_gadget_wakeup()
1976 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in __dwc3_gadget_wakeup()
1983 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
1991 dev_err(dwc->dev, "failed to send remote wakeup\n"); in __dwc3_gadget_wakeup()
2000 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_wakeup() local
2004 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_wakeup()
2005 ret = __dwc3_gadget_wakeup(dwc); in dwc3_gadget_wakeup()
2006 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_wakeup()
2014 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_selfpowered() local
2017 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2019 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2024 static void dwc3_stop_active_transfers(struct dwc3 *dwc) in dwc3_stop_active_transfers() argument
2028 for (epnum = 2; epnum < dwc->num_eps; epnum++) { in dwc3_stop_active_transfers()
2031 dep = dwc->eps[epnum]; in dwc3_stop_active_transfers()
2035 dwc3_remove_requests(dwc, dep); in dwc3_stop_active_transfers()
2039 static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) in dwc3_gadget_run_stop() argument
2044 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_run_stop()
2047 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_run_stop()
2058 if (dwc->has_hibernation) in dwc3_gadget_run_stop()
2061 dwc->pullups_connected = true; in dwc3_gadget_run_stop()
2065 if (dwc->has_hibernation && !suspend) in dwc3_gadget_run_stop()
2068 dwc->pullups_connected = false; in dwc3_gadget_run_stop()
2071 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_run_stop()
2074 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_run_stop()
2084 static void dwc3_gadget_disable_irq(struct dwc3 *dwc);
2085 static void __dwc3_gadget_stop(struct dwc3 *dwc);
2089 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_pullup() local
2099 if (!is_on && dwc->ep0state != EP0_SETUP_PHASE) { in dwc3_gadget_pullup()
2100 reinit_completion(&dwc->ep0_in_setup); in dwc3_gadget_pullup()
2102 ret = wait_for_completion_timeout(&dwc->ep0_in_setup, in dwc3_gadget_pullup()
2105 dev_err(dwc->dev, "timed out waiting for SETUP phase\n"); in dwc3_gadget_pullup()
2115 dwc3_gadget_disable_irq(dwc); in dwc3_gadget_pullup()
2116 synchronize_irq(dwc->irq_gadget); in dwc3_gadget_pullup()
2119 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_pullup()
2131 dwc3_stop_active_transfers(dwc); in dwc3_gadget_pullup()
2132 __dwc3_gadget_stop(dwc); in dwc3_gadget_pullup()
2141 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); in dwc3_gadget_pullup()
2144 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); in dwc3_gadget_pullup()
2145 dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % in dwc3_gadget_pullup()
2146 dwc->ev_buf->length; in dwc3_gadget_pullup()
2150 ret = dwc3_gadget_run_stop(dwc, is_on, false); in dwc3_gadget_pullup()
2151 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_pullup()
2156 static void dwc3_gadget_enable_irq(struct dwc3 *dwc) in dwc3_gadget_enable_irq() argument
2173 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); in dwc3_gadget_enable_irq()
2176 static void dwc3_gadget_disable_irq(struct dwc3 *dwc) in dwc3_gadget_disable_irq() argument
2179 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00); in dwc3_gadget_disable_irq()
2206 static void dwc3_gadget_setup_nump(struct dwc3 *dwc) in dwc3_gadget_setup_nump() argument
2213 ram2_depth = DWC3_GHWPARAMS7_RAM2_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_setup_nump()
2214 mdwidth = DWC3_GHWPARAMS0_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_setup_nump()
2216 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6); in dwc3_gadget_setup_nump()
2222 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_setup_nump()
2225 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_setup_nump()
2228 static int __dwc3_gadget_start(struct dwc3 *dwc) in __dwc3_gadget_start() argument
2238 if (dwc->imod_interval) { in __dwc3_gadget_start()
2239 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in __dwc3_gadget_start()
2240 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in __dwc3_gadget_start()
2241 } else if (dwc3_has_imod(dwc)) { in __dwc3_gadget_start()
2242 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), 0); in __dwc3_gadget_start()
2252 reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG); in __dwc3_gadget_start()
2258 dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg); in __dwc3_gadget_start()
2260 dwc3_gadget_setup_nump(dwc); in __dwc3_gadget_start()
2265 dep = dwc->eps[0]; in __dwc3_gadget_start()
2268 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2272 dep = dwc->eps[1]; in __dwc3_gadget_start()
2275 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2280 dwc->ep0state = EP0_SETUP_PHASE; in __dwc3_gadget_start()
2281 dwc->link_state = DWC3_LINK_STATE_SS_DIS; in __dwc3_gadget_start()
2282 dwc3_ep0_out_start(dwc); in __dwc3_gadget_start()
2284 dwc3_gadget_enable_irq(dwc); in __dwc3_gadget_start()
2289 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_start()
2298 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_start() local
2303 irq = dwc->irq_gadget; in dwc3_gadget_start()
2305 IRQF_SHARED, "dwc3", dwc->ev_buf); in dwc3_gadget_start()
2307 dev_err(dwc->dev, "failed to request irq #%d --> %d\n", in dwc3_gadget_start()
2312 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_start()
2313 if (dwc->gadget_driver) { in dwc3_gadget_start()
2314 dev_err(dwc->dev, "%s is already bound to %s\n", in dwc3_gadget_start()
2315 dwc->gadget->name, in dwc3_gadget_start()
2316 dwc->gadget_driver->driver.name); in dwc3_gadget_start()
2321 dwc->gadget_driver = driver; in dwc3_gadget_start()
2323 if (pm_runtime_active(dwc->dev)) in dwc3_gadget_start()
2324 __dwc3_gadget_start(dwc); in dwc3_gadget_start()
2326 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2331 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2332 free_irq(irq, dwc); in dwc3_gadget_start()
2338 static void __dwc3_gadget_stop(struct dwc3 *dwc) in __dwc3_gadget_stop() argument
2340 dwc3_gadget_disable_irq(dwc); in __dwc3_gadget_stop()
2341 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_stop()
2342 __dwc3_gadget_ep_disable(dwc->eps[1]); in __dwc3_gadget_stop()
2347 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_stop() local
2350 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_stop()
2352 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_stop()
2355 __dwc3_gadget_stop(dwc); in dwc3_gadget_stop()
2358 dwc->gadget_driver = NULL; in dwc3_gadget_stop()
2359 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
2361 free_irq(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_stop()
2369 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_config_params() local
2375 if (!dwc->dis_enblslpm_quirk) { in dwc3_gadget_config_params()
2386 if (dwc->is_utmi_l1_suspend) in dwc3_gadget_config_params()
2388 clamp_t(u8, dwc->hird_threshold, 2, 15); in dwc3_gadget_config_params()
2392 if (dwc->dis_u1_entry_quirk) in dwc3_gadget_config_params()
2398 if (dwc->dis_u2_entry_quirk) in dwc3_gadget_config_params()
2408 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_speed() local
2412 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_speed()
2413 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_set_speed()
2430 !dwc->dis_metastability_quirk) { in dwc3_gadget_set_speed()
2453 dev_err(dwc->dev, "invalid speed (%d)\n", speed); in dwc3_gadget_set_speed()
2461 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_set_speed()
2463 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_speed()
2481 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_control_endpoint() local
2487 dwc->gadget->ep0 = &dep->endpoint; in dwc3_gadget_init_control_endpoint()
2496 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_in_endpoint() local
2500 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_init_in_endpoint()
2502 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6); in dwc3_gadget_init_in_endpoint()
2507 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1)); in dwc3_gadget_init_in_endpoint()
2523 if (dwc->maximum_speed >= USB_SPEED_SUPER) in dwc3_gadget_init_in_endpoint()
2533 &dwc->gadget->ep_list); in dwc3_gadget_init_in_endpoint()
2543 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_out_endpoint() local
2547 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_init_out_endpoint()
2549 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6); in dwc3_gadget_init_out_endpoint()
2555 size = dwc3_readl(dwc->regs, DWC3_GRXFIFOSIZ(0)); in dwc3_gadget_init_out_endpoint()
2582 &dwc->gadget->ep_list); in dwc3_gadget_init_out_endpoint()
2590 static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum) in dwc3_gadget_init_endpoint() argument
2601 dep->dwc = dwc; in dwc3_gadget_init_endpoint()
2604 dep->regs = dwc->regs + DWC3_DEP_BASE(epnum); in dwc3_gadget_init_endpoint()
2605 dwc->eps[epnum] = dep; in dwc3_gadget_init_endpoint()
2639 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc, u8 total) in dwc3_gadget_init_endpoints() argument
2643 INIT_LIST_HEAD(&dwc->gadget->ep_list); in dwc3_gadget_init_endpoints()
2648 ret = dwc3_gadget_init_endpoint(dwc, epnum); in dwc3_gadget_init_endpoints()
2656 static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) in dwc3_gadget_free_endpoints() argument
2662 dep = dwc->eps[epnum]; in dwc3_gadget_free_endpoints()
2727 if (trb->bpl == lower_32_bits(dep->dwc->bounce_addr) && in dwc3_gadget_ep_reclaim_completed_trb()
2728 trb->bph == upper_32_bits(dep->dwc->bounce_addr)) { in dwc3_gadget_ep_reclaim_completed_trb()
2863 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_trbs_complete() local
2889 dep = dwc->eps[i]; in dwc3_gadget_endpoint_trbs_complete()
2898 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_endpoint_trbs_complete()
2899 reg |= dwc->u1u2; in dwc3_gadget_endpoint_trbs_complete()
2900 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_endpoint_trbs_complete()
2902 dwc->u1u2 = 0; in dwc3_gadget_endpoint_trbs_complete()
2971 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_command_complete() local
2975 struct usb_ep *ep0 = &dwc->eps[0]->endpoint; in dwc3_gadget_endpoint_command_complete()
2977 dev_err(dwc->dev, "failed to clear STALL on %s\n", dep->name); in dwc3_gadget_endpoint_command_complete()
2978 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
2984 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
2985 dwc3_ep0_send_delayed_status(dwc); in dwc3_gadget_endpoint_command_complete()
2998 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_stream_event() local
3046 dwc3_send_gadget_generic_command(dwc, cmd, dep->number); in dwc3_gadget_endpoint_stream_event()
3059 static void dwc3_endpoint_interrupt(struct dwc3 *dwc, in dwc3_endpoint_interrupt() argument
3065 dep = dwc->eps[epnum]; in dwc3_endpoint_interrupt()
3077 dwc3_ep0_interrupt(dwc, event); in dwc3_endpoint_interrupt()
3102 static void dwc3_disconnect_gadget(struct dwc3 *dwc) in dwc3_disconnect_gadget() argument
3104 if (dwc->gadget_driver && dwc->gadget_driver->disconnect) { in dwc3_disconnect_gadget()
3105 spin_unlock(&dwc->lock); in dwc3_disconnect_gadget()
3106 dwc->gadget_driver->disconnect(dwc->gadget); in dwc3_disconnect_gadget()
3107 spin_lock(&dwc->lock); in dwc3_disconnect_gadget()
3111 static void dwc3_suspend_gadget(struct dwc3 *dwc) in dwc3_suspend_gadget() argument
3113 if (dwc->gadget_driver && dwc->gadget_driver->suspend) { in dwc3_suspend_gadget()
3114 spin_unlock(&dwc->lock); in dwc3_suspend_gadget()
3115 dwc->gadget_driver->suspend(dwc->gadget); in dwc3_suspend_gadget()
3116 spin_lock(&dwc->lock); in dwc3_suspend_gadget()
3120 static void dwc3_resume_gadget(struct dwc3 *dwc) in dwc3_resume_gadget() argument
3122 if (dwc->gadget_driver && dwc->gadget_driver->resume) { in dwc3_resume_gadget()
3123 spin_unlock(&dwc->lock); in dwc3_resume_gadget()
3124 dwc->gadget_driver->resume(dwc->gadget); in dwc3_resume_gadget()
3125 spin_lock(&dwc->lock); in dwc3_resume_gadget()
3129 static void dwc3_reset_gadget(struct dwc3 *dwc) in dwc3_reset_gadget() argument
3131 if (!dwc->gadget_driver) in dwc3_reset_gadget()
3134 if (dwc->gadget->speed != USB_SPEED_UNKNOWN) { in dwc3_reset_gadget()
3135 spin_unlock(&dwc->lock); in dwc3_reset_gadget()
3136 usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver); in dwc3_reset_gadget()
3137 spin_lock(&dwc->lock); in dwc3_reset_gadget()
3202 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) in dwc3_clear_stall_all_ep() argument
3210 dep = dwc->eps[epnum]; in dwc3_clear_stall_all_ep()
3224 static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) in dwc3_gadget_disconnect_interrupt() argument
3228 dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET); in dwc3_gadget_disconnect_interrupt()
3230 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_disconnect_interrupt()
3233 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_disconnect_interrupt()
3235 dwc3_disconnect_gadget(dwc); in dwc3_gadget_disconnect_interrupt()
3237 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_disconnect_interrupt()
3238 dwc->setup_packet_pending = false; in dwc3_gadget_disconnect_interrupt()
3239 usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED); in dwc3_gadget_disconnect_interrupt()
3241 dwc->connected = false; in dwc3_gadget_disconnect_interrupt()
3244 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) in dwc3_gadget_reset_interrupt() argument
3248 dwc->connected = true; in dwc3_gadget_reset_interrupt()
3277 if (dwc->setup_packet_pending) in dwc3_gadget_reset_interrupt()
3278 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_reset_interrupt()
3281 dwc3_reset_gadget(dwc); in dwc3_gadget_reset_interrupt()
3288 dwc3_stop_active_transfers(dwc); in dwc3_gadget_reset_interrupt()
3290 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_reset_interrupt()
3292 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_reset_interrupt()
3293 dwc->test_mode = false; in dwc3_gadget_reset_interrupt()
3294 dwc3_clear_stall_all_ep(dwc); in dwc3_gadget_reset_interrupt()
3297 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_reset_interrupt()
3299 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_reset_interrupt()
3302 static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) in dwc3_gadget_conndone_interrupt() argument
3309 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_conndone_interrupt()
3311 dwc->speed = speed; in dwc3_gadget_conndone_interrupt()
3325 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
3326 dwc->gadget->speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_conndone_interrupt()
3343 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_conndone_interrupt()
3346 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
3347 dwc->gadget->speed = USB_SPEED_SUPER; in dwc3_gadget_conndone_interrupt()
3351 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
3352 dwc->gadget->speed = USB_SPEED_HIGH; in dwc3_gadget_conndone_interrupt()
3356 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
3357 dwc->gadget->speed = USB_SPEED_FULL; in dwc3_gadget_conndone_interrupt()
3361 dwc->gadget->ep0->maxpacket = 8; in dwc3_gadget_conndone_interrupt()
3362 dwc->gadget->speed = USB_SPEED_LOW; in dwc3_gadget_conndone_interrupt()
3366 dwc->eps[1]->endpoint.maxpacket = dwc->gadget->ep0->maxpacket; in dwc3_gadget_conndone_interrupt()
3373 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
3375 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
3377 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
3380 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold | in dwc3_gadget_conndone_interrupt()
3381 (dwc->is_utmi_l1_suspend << 4)); in dwc3_gadget_conndone_interrupt()
3389 WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum, in dwc3_gadget_conndone_interrupt()
3392 if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) in dwc3_gadget_conndone_interrupt()
3393 reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold); in dwc3_gadget_conndone_interrupt()
3395 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
3397 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
3399 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
3402 dep = dwc->eps[0]; in dwc3_gadget_conndone_interrupt()
3405 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
3409 dep = dwc->eps[1]; in dwc3_gadget_conndone_interrupt()
3412 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
3425 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) in dwc3_gadget_wakeup_interrupt() argument
3432 if (dwc->gadget_driver && dwc->gadget_driver->resume) { in dwc3_gadget_wakeup_interrupt()
3433 spin_unlock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
3434 dwc->gadget_driver->resume(dwc->gadget); in dwc3_gadget_wakeup_interrupt()
3435 spin_lock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
3439 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, in dwc3_gadget_linksts_change_interrupt() argument
3462 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1); in dwc3_gadget_linksts_change_interrupt()
3465 if ((dwc->link_state == DWC3_LINK_STATE_U3) && in dwc3_gadget_linksts_change_interrupt()
3494 switch (dwc->link_state) { in dwc3_gadget_linksts_change_interrupt()
3497 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_linksts_change_interrupt()
3503 if (!dwc->u1u2) in dwc3_gadget_linksts_change_interrupt()
3504 dwc->u1u2 = reg & u1u2; in dwc3_gadget_linksts_change_interrupt()
3508 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_linksts_change_interrupt()
3519 if (dwc->speed == USB_SPEED_SUPER) in dwc3_gadget_linksts_change_interrupt()
3520 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3524 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3527 dwc3_resume_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3534 dwc->link_state = next; in dwc3_gadget_linksts_change_interrupt()
3537 static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc, in dwc3_gadget_suspend_interrupt() argument
3542 if (dwc->link_state != next && next == DWC3_LINK_STATE_U3) in dwc3_gadget_suspend_interrupt()
3543 dwc3_suspend_gadget(dwc); in dwc3_gadget_suspend_interrupt()
3545 dwc->link_state = next; in dwc3_gadget_suspend_interrupt()
3548 static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, in dwc3_gadget_hibernation_interrupt() argument
3566 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) in dwc3_gadget_hibernation_interrupt()
3572 static void dwc3_gadget_interrupt(struct dwc3 *dwc, in dwc3_gadget_interrupt() argument
3577 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_interrupt()
3580 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_interrupt()
3583 dwc3_gadget_conndone_interrupt(dwc); in dwc3_gadget_interrupt()
3586 dwc3_gadget_wakeup_interrupt(dwc); in dwc3_gadget_interrupt()
3589 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation, in dwc3_gadget_interrupt()
3593 dwc3_gadget_hibernation_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
3596 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
3605 if (dwc->gadget->state >= USB_STATE_CONFIGURED) in dwc3_gadget_interrupt()
3606 dwc3_gadget_suspend_interrupt(dwc, in dwc3_gadget_interrupt()
3616 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type); in dwc3_gadget_interrupt()
3620 static void dwc3_process_event_entry(struct dwc3 *dwc, in dwc3_process_event_entry() argument
3623 trace_dwc3_event(event->raw, dwc); in dwc3_process_event_entry()
3626 dwc3_endpoint_interrupt(dwc, &event->depevt); in dwc3_process_event_entry()
3628 dwc3_gadget_interrupt(dwc, &event->devt); in dwc3_process_event_entry()
3630 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw); in dwc3_process_event_entry()
3635 struct dwc3 *dwc = evt->dwc; in dwc3_process_event_buf() local
3650 dwc3_process_event_entry(dwc, &event); in dwc3_process_event_buf()
3670 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0)); in dwc3_process_event_buf()
3672 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg); in dwc3_process_event_buf()
3674 if (dwc->imod_interval) { in dwc3_process_event_buf()
3675 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in dwc3_process_event_buf()
3676 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in dwc3_process_event_buf()
3685 struct dwc3 *dwc = evt->dwc; in dwc3_thread_interrupt() local
3689 spin_lock_irqsave(&dwc->lock, flags); in dwc3_thread_interrupt()
3691 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_thread_interrupt()
3698 struct dwc3 *dwc = evt->dwc; in dwc3_check_event_buf() local
3703 if (pm_runtime_suspended(dwc->dev)) { in dwc3_check_event_buf()
3704 pm_runtime_get(dwc->dev); in dwc3_check_event_buf()
3705 disable_irq_nosync(dwc->irq_gadget); in dwc3_check_event_buf()
3706 dwc->pending_events = true; in dwc3_check_event_buf()
3719 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); in dwc3_check_event_buf()
3728 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0)); in dwc3_check_event_buf()
3730 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg); in dwc3_check_event_buf()
3738 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); in dwc3_check_event_buf()
3750 static int dwc3_gadget_get_irq(struct dwc3 *dwc) in dwc3_gadget_get_irq() argument
3752 struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); in dwc3_gadget_get_irq()
3793 int dwc3_gadget_init(struct dwc3 *dwc) in dwc3_gadget_init() argument
3799 irq = dwc3_gadget_get_irq(dwc); in dwc3_gadget_init()
3805 dwc->irq_gadget = irq; in dwc3_gadget_init()
3807 dwc->ep0_trb = dma_alloc_coherent(dwc->sysdev, in dwc3_gadget_init()
3808 sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
3809 &dwc->ep0_trb_addr, GFP_KERNEL); in dwc3_gadget_init()
3810 if (!dwc->ep0_trb) { in dwc3_gadget_init()
3811 dev_err(dwc->dev, "failed to allocate ep0 trb\n"); in dwc3_gadget_init()
3816 dwc->setup_buf = kzalloc(DWC3_EP0_SETUP_SIZE, GFP_KERNEL); in dwc3_gadget_init()
3817 if (!dwc->setup_buf) { in dwc3_gadget_init()
3822 dwc->bounce = dma_alloc_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, in dwc3_gadget_init()
3823 &dwc->bounce_addr, GFP_KERNEL); in dwc3_gadget_init()
3824 if (!dwc->bounce) { in dwc3_gadget_init()
3829 init_completion(&dwc->ep0_in_setup); in dwc3_gadget_init()
3830 dwc->gadget = kzalloc(sizeof(struct usb_gadget), GFP_KERNEL); in dwc3_gadget_init()
3831 if (!dwc->gadget) { in dwc3_gadget_init()
3837 usb_initialize_gadget(dwc->dev, dwc->gadget, dwc_gadget_release); in dwc3_gadget_init()
3838 dev = &dwc->gadget->dev; in dwc3_gadget_init()
3839 dev->platform_data = dwc; in dwc3_gadget_init()
3840 dwc->gadget->ops = &dwc3_gadget_ops; in dwc3_gadget_init()
3841 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_init()
3842 dwc->gadget->sg_supported = true; in dwc3_gadget_init()
3843 dwc->gadget->name = "dwc3-gadget"; in dwc3_gadget_init()
3844 dwc->gadget->lpm_capable = true; in dwc3_gadget_init()
3863 !dwc->dis_metastability_quirk) in dwc3_gadget_init()
3864 dev_info(dwc->dev, "changing max_speed on rev %08x\n", in dwc3_gadget_init()
3865 dwc->revision); in dwc3_gadget_init()
3867 dwc->gadget->max_speed = dwc->maximum_speed; in dwc3_gadget_init()
3874 ret = dwc3_gadget_init_endpoints(dwc, dwc->num_eps); in dwc3_gadget_init()
3878 ret = usb_add_gadget(dwc->gadget); in dwc3_gadget_init()
3880 dev_err(dwc->dev, "failed to add gadget\n"); in dwc3_gadget_init()
3884 dwc3_gadget_set_speed(dwc->gadget, dwc->maximum_speed); in dwc3_gadget_init()
3889 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_init()
3891 usb_put_gadget(dwc->gadget); in dwc3_gadget_init()
3893 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_init()
3894 dwc->bounce_addr); in dwc3_gadget_init()
3897 kfree(dwc->setup_buf); in dwc3_gadget_init()
3900 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
3901 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_init()
3909 void dwc3_gadget_exit(struct dwc3 *dwc) in dwc3_gadget_exit() argument
3911 usb_del_gadget_udc(dwc->gadget); in dwc3_gadget_exit()
3912 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_exit()
3913 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_exit()
3914 dwc->bounce_addr); in dwc3_gadget_exit()
3915 kfree(dwc->setup_buf); in dwc3_gadget_exit()
3916 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_exit()
3917 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_exit()
3920 int dwc3_gadget_suspend(struct dwc3 *dwc) in dwc3_gadget_suspend() argument
3922 if (!dwc->gadget_driver) in dwc3_gadget_suspend()
3925 dwc3_gadget_run_stop(dwc, false, false); in dwc3_gadget_suspend()
3926 dwc3_disconnect_gadget(dwc); in dwc3_gadget_suspend()
3927 __dwc3_gadget_stop(dwc); in dwc3_gadget_suspend()
3932 int dwc3_gadget_resume(struct dwc3 *dwc) in dwc3_gadget_resume() argument
3936 if (!dwc->gadget_driver) in dwc3_gadget_resume()
3939 ret = __dwc3_gadget_start(dwc); in dwc3_gadget_resume()
3943 ret = dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_resume()
3950 __dwc3_gadget_stop(dwc); in dwc3_gadget_resume()
3956 void dwc3_gadget_process_pending_events(struct dwc3 *dwc) in dwc3_gadget_process_pending_events() argument
3958 if (dwc->pending_events) { in dwc3_gadget_process_pending_events()
3959 dwc3_interrupt(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_process_pending_events()
3960 dwc->pending_events = false; in dwc3_gadget_process_pending_events()
3961 enable_irq(dwc->irq_gadget); in dwc3_gadget_process_pending_events()