Lines Matching refs:dwc

47 int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)  in dwc3_gadget_set_test_mode()  argument
51 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_set_test_mode()
66 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_set_test_mode()
78 int dwc3_gadget_get_link_state(struct dwc3 *dwc) in dwc3_gadget_get_link_state() argument
82 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_get_link_state()
95 int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state) in dwc3_gadget_set_link_state() argument
104 if (dwc->revision >= DWC3_REVISION_194A) { in dwc3_gadget_set_link_state()
106 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_set_link_state()
117 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_set_link_state()
122 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_set_link_state()
128 if (dwc->revision >= DWC3_REVISION_194A) in dwc3_gadget_set_link_state()
134 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_set_link_state()
169 int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) in dwc3_gadget_resize_tx_fifos() argument
177 if (!dwc->needs_fifo_resize) in dwc3_gadget_resize_tx_fifos()
180 ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); in dwc3_gadget_resize_tx_fifos()
181 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_resize_tx_fifos()
192 for (num = 0; num < dwc->num_in_eps; num++) { in dwc3_gadget_resize_tx_fifos()
194 struct dwc3_ep *dep = dwc->eps[(num << 1) | 1]; in dwc3_gadget_resize_tx_fifos()
226 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); in dwc3_gadget_resize_tx_fifos()
237 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_giveback() local
262 if (dwc->ep0_bounced && dep->number == 0) in dwc3_gadget_giveback()
263 dwc->ep0_bounced = false; in dwc3_gadget_giveback()
265 usb_gadget_unmap_request(&dwc->gadget, &req->request, in dwc3_gadget_giveback()
268 dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", in dwc3_gadget_giveback()
273 spin_unlock(&dwc->lock); in dwc3_gadget_giveback()
275 spin_lock(&dwc->lock); in dwc3_gadget_giveback()
278 int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param) in dwc3_send_gadget_generic_command() argument
285 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param); in dwc3_send_gadget_generic_command()
286 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT); in dwc3_send_gadget_generic_command()
289 reg = dwc3_readl(dwc->regs, DWC3_DGCMD); in dwc3_send_gadget_generic_command()
313 int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, in dwc3_send_gadget_ep_cmd() argument
316 struct dwc3_ep *dep = dwc->eps[ep]; in dwc3_send_gadget_ep_cmd()
322 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR0(ep), params->param0); in dwc3_send_gadget_ep_cmd()
323 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR1(ep), params->param1); in dwc3_send_gadget_ep_cmd()
324 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR2(ep), params->param2); in dwc3_send_gadget_ep_cmd()
326 dwc3_writel(dwc->regs, DWC3_DEPCMD(ep), cmd | DWC3_DEPCMD_CMDACT); in dwc3_send_gadget_ep_cmd()
328 reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep)); in dwc3_send_gadget_ep_cmd()
363 struct dwc3 *dwc = dep->dwc; in dwc3_alloc_trb_pool() local
368 dep->trb_pool = dma_alloc_coherent(dwc->dev, in dwc3_alloc_trb_pool()
372 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n", in dwc3_alloc_trb_pool()
382 struct dwc3 *dwc = dep->dwc; in dwc3_free_trb_pool() local
384 dma_free_coherent(dwc->dev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM, in dwc3_free_trb_pool()
391 static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep);
425 static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_gadget_start_config() argument
438 ret = dwc3_send_gadget_ep_cmd(dwc, 0, cmd, &params); in dwc3_gadget_start_config()
443 struct dwc3_ep *dep = dwc->eps[i]; in dwc3_gadget_start_config()
448 ret = dwc3_gadget_set_xfer_resource(dwc, dep); in dwc3_gadget_start_config()
456 static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, in dwc3_gadget_set_ep_config() argument
469 if (dwc->gadget.speed == USB_SPEED_SUPER) { in dwc3_gadget_set_ep_config()
515 return dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_gadget_set_ep_config()
519 static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_gadget_set_xfer_resource() argument
527 return dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_gadget_set_xfer_resource()
543 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_enable() local
550 ret = dwc3_gadget_start_config(dwc, dep); in __dwc3_gadget_ep_enable()
555 ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore, in __dwc3_gadget_ep_enable()
569 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_enable()
571 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_enable()
591 static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force);
592 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_remove_requests() argument
597 dwc3_stop_active_transfer(dwc, dep->number, true); in dwc3_remove_requests()
624 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_disable() local
627 dwc3_remove_requests(dwc, dep); in __dwc3_gadget_ep_disable()
633 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_disable()
635 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_disable()
665 struct dwc3 *dwc; in dwc3_gadget_ep_enable() local
680 dwc = dep->dwc; in dwc3_gadget_ep_enable()
683 dev_WARN_ONCE(dwc->dev, true, "%s is already enabled\n", in dwc3_gadget_ep_enable()
702 dev_err(dwc->dev, "invalid endpoint transfer type\n"); in dwc3_gadget_ep_enable()
705 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_enable()
707 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_enable()
715 struct dwc3 *dwc; in dwc3_gadget_ep_disable() local
725 dwc = dep->dwc; in dwc3_gadget_ep_disable()
728 dev_WARN_ONCE(dwc->dev, true, "%s is already disabled\n", in dwc3_gadget_ep_disable()
737 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_disable()
739 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_disable()
979 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_kick_transfer() local
1023 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params); in __dwc3_gadget_kick_transfer()
1025 dev_dbg(dwc->dev, "failed to send STARTTRANSFER command\n"); in __dwc3_gadget_kick_transfer()
1032 usb_gadget_unmap_request(&dwc->gadget, &req->request, in __dwc3_gadget_kick_transfer()
1041 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc, in __dwc3_gadget_kick_transfer()
1049 static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, in __dwc3_gadget_start_isoc() argument
1068 static void dwc3_gadget_start_isoc(struct dwc3 *dwc, in dwc3_gadget_start_isoc() argument
1076 __dwc3_gadget_start_isoc(dwc, dep, cur_uf); in dwc3_gadget_start_isoc()
1081 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_queue() local
1101 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_gadget_ep_queue()
1128 dwc3_stop_active_transfer(dwc, dep->number, true); in __dwc3_gadget_ep_queue()
1136 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in __dwc3_gadget_ep_queue()
1153 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in __dwc3_gadget_ep_queue()
1166 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in __dwc3_gadget_ep_queue()
1178 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_queue() local
1184 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1186 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", in dwc3_gadget_ep_queue()
1203 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1215 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_dequeue() local
1222 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1236 dwc3_stop_active_transfer(dwc, dep->number, true); in dwc3_gadget_ep_dequeue()
1239 dev_err(dwc->dev, "request %p was not queued to %s\n", in dwc3_gadget_ep_dequeue()
1250 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1258 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_set_halt() local
1262 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); in __dwc3_gadget_ep_set_halt()
1272 dev_dbg(dwc->dev, "%s: pending request, cannot halt\n", in __dwc3_gadget_ep_set_halt()
1277 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in __dwc3_gadget_ep_set_halt()
1280 dev_err(dwc->dev, "failed to set STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1285 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in __dwc3_gadget_ep_set_halt()
1288 dev_err(dwc->dev, "failed to clear STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1300 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_halt() local
1306 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1308 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1316 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_set_wedge() local
1320 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1327 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1366 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_get_frame() local
1369 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_get_frame()
1375 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_wakeup() local
1387 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_wakeup()
1395 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_wakeup()
1399 dev_dbg(dwc->dev, "no wakeup on SuperSpeed\n"); in dwc3_gadget_wakeup()
1411 dev_dbg(dwc->dev, "can't wakeup from link state %d\n", in dwc3_gadget_wakeup()
1417 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); in dwc3_gadget_wakeup()
1419 dev_err(dwc->dev, "failed to put link in Recovery\n"); in dwc3_gadget_wakeup()
1424 if (dwc->revision < DWC3_REVISION_194A) { in dwc3_gadget_wakeup()
1426 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_wakeup()
1428 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_wakeup()
1435 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_wakeup()
1443 dev_err(dwc->dev, "failed to send remote wakeup\n"); in dwc3_gadget_wakeup()
1448 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_wakeup()
1456 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_selfpowered() local
1459 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
1461 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
1466 static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) in dwc3_gadget_run_stop() argument
1471 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_run_stop()
1473 if (dwc->revision <= DWC3_REVISION_187A) { in dwc3_gadget_run_stop()
1478 if (dwc->revision >= DWC3_REVISION_194A) in dwc3_gadget_run_stop()
1482 if (dwc->has_hibernation) in dwc3_gadget_run_stop()
1485 dwc->pullups_connected = true; in dwc3_gadget_run_stop()
1489 if (dwc->has_hibernation && !suspend) in dwc3_gadget_run_stop()
1492 dwc->pullups_connected = false; in dwc3_gadget_run_stop()
1495 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_run_stop()
1498 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_run_stop()
1513 dwc->gadget_driver in dwc3_gadget_run_stop()
1514 ? dwc->gadget_driver->function : "no-function", in dwc3_gadget_run_stop()
1522 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_pullup() local
1528 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_pullup()
1529 ret = dwc3_gadget_run_stop(dwc, is_on, false); in dwc3_gadget_pullup()
1530 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_pullup()
1535 static void dwc3_gadget_enable_irq(struct dwc3 *dwc) in dwc3_gadget_enable_irq() argument
1550 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); in dwc3_gadget_enable_irq()
1553 static void dwc3_gadget_disable_irq(struct dwc3 *dwc) in dwc3_gadget_disable_irq() argument
1556 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00); in dwc3_gadget_disable_irq()
1565 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_start() local
1572 irq = platform_get_irq(to_platform_device(dwc->dev), 0); in dwc3_gadget_start()
1574 IRQF_SHARED, "dwc3", dwc); in dwc3_gadget_start()
1576 dev_err(dwc->dev, "failed to request irq #%d --> %d\n", in dwc3_gadget_start()
1581 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_start()
1583 if (dwc->gadget_driver) { in dwc3_gadget_start()
1584 dev_err(dwc->dev, "%s is already bound to %s\n", in dwc3_gadget_start()
1585 dwc->gadget.name, in dwc3_gadget_start()
1586 dwc->gadget_driver->driver.name); in dwc3_gadget_start()
1591 dwc->gadget_driver = driver; in dwc3_gadget_start()
1593 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_start()
1609 if (dwc->revision < DWC3_REVISION_220A) { in dwc3_gadget_start()
1612 switch (dwc->maximum_speed) { in dwc3_gadget_start()
1628 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_start()
1633 dep = dwc->eps[0]; in dwc3_gadget_start()
1637 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_start()
1641 dep = dwc->eps[1]; in dwc3_gadget_start()
1645 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_start()
1650 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_gadget_start()
1651 dwc3_ep0_out_start(dwc); in dwc3_gadget_start()
1653 dwc3_gadget_enable_irq(dwc); in dwc3_gadget_start()
1655 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
1660 __dwc3_gadget_ep_disable(dwc->eps[0]); in dwc3_gadget_start()
1663 dwc->gadget_driver = NULL; in dwc3_gadget_start()
1666 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
1668 free_irq(irq, dwc); in dwc3_gadget_start()
1676 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_stop() local
1680 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_stop()
1682 dwc3_gadget_disable_irq(dwc); in dwc3_gadget_stop()
1683 __dwc3_gadget_ep_disable(dwc->eps[0]); in dwc3_gadget_stop()
1684 __dwc3_gadget_ep_disable(dwc->eps[1]); in dwc3_gadget_stop()
1686 dwc->gadget_driver = NULL; in dwc3_gadget_stop()
1688 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
1690 irq = platform_get_irq(to_platform_device(dwc->dev), 0); in dwc3_gadget_stop()
1691 free_irq(irq, dwc); in dwc3_gadget_stop()
1707 static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc, in dwc3_gadget_init_hw_endpoints() argument
1720 dep->dwc = dwc; in dwc3_gadget_init_hw_endpoints()
1723 dwc->eps[epnum] = dep; in dwc3_gadget_init_hw_endpoints()
1737 dwc->gadget.ep0 = &dep->endpoint; in dwc3_gadget_init_hw_endpoints()
1745 &dwc->gadget.ep_list); in dwc3_gadget_init_hw_endpoints()
1759 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) in dwc3_gadget_init_endpoints() argument
1763 INIT_LIST_HEAD(&dwc->gadget.ep_list); in dwc3_gadget_init_endpoints()
1765 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0); in dwc3_gadget_init_endpoints()
1772 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1); in dwc3_gadget_init_endpoints()
1782 static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) in dwc3_gadget_free_endpoints() argument
1788 dep = dwc->eps[epnum]; in dwc3_gadget_free_endpoints()
1811 static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep, in __dwc3_cleanup_done_trbs() argument
1830 dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n", in __dwc3_cleanup_done_trbs()
1838 dev_dbg(dwc->dev, "incomplete IN transfer %s\n", in __dwc3_cleanup_done_trbs()
1857 dev_err(dwc->dev, "incomplete IN transfer %s\n", in __dwc3_cleanup_done_trbs()
1889 static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, in dwc3_cleanup_done_reqs() argument
1913 ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb, in dwc3_cleanup_done_reqs()
1936 dwc3_stop_active_transfer(dwc, dep->number, true); in dwc3_cleanup_done_reqs()
1945 static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc, in dwc3_endpoint_transfer_complete() argument
1957 clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status); in dwc3_endpoint_transfer_complete()
1966 if (dwc->revision < DWC3_REVISION_183A) { in dwc3_endpoint_transfer_complete()
1971 dep = dwc->eps[i]; in dwc3_endpoint_transfer_complete()
1980 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_endpoint_transfer_complete()
1981 reg |= dwc->u1u2; in dwc3_endpoint_transfer_complete()
1982 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_endpoint_transfer_complete()
1984 dwc->u1u2 = 0; in dwc3_endpoint_transfer_complete()
1988 static void dwc3_endpoint_interrupt(struct dwc3 *dwc, in dwc3_endpoint_interrupt() argument
1994 dep = dwc->eps[epnum]; in dwc3_endpoint_interrupt()
2000 dwc3_ep0_interrupt(dwc, event); in dwc3_endpoint_interrupt()
2009 dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n", in dwc3_endpoint_interrupt()
2014 dwc3_endpoint_transfer_complete(dwc, dep, event); in dwc3_endpoint_interrupt()
2017 dwc3_endpoint_transfer_complete(dwc, dep, event); in dwc3_endpoint_interrupt()
2021 dwc3_gadget_start_isoc(dwc, dep, event); in dwc3_endpoint_interrupt()
2035 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in dwc3_endpoint_interrupt()
2042 dev_err(dwc->dev, "Stream event for non-Bulk %s\n", in dwc3_endpoint_interrupt()
2057 dev_dbg(dwc->dev, "Couldn't find suitable stream\n"); in dwc3_endpoint_interrupt()
2061 dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); in dwc3_endpoint_interrupt()
2069 static void dwc3_disconnect_gadget(struct dwc3 *dwc) in dwc3_disconnect_gadget() argument
2071 if (dwc->gadget_driver && dwc->gadget_driver->disconnect) { in dwc3_disconnect_gadget()
2072 spin_unlock(&dwc->lock); in dwc3_disconnect_gadget()
2073 dwc->gadget_driver->disconnect(&dwc->gadget); in dwc3_disconnect_gadget()
2074 spin_lock(&dwc->lock); in dwc3_disconnect_gadget()
2078 static void dwc3_suspend_gadget(struct dwc3 *dwc) in dwc3_suspend_gadget() argument
2080 if (dwc->gadget_driver && dwc->gadget_driver->suspend) { in dwc3_suspend_gadget()
2081 spin_unlock(&dwc->lock); in dwc3_suspend_gadget()
2082 dwc->gadget_driver->suspend(&dwc->gadget); in dwc3_suspend_gadget()
2083 spin_lock(&dwc->lock); in dwc3_suspend_gadget()
2087 static void dwc3_resume_gadget(struct dwc3 *dwc) in dwc3_resume_gadget() argument
2089 if (dwc->gadget_driver && dwc->gadget_driver->resume) { in dwc3_resume_gadget()
2090 spin_unlock(&dwc->lock); in dwc3_resume_gadget()
2091 dwc->gadget_driver->resume(&dwc->gadget); in dwc3_resume_gadget()
2092 spin_lock(&dwc->lock); in dwc3_resume_gadget()
2096 static void dwc3_reset_gadget(struct dwc3 *dwc) in dwc3_reset_gadget() argument
2098 if (!dwc->gadget_driver) in dwc3_reset_gadget()
2101 if (dwc->gadget.speed != USB_SPEED_UNKNOWN) { in dwc3_reset_gadget()
2102 spin_unlock(&dwc->lock); in dwc3_reset_gadget()
2103 usb_gadget_udc_reset(&dwc->gadget, dwc->gadget_driver); in dwc3_reset_gadget()
2104 spin_lock(&dwc->lock); in dwc3_reset_gadget()
2108 static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force) in dwc3_stop_active_transfer() argument
2115 dep = dwc->eps[epnum]; in dwc3_stop_active_transfer()
2144 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params); in dwc3_stop_active_transfer()
2151 static void dwc3_stop_active_transfers(struct dwc3 *dwc) in dwc3_stop_active_transfers() argument
2158 dep = dwc->eps[epnum]; in dwc3_stop_active_transfers()
2165 dwc3_remove_requests(dwc, dep); in dwc3_stop_active_transfers()
2169 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) in dwc3_clear_stall_all_ep() argument
2178 dep = dwc->eps[epnum]; in dwc3_clear_stall_all_ep()
2188 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_clear_stall_all_ep()
2194 static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) in dwc3_gadget_disconnect_interrupt() argument
2198 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_disconnect_interrupt()
2200 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_disconnect_interrupt()
2203 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_disconnect_interrupt()
2205 dwc3_disconnect_gadget(dwc); in dwc3_gadget_disconnect_interrupt()
2207 dwc->gadget.speed = USB_SPEED_UNKNOWN; in dwc3_gadget_disconnect_interrupt()
2208 dwc->setup_packet_pending = false; in dwc3_gadget_disconnect_interrupt()
2209 usb_gadget_set_state(&dwc->gadget, USB_STATE_NOTATTACHED); in dwc3_gadget_disconnect_interrupt()
2212 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) in dwc3_gadget_reset_interrupt() argument
2242 if (dwc->revision < DWC3_REVISION_188A) { in dwc3_gadget_reset_interrupt()
2243 if (dwc->setup_packet_pending) in dwc3_gadget_reset_interrupt()
2244 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_reset_interrupt()
2247 dwc3_reset_gadget(dwc); in dwc3_gadget_reset_interrupt()
2249 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_reset_interrupt()
2251 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_reset_interrupt()
2252 dwc->test_mode = false; in dwc3_gadget_reset_interrupt()
2254 dwc3_stop_active_transfers(dwc); in dwc3_gadget_reset_interrupt()
2255 dwc3_clear_stall_all_ep(dwc); in dwc3_gadget_reset_interrupt()
2258 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_reset_interrupt()
2260 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_reset_interrupt()
2263 static void dwc3_update_ram_clk_sel(struct dwc3 *dwc, u32 speed) in dwc3_update_ram_clk_sel() argument
2283 reg = dwc3_readl(dwc->regs, DWC3_GCTL); in dwc3_update_ram_clk_sel()
2285 dwc3_writel(dwc->regs, DWC3_GCTL, reg); in dwc3_update_ram_clk_sel()
2288 static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) in dwc3_gadget_conndone_interrupt() argument
2295 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_conndone_interrupt()
2297 dwc->speed = speed; in dwc3_gadget_conndone_interrupt()
2299 dwc3_update_ram_clk_sel(dwc, speed); in dwc3_gadget_conndone_interrupt()
2316 if (dwc->revision < DWC3_REVISION_190A) in dwc3_gadget_conndone_interrupt()
2317 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_conndone_interrupt()
2320 dwc->gadget.ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
2321 dwc->gadget.speed = USB_SPEED_SUPER; in dwc3_gadget_conndone_interrupt()
2325 dwc->gadget.ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
2326 dwc->gadget.speed = USB_SPEED_HIGH; in dwc3_gadget_conndone_interrupt()
2331 dwc->gadget.ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
2332 dwc->gadget.speed = USB_SPEED_FULL; in dwc3_gadget_conndone_interrupt()
2336 dwc->gadget.ep0->maxpacket = 8; in dwc3_gadget_conndone_interrupt()
2337 dwc->gadget.speed = USB_SPEED_LOW; in dwc3_gadget_conndone_interrupt()
2343 if ((dwc->revision > DWC3_REVISION_194A) in dwc3_gadget_conndone_interrupt()
2345 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
2347 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
2349 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
2352 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold); in dwc3_gadget_conndone_interrupt()
2360 WARN_ONCE(dwc->revision < DWC3_REVISION_240A in dwc3_gadget_conndone_interrupt()
2361 && dwc->has_lpm_erratum, in dwc3_gadget_conndone_interrupt()
2364 if (dwc->has_lpm_erratum && dwc->revision >= DWC3_REVISION_240A) in dwc3_gadget_conndone_interrupt()
2365 reg |= DWC3_DCTL_LPM_ERRATA(dwc->lpm_nyet_threshold); in dwc3_gadget_conndone_interrupt()
2367 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_conndone_interrupt()
2369 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
2371 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_conndone_interrupt()
2374 dep = dwc->eps[0]; in dwc3_gadget_conndone_interrupt()
2378 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
2382 dep = dwc->eps[1]; in dwc3_gadget_conndone_interrupt()
2386 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
2399 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) in dwc3_gadget_wakeup_interrupt() argument
2406 dwc->gadget_driver->resume(&dwc->gadget); in dwc3_gadget_wakeup_interrupt()
2409 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, in dwc3_gadget_linksts_change_interrupt() argument
2432 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1); in dwc3_gadget_linksts_change_interrupt()
2433 if ((dwc->revision < DWC3_REVISION_250A) && in dwc3_gadget_linksts_change_interrupt()
2435 if ((dwc->link_state == DWC3_LINK_STATE_U3) && in dwc3_gadget_linksts_change_interrupt()
2461 if (dwc->revision < DWC3_REVISION_183A) { in dwc3_gadget_linksts_change_interrupt()
2466 switch (dwc->link_state) { in dwc3_gadget_linksts_change_interrupt()
2469 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_linksts_change_interrupt()
2475 if (!dwc->u1u2) in dwc3_gadget_linksts_change_interrupt()
2476 dwc->u1u2 = reg & u1u2; in dwc3_gadget_linksts_change_interrupt()
2480 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_linksts_change_interrupt()
2491 if (dwc->speed == USB_SPEED_SUPER) in dwc3_gadget_linksts_change_interrupt()
2492 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
2496 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
2499 dwc3_resume_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
2506 dwc->link_state = next; in dwc3_gadget_linksts_change_interrupt()
2509 static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, in dwc3_gadget_hibernation_interrupt() argument
2527 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) in dwc3_gadget_hibernation_interrupt()
2533 static void dwc3_gadget_interrupt(struct dwc3 *dwc, in dwc3_gadget_interrupt() argument
2538 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_interrupt()
2541 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_interrupt()
2544 dwc3_gadget_conndone_interrupt(dwc); in dwc3_gadget_interrupt()
2547 dwc3_gadget_wakeup_interrupt(dwc); in dwc3_gadget_interrupt()
2550 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation, in dwc3_gadget_interrupt()
2554 dwc3_gadget_hibernation_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
2557 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
2575 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type); in dwc3_gadget_interrupt()
2579 static void dwc3_process_event_entry(struct dwc3 *dwc, in dwc3_process_event_entry() argument
2587 return dwc3_endpoint_interrupt(dwc, &event->depevt); in dwc3_process_event_entry()
2592 dwc3_gadget_interrupt(dwc, &event->devt); in dwc3_process_event_entry()
2596 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw); in dwc3_process_event_entry()
2600 static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf) in dwc3_process_event_buf() argument
2607 evt = dwc->ev_buffs[buf]; in dwc3_process_event_buf()
2618 dwc3_process_event_entry(dwc, &event); in dwc3_process_event_buf()
2632 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(buf), 4); in dwc3_process_event_buf()
2640 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf)); in dwc3_process_event_buf()
2642 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg); in dwc3_process_event_buf()
2649 struct dwc3 *dwc = _dwc; in dwc3_thread_interrupt() local
2654 spin_lock_irqsave(&dwc->lock, flags); in dwc3_thread_interrupt()
2656 for (i = 0; i < dwc->num_event_buffers; i++) in dwc3_thread_interrupt()
2657 ret |= dwc3_process_event_buf(dwc, i); in dwc3_thread_interrupt()
2659 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_thread_interrupt()
2664 static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc, u32 buf) in dwc3_check_event_buf() argument
2670 evt = dwc->ev_buffs[buf]; in dwc3_check_event_buf()
2672 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf)); in dwc3_check_event_buf()
2681 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf)); in dwc3_check_event_buf()
2683 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg); in dwc3_check_event_buf()
2690 struct dwc3 *dwc = _dwc; in dwc3_interrupt() local
2694 spin_lock(&dwc->lock); in dwc3_interrupt()
2696 for (i = 0; i < dwc->num_event_buffers; i++) { in dwc3_interrupt()
2699 status = dwc3_check_event_buf(dwc, i); in dwc3_interrupt()
2704 spin_unlock(&dwc->lock); in dwc3_interrupt()
2715 int dwc3_gadget_init(struct dwc3 *dwc) in dwc3_gadget_init() argument
2719 dwc->ctrl_req = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ctrl_req), in dwc3_gadget_init()
2720 &dwc->ctrl_req_addr, GFP_KERNEL); in dwc3_gadget_init()
2721 if (!dwc->ctrl_req) { in dwc3_gadget_init()
2722 dev_err(dwc->dev, "failed to allocate ctrl request\n"); in dwc3_gadget_init()
2727 dwc->ep0_trb = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ep0_trb), in dwc3_gadget_init()
2728 &dwc->ep0_trb_addr, GFP_KERNEL); in dwc3_gadget_init()
2729 if (!dwc->ep0_trb) { in dwc3_gadget_init()
2730 dev_err(dwc->dev, "failed to allocate ep0 trb\n"); in dwc3_gadget_init()
2735 dwc->setup_buf = kzalloc(DWC3_EP0_BOUNCE_SIZE, GFP_KERNEL); in dwc3_gadget_init()
2736 if (!dwc->setup_buf) { in dwc3_gadget_init()
2741 dwc->ep0_bounce = dma_alloc_coherent(dwc->dev, in dwc3_gadget_init()
2742 DWC3_EP0_BOUNCE_SIZE, &dwc->ep0_bounce_addr, in dwc3_gadget_init()
2744 if (!dwc->ep0_bounce) { in dwc3_gadget_init()
2745 dev_err(dwc->dev, "failed to allocate ep0 bounce buffer\n"); in dwc3_gadget_init()
2750 dwc->gadget.ops = &dwc3_gadget_ops; in dwc3_gadget_init()
2751 dwc->gadget.speed = USB_SPEED_UNKNOWN; in dwc3_gadget_init()
2752 dwc->gadget.sg_supported = true; in dwc3_gadget_init()
2753 dwc->gadget.name = "dwc3-gadget"; in dwc3_gadget_init()
2771 if (dwc->revision < DWC3_REVISION_220A) in dwc3_gadget_init()
2774 dwc->revision); in dwc3_gadget_init()
2776 dwc->gadget.max_speed = dwc->maximum_speed; in dwc3_gadget_init()
2782 dwc->gadget.quirk_ep_out_aligned_size = true; in dwc3_gadget_init()
2789 ret = dwc3_gadget_init_endpoints(dwc); in dwc3_gadget_init()
2793 ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget); in dwc3_gadget_init()
2795 dev_err(dwc->dev, "failed to register udc\n"); in dwc3_gadget_init()
2802 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_init()
2803 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE, in dwc3_gadget_init()
2804 dwc->ep0_bounce, dwc->ep0_bounce_addr); in dwc3_gadget_init()
2807 kfree(dwc->setup_buf); in dwc3_gadget_init()
2810 dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb), in dwc3_gadget_init()
2811 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_init()
2814 dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req), in dwc3_gadget_init()
2815 dwc->ctrl_req, dwc->ctrl_req_addr); in dwc3_gadget_init()
2823 void dwc3_gadget_exit(struct dwc3 *dwc) in dwc3_gadget_exit() argument
2825 usb_del_gadget_udc(&dwc->gadget); in dwc3_gadget_exit()
2827 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_exit()
2829 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE, in dwc3_gadget_exit()
2830 dwc->ep0_bounce, dwc->ep0_bounce_addr); in dwc3_gadget_exit()
2832 kfree(dwc->setup_buf); in dwc3_gadget_exit()
2834 dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb), in dwc3_gadget_exit()
2835 dwc->ep0_trb, dwc->ep0_trb_addr); in dwc3_gadget_exit()
2837 dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req), in dwc3_gadget_exit()
2838 dwc->ctrl_req, dwc->ctrl_req_addr); in dwc3_gadget_exit()
2841 int dwc3_gadget_suspend(struct dwc3 *dwc) in dwc3_gadget_suspend() argument
2843 if (dwc->pullups_connected) { in dwc3_gadget_suspend()
2844 dwc3_gadget_disable_irq(dwc); in dwc3_gadget_suspend()
2845 dwc3_gadget_run_stop(dwc, true, true); in dwc3_gadget_suspend()
2848 __dwc3_gadget_ep_disable(dwc->eps[0]); in dwc3_gadget_suspend()
2849 __dwc3_gadget_ep_disable(dwc->eps[1]); in dwc3_gadget_suspend()
2851 dwc->dcfg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_suspend()
2856 int dwc3_gadget_resume(struct dwc3 *dwc) in dwc3_gadget_resume() argument
2864 dep = dwc->eps[0]; in dwc3_gadget_resume()
2870 dep = dwc->eps[1]; in dwc3_gadget_resume()
2877 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_gadget_resume()
2878 dwc3_ep0_out_start(dwc); in dwc3_gadget_resume()
2880 dwc3_writel(dwc->regs, DWC3_DCFG, dwc->dcfg); in dwc3_gadget_resume()
2882 if (dwc->pullups_connected) { in dwc3_gadget_resume()
2883 dwc3_gadget_enable_irq(dwc); in dwc3_gadget_resume()
2884 dwc3_gadget_run_stop(dwc, true, false); in dwc3_gadget_resume()
2890 __dwc3_gadget_ep_disable(dwc->eps[0]); in dwc3_gadget_resume()