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()
319 link_state = dwc3_gadget_get_link_state(dwc); in dwc3_send_gadget_ep_cmd()
322 if (dwc->gadget->speed >= USB_SPEED_SUPER) in dwc3_send_gadget_ep_cmd()
327 ret = __dwc3_gadget_wakeup(dwc); in dwc3_send_gadget_ep_cmd()
328 dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n", in dwc3_send_gadget_ep_cmd()
370 dev_WARN(dwc->dev, "No resource for %s\n", in dwc3_send_gadget_ep_cmd()
389 dev_WARN(dwc->dev, "UNKNOWN cmd status\n"); in dwc3_send_gadget_ep_cmd()
412 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
414 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
422 struct dwc3 *dwc = dep->dwc; in dwc3_send_clear_stall_ep_cmd() local
436 (dwc->gadget->speed >= USB_SPEED_SUPER)) in dwc3_send_clear_stall_ep_cmd()
454 struct dwc3 *dwc = dep->dwc; in dwc3_alloc_trb_pool() local
459 dep->trb_pool = dma_alloc_coherent(dwc->sysdev, in dwc3_alloc_trb_pool()
463 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n", in dwc3_alloc_trb_pool()
473 struct dwc3 *dwc = dep->dwc; in dwc3_free_trb_pool() local
475 dma_free_coherent(dwc->sysdev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM, in dwc3_free_trb_pool()
530 struct dwc3 *dwc; in dwc3_gadget_start_config() local
540 dwc = dep->dwc; in dwc3_gadget_start_config()
547 struct dwc3_ep *dep = dwc->eps[i]; in dwc3_gadget_start_config()
565 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_set_ep_config() local
576 if (dwc->gadget->speed >= USB_SPEED_SUPER) { in dwc3_gadget_set_ep_config()
631 dwc->gadget->speed == USB_SPEED_FULL) in dwc3_gadget_set_ep_config()
662 static int dwc3_gadget_calc_tx_fifo_size(struct dwc3 *dwc, int mult) in dwc3_gadget_calc_tx_fifo_size() argument
668 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_calc_tx_fifo_size()
687 void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc) in dwc3_gadget_clear_tx_fifos() argument
694 if (!dwc->do_fifo_resize) in dwc3_gadget_clear_tx_fifos()
698 dep = dwc->eps[1]; in dwc3_gadget_clear_tx_fifos()
699 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); in dwc3_gadget_clear_tx_fifos()
705 dwc->last_fifo_depth = fifo_depth; in dwc3_gadget_clear_tx_fifos()
707 for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM); in dwc3_gadget_clear_tx_fifos()
709 dep = dwc->eps[num]; in dwc3_gadget_clear_tx_fifos()
712 dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1)) & in dwc3_gadget_clear_tx_fifos()
715 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1), size); in dwc3_gadget_clear_tx_fifos()
718 dwc->num_ep_resized = 0; in dwc3_gadget_clear_tx_fifos()
744 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_resize_tx_fifos() local
755 if (!dwc->do_fifo_resize) in dwc3_gadget_resize_tx_fifos()
766 ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_resize_tx_fifos()
775 num_fifos = dwc->tx_fifo_resize_max_num; in dwc3_gadget_resize_tx_fifos()
778 fifo = dwc3_gadget_calc_tx_fifo_size(dwc, 1); in dwc3_gadget_resize_tx_fifos()
781 num_in_ep = dwc->max_cfg_eps; in dwc3_gadget_resize_tx_fifos()
782 num_in_ep -= dwc->num_ep_resized; in dwc3_gadget_resize_tx_fifos()
786 remaining = ram1_depth - min_depth - dwc->last_fifo_depth; in dwc3_gadget_resize_tx_fifos()
802 tmp = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); in dwc3_gadget_resize_tx_fifos()
805 fifo_size |= (fifo_0_start + (dwc->last_fifo_depth << 16)); in dwc3_gadget_resize_tx_fifos()
807 dwc->last_fifo_depth += DWC3_GTXFIFOSIZ_TXFDEP(fifo_size); in dwc3_gadget_resize_tx_fifos()
809 dwc->last_fifo_depth += DWC31_GTXFIFOSIZ_TXFDEP(fifo_size); in dwc3_gadget_resize_tx_fifos()
812 if (dwc->last_fifo_depth >= ram1_depth) { in dwc3_gadget_resize_tx_fifos()
813 dev_err(dwc->dev, "Fifosize(%d) > RAM size(%d) %s depth:%d\n", in dwc3_gadget_resize_tx_fifos()
814 dwc->last_fifo_depth, ram1_depth, in dwc3_gadget_resize_tx_fifos()
821 dwc->last_fifo_depth -= fifo_size; in dwc3_gadget_resize_tx_fifos()
825 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1), fifo_size); in dwc3_gadget_resize_tx_fifos()
827 dwc->num_ep_resized++; in dwc3_gadget_resize_tx_fifos()
843 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_enable() local
869 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_enable()
871 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_enable()
942 !(dwc->hwparams.hwparams9 & in __dwc3_gadget_ep_enable()
954 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_remove_requests() argument
992 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_disable() local
1001 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_disable()
1003 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_disable()
1011 dwc3_remove_requests(dwc, dep); in __dwc3_gadget_ep_disable()
1039 struct dwc3 *dwc; in dwc3_gadget_ep_enable() local
1054 dwc = dep->dwc; in dwc3_gadget_ep_enable()
1056 if (dev_WARN_ONCE(dwc->dev, dep->flags & DWC3_EP_ENABLED, in dwc3_gadget_ep_enable()
1061 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_enable()
1063 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_enable()
1071 struct dwc3 *dwc; in dwc3_gadget_ep_disable() local
1081 dwc = dep->dwc; in dwc3_gadget_ep_disable()
1083 if (dev_WARN_ONCE(dwc->dev, !(dep->flags & DWC3_EP_ENABLED), in dwc3_gadget_ep_disable()
1088 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_disable()
1090 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_disable()
1178 struct dwc3 *dwc = dep->dwc; in __dwc3_prepare_one_trb() local
1179 struct usb_gadget *gadget = dwc->gadget; in __dwc3_prepare_one_trb()
1247 dev_WARN(dwc->dev, "Unknown endpoint type %d\n", in __dwc3_prepare_one_trb()
1304 dma = dep->dwc->bounce_addr; in dwc3_prepare_one_trb()
1521 struct dwc3 *dwc = dep->dwc; in dwc3_prepare_trbs() local
1523 ret = usb_gadget_map_request_by_dev(dwc->sysdev, &req->request, in dwc3_prepare_trbs()
1632 static int __dwc3_gadget_get_frame(struct dwc3 *dwc) in __dwc3_gadget_get_frame() argument
1636 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_get_frame()
1701 params.param0 = upper_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1702 params.param1 = lower_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1758 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_start_isoc() local
1768 if (!dwc->dis_start_transfer_quirk && in __dwc3_gadget_start_isoc()
1771 if (dwc->gadget->speed <= USB_SPEED_HIGH && dep->direction) in __dwc3_gadget_start_isoc()
1776 dwc->gadget->speed >= USB_SPEED_HIGH) { in __dwc3_gadget_start_isoc()
1777 u32 frame = __dwc3_gadget_get_frame(dwc); in __dwc3_gadget_start_isoc()
1830 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_queue() local
1832 if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) { in __dwc3_gadget_ep_queue()
1833 dev_dbg(dwc->dev, "%s: can't queue to disabled endpoint\n", in __dwc3_gadget_ep_queue()
1847 pm_runtime_get(dwc->dev); in __dwc3_gadget_ep_queue()
1900 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_queue() local
1906 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1908 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1946 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_cleanup_cancelled_requests() local
1961 dev_err(dwc->dev, "request cancelled with wrong reason:%d\n", req->status); in dwc3_gadget_ep_cleanup_cancelled_requests()
1975 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_dequeue() local
1982 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
2017 dev_err(dwc->dev, "request %pK was not queued to %s\n", in dwc3_gadget_ep_dequeue()
2021 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
2029 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_set_halt() local
2035 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); in __dwc3_gadget_ep_set_halt()
2050 trb = &dwc->ep0_trb[dep->trb_enqueue]; in __dwc3_gadget_ep_set_halt()
2063 dev_err(dwc->dev, "failed to set STALL on %s\n", in __dwc3_gadget_ep_set_halt()
2092 dev_err(dwc->dev, "failed to clear STALL on %s\n", in __dwc3_gadget_ep_set_halt()
2112 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_halt() local
2118 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
2120 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
2128 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_wedge() local
2132 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
2139 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
2178 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_get_frame() local
2180 return __dwc3_gadget_get_frame(dwc); in dwc3_gadget_get_frame()
2183 static int __dwc3_gadget_wakeup(struct dwc3 *dwc) in __dwc3_gadget_wakeup() argument
2198 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
2214 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); in __dwc3_gadget_wakeup()
2216 dev_err(dwc->dev, "failed to put link in Recovery\n"); in __dwc3_gadget_wakeup()
2223 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in __dwc3_gadget_wakeup()
2225 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in __dwc3_gadget_wakeup()
2232 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
2240 dev_err(dwc->dev, "failed to send remote wakeup\n"); in __dwc3_gadget_wakeup()
2249 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_wakeup() local
2253 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_wakeup()
2254 ret = __dwc3_gadget_wakeup(dwc); in dwc3_gadget_wakeup()
2255 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_wakeup()
2263 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_selfpowered() local
2266 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2268 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2273 static void dwc3_stop_active_transfers(struct dwc3 *dwc) in dwc3_stop_active_transfers() argument
2277 for (epnum = 2; epnum < dwc->num_eps; epnum++) { in dwc3_stop_active_transfers()
2280 dep = dwc->eps[epnum]; in dwc3_stop_active_transfers()
2284 dwc3_remove_requests(dwc, dep); in dwc3_stop_active_transfers()
2288 static void __dwc3_gadget_set_ssp_rate(struct dwc3 *dwc) in __dwc3_gadget_set_ssp_rate() argument
2290 enum usb_ssp_rate ssp_rate = dwc->gadget_ssp_rate; in __dwc3_gadget_set_ssp_rate()
2294 ssp_rate = dwc->max_ssp_rate; in __dwc3_gadget_set_ssp_rate()
2296 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in __dwc3_gadget_set_ssp_rate()
2302 else if (dwc->max_ssp_rate != USB_SSP_GEN_1x2) in __dwc3_gadget_set_ssp_rate()
2306 dwc->max_ssp_rate != USB_SSP_GEN_2x1) in __dwc3_gadget_set_ssp_rate()
2309 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in __dwc3_gadget_set_ssp_rate()
2312 static void __dwc3_gadget_set_speed(struct dwc3 *dwc) in __dwc3_gadget_set_speed() argument
2317 speed = dwc->gadget_max_speed; in __dwc3_gadget_set_speed()
2318 if (speed == USB_SPEED_UNKNOWN || speed > dwc->maximum_speed) in __dwc3_gadget_set_speed()
2319 speed = dwc->maximum_speed; in __dwc3_gadget_set_speed()
2323 __dwc3_gadget_set_ssp_rate(dwc); in __dwc3_gadget_set_speed()
2327 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in __dwc3_gadget_set_speed()
2344 !dwc->dis_metastability_quirk) { in __dwc3_gadget_set_speed()
2364 dev_err(dwc->dev, "invalid speed (%d)\n", speed); in __dwc3_gadget_set_speed()
2378 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in __dwc3_gadget_set_speed()
2381 static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) in dwc3_gadget_run_stop() argument
2386 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_run_stop()
2389 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_run_stop()
2400 if (dwc->has_hibernation) in dwc3_gadget_run_stop()
2403 __dwc3_gadget_set_speed(dwc); in dwc3_gadget_run_stop()
2404 dwc->pullups_connected = true; in dwc3_gadget_run_stop()
2408 if (dwc->has_hibernation && !suspend) in dwc3_gadget_run_stop()
2411 dwc->pullups_connected = false; in dwc3_gadget_run_stop()
2414 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_run_stop()
2417 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_run_stop()
2427 static void dwc3_gadget_disable_irq(struct dwc3 *dwc);
2428 static void __dwc3_gadget_stop(struct dwc3 *dwc);
2429 static int __dwc3_gadget_start(struct dwc3 *dwc);
2433 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_pullup() local
2438 dwc->softconnect = is_on; in dwc3_gadget_pullup()
2443 if (!is_on && dwc->ep0state != EP0_SETUP_PHASE) { in dwc3_gadget_pullup()
2444 reinit_completion(&dwc->ep0_in_setup); in dwc3_gadget_pullup()
2446 ret = wait_for_completion_timeout(&dwc->ep0_in_setup, in dwc3_gadget_pullup()
2449 dev_warn(dwc->dev, "timed out waiting for SETUP phase\n"); in dwc3_gadget_pullup()
2458 pm_runtime_barrier(dwc->dev); in dwc3_gadget_pullup()
2459 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_pullup()
2468 ret = pm_runtime_get_sync(dwc->dev); in dwc3_gadget_pullup()
2470 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2478 disable_irq(dwc->irq_gadget); in dwc3_gadget_pullup()
2480 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_pullup()
2485 dwc->connected = false; in dwc3_gadget_pullup()
2493 dwc3_stop_active_transfers(dwc); in dwc3_gadget_pullup()
2494 __dwc3_gadget_stop(dwc); in dwc3_gadget_pullup()
2503 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); in dwc3_gadget_pullup()
2506 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); in dwc3_gadget_pullup()
2507 dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % in dwc3_gadget_pullup()
2508 dwc->ev_buf->length; in dwc3_gadget_pullup()
2511 __dwc3_gadget_start(dwc); in dwc3_gadget_pullup()
2514 ret = dwc3_gadget_run_stop(dwc, is_on, false); in dwc3_gadget_pullup()
2515 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_pullup()
2516 enable_irq(dwc->irq_gadget); in dwc3_gadget_pullup()
2518 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2523 static void dwc3_gadget_enable_irq(struct dwc3 *dwc) in dwc3_gadget_enable_irq() argument
2543 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); in dwc3_gadget_enable_irq()
2546 static void dwc3_gadget_disable_irq(struct dwc3 *dwc) in dwc3_gadget_disable_irq() argument
2549 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00); in dwc3_gadget_disable_irq()
2576 static void dwc3_gadget_setup_nump(struct dwc3 *dwc) in dwc3_gadget_setup_nump() argument
2583 ram2_depth = DWC3_GHWPARAMS7_RAM2_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_setup_nump()
2584 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_setup_nump()
2590 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_setup_nump()
2593 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_setup_nump()
2596 static int __dwc3_gadget_start(struct dwc3 *dwc) in __dwc3_gadget_start() argument
2606 if (dwc->imod_interval) { in __dwc3_gadget_start()
2607 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in __dwc3_gadget_start()
2608 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in __dwc3_gadget_start()
2609 } else if (dwc3_has_imod(dwc)) { in __dwc3_gadget_start()
2610 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), 0); in __dwc3_gadget_start()
2620 reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG); in __dwc3_gadget_start()
2626 dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg); in __dwc3_gadget_start()
2628 dwc3_gadget_setup_nump(dwc); in __dwc3_gadget_start()
2637 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in __dwc3_gadget_start()
2639 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in __dwc3_gadget_start()
2644 dep = dwc->eps[0]; in __dwc3_gadget_start()
2647 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2651 dep = dwc->eps[1]; in __dwc3_gadget_start()
2654 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2659 dwc->ep0state = EP0_SETUP_PHASE; in __dwc3_gadget_start()
2660 dwc->link_state = DWC3_LINK_STATE_SS_DIS; in __dwc3_gadget_start()
2661 dwc->delayed_status = false; in __dwc3_gadget_start()
2662 dwc3_ep0_out_start(dwc); in __dwc3_gadget_start()
2664 dwc3_gadget_enable_irq(dwc); in __dwc3_gadget_start()
2669 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_start()
2678 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_start() local
2683 irq = dwc->irq_gadget; in dwc3_gadget_start()
2685 IRQF_SHARED, "dwc3", dwc->ev_buf); in dwc3_gadget_start()
2687 dev_err(dwc->dev, "failed to request irq #%d --> %d\n", in dwc3_gadget_start()
2692 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_start()
2693 dwc->gadget_driver = driver; in dwc3_gadget_start()
2694 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2699 static void __dwc3_gadget_stop(struct dwc3 *dwc) in __dwc3_gadget_stop() argument
2701 dwc3_gadget_disable_irq(dwc); in __dwc3_gadget_stop()
2702 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_stop()
2703 __dwc3_gadget_ep_disable(dwc->eps[1]); in __dwc3_gadget_stop()
2708 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_stop() local
2711 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_stop()
2712 dwc->gadget_driver = NULL; in dwc3_gadget_stop()
2713 dwc->max_cfg_eps = 0; in dwc3_gadget_stop()
2714 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
2716 free_irq(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_stop()
2724 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_config_params() local
2730 if (!dwc->dis_enblslpm_quirk) { in dwc3_gadget_config_params()
2741 if (dwc->is_utmi_l1_suspend) in dwc3_gadget_config_params()
2743 clamp_t(u8, dwc->hird_threshold, 2, 15); in dwc3_gadget_config_params()
2747 if (dwc->dis_u1_entry_quirk) in dwc3_gadget_config_params()
2753 if (dwc->dis_u2_entry_quirk) in dwc3_gadget_config_params()
2763 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_speed() local
2766 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_speed()
2767 dwc->gadget_max_speed = speed; in dwc3_gadget_set_speed()
2768 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_speed()
2774 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_ssp_rate() local
2777 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_ssp_rate()
2778 dwc->gadget_max_speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_set_ssp_rate()
2779 dwc->gadget_ssp_rate = rate; in dwc3_gadget_set_ssp_rate()
2780 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_ssp_rate()
2785 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_vbus_draw() local
2789 if (dwc->usb2_phy) in dwc3_gadget_vbus_draw()
2790 return usb_phy_set_power(dwc->usb2_phy, mA); in dwc3_gadget_vbus_draw()
2792 if (!dwc->usb_psy) in dwc3_gadget_vbus_draw()
2796 ret = power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &val); in dwc3_gadget_vbus_draw()
2813 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_check_config() local
2819 if (!dwc->do_fifo_resize) in dwc3_gadget_check_config()
2828 if (ep_num <= dwc->max_cfg_eps) in dwc3_gadget_check_config()
2832 dwc->max_cfg_eps = ep_num; in dwc3_gadget_check_config()
2834 fifo_size = dwc3_gadget_calc_tx_fifo_size(dwc, dwc->max_cfg_eps); in dwc3_gadget_check_config()
2836 fifo_size += dwc->max_cfg_eps; in dwc3_gadget_check_config()
2839 ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_check_config()
2848 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_async_callbacks() local
2851 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_async_callbacks()
2852 dwc->async_callbacks = enable; in dwc3_gadget_async_callbacks()
2853 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_async_callbacks()
2875 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_control_endpoint() local
2881 dwc->gadget->ep0 = &dep->endpoint; in dwc3_gadget_init_control_endpoint()
2890 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_in_endpoint() local
2894 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_init_in_endpoint()
2899 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1)); in dwc3_gadget_init_in_endpoint()
2915 if (dwc->maximum_speed >= USB_SPEED_SUPER) in dwc3_gadget_init_in_endpoint()
2925 &dwc->gadget->ep_list); in dwc3_gadget_init_in_endpoint()
2935 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_out_endpoint() local
2939 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_init_out_endpoint()
2945 size = dwc3_readl(dwc->regs, DWC3_GRXFIFOSIZ(0)); in dwc3_gadget_init_out_endpoint()
2972 &dwc->gadget->ep_list); in dwc3_gadget_init_out_endpoint()
2980 static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum) in dwc3_gadget_init_endpoint() argument
2991 dep->dwc = dwc; in dwc3_gadget_init_endpoint()
2994 dep->regs = dwc->regs + DWC3_DEP_BASE(epnum); in dwc3_gadget_init_endpoint()
2995 dwc->eps[epnum] = dep; in dwc3_gadget_init_endpoint()
3031 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc, u8 total) in dwc3_gadget_init_endpoints() argument
3035 INIT_LIST_HEAD(&dwc->gadget->ep_list); in dwc3_gadget_init_endpoints()
3040 ret = dwc3_gadget_init_endpoint(dwc, epnum); in dwc3_gadget_init_endpoints()
3048 static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) in dwc3_gadget_free_endpoints() argument
3054 dep = dwc->eps[epnum]; in dwc3_gadget_free_endpoints()
3072 debugfs_lookup(dev_name(dep->dwc->dev), in dwc3_gadget_free_endpoints()
3122 if (trb->bpl == lower_32_bits(dep->dwc->bounce_addr) && in dwc3_gadget_ep_reclaim_completed_trb()
3123 trb->bph == upper_32_bits(dep->dwc->bounce_addr)) { in dwc3_gadget_ep_reclaim_completed_trb()
3234 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_should_continue() local
3236 if (!dep->endpoint.desc || !dwc->pullups_connected || in dwc3_gadget_ep_should_continue()
3237 !dwc->connected) in dwc3_gadget_ep_should_continue()
3263 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_trbs_complete() local
3292 dep = dwc->eps[i]; in dwc3_gadget_endpoint_trbs_complete()
3301 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_endpoint_trbs_complete()
3302 reg |= dwc->u1u2; in dwc3_gadget_endpoint_trbs_complete()
3303 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_endpoint_trbs_complete()
3305 dwc->u1u2 = 0; in dwc3_gadget_endpoint_trbs_complete()
3385 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_command_complete() local
3389 struct usb_ep *ep0 = &dwc->eps[0]->endpoint; in dwc3_gadget_endpoint_command_complete()
3391 dev_err(dwc->dev, "failed to clear STALL on %s\n", dep->name); in dwc3_gadget_endpoint_command_complete()
3392 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
3398 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
3399 dwc3_ep0_send_delayed_status(dwc); in dwc3_gadget_endpoint_command_complete()
3412 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_stream_event() local
3460 dwc3_send_gadget_generic_command(dwc, cmd, dep->number); in dwc3_gadget_endpoint_stream_event()
3473 static void dwc3_endpoint_interrupt(struct dwc3 *dwc, in dwc3_endpoint_interrupt() argument
3479 dep = dwc->eps[epnum]; in dwc3_endpoint_interrupt()
3491 dwc3_ep0_interrupt(dwc, event); in dwc3_endpoint_interrupt()
3516 static void dwc3_disconnect_gadget(struct dwc3 *dwc) in dwc3_disconnect_gadget() argument
3518 if (dwc->async_callbacks && dwc->gadget_driver->disconnect) { in dwc3_disconnect_gadget()
3519 spin_unlock(&dwc->lock); in dwc3_disconnect_gadget()
3520 dwc->gadget_driver->disconnect(dwc->gadget); in dwc3_disconnect_gadget()
3521 spin_lock(&dwc->lock); in dwc3_disconnect_gadget()
3525 static void dwc3_suspend_gadget(struct dwc3 *dwc) in dwc3_suspend_gadget() argument
3527 if (dwc->async_callbacks && dwc->gadget_driver->suspend) { in dwc3_suspend_gadget()
3528 spin_unlock(&dwc->lock); in dwc3_suspend_gadget()
3529 dwc->gadget_driver->suspend(dwc->gadget); in dwc3_suspend_gadget()
3530 spin_lock(&dwc->lock); in dwc3_suspend_gadget()
3534 static void dwc3_resume_gadget(struct dwc3 *dwc) in dwc3_resume_gadget() argument
3536 if (dwc->async_callbacks && dwc->gadget_driver->resume) { in dwc3_resume_gadget()
3537 spin_unlock(&dwc->lock); in dwc3_resume_gadget()
3538 dwc->gadget_driver->resume(dwc->gadget); in dwc3_resume_gadget()
3539 spin_lock(&dwc->lock); in dwc3_resume_gadget()
3543 static void dwc3_reset_gadget(struct dwc3 *dwc) in dwc3_reset_gadget() argument
3545 if (!dwc->gadget_driver) in dwc3_reset_gadget()
3548 if (dwc->async_callbacks && dwc->gadget->speed != USB_SPEED_UNKNOWN) { in dwc3_reset_gadget()
3549 spin_unlock(&dwc->lock); in dwc3_reset_gadget()
3550 usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver); in dwc3_reset_gadget()
3551 spin_lock(&dwc->lock); in dwc3_reset_gadget()
3608 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) in dwc3_clear_stall_all_ep() argument
3616 dep = dwc->eps[epnum]; in dwc3_clear_stall_all_ep()
3630 static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) in dwc3_gadget_disconnect_interrupt() argument
3634 dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET); in dwc3_gadget_disconnect_interrupt()
3636 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_disconnect_interrupt()
3639 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_disconnect_interrupt()
3641 dwc3_disconnect_gadget(dwc); in dwc3_gadget_disconnect_interrupt()
3643 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_disconnect_interrupt()
3644 dwc->setup_packet_pending = false; in dwc3_gadget_disconnect_interrupt()
3645 usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED); in dwc3_gadget_disconnect_interrupt()
3647 dwc->connected = false; in dwc3_gadget_disconnect_interrupt()
3650 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) in dwc3_gadget_reset_interrupt() argument
3661 dwc->connected = false; in dwc3_gadget_reset_interrupt()
3690 if (dwc->setup_packet_pending) in dwc3_gadget_reset_interrupt()
3691 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_reset_interrupt()
3694 dwc3_reset_gadget(dwc); in dwc3_gadget_reset_interrupt()
3701 dwc3_stop_active_transfers(dwc); in dwc3_gadget_reset_interrupt()
3702 dwc->connected = true; in dwc3_gadget_reset_interrupt()
3704 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_reset_interrupt()
3706 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_reset_interrupt()
3707 dwc->test_mode = false; in dwc3_gadget_reset_interrupt()
3708 dwc3_clear_stall_all_ep(dwc); in dwc3_gadget_reset_interrupt()
3711 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_reset_interrupt()
3713 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_reset_interrupt()
3716 static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) in dwc3_gadget_conndone_interrupt() argument
3724 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_conndone_interrupt()
3726 dwc->speed = speed; in dwc3_gadget_conndone_interrupt()
3731 dwc->gadget->ssp_rate = USB_SSP_GEN_UNKNOWN; in dwc3_gadget_conndone_interrupt()
3745 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
3746 dwc->gadget->speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_conndone_interrupt()
3749 dwc->gadget->ssp_rate = USB_SSP_GEN_2x2; in dwc3_gadget_conndone_interrupt()
3751 dwc->gadget->ssp_rate = USB_SSP_GEN_2x1; in dwc3_gadget_conndone_interrupt()
3768 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_conndone_interrupt()
3771 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
3772 dwc->gadget->speed = USB_SPEED_SUPER; in dwc3_gadget_conndone_interrupt()
3775 dwc->gadget->speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_conndone_interrupt()
3776 dwc->gadget->ssp_rate = USB_SSP_GEN_1x2; in dwc3_gadget_conndone_interrupt()
3781 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
3782 dwc->gadget->speed = USB_SPEED_HIGH; in dwc3_gadget_conndone_interrupt()
3786 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
3787 dwc->gadget->speed = USB_SPEED_FULL; in dwc3_gadget_conndone_interrupt()
3791 dwc->eps[1]->endpoint.maxpacket = dwc->gadget->ep0->maxpacket; in dwc3_gadget_conndone_interrupt()
3796 !dwc->usb2_gadget_lpm_disable && in dwc3_gadget_conndone_interrupt()
3799 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
3801 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
3803 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
3806 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold | in dwc3_gadget_conndone_interrupt()
3807 (dwc->is_utmi_l1_suspend << 4)); in dwc3_gadget_conndone_interrupt()
3815 WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum, in dwc3_gadget_conndone_interrupt()
3818 if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) in dwc3_gadget_conndone_interrupt()
3819 reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold); in dwc3_gadget_conndone_interrupt()
3821 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
3823 if (dwc->usb2_gadget_lpm_disable) { in dwc3_gadget_conndone_interrupt()
3824 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
3826 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
3829 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
3831 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
3834 dep = dwc->eps[0]; in dwc3_gadget_conndone_interrupt()
3837 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
3841 dep = dwc->eps[1]; in dwc3_gadget_conndone_interrupt()
3844 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
3857 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) in dwc3_gadget_wakeup_interrupt() argument
3864 if (dwc->async_callbacks && dwc->gadget_driver->resume) { in dwc3_gadget_wakeup_interrupt()
3865 spin_unlock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
3866 dwc->gadget_driver->resume(dwc->gadget); in dwc3_gadget_wakeup_interrupt()
3867 spin_lock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
3871 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, in dwc3_gadget_linksts_change_interrupt() argument
3894 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1); in dwc3_gadget_linksts_change_interrupt()
3897 if ((dwc->link_state == DWC3_LINK_STATE_U3) && in dwc3_gadget_linksts_change_interrupt()
3926 switch (dwc->link_state) { in dwc3_gadget_linksts_change_interrupt()
3929 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_linksts_change_interrupt()
3935 if (!dwc->u1u2) in dwc3_gadget_linksts_change_interrupt()
3936 dwc->u1u2 = reg & u1u2; in dwc3_gadget_linksts_change_interrupt()
3940 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_linksts_change_interrupt()
3951 if (dwc->speed == USB_SPEED_SUPER) in dwc3_gadget_linksts_change_interrupt()
3952 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3956 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3959 dwc3_resume_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
3966 dwc->link_state = next; in dwc3_gadget_linksts_change_interrupt()
3969 static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc, in dwc3_gadget_suspend_interrupt() argument
3974 if (dwc->link_state != next && next == DWC3_LINK_STATE_U3) in dwc3_gadget_suspend_interrupt()
3975 dwc3_suspend_gadget(dwc); in dwc3_gadget_suspend_interrupt()
3977 dwc->link_state = next; in dwc3_gadget_suspend_interrupt()
3980 static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, in dwc3_gadget_hibernation_interrupt() argument
3998 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) in dwc3_gadget_hibernation_interrupt()
4004 static void dwc3_gadget_interrupt(struct dwc3 *dwc, in dwc3_gadget_interrupt() argument
4009 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_interrupt()
4012 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_interrupt()
4015 dwc3_gadget_conndone_interrupt(dwc); in dwc3_gadget_interrupt()
4018 dwc3_gadget_wakeup_interrupt(dwc); in dwc3_gadget_interrupt()
4021 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation, in dwc3_gadget_interrupt()
4025 dwc3_gadget_hibernation_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
4028 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
4037 if (dwc->gadget->state >= USB_STATE_CONFIGURED) in dwc3_gadget_interrupt()
4038 dwc3_gadget_suspend_interrupt(dwc, in dwc3_gadget_interrupt()
4048 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type); in dwc3_gadget_interrupt()
4052 static void dwc3_process_event_entry(struct dwc3 *dwc, in dwc3_process_event_entry() argument
4055 trace_dwc3_event(event->raw, dwc); in dwc3_process_event_entry()
4058 dwc3_endpoint_interrupt(dwc, &event->depevt); in dwc3_process_event_entry()
4060 dwc3_gadget_interrupt(dwc, &event->devt); in dwc3_process_event_entry()
4062 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw); in dwc3_process_event_entry()
4067 struct dwc3 *dwc = evt->dwc; in dwc3_process_event_buf() local
4082 dwc3_process_event_entry(dwc, &event); in dwc3_process_event_buf()
4102 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0)); in dwc3_process_event_buf()
4104 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg); in dwc3_process_event_buf()
4106 if (dwc->imod_interval) { in dwc3_process_event_buf()
4107 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in dwc3_process_event_buf()
4108 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in dwc3_process_event_buf()
4117 struct dwc3 *dwc = evt->dwc; in dwc3_thread_interrupt() local
4121 spin_lock_irqsave(&dwc->lock, flags); in dwc3_thread_interrupt()
4123 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_thread_interrupt()
4130 struct dwc3 *dwc = evt->dwc; in dwc3_check_event_buf() local
4135 if (pm_runtime_suspended(dwc->dev)) { in dwc3_check_event_buf()
4136 pm_runtime_get(dwc->dev); in dwc3_check_event_buf()
4137 disable_irq_nosync(dwc->irq_gadget); in dwc3_check_event_buf()
4138 dwc->pending_events = true; in dwc3_check_event_buf()
4151 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); in dwc3_check_event_buf()
4160 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0)); in dwc3_check_event_buf()
4162 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg); in dwc3_check_event_buf()
4170 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); in dwc3_check_event_buf()
4182 static int dwc3_gadget_get_irq(struct dwc3 *dwc) in dwc3_gadget_get_irq() argument
4184 struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); in dwc3_gadget_get_irq()
4225 int dwc3_gadget_init(struct dwc3 *dwc) in dwc3_gadget_init() argument
4231 irq = dwc3_gadget_get_irq(dwc); in dwc3_gadget_init()
4237 dwc->irq_gadget = irq; in dwc3_gadget_init()
4239 dwc->ep0_trb = dma_alloc_coherent(dwc->sysdev, in dwc3_gadget_init()
4240 sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
4241 &dwc->ep0_trb_addr, GFP_KERNEL); in dwc3_gadget_init()
4242 if (!dwc->ep0_trb) { in dwc3_gadget_init()
4243 dev_err(dwc->dev, "failed to allocate ep0 trb\n"); in dwc3_gadget_init()
4248 dwc->setup_buf = kzalloc(DWC3_EP0_SETUP_SIZE, GFP_KERNEL); in dwc3_gadget_init()
4249 if (!dwc->setup_buf) { in dwc3_gadget_init()
4254 dwc->bounce = dma_alloc_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, in dwc3_gadget_init()
4255 &dwc->bounce_addr, GFP_KERNEL); in dwc3_gadget_init()
4256 if (!dwc->bounce) { in dwc3_gadget_init()
4261 init_completion(&dwc->ep0_in_setup); in dwc3_gadget_init()
4262 dwc->gadget = kzalloc(sizeof(struct usb_gadget), GFP_KERNEL); in dwc3_gadget_init()
4263 if (!dwc->gadget) { in dwc3_gadget_init()
4269 usb_initialize_gadget(dwc->dev, dwc->gadget, dwc_gadget_release); in dwc3_gadget_init()
4270 dev = &dwc->gadget->dev; in dwc3_gadget_init()
4271 dev->platform_data = dwc; in dwc3_gadget_init()
4272 dwc->gadget->ops = &dwc3_gadget_ops; in dwc3_gadget_init()
4273 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_init()
4274 dwc->gadget->ssp_rate = USB_SSP_GEN_UNKNOWN; in dwc3_gadget_init()
4275 dwc->gadget->sg_supported = true; in dwc3_gadget_init()
4276 dwc->gadget->name = "dwc3-gadget"; in dwc3_gadget_init()
4277 dwc->gadget->lpm_capable = !dwc->usb2_gadget_lpm_disable; in dwc3_gadget_init()
4296 !dwc->dis_metastability_quirk) in dwc3_gadget_init()
4297 dev_info(dwc->dev, "changing max_speed on rev %08x\n", in dwc3_gadget_init()
4298 dwc->revision); in dwc3_gadget_init()
4300 dwc->gadget->max_speed = dwc->maximum_speed; in dwc3_gadget_init()
4301 dwc->gadget->max_ssp_rate = dwc->max_ssp_rate; in dwc3_gadget_init()
4308 ret = dwc3_gadget_init_endpoints(dwc, dwc->num_eps); in dwc3_gadget_init()
4312 ret = usb_add_gadget(dwc->gadget); in dwc3_gadget_init()
4314 dev_err(dwc->dev, "failed to add gadget\n"); in dwc3_gadget_init()
4318 if (DWC3_IP_IS(DWC32) && dwc->maximum_speed == USB_SPEED_SUPER_PLUS) in dwc3_gadget_init()
4319 dwc3_gadget_set_ssp_rate(dwc->gadget, dwc->max_ssp_rate); in dwc3_gadget_init()
4321 dwc3_gadget_set_speed(dwc->gadget, dwc->maximum_speed); in dwc3_gadget_init()
4326 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_init()
4328 usb_put_gadget(dwc->gadget); in dwc3_gadget_init()
4329 dwc->gadget = NULL; in dwc3_gadget_init()
4331 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_init()
4332 dwc->bounce_addr); in dwc3_gadget_init()
4335 kfree(dwc->setup_buf); in dwc3_gadget_init()
4338 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
4339 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_init()
4347 void dwc3_gadget_exit(struct dwc3 *dwc) in dwc3_gadget_exit() argument
4349 if (!dwc->gadget) in dwc3_gadget_exit()
4352 usb_del_gadget(dwc->gadget); in dwc3_gadget_exit()
4353 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_exit()
4354 usb_put_gadget(dwc->gadget); in dwc3_gadget_exit()
4355 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_exit()
4356 dwc->bounce_addr); in dwc3_gadget_exit()
4357 kfree(dwc->setup_buf); in dwc3_gadget_exit()
4358 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_exit()
4359 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_exit()
4362 int dwc3_gadget_suspend(struct dwc3 *dwc) in dwc3_gadget_suspend() argument
4364 if (!dwc->gadget_driver) in dwc3_gadget_suspend()
4367 dwc3_gadget_run_stop(dwc, false, false); in dwc3_gadget_suspend()
4368 dwc3_disconnect_gadget(dwc); in dwc3_gadget_suspend()
4369 __dwc3_gadget_stop(dwc); in dwc3_gadget_suspend()
4374 int dwc3_gadget_resume(struct dwc3 *dwc) in dwc3_gadget_resume() argument
4378 if (!dwc->gadget_driver || !dwc->softconnect) in dwc3_gadget_resume()
4381 ret = __dwc3_gadget_start(dwc); in dwc3_gadget_resume()
4385 ret = dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_resume()
4392 __dwc3_gadget_stop(dwc); in dwc3_gadget_resume()
4398 void dwc3_gadget_process_pending_events(struct dwc3 *dwc) in dwc3_gadget_process_pending_events() argument
4400 if (dwc->pending_events) { in dwc3_gadget_process_pending_events()
4401 dwc3_interrupt(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_process_pending_events()
4402 dwc->pending_events = false; in dwc3_gadget_process_pending_events()
4403 enable_irq(dwc->irq_gadget); in dwc3_gadget_process_pending_events()