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()
296 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
308 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
320 link_state = dwc3_gadget_get_link_state(dwc); in dwc3_send_gadget_ep_cmd()
323 if (dwc->gadget->speed >= USB_SPEED_SUPER) in dwc3_send_gadget_ep_cmd()
328 ret = __dwc3_gadget_wakeup(dwc); in dwc3_send_gadget_ep_cmd()
329 dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n", in dwc3_send_gadget_ep_cmd()
387 dev_WARN(dwc->dev, "No resource for %s\n", in dwc3_send_gadget_ep_cmd()
406 dev_WARN(dwc->dev, "UNKNOWN cmd status\n"); in dwc3_send_gadget_ep_cmd()
430 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); in dwc3_send_gadget_ep_cmd()
432 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); in dwc3_send_gadget_ep_cmd()
441 struct dwc3 *dwc = dep->dwc; in dwc3_send_clear_stall_ep_cmd() local
455 (dwc->gadget->speed >= USB_SPEED_SUPER)) in dwc3_send_clear_stall_ep_cmd()
473 struct dwc3 *dwc = dep->dwc; in dwc3_alloc_trb_pool() local
478 dep->trb_pool = dma_alloc_coherent(dwc->sysdev, in dwc3_alloc_trb_pool()
482 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n", in dwc3_alloc_trb_pool()
492 struct dwc3 *dwc = dep->dwc; in dwc3_free_trb_pool() local
494 dma_free_coherent(dwc->sysdev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM, in dwc3_free_trb_pool()
549 struct dwc3 *dwc; in dwc3_gadget_start_config() local
559 dwc = dep->dwc; in dwc3_gadget_start_config()
566 struct dwc3_ep *dep = dwc->eps[i]; in dwc3_gadget_start_config()
584 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_set_ep_config() local
595 if (dwc->gadget->speed >= USB_SPEED_SUPER) { in dwc3_gadget_set_ep_config()
650 dwc->gadget->speed == USB_SPEED_FULL) in dwc3_gadget_set_ep_config()
677 static int dwc3_gadget_get_tx_fifos_size(struct dwc3 *dwc) in dwc3_gadget_get_tx_fifos_size() argument
683 if (DWC3_NUM_RAMS(dwc->hwparams.hwparams1) > 1) { in dwc3_gadget_get_tx_fifos_size()
685 txfifo_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_get_tx_fifos_size()
688 ram0_depth = DWC3_GHWPARAMS6_RAM0_DEPTH(dwc->hwparams.hwparams6); in dwc3_gadget_get_tx_fifos_size()
691 rxfifo_size = dwc3_readl(dwc->regs, DWC3_GRXFIFOSIZ(0)); in dwc3_gadget_get_tx_fifos_size()
721 static int dwc3_gadget_calc_tx_fifo_size(struct dwc3 *dwc, int mult) in dwc3_gadget_calc_tx_fifo_size() argument
727 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_calc_tx_fifo_size()
746 void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc) in dwc3_gadget_clear_tx_fifos() argument
753 if (!dwc->do_fifo_resize) in dwc3_gadget_clear_tx_fifos()
757 dep = dwc->eps[1]; in dwc3_gadget_clear_tx_fifos()
758 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); in dwc3_gadget_clear_tx_fifos()
764 dwc->last_fifo_depth = fifo_depth; in dwc3_gadget_clear_tx_fifos()
766 for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM); in dwc3_gadget_clear_tx_fifos()
768 dep = dwc->eps[num]; in dwc3_gadget_clear_tx_fifos()
771 dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1)) & in dwc3_gadget_clear_tx_fifos()
774 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1), size); in dwc3_gadget_clear_tx_fifos()
777 dwc->num_ep_resized = 0; in dwc3_gadget_clear_tx_fifos()
792 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_resize_tx_fifos() local
803 if (gadget_is_superspeed(dwc->gadget)) in __dwc3_gadget_resize_tx_fifos()
817 if (gadget_is_superspeed(dwc->gadget)) { in __dwc3_gadget_resize_tx_fifos()
838 mdwidth = dwc3_mdwidth(dwc); in __dwc3_gadget_resize_tx_fifos()
840 ram1_depth = dwc3_gadget_get_tx_fifos_size(dwc); in __dwc3_gadget_resize_tx_fifos()
841 last_fifo_depth = dwc->last_fifo_depth; in __dwc3_gadget_resize_tx_fifos()
849 tmp = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); in __dwc3_gadget_resize_tx_fifos()
860 dev_err(dwc->dev, "Fifosize(0x%x) > RAM size(0x%x) %s depth(0x%x)\n", in __dwc3_gadget_resize_tx_fifos()
866 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1), fifo_size); in __dwc3_gadget_resize_tx_fifos()
868 dwc->last_fifo_depth = last_fifo_depth; in __dwc3_gadget_resize_tx_fifos()
869 dwc->num_ep_resized++; in __dwc3_gadget_resize_tx_fifos()
898 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_resize_tx_fifos() local
909 if (!dwc->do_fifo_resize) in dwc3_gadget_resize_tx_fifos()
923 ram1_depth = dwc3_gadget_get_tx_fifos_size(dwc); in dwc3_gadget_resize_tx_fifos()
933 num_fifos = dwc->tx_fifo_resize_max_num; in dwc3_gadget_resize_tx_fifos()
936 fifo = dwc3_gadget_calc_tx_fifo_size(dwc, 1); in dwc3_gadget_resize_tx_fifos()
939 num_in_ep = dwc->max_cfg_eps; in dwc3_gadget_resize_tx_fifos()
940 num_in_ep -= dwc->num_ep_resized; in dwc3_gadget_resize_tx_fifos()
944 remaining = ram1_depth - min_depth - dwc->last_fifo_depth; in dwc3_gadget_resize_tx_fifos()
960 tmp = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(0)); in dwc3_gadget_resize_tx_fifos()
963 fifo_size |= (fifo_0_start + (dwc->last_fifo_depth << 16)); in dwc3_gadget_resize_tx_fifos()
965 dwc->last_fifo_depth += DWC3_GTXFIFOSIZ_TXFDEP(fifo_size); in dwc3_gadget_resize_tx_fifos()
967 dwc->last_fifo_depth += DWC31_GTXFIFOSIZ_TXFDEP(fifo_size); in dwc3_gadget_resize_tx_fifos()
970 if (dwc->last_fifo_depth >= ram1_depth) { in dwc3_gadget_resize_tx_fifos()
971 dev_err(dwc->dev, "Fifosize(%d) > RAM size(%d) %s depth:%d\n", in dwc3_gadget_resize_tx_fifos()
972 dwc->last_fifo_depth, ram1_depth, in dwc3_gadget_resize_tx_fifos()
979 dwc->last_fifo_depth -= fifo_size; in dwc3_gadget_resize_tx_fifos()
983 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1), fifo_size); in dwc3_gadget_resize_tx_fifos()
985 dwc->num_ep_resized++; in dwc3_gadget_resize_tx_fifos()
1001 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_enable() local
1027 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_enable()
1029 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_enable()
1101 !(dwc->hwparams.hwparams9 & in __dwc3_gadget_ep_enable()
1113 void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep, int status) in dwc3_remove_requests() argument
1155 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_disable() local
1165 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_disable()
1167 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_disable()
1169 dwc3_remove_requests(dwc, dep, -ESHUTDOWN); in __dwc3_gadget_ep_disable()
1211 struct dwc3 *dwc; in dwc3_gadget_ep_enable() local
1226 dwc = dep->dwc; in dwc3_gadget_ep_enable()
1228 if (dev_WARN_ONCE(dwc->dev, dep->flags & DWC3_EP_ENABLED, in dwc3_gadget_ep_enable()
1233 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_enable()
1235 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_enable()
1243 struct dwc3 *dwc; in dwc3_gadget_ep_disable() local
1253 dwc = dep->dwc; in dwc3_gadget_ep_disable()
1255 if (dev_WARN_ONCE(dwc->dev, !(dep->flags & DWC3_EP_ENABLED), in dwc3_gadget_ep_disable()
1260 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_disable()
1262 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_disable()
1365 struct dwc3 *dwc = dep->dwc; in dwc3_prepare_one_trb() local
1366 struct usb_gadget *gadget = dwc->gadget; in dwc3_prepare_one_trb()
1370 dma = dep->dwc->bounce_addr; in dwc3_prepare_one_trb()
1451 dev_WARN(dwc->dev, "Unknown endpoint type %d\n", in dwc3_prepare_one_trb()
1694 struct dwc3 *dwc = dep->dwc; in dwc3_prepare_trbs() local
1696 ret = usb_gadget_map_request_by_dev(dwc->sysdev, &req->request, in dwc3_prepare_trbs()
1805 static int __dwc3_gadget_get_frame(struct dwc3 *dwc) in __dwc3_gadget_get_frame() argument
1809 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_get_frame()
1842 if (ret == -ETIMEDOUT && dep->dwc->ep0state != EP0_SETUP_PHASE) { in __dwc3_stop_active_transfer()
1918 params.param0 = upper_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1919 params.param1 = lower_32_bits(dep->dwc->bounce_addr); in dwc3_gadget_start_isoc_quirk()
1975 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_start_isoc() local
1985 if (!dwc->dis_start_transfer_quirk && in __dwc3_gadget_start_isoc()
1988 if (dwc->gadget->speed <= USB_SPEED_HIGH && dep->direction) in __dwc3_gadget_start_isoc()
1993 dwc->gadget->speed >= USB_SPEED_HIGH) { in __dwc3_gadget_start_isoc()
1994 u32 frame = __dwc3_gadget_get_frame(dwc); in __dwc3_gadget_start_isoc()
2043 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_queue() local
2045 if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) { in __dwc3_gadget_ep_queue()
2046 dev_dbg(dwc->dev, "%s: can't queue to disabled endpoint\n", in __dwc3_gadget_ep_queue()
2060 pm_runtime_get(dwc->dev); in __dwc3_gadget_ep_queue()
2112 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_queue() local
2118 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_queue()
2120 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_queue()
2157 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_cleanup_cancelled_requests() local
2173 dev_err(dwc->dev, "request cancelled with wrong reason:%d\n", req->status); in dwc3_gadget_ep_cleanup_cancelled_requests()
2193 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_dequeue() local
2200 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
2237 dev_err(dwc->dev, "request %pK was not queued to %s\n", in dwc3_gadget_ep_dequeue()
2241 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
2249 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_set_halt() local
2251 struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); in __dwc3_gadget_ep_set_halt()
2254 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); in __dwc3_gadget_ep_set_halt()
2269 trb = &dwc->ep0_trb[dep->trb_enqueue]; in __dwc3_gadget_ep_set_halt()
2282 dev_err(dwc->dev, "failed to set STALL on %s\n", in __dwc3_gadget_ep_set_halt()
2313 dev_err(dwc->dev, "failed to clear STALL on %s\n", in __dwc3_gadget_ep_set_halt()
2333 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_halt() local
2339 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
2341 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
2349 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_wedge() local
2353 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
2360 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
2399 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_get_frame() local
2401 return __dwc3_gadget_get_frame(dwc); in dwc3_gadget_get_frame()
2404 static int __dwc3_gadget_wakeup(struct dwc3 *dwc) in __dwc3_gadget_wakeup() argument
2419 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
2435 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); in __dwc3_gadget_wakeup()
2437 dev_err(dwc->dev, "failed to put link in Recovery\n"); in __dwc3_gadget_wakeup()
2444 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in __dwc3_gadget_wakeup()
2446 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in __dwc3_gadget_wakeup()
2453 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in __dwc3_gadget_wakeup()
2461 dev_err(dwc->dev, "failed to send remote wakeup\n"); in __dwc3_gadget_wakeup()
2470 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_wakeup() local
2474 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_wakeup()
2475 ret = __dwc3_gadget_wakeup(dwc); in dwc3_gadget_wakeup()
2476 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_wakeup()
2484 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_selfpowered() local
2487 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2489 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
2494 static void dwc3_stop_active_transfers(struct dwc3 *dwc) in dwc3_stop_active_transfers() argument
2498 for (epnum = 2; epnum < dwc->num_eps; epnum++) { in dwc3_stop_active_transfers()
2501 dep = dwc->eps[epnum]; in dwc3_stop_active_transfers()
2505 dwc3_remove_requests(dwc, dep, -ESHUTDOWN); in dwc3_stop_active_transfers()
2509 static void __dwc3_gadget_set_ssp_rate(struct dwc3 *dwc) in __dwc3_gadget_set_ssp_rate() argument
2511 enum usb_ssp_rate ssp_rate = dwc->gadget_ssp_rate; in __dwc3_gadget_set_ssp_rate()
2515 ssp_rate = dwc->max_ssp_rate; in __dwc3_gadget_set_ssp_rate()
2517 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in __dwc3_gadget_set_ssp_rate()
2523 else if (dwc->max_ssp_rate != USB_SSP_GEN_1x2) in __dwc3_gadget_set_ssp_rate()
2527 dwc->max_ssp_rate != USB_SSP_GEN_2x1) in __dwc3_gadget_set_ssp_rate()
2530 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in __dwc3_gadget_set_ssp_rate()
2533 static void __dwc3_gadget_set_speed(struct dwc3 *dwc) in __dwc3_gadget_set_speed() argument
2538 speed = dwc->gadget_max_speed; in __dwc3_gadget_set_speed()
2539 if (speed == USB_SPEED_UNKNOWN || speed > dwc->maximum_speed) in __dwc3_gadget_set_speed()
2540 speed = dwc->maximum_speed; in __dwc3_gadget_set_speed()
2544 __dwc3_gadget_set_ssp_rate(dwc); in __dwc3_gadget_set_speed()
2548 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in __dwc3_gadget_set_speed()
2565 !dwc->dis_metastability_quirk) { in __dwc3_gadget_set_speed()
2588 dev_err(dwc->dev, "invalid speed (%d)\n", speed); in __dwc3_gadget_set_speed()
2602 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in __dwc3_gadget_set_speed()
2605 static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) in dwc3_gadget_run_stop() argument
2610 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_run_stop()
2613 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_run_stop()
2624 if (dwc->has_hibernation) in dwc3_gadget_run_stop()
2627 __dwc3_gadget_set_speed(dwc); in dwc3_gadget_run_stop()
2628 dwc->pullups_connected = true; in dwc3_gadget_run_stop()
2632 if (dwc->has_hibernation && !suspend) in dwc3_gadget_run_stop()
2635 dwc->pullups_connected = false; in dwc3_gadget_run_stop()
2638 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_run_stop()
2642 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_run_stop()
2652 static void dwc3_gadget_disable_irq(struct dwc3 *dwc);
2653 static void __dwc3_gadget_stop(struct dwc3 *dwc);
2654 static int __dwc3_gadget_start(struct dwc3 *dwc);
2656 static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) in dwc3_gadget_soft_disconnect() argument
2660 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_soft_disconnect()
2661 dwc->connected = false; in dwc3_gadget_soft_disconnect()
2667 if (dwc->ep0state != EP0_SETUP_PHASE && in dwc3_gadget_soft_disconnect()
2668 dwc->ep0state != EP0_UNCONNECTED) { in dwc3_gadget_soft_disconnect()
2671 if (dwc->delayed_status) in dwc3_gadget_soft_disconnect()
2672 dwc3_ep0_send_delayed_status(dwc); in dwc3_gadget_soft_disconnect()
2674 reinit_completion(&dwc->ep0_in_setup); in dwc3_gadget_soft_disconnect()
2676 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_soft_disconnect()
2677 ret = wait_for_completion_timeout(&dwc->ep0_in_setup, in dwc3_gadget_soft_disconnect()
2679 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_soft_disconnect()
2681 dev_warn(dwc->dev, "timed out waiting for SETUP phase\n"); in dwc3_gadget_soft_disconnect()
2691 dwc3_stop_active_transfers(dwc); in dwc3_gadget_soft_disconnect()
2692 __dwc3_gadget_stop(dwc); in dwc3_gadget_soft_disconnect()
2693 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_soft_disconnect()
2702 return dwc3_gadget_run_stop(dwc, false, false); in dwc3_gadget_soft_disconnect()
2707 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_pullup() local
2708 struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); in dwc3_gadget_pullup()
2721 pm_runtime_barrier(dwc->dev); in dwc3_gadget_pullup()
2722 if (pm_runtime_suspended(dwc->dev)) in dwc3_gadget_pullup()
2731 ret = pm_runtime_get_sync(dwc->dev); in dwc3_gadget_pullup()
2733 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2737 if (dwc->pullups_connected == is_on) { in dwc3_gadget_pullup()
2738 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2742 synchronize_irq(dwc->irq_gadget); in dwc3_gadget_pullup()
2745 ret = dwc3_gadget_soft_disconnect(dwc); in dwc3_gadget_pullup()
2753 dwc3_core_soft_reset(dwc); in dwc3_gadget_pullup()
2755 dwc3_event_buffers_setup(dwc); in dwc3_gadget_pullup()
2756 __dwc3_gadget_start(dwc); in dwc3_gadget_pullup()
2757 ret = dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_pullup()
2760 pm_runtime_put(dwc->dev); in dwc3_gadget_pullup()
2765 static void dwc3_gadget_enable_irq(struct dwc3 *dwc) in dwc3_gadget_enable_irq() argument
2785 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); in dwc3_gadget_enable_irq()
2788 static void dwc3_gadget_disable_irq(struct dwc3 *dwc) in dwc3_gadget_disable_irq() argument
2791 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00); in dwc3_gadget_disable_irq()
2818 static void dwc3_gadget_setup_nump(struct dwc3 *dwc) in dwc3_gadget_setup_nump() argument
2825 ram2_depth = DWC3_GHWPARAMS7_RAM2_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_setup_nump()
2826 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_setup_nump()
2832 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_setup_nump()
2835 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_setup_nump()
2838 static int __dwc3_gadget_start(struct dwc3 *dwc) in __dwc3_gadget_start() argument
2850 if (pm_runtime_suspended(dwc->dev)) in __dwc3_gadget_start()
2857 if (dwc->imod_interval) { in __dwc3_gadget_start()
2858 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in __dwc3_gadget_start()
2859 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in __dwc3_gadget_start()
2860 } else if (dwc3_has_imod(dwc)) { in __dwc3_gadget_start()
2861 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), 0); in __dwc3_gadget_start()
2871 reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG); in __dwc3_gadget_start()
2877 dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg); in __dwc3_gadget_start()
2879 dwc3_gadget_setup_nump(dwc); in __dwc3_gadget_start()
2888 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in __dwc3_gadget_start()
2890 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in __dwc3_gadget_start()
2895 dep = dwc->eps[0]; in __dwc3_gadget_start()
2899 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2903 dep = dwc->eps[1]; in __dwc3_gadget_start()
2907 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in __dwc3_gadget_start()
2912 dwc->ep0state = EP0_SETUP_PHASE; in __dwc3_gadget_start()
2913 dwc->ep0_bounced = false; in __dwc3_gadget_start()
2914 dwc->link_state = DWC3_LINK_STATE_SS_DIS; in __dwc3_gadget_start()
2915 dwc->delayed_status = false; in __dwc3_gadget_start()
2916 dwc3_ep0_out_start(dwc); in __dwc3_gadget_start()
2918 dwc3_gadget_enable_irq(dwc); in __dwc3_gadget_start()
2923 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_start()
2932 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_start() local
2937 irq = dwc->irq_gadget; in dwc3_gadget_start()
2939 IRQF_SHARED, "dwc3", dwc->ev_buf); in dwc3_gadget_start()
2941 dev_err(dwc->dev, "failed to request irq #%d --> %d\n", in dwc3_gadget_start()
2946 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_start()
2947 if (dwc->gadget_driver) { in dwc3_gadget_start()
2948 dev_err(dwc->dev, "%s is already bound to %s\n", in dwc3_gadget_start()
2949 dwc->gadget->name, in dwc3_gadget_start()
2950 dwc->gadget_driver->driver.name); in dwc3_gadget_start()
2955 dwc->gadget_driver = driver; in dwc3_gadget_start()
2956 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2961 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
2962 free_irq(irq, dwc); in dwc3_gadget_start()
2968 static void __dwc3_gadget_stop(struct dwc3 *dwc) in __dwc3_gadget_stop() argument
2970 dwc3_gadget_disable_irq(dwc); in __dwc3_gadget_stop()
2971 __dwc3_gadget_ep_disable(dwc->eps[0]); in __dwc3_gadget_stop()
2972 __dwc3_gadget_ep_disable(dwc->eps[1]); in __dwc3_gadget_stop()
2977 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_stop() local
2980 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_stop()
2981 if (!dwc->gadget_driver) { in dwc3_gadget_stop()
2982 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
2983 dev_warn(dwc->dev, "%s is already stopped\n", in dwc3_gadget_stop()
2984 dwc->gadget->name); in dwc3_gadget_stop()
2987 dwc->gadget_driver = NULL; in dwc3_gadget_stop()
2988 dwc->max_cfg_eps = 0; in dwc3_gadget_stop()
2989 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
2991 free_irq(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_stop()
3000 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_config_params() local
3006 if (!dwc->dis_enblslpm_quirk) { in dwc3_gadget_config_params()
3017 if (dwc->is_utmi_l1_suspend) in dwc3_gadget_config_params()
3019 clamp_t(u8, dwc->hird_threshold, 2, 15); in dwc3_gadget_config_params()
3023 if (dwc->dis_u1_entry_quirk) in dwc3_gadget_config_params()
3029 if (dwc->dis_u2_entry_quirk) in dwc3_gadget_config_params()
3039 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_speed() local
3042 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_speed()
3043 dwc->gadget_max_speed = speed; in dwc3_gadget_set_speed()
3044 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_speed()
3050 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_ssp_rate() local
3053 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_ssp_rate()
3054 dwc->gadget_max_speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_set_ssp_rate()
3055 dwc->gadget_ssp_rate = rate; in dwc3_gadget_set_ssp_rate()
3056 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_ssp_rate()
3061 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_vbus_draw() local
3065 if (dwc->usb2_phy) in dwc3_gadget_vbus_draw()
3066 return usb_phy_set_power(dwc->usb2_phy, mA); in dwc3_gadget_vbus_draw()
3068 if (!dwc->usb_psy) in dwc3_gadget_vbus_draw()
3072 ret = power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &val); in dwc3_gadget_vbus_draw()
3089 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_check_config() local
3095 if (!dwc->do_fifo_resize) in dwc3_gadget_check_config()
3104 if (ep_num <= dwc->max_cfg_eps) in dwc3_gadget_check_config()
3108 dwc->max_cfg_eps = ep_num; in dwc3_gadget_check_config()
3110 fifo_size = dwc3_gadget_calc_tx_fifo_size(dwc, dwc->max_cfg_eps); in dwc3_gadget_check_config()
3112 fifo_size += dwc->max_cfg_eps; in dwc3_gadget_check_config()
3115 ram1_depth = dwc3_gadget_get_tx_fifos_size(dwc); in dwc3_gadget_check_config()
3124 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_async_callbacks() local
3127 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_async_callbacks()
3128 dwc->async_callbacks = enable; in dwc3_gadget_async_callbacks()
3129 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_async_callbacks()
3151 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_control_endpoint() local
3157 dwc->gadget->ep0 = &dep->endpoint; in dwc3_gadget_init_control_endpoint()
3166 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_in_endpoint() local
3171 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_init_in_endpoint()
3176 size = dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(dep->number >> 1)); in dwc3_gadget_init_in_endpoint()
3205 (dwc->maximum_speed >= USB_SPEED_HIGH)) in dwc3_gadget_init_in_endpoint()
3215 if (dwc->do_fifo_resize) in dwc3_gadget_init_in_endpoint()
3222 &dwc->gadget->ep_list); in dwc3_gadget_init_in_endpoint()
3232 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_init_out_endpoint() local
3236 mdwidth = dwc3_mdwidth(dwc); in dwc3_gadget_init_out_endpoint()
3242 size = dwc3_readl(dwc->regs, DWC3_GRXFIFOSIZ(0)); in dwc3_gadget_init_out_endpoint()
3269 &dwc->gadget->ep_list); in dwc3_gadget_init_out_endpoint()
3277 static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum) in dwc3_gadget_init_endpoint() argument
3289 num_in_eps = DWC3_NUM_IN_EPS(&dwc->hwparams); in dwc3_gadget_init_endpoint()
3290 num_out_eps = dwc->num_eps - num_in_eps; in dwc3_gadget_init_endpoint()
3299 dep->dwc = dwc; in dwc3_gadget_init_endpoint()
3302 dep->regs = dwc->regs + DWC3_DEP_BASE(epnum); in dwc3_gadget_init_endpoint()
3303 dwc->eps[epnum] = dep; in dwc3_gadget_init_endpoint()
3339 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc, u8 total) in dwc3_gadget_init_endpoints() argument
3343 INIT_LIST_HEAD(&dwc->gadget->ep_list); in dwc3_gadget_init_endpoints()
3348 ret = dwc3_gadget_init_endpoint(dwc, epnum); in dwc3_gadget_init_endpoints()
3356 static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) in dwc3_gadget_free_endpoints() argument
3362 dep = dwc->eps[epnum]; in dwc3_gadget_free_endpoints()
3379 debugfs_remove_recursive(debugfs_lookup(dep->name, dwc->root)); in dwc3_gadget_free_endpoints()
3428 if (trb->bpl == lower_32_bits(dep->dwc->bounce_addr) && in dwc3_gadget_ep_reclaim_completed_trb()
3429 trb->bph == upper_32_bits(dep->dwc->bounce_addr)) { in dwc3_gadget_ep_reclaim_completed_trb()
3499 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_cleanup_completed_request() local
3533 usb_gadget_unmap_request_by_dev(dwc->sysdev, in dwc3_gadget_ep_cleanup_completed_request()
3602 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_should_continue() local
3604 if (!dep->endpoint.desc || !dwc->pullups_connected || in dwc3_gadget_ep_should_continue()
3605 !dwc->connected) in dwc3_gadget_ep_should_continue()
3631 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_trbs_complete() local
3684 dep = dwc->eps[i]; in dwc3_gadget_endpoint_trbs_complete()
3693 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_endpoint_trbs_complete()
3694 reg |= dwc->u1u2; in dwc3_gadget_endpoint_trbs_complete()
3695 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_endpoint_trbs_complete()
3697 dwc->u1u2 = 0; in dwc3_gadget_endpoint_trbs_complete()
3777 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_command_complete() local
3778 struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); in dwc3_gadget_endpoint_command_complete()
3782 struct usb_ep *ep0 = &dwc->eps[0]->endpoint; in dwc3_gadget_endpoint_command_complete()
3784 dev_err(dwc->dev, "failed to clear STALL on %s\n", dep->name); in dwc3_gadget_endpoint_command_complete()
3785 if (dwc->delayed_status) in dwc3_gadget_endpoint_command_complete()
3792 dwc3_ep0_send_delayed_status(dwc); in dwc3_gadget_endpoint_command_complete()
3805 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_endpoint_stream_event() local
3853 dwc3_send_gadget_generic_command(dwc, cmd, dep->number); in dwc3_gadget_endpoint_stream_event()
3866 static void dwc3_endpoint_interrupt(struct dwc3 *dwc, in dwc3_endpoint_interrupt() argument
3872 dep = dwc->eps[epnum]; in dwc3_endpoint_interrupt()
3885 dwc3_ep0_interrupt(dwc, event); in dwc3_endpoint_interrupt()
3910 static void dwc3_disconnect_gadget(struct dwc3 *dwc) in dwc3_disconnect_gadget() argument
3912 if (dwc->async_callbacks && dwc->gadget_driver->disconnect) { in dwc3_disconnect_gadget()
3913 spin_unlock(&dwc->lock); in dwc3_disconnect_gadget()
3914 dwc->gadget_driver->disconnect(dwc->gadget); in dwc3_disconnect_gadget()
3915 spin_lock(&dwc->lock); in dwc3_disconnect_gadget()
3919 static void dwc3_suspend_gadget(struct dwc3 *dwc) in dwc3_suspend_gadget() argument
3921 if (dwc->async_callbacks && dwc->gadget_driver->suspend) { in dwc3_suspend_gadget()
3922 spin_unlock(&dwc->lock); in dwc3_suspend_gadget()
3923 dwc->gadget_driver->suspend(dwc->gadget); in dwc3_suspend_gadget()
3924 spin_lock(&dwc->lock); in dwc3_suspend_gadget()
3928 static void dwc3_resume_gadget(struct dwc3 *dwc) in dwc3_resume_gadget() argument
3930 if (dwc->async_callbacks && dwc->gadget_driver->resume) { in dwc3_resume_gadget()
3931 spin_unlock(&dwc->lock); in dwc3_resume_gadget()
3932 dwc->gadget_driver->resume(dwc->gadget); in dwc3_resume_gadget()
3933 spin_lock(&dwc->lock); in dwc3_resume_gadget()
3937 static void dwc3_reset_gadget(struct dwc3 *dwc) in dwc3_reset_gadget() argument
3939 if (!dwc->gadget_driver) in dwc3_reset_gadget()
3942 if (dwc->async_callbacks && dwc->gadget->speed != USB_SPEED_UNKNOWN) { in dwc3_reset_gadget()
3943 spin_unlock(&dwc->lock); in dwc3_reset_gadget()
3944 usb_gadget_udc_reset(dwc->gadget, dwc->gadget_driver); in dwc3_reset_gadget()
3945 spin_lock(&dwc->lock); in dwc3_reset_gadget()
3952 struct dwc3 *dwc = dep->dwc; in dwc3_stop_active_transfer() local
3960 if (dep->number <= 1 && dwc->ep0state != EP0_DATA_PHASE) in dwc3_stop_active_transfer()
3975 if (dwc->ep0state != EP0_SETUP_PHASE && !dwc->delayed_status) { in dwc3_stop_active_transfer()
4011 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) in dwc3_clear_stall_all_ep() argument
4019 dep = dwc->eps[epnum]; in dwc3_clear_stall_all_ep()
4033 static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) in dwc3_gadget_disconnect_interrupt() argument
4037 dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET); in dwc3_gadget_disconnect_interrupt()
4039 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_disconnect_interrupt()
4042 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_disconnect_interrupt()
4044 dwc->connected = false; in dwc3_gadget_disconnect_interrupt()
4046 dwc3_disconnect_gadget(dwc); in dwc3_gadget_disconnect_interrupt()
4048 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_disconnect_interrupt()
4049 dwc->setup_packet_pending = false; in dwc3_gadget_disconnect_interrupt()
4050 usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED); in dwc3_gadget_disconnect_interrupt()
4052 if (dwc->ep0state != EP0_SETUP_PHASE) { in dwc3_gadget_disconnect_interrupt()
4055 dir = !!dwc->ep0_expect_in; in dwc3_gadget_disconnect_interrupt()
4056 if (dwc->ep0state == EP0_DATA_PHASE) in dwc3_gadget_disconnect_interrupt()
4057 dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); in dwc3_gadget_disconnect_interrupt()
4059 dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); in dwc3_gadget_disconnect_interrupt()
4060 dwc3_ep0_stall_and_restart(dwc); in dwc3_gadget_disconnect_interrupt()
4064 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) in dwc3_gadget_reset_interrupt() argument
4075 dwc->connected = false; in dwc3_gadget_reset_interrupt()
4104 if (dwc->setup_packet_pending) in dwc3_gadget_reset_interrupt()
4105 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_reset_interrupt()
4108 dwc3_reset_gadget(dwc); in dwc3_gadget_reset_interrupt()
4115 if (dwc->ep0state != EP0_SETUP_PHASE) { in dwc3_gadget_reset_interrupt()
4118 dir = !!dwc->ep0_expect_in; in dwc3_gadget_reset_interrupt()
4119 if (dwc->ep0state == EP0_DATA_PHASE) in dwc3_gadget_reset_interrupt()
4120 dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); in dwc3_gadget_reset_interrupt()
4122 dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); in dwc3_gadget_reset_interrupt()
4124 dwc->eps[0]->trb_enqueue = 0; in dwc3_gadget_reset_interrupt()
4125 dwc->eps[1]->trb_enqueue = 0; in dwc3_gadget_reset_interrupt()
4127 dwc3_ep0_stall_and_restart(dwc); in dwc3_gadget_reset_interrupt()
4136 dwc3_stop_active_transfers(dwc); in dwc3_gadget_reset_interrupt()
4137 dwc->connected = true; in dwc3_gadget_reset_interrupt()
4139 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_reset_interrupt()
4141 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_reset_interrupt()
4142 dwc->test_mode = false; in dwc3_gadget_reset_interrupt()
4143 dwc3_clear_stall_all_ep(dwc); in dwc3_gadget_reset_interrupt()
4146 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_reset_interrupt()
4148 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_reset_interrupt()
4151 static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) in dwc3_gadget_conndone_interrupt() argument
4158 struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); in dwc3_gadget_conndone_interrupt()
4163 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_conndone_interrupt()
4165 dwc->speed = speed; in dwc3_gadget_conndone_interrupt()
4170 dwc->gadget->ssp_rate = USB_SSP_GEN_UNKNOWN; in dwc3_gadget_conndone_interrupt()
4184 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
4185 dwc->gadget->speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_conndone_interrupt()
4188 dwc->gadget->ssp_rate = USB_SSP_GEN_2x2; in dwc3_gadget_conndone_interrupt()
4190 dwc->gadget->ssp_rate = USB_SSP_GEN_2x1; in dwc3_gadget_conndone_interrupt()
4207 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_conndone_interrupt()
4210 dwc->gadget->ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
4211 dwc->gadget->speed = USB_SPEED_SUPER; in dwc3_gadget_conndone_interrupt()
4214 dwc->gadget->speed = USB_SPEED_SUPER_PLUS; in dwc3_gadget_conndone_interrupt()
4215 dwc->gadget->ssp_rate = USB_SSP_GEN_1x2; in dwc3_gadget_conndone_interrupt()
4220 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
4221 dwc->gadget->speed = USB_SPEED_HIGH; in dwc3_gadget_conndone_interrupt()
4225 dwc->gadget->ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
4226 dwc->gadget->speed = USB_SPEED_FULL; in dwc3_gadget_conndone_interrupt()
4230 dwc->gadget->ep0->maxpacket = 8; in dwc3_gadget_conndone_interrupt()
4231 dwc->gadget->speed = USB_SPEED_LOW; in dwc3_gadget_conndone_interrupt()
4235 dwc->eps[1]->endpoint.maxpacket = dwc->gadget->ep0->maxpacket; in dwc3_gadget_conndone_interrupt()
4240 !dwc->usb2_gadget_lpm_disable && in dwc3_gadget_conndone_interrupt()
4243 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
4245 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
4247 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
4250 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold | in dwc3_gadget_conndone_interrupt()
4251 (dwc->is_utmi_l1_suspend << 4)); in dwc3_gadget_conndone_interrupt()
4259 WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum, in dwc3_gadget_conndone_interrupt()
4262 if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) in dwc3_gadget_conndone_interrupt()
4263 reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold); in dwc3_gadget_conndone_interrupt()
4265 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
4267 if (dwc->usb2_gadget_lpm_disable) { in dwc3_gadget_conndone_interrupt()
4268 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
4270 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
4273 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
4275 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_conndone_interrupt()
4278 dep = dwc->eps[0]; in dwc3_gadget_conndone_interrupt()
4281 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
4285 dep = dwc->eps[1]; in dwc3_gadget_conndone_interrupt()
4288 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
4301 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) in dwc3_gadget_wakeup_interrupt() argument
4308 if (dwc->async_callbacks && dwc->gadget_driver->resume) { in dwc3_gadget_wakeup_interrupt()
4309 spin_unlock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
4310 dwc->gadget_driver->resume(dwc->gadget); in dwc3_gadget_wakeup_interrupt()
4311 spin_lock(&dwc->lock); in dwc3_gadget_wakeup_interrupt()
4315 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, in dwc3_gadget_linksts_change_interrupt() argument
4338 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1); in dwc3_gadget_linksts_change_interrupt()
4341 if ((dwc->link_state == DWC3_LINK_STATE_U3) && in dwc3_gadget_linksts_change_interrupt()
4370 switch (dwc->link_state) { in dwc3_gadget_linksts_change_interrupt()
4373 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_linksts_change_interrupt()
4379 if (!dwc->u1u2) in dwc3_gadget_linksts_change_interrupt()
4380 dwc->u1u2 = reg & u1u2; in dwc3_gadget_linksts_change_interrupt()
4384 dwc3_gadget_dctl_write_safe(dwc, reg); in dwc3_gadget_linksts_change_interrupt()
4395 if (dwc->speed == USB_SPEED_SUPER) in dwc3_gadget_linksts_change_interrupt()
4396 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
4400 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
4403 dwc3_resume_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
4410 dwc->link_state = next; in dwc3_gadget_linksts_change_interrupt()
4413 static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc, in dwc3_gadget_suspend_interrupt() argument
4418 if (dwc->link_state != next && next == DWC3_LINK_STATE_U3) in dwc3_gadget_suspend_interrupt()
4419 dwc3_suspend_gadget(dwc); in dwc3_gadget_suspend_interrupt()
4421 dwc->link_state = next; in dwc3_gadget_suspend_interrupt()
4424 static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, in dwc3_gadget_hibernation_interrupt() argument
4442 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) in dwc3_gadget_hibernation_interrupt()
4448 static void dwc3_gadget_interrupt(struct dwc3 *dwc, in dwc3_gadget_interrupt() argument
4453 dev_info(dwc->dev, "device disconnect\n"); in dwc3_gadget_interrupt()
4454 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_interrupt()
4457 dev_info(dwc->dev, "device reset\n"); in dwc3_gadget_interrupt()
4458 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_interrupt()
4461 dwc3_gadget_conndone_interrupt(dwc); in dwc3_gadget_interrupt()
4464 dwc3_gadget_wakeup_interrupt(dwc); in dwc3_gadget_interrupt()
4467 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation, in dwc3_gadget_interrupt()
4471 dwc3_gadget_hibernation_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
4474 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
4483 if (dwc->gadget->state >= USB_STATE_CONFIGURED) in dwc3_gadget_interrupt()
4484 dwc3_gadget_suspend_interrupt(dwc, in dwc3_gadget_interrupt()
4494 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type); in dwc3_gadget_interrupt()
4498 static void dwc3_process_event_entry(struct dwc3 *dwc, in dwc3_process_event_entry() argument
4501 trace_dwc3_event(event->raw, dwc); in dwc3_process_event_entry()
4504 dwc3_endpoint_interrupt(dwc, &event->depevt); in dwc3_process_event_entry()
4506 dwc3_gadget_interrupt(dwc, &event->devt); in dwc3_process_event_entry()
4508 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw); in dwc3_process_event_entry()
4513 struct dwc3 *dwc = evt->dwc; in dwc3_process_event_buf() local
4527 dwc3_process_event_entry(dwc, &event); in dwc3_process_event_buf()
4546 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), in dwc3_process_event_buf()
4549 if (dwc->imod_interval) { in dwc3_process_event_buf()
4550 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB); in dwc3_process_event_buf()
4551 dwc3_writel(dwc->regs, DWC3_DEV_IMOD(0), dwc->imod_interval); in dwc3_process_event_buf()
4563 struct dwc3 *dwc = evt->dwc; in dwc3_thread_interrupt() local
4568 spin_lock_irqsave(&dwc->lock, flags); in dwc3_thread_interrupt()
4570 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_thread_interrupt()
4578 struct dwc3 *dwc = evt->dwc; in dwc3_check_event_buf() local
4582 if (pm_runtime_suspended(dwc->dev)) { in dwc3_check_event_buf()
4583 pm_runtime_get(dwc->dev); in dwc3_check_event_buf()
4584 disable_irq_nosync(dwc->irq_gadget); in dwc3_check_event_buf()
4585 dwc->pending_events = true; in dwc3_check_event_buf()
4598 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); in dwc3_check_event_buf()
4607 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), in dwc3_check_event_buf()
4616 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); in dwc3_check_event_buf()
4628 static int dwc3_gadget_get_irq(struct dwc3 *dwc) in dwc3_gadget_get_irq() argument
4630 struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); in dwc3_gadget_get_irq()
4671 int dwc3_gadget_init(struct dwc3 *dwc) in dwc3_gadget_init() argument
4677 irq = dwc3_gadget_get_irq(dwc); in dwc3_gadget_init()
4683 dwc->irq_gadget = irq; in dwc3_gadget_init()
4685 dwc->ep0_trb = dma_alloc_coherent(dwc->sysdev, in dwc3_gadget_init()
4686 sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
4687 &dwc->ep0_trb_addr, GFP_KERNEL); in dwc3_gadget_init()
4688 if (!dwc->ep0_trb) { in dwc3_gadget_init()
4689 dev_err(dwc->dev, "failed to allocate ep0 trb\n"); in dwc3_gadget_init()
4694 dwc->setup_buf = kzalloc(DWC3_EP0_SETUP_SIZE, GFP_KERNEL); in dwc3_gadget_init()
4695 if (!dwc->setup_buf) { in dwc3_gadget_init()
4700 dwc->bounce = dma_alloc_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, in dwc3_gadget_init()
4701 &dwc->bounce_addr, GFP_KERNEL); in dwc3_gadget_init()
4702 if (!dwc->bounce) { in dwc3_gadget_init()
4707 init_completion(&dwc->ep0_in_setup); in dwc3_gadget_init()
4708 dwc->gadget = kzalloc(sizeof(struct usb_gadget), GFP_KERNEL); in dwc3_gadget_init()
4709 if (!dwc->gadget) { in dwc3_gadget_init()
4715 usb_initialize_gadget(dwc->dev, dwc->gadget, dwc_gadget_release); in dwc3_gadget_init()
4716 dev = &dwc->gadget->dev; in dwc3_gadget_init()
4717 dev->platform_data = dwc; in dwc3_gadget_init()
4718 dwc->gadget->ops = &dwc3_gadget_ops; in dwc3_gadget_init()
4719 dwc->gadget->speed = USB_SPEED_UNKNOWN; in dwc3_gadget_init()
4720 dwc->gadget->ssp_rate = USB_SSP_GEN_UNKNOWN; in dwc3_gadget_init()
4721 dwc->gadget->sg_supported = true; in dwc3_gadget_init()
4722 dwc->gadget->name = "dwc3-gadget"; in dwc3_gadget_init()
4723 dwc->gadget->lpm_capable = !dwc->usb2_gadget_lpm_disable; in dwc3_gadget_init()
4742 !dwc->dis_metastability_quirk) in dwc3_gadget_init()
4743 dev_info(dwc->dev, "changing max_speed on rev %08x\n", in dwc3_gadget_init()
4744 dwc->revision); in dwc3_gadget_init()
4746 dwc->gadget->max_speed = dwc->maximum_speed; in dwc3_gadget_init()
4747 dwc->gadget->max_ssp_rate = dwc->max_ssp_rate; in dwc3_gadget_init()
4754 ret = dwc3_gadget_init_endpoints(dwc, dwc->num_eps); in dwc3_gadget_init()
4758 ret = usb_add_gadget(dwc->gadget); in dwc3_gadget_init()
4760 dev_err(dwc->dev, "failed to add gadget\n"); in dwc3_gadget_init()
4764 if (DWC3_IP_IS(DWC32) && dwc->maximum_speed == USB_SPEED_SUPER_PLUS) in dwc3_gadget_init()
4765 dwc3_gadget_set_ssp_rate(dwc->gadget, dwc->max_ssp_rate); in dwc3_gadget_init()
4767 dwc3_gadget_set_speed(dwc->gadget, dwc->maximum_speed); in dwc3_gadget_init()
4772 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_init()
4774 usb_put_gadget(dwc->gadget); in dwc3_gadget_init()
4775 dwc->gadget = NULL; in dwc3_gadget_init()
4777 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_init()
4778 dwc->bounce_addr); in dwc3_gadget_init()
4781 kfree(dwc->setup_buf); in dwc3_gadget_init()
4784 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
4785 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_init()
4793 void dwc3_gadget_exit(struct dwc3 *dwc) in dwc3_gadget_exit() argument
4795 if (!dwc->gadget) in dwc3_gadget_exit()
4798 usb_del_gadget(dwc->gadget); in dwc3_gadget_exit()
4799 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_exit()
4800 usb_put_gadget(dwc->gadget); in dwc3_gadget_exit()
4801 dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce, in dwc3_gadget_exit()
4802 dwc->bounce_addr); in dwc3_gadget_exit()
4803 kfree(dwc->setup_buf); in dwc3_gadget_exit()
4804 dma_free_coherent(dwc->sysdev, sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_exit()
4805 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_exit()
4808 int dwc3_gadget_suspend(struct dwc3 *dwc) in dwc3_gadget_suspend() argument
4812 if (!dwc->gadget_driver) in dwc3_gadget_suspend()
4815 dwc3_gadget_run_stop(dwc, false, false); in dwc3_gadget_suspend()
4817 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_suspend()
4818 dwc3_disconnect_gadget(dwc); in dwc3_gadget_suspend()
4819 __dwc3_gadget_stop(dwc); in dwc3_gadget_suspend()
4820 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_suspend()
4825 int dwc3_gadget_resume(struct dwc3 *dwc) in dwc3_gadget_resume() argument
4827 struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); in dwc3_gadget_resume()
4830 if (!dwc->gadget_driver || !vdwc->softconnect) in dwc3_gadget_resume()
4833 ret = __dwc3_gadget_start(dwc); in dwc3_gadget_resume()
4837 ret = dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_resume()
4844 __dwc3_gadget_stop(dwc); in dwc3_gadget_resume()
4850 void dwc3_gadget_process_pending_events(struct dwc3 *dwc) in dwc3_gadget_process_pending_events() argument
4852 if (dwc->pending_events) { in dwc3_gadget_process_pending_events()
4853 dwc3_interrupt(dwc->irq_gadget, dwc->ev_buf); in dwc3_gadget_process_pending_events()
4854 dwc->pending_events = false; in dwc3_gadget_process_pending_events()
4855 enable_irq(dwc->irq_gadget); in dwc3_gadget_process_pending_events()