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_writel(dwc->regs, DWC3_DCTL, 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
98 if (dwc->revision >= DWC3_REVISION_194A) { in dwc3_gadget_set_link_state()
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()
116 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_set_link_state()
122 if (dwc->revision >= DWC3_REVISION_194A) in dwc3_gadget_set_link_state()
128 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_set_link_state()
136 dev_vdbg(dwc->dev, "link state change request timed out\n"); in dwc3_gadget_set_link_state()
162 int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) in dwc3_gadget_resize_tx_fifos() argument
169 if (!dwc->needs_fifo_resize) in dwc3_gadget_resize_tx_fifos()
172 mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); in dwc3_gadget_resize_tx_fifos()
183 for (num = 0; num < dwc->num_in_eps; num++) { in dwc3_gadget_resize_tx_fifos()
185 struct dwc3_ep *dep = dwc->eps[(num << 1) | 1]; in dwc3_gadget_resize_tx_fifos()
214 dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", in dwc3_gadget_resize_tx_fifos()
217 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); in dwc3_gadget_resize_tx_fifos()
228 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_giveback() local
252 if (dwc->ep0_bounced && dep->number == 0) in dwc3_gadget_giveback()
253 dwc->ep0_bounced = false; in dwc3_gadget_giveback()
255 usb_gadget_unmap_request(&dwc->gadget, &req->request, in dwc3_gadget_giveback()
258 dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", in dwc3_gadget_giveback()
262 spin_unlock(&dwc->lock); in dwc3_gadget_giveback()
264 spin_lock(&dwc->lock); in dwc3_gadget_giveback()
267 int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param) in dwc3_send_gadget_generic_command() argument
272 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param); in dwc3_send_gadget_generic_command()
273 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT); in dwc3_send_gadget_generic_command()
276 reg = dwc3_readl(dwc->regs, DWC3_DGCMD); in dwc3_send_gadget_generic_command()
278 dev_vdbg(dwc->dev, "Command Complete --> %d\n", in dwc3_send_gadget_generic_command()
294 int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, in dwc3_send_gadget_ep_cmd() argument
300 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR0(ep), params->param0); in dwc3_send_gadget_ep_cmd()
301 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR1(ep), params->param1); in dwc3_send_gadget_ep_cmd()
302 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR2(ep), params->param2); in dwc3_send_gadget_ep_cmd()
304 dwc3_writel(dwc->regs, DWC3_DEPCMD(ep), cmd | DWC3_DEPCMD_CMDACT); in dwc3_send_gadget_ep_cmd()
306 reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep)); in dwc3_send_gadget_ep_cmd()
308 dev_vdbg(dwc->dev, "Command Complete --> %d\n", in dwc3_send_gadget_ep_cmd()
345 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n", in dwc3_alloc_trb_pool()
361 static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_gadget_start_config() argument
372 if (dwc->start_config_issued) in dwc3_gadget_start_config()
374 dwc->start_config_issued = true; in dwc3_gadget_start_config()
378 return dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms); in dwc3_gadget_start_config()
384 static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, in dwc3_gadget_set_ep_config() argument
397 if (dwc->gadget.speed == USB_SPEED_SUPER) { in dwc3_gadget_set_ep_config()
443 return dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_gadget_set_ep_config()
447 static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_gadget_set_xfer_resource() argument
455 return dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_gadget_set_xfer_resource()
471 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_enable() local
475 dev_vdbg(dwc->dev, "Enabling %s\n", dep->name); in __dwc3_gadget_ep_enable()
478 ret = dwc3_gadget_start_config(dwc, dep); in __dwc3_gadget_ep_enable()
483 ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore, in __dwc3_gadget_ep_enable()
492 ret = dwc3_gadget_set_xfer_resource(dwc, dep); in __dwc3_gadget_ep_enable()
501 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_enable()
503 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_enable()
523 static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force);
524 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) in dwc3_remove_requests() argument
529 dwc3_stop_active_transfer(dwc, dep->number, true); in dwc3_remove_requests()
556 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_disable() local
559 dwc3_remove_requests(dwc, dep); in __dwc3_gadget_ep_disable()
565 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); in __dwc3_gadget_ep_disable()
567 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); in __dwc3_gadget_ep_disable()
632 dev_err(dwc->dev, "invalid endpoint transfer type\n"); in dwc3_gadget_ep_enable()
635 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_enable()
637 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_enable()
665 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_disable()
667 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_disable()
707 dev_vdbg(dwc->dev, "%s: req %p dma %08llx length %d%s%s\n", in dwc3_prepare_one_trb()
869 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_kick_transfer() local
874 dev_vdbg(dwc->dev, "%s: endpoint busy\n", dep->name); in __dwc3_gadget_kick_transfer()
913 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); in __dwc3_gadget_kick_transfer()
915 dev_dbg(dwc->dev, "failed to send STARTTRANSFER command\n"); in __dwc3_gadget_kick_transfer()
922 usb_gadget_unmap_request(&dwc->gadget, &req->request, in __dwc3_gadget_kick_transfer()
931 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc, in __dwc3_gadget_kick_transfer()
939 static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, in __dwc3_gadget_start_isoc() argument
945 dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", in __dwc3_gadget_start_isoc()
957 static void dwc3_gadget_start_isoc(struct dwc3 *dwc, in dwc3_gadget_start_isoc() argument
965 __dwc3_gadget_start_isoc(dwc, dep, cur_uf); in dwc3_gadget_start_isoc()
970 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_queue() local
998 ret = usb_gadget_map_request(&dwc->gadget, &req->request, in __dwc3_gadget_ep_queue()
1025 dwc3_stop_active_transfer(dwc, dep->number, true); in __dwc3_gadget_ep_queue()
1033 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in __dwc3_gadget_ep_queue()
1050 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in __dwc3_gadget_ep_queue()
1065 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in __dwc3_gadget_ep_queue()
1083 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1085 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", in dwc3_gadget_ep_queue()
1098 dev_vdbg(dwc->dev, "queing request %p to %s length %d\n", in dwc3_gadget_ep_queue()
1104 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_queue()
1116 struct dwc3 *dwc = dep->dwc; in dwc3_gadget_ep_dequeue() local
1121 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1135 dwc3_stop_active_transfer(dwc, dep->number, true); in dwc3_gadget_ep_dequeue()
1138 dev_err(dwc->dev, "request %p was not queued to %s\n", in dwc3_gadget_ep_dequeue()
1149 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_dequeue()
1157 struct dwc3 *dwc = dep->dwc; in __dwc3_gadget_ep_set_halt() local
1161 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); in __dwc3_gadget_ep_set_halt()
1171 dev_dbg(dwc->dev, "%s: pending request, cannot halt\n", in __dwc3_gadget_ep_set_halt()
1176 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in __dwc3_gadget_ep_set_halt()
1179 dev_err(dwc->dev, "failed to set STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1184 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in __dwc3_gadget_ep_set_halt()
1187 dev_err(dwc->dev, "failed to clear STALL on %s\n", in __dwc3_gadget_ep_set_halt()
1204 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1206 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_halt()
1217 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1224 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_ep_set_wedge()
1263 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_get_frame() local
1266 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_get_frame()
1272 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_wakeup() local
1284 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_wakeup()
1292 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_wakeup()
1296 dev_dbg(dwc->dev, "no wakeup on SuperSpeed\n"); in dwc3_gadget_wakeup()
1308 dev_dbg(dwc->dev, "can't wakeup from link state %d\n", in dwc3_gadget_wakeup()
1314 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); in dwc3_gadget_wakeup()
1316 dev_err(dwc->dev, "failed to put link in Recovery\n"); in dwc3_gadget_wakeup()
1321 if (dwc->revision < DWC3_REVISION_194A) { in dwc3_gadget_wakeup()
1323 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_wakeup()
1325 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_wakeup()
1332 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_wakeup()
1340 dev_err(dwc->dev, "failed to send remote wakeup\n"); in dwc3_gadget_wakeup()
1345 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_wakeup()
1353 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_set_selfpowered() local
1356 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
1357 dwc->is_selfpowered = !!is_selfpowered; in dwc3_gadget_set_selfpowered()
1358 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_set_selfpowered()
1363 static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) in dwc3_gadget_run_stop() argument
1368 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_run_stop()
1370 if (dwc->revision <= DWC3_REVISION_187A) { in dwc3_gadget_run_stop()
1375 if (dwc->revision >= DWC3_REVISION_194A) in dwc3_gadget_run_stop()
1379 if (dwc->has_hibernation) in dwc3_gadget_run_stop()
1382 dwc->pullups_connected = true; in dwc3_gadget_run_stop()
1386 if (dwc->has_hibernation && !suspend) in dwc3_gadget_run_stop()
1389 dwc->pullups_connected = false; in dwc3_gadget_run_stop()
1392 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_run_stop()
1395 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_run_stop()
1409 dev_vdbg(dwc->dev, "gadget %s data soft-%s\n", in dwc3_gadget_run_stop()
1410 dwc->gadget_driver in dwc3_gadget_run_stop()
1411 ? dwc->gadget_driver->function : "no-function", in dwc3_gadget_run_stop()
1419 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_pullup() local
1425 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_pullup()
1426 ret = dwc3_gadget_run_stop(dwc, is_on, false); in dwc3_gadget_pullup()
1427 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_pullup()
1432 static void dwc3_gadget_enable_irq(struct dwc3 *dwc) in dwc3_gadget_enable_irq() argument
1447 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg); in dwc3_gadget_enable_irq()
1450 static void dwc3_gadget_disable_irq(struct dwc3 *dwc) in dwc3_gadget_disable_irq() argument
1453 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00); in dwc3_gadget_disable_irq()
1459 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_start() local
1465 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_start()
1467 if (dwc->gadget_driver) { in dwc3_gadget_start()
1468 dev_err(dwc->dev, "%s is already bound to %s\n", in dwc3_gadget_start()
1469 dwc->gadget.name, in dwc3_gadget_start()
1470 dwc->gadget_driver->function); in dwc3_gadget_start()
1475 dwc->gadget_driver = driver; in dwc3_gadget_start()
1477 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_start()
1493 if (dwc->revision < DWC3_REVISION_220A) { in dwc3_gadget_start()
1496 switch (dwc->maximum_speed) { in dwc3_gadget_start()
1512 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_start()
1514 dwc->start_config_issued = false; in dwc3_gadget_start()
1519 dep = dwc->eps[0]; in dwc3_gadget_start()
1523 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_start()
1527 dep = dwc->eps[1]; in dwc3_gadget_start()
1531 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_start()
1536 dwc->ep0state = EP0_SETUP_PHASE; in dwc3_gadget_start()
1537 dwc3_ep0_out_start(dwc); in dwc3_gadget_start()
1539 dwc3_gadget_enable_irq(dwc); in dwc3_gadget_start()
1541 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
1546 __dwc3_gadget_ep_disable(dwc->eps[0]); in dwc3_gadget_start()
1549 dwc->gadget_driver = NULL; in dwc3_gadget_start()
1552 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_start()
1559 struct dwc3 *dwc = gadget_to_dwc(g); in dwc3_gadget_stop() local
1562 spin_lock_irqsave(&dwc->lock, flags); in dwc3_gadget_stop()
1564 dwc3_gadget_disable_irq(dwc); in dwc3_gadget_stop()
1565 __dwc3_gadget_ep_disable(dwc->eps[0]); in dwc3_gadget_stop()
1566 __dwc3_gadget_ep_disable(dwc->eps[1]); in dwc3_gadget_stop()
1568 dwc->gadget_driver = NULL; in dwc3_gadget_stop()
1569 dwc->connected = 0; in dwc3_gadget_stop()
1571 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_gadget_stop()
1587 static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc, in dwc3_gadget_init_hw_endpoints() argument
1600 dep->dwc = dwc; in dwc3_gadget_init_hw_endpoints()
1603 dwc->eps[epnum] = dep; in dwc3_gadget_init_hw_endpoints()
1610 dev_vdbg(dwc->dev, "initializing %s\n", dep->name); in dwc3_gadget_init_hw_endpoints()
1617 dwc->gadget.ep0 = &dep->endpoint; in dwc3_gadget_init_hw_endpoints()
1621 if (dwc->maximum_speed < USB_SPEED_SUPER) in dwc3_gadget_init_hw_endpoints()
1628 &dwc->gadget.ep_list); in dwc3_gadget_init_hw_endpoints()
1642 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) in dwc3_gadget_init_endpoints() argument
1646 INIT_LIST_HEAD(&dwc->gadget.ep_list); in dwc3_gadget_init_endpoints()
1648 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0); in dwc3_gadget_init_endpoints()
1650 dev_vdbg(dwc->dev, "failed to allocate OUT endpoints\n"); in dwc3_gadget_init_endpoints()
1654 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1); in dwc3_gadget_init_endpoints()
1656 dev_vdbg(dwc->dev, "failed to allocate IN endpoints\n"); in dwc3_gadget_init_endpoints()
1663 static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) in dwc3_gadget_free_endpoints() argument
1669 dep = dwc->eps[epnum]; in dwc3_gadget_free_endpoints()
1692 static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep, in __dwc3_cleanup_done_trbs() argument
1710 dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n", in __dwc3_cleanup_done_trbs()
1718 dev_dbg(dwc->dev, "incomplete IN transfer %s\n", in __dwc3_cleanup_done_trbs()
1737 dev_err(dwc->dev, "incomplete IN transfer %s\n", in __dwc3_cleanup_done_trbs()
1776 static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, in dwc3_cleanup_done_reqs() argument
1797 __dwc3_cleanup_done_trbs(dwc, dep, req, trb, event, status); in dwc3_cleanup_done_reqs()
1811 dwc3_stop_active_transfer(dwc, dep->number, true); in dwc3_cleanup_done_reqs()
1820 static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc, in dwc3_endpoint_transfer_complete() argument
1833 clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status); in dwc3_endpoint_transfer_complete()
1842 if (dwc->revision < DWC3_REVISION_183A) { in dwc3_endpoint_transfer_complete()
1847 dep = dwc->eps[i]; in dwc3_endpoint_transfer_complete()
1856 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_endpoint_transfer_complete()
1857 reg |= dwc->u1u2; in dwc3_endpoint_transfer_complete()
1858 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_endpoint_transfer_complete()
1860 dwc->u1u2 = 0; in dwc3_endpoint_transfer_complete()
1870 static void dwc3_endpoint_interrupt(struct dwc3 *dwc, in dwc3_endpoint_interrupt() argument
1876 dep = dwc->eps[epnum]; in dwc3_endpoint_interrupt()
1882 dwc3_ep0_interrupt(dwc, event); in dwc3_endpoint_interrupt()
1891 dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n", in dwc3_endpoint_interrupt()
1896 dwc3_endpoint_transfer_complete(dwc, dep, event); in dwc3_endpoint_interrupt()
1899 dwc3_endpoint_transfer_complete(dwc, dep, event); in dwc3_endpoint_interrupt()
1903 dwc3_gadget_start_isoc(dwc, dep, event); in dwc3_endpoint_interrupt()
1907 dev_vdbg(dwc->dev, "%s: reason %s\n", in dwc3_endpoint_interrupt()
1917 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", in dwc3_endpoint_interrupt()
1924 dev_err(dwc->dev, "Stream event for non-Bulk %s\n", in dwc3_endpoint_interrupt()
1931 dev_vdbg(dwc->dev, "Stream %d found and started\n", in dwc3_endpoint_interrupt()
1938 dev_dbg(dwc->dev, "Couldn't find suitable stream\n"); in dwc3_endpoint_interrupt()
1942 dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); in dwc3_endpoint_interrupt()
1945 dev_vdbg(dwc->dev, "Endpoint Command Complete\n"); in dwc3_endpoint_interrupt()
1950 static void dwc3_disconnect_gadget(struct dwc3 *dwc) in dwc3_disconnect_gadget() argument
1952 if (dwc->gadget_driver && dwc->gadget_driver->disconnect) { in dwc3_disconnect_gadget()
1953 spin_unlock(&dwc->lock); in dwc3_disconnect_gadget()
1954 dwc->gadget_driver->disconnect(&dwc->gadget); in dwc3_disconnect_gadget()
1955 spin_lock(&dwc->lock); in dwc3_disconnect_gadget()
1959 static void dwc3_suspend_gadget(struct dwc3 *dwc) in dwc3_suspend_gadget() argument
1961 if (dwc->gadget_driver && dwc->gadget_driver->suspend) { in dwc3_suspend_gadget()
1962 spin_unlock(&dwc->lock); in dwc3_suspend_gadget()
1963 dwc->gadget_driver->suspend(&dwc->gadget); in dwc3_suspend_gadget()
1964 spin_lock(&dwc->lock); in dwc3_suspend_gadget()
1968 static void dwc3_resume_gadget(struct dwc3 *dwc) in dwc3_resume_gadget() argument
1970 if (dwc->gadget_driver && dwc->gadget_driver->resume) { in dwc3_resume_gadget()
1971 spin_unlock(&dwc->lock); in dwc3_resume_gadget()
1972 dwc->gadget_driver->resume(&dwc->gadget); in dwc3_resume_gadget()
1976 static void dwc3_reset_gadget(struct dwc3 *dwc) in dwc3_reset_gadget() argument
1978 if (!dwc->gadget_driver) in dwc3_reset_gadget()
1981 if (dwc->gadget.speed != USB_SPEED_UNKNOWN) { in dwc3_reset_gadget()
1982 spin_unlock(&dwc->lock); in dwc3_reset_gadget()
1983 usb_gadget_udc_reset(&dwc->gadget, dwc->gadget_driver); in dwc3_reset_gadget()
1984 spin_lock(&dwc->lock); in dwc3_reset_gadget()
1988 static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force) in dwc3_stop_active_transfer() argument
1995 dep = dwc->eps[epnum]; in dwc3_stop_active_transfer()
2024 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); in dwc3_stop_active_transfer()
2031 static void dwc3_stop_active_transfers(struct dwc3 *dwc) in dwc3_stop_active_transfers() argument
2038 dep = dwc->eps[epnum]; in dwc3_stop_active_transfers()
2045 dwc3_remove_requests(dwc, dep); in dwc3_stop_active_transfers()
2049 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) in dwc3_clear_stall_all_ep() argument
2058 dep = dwc->eps[epnum]; in dwc3_clear_stall_all_ep()
2068 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, in dwc3_clear_stall_all_ep()
2074 static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) in dwc3_gadget_disconnect_interrupt() argument
2078 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_disconnect_interrupt()
2080 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_disconnect_interrupt()
2083 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_disconnect_interrupt()
2085 dwc3_disconnect_gadget(dwc); in dwc3_gadget_disconnect_interrupt()
2086 dwc->start_config_issued = false; in dwc3_gadget_disconnect_interrupt()
2088 dwc->gadget.speed = USB_SPEED_UNKNOWN; in dwc3_gadget_disconnect_interrupt()
2089 dwc->setup_packet_pending = false; in dwc3_gadget_disconnect_interrupt()
2090 usb_gadget_set_state(&dwc->gadget, USB_STATE_NOTATTACHED); in dwc3_gadget_disconnect_interrupt()
2093 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) in dwc3_gadget_reset_interrupt() argument
2123 if (dwc->revision < DWC3_REVISION_188A) { in dwc3_gadget_reset_interrupt()
2124 if (dwc->setup_packet_pending) in dwc3_gadget_reset_interrupt()
2125 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_reset_interrupt()
2128 dwc3_reset_gadget(dwc); in dwc3_gadget_reset_interrupt()
2130 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_reset_interrupt()
2132 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_reset_interrupt()
2133 dwc->test_mode = false; in dwc3_gadget_reset_interrupt()
2135 dwc3_stop_active_transfers(dwc); in dwc3_gadget_reset_interrupt()
2136 dwc3_clear_stall_all_ep(dwc); in dwc3_gadget_reset_interrupt()
2137 dwc->start_config_issued = false; in dwc3_gadget_reset_interrupt()
2140 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_reset_interrupt()
2142 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_reset_interrupt()
2145 static void dwc3_update_ram_clk_sel(struct dwc3 *dwc, u32 speed) in dwc3_update_ram_clk_sel() argument
2165 reg = dwc3_readl(dwc->regs, DWC3_GCTL); in dwc3_update_ram_clk_sel()
2167 dwc3_writel(dwc->regs, DWC3_GCTL, reg); in dwc3_update_ram_clk_sel()
2170 static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) in dwc3_gadget_conndone_interrupt() argument
2177 reg = dwc3_readl(dwc->regs, DWC3_DSTS); in dwc3_gadget_conndone_interrupt()
2179 dwc->speed = speed; in dwc3_gadget_conndone_interrupt()
2181 dwc3_update_ram_clk_sel(dwc, speed); in dwc3_gadget_conndone_interrupt()
2198 if (dwc->revision < DWC3_REVISION_190A) in dwc3_gadget_conndone_interrupt()
2199 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_conndone_interrupt()
2202 dwc->gadget.ep0->maxpacket = 512; in dwc3_gadget_conndone_interrupt()
2203 dwc->gadget.speed = USB_SPEED_SUPER; in dwc3_gadget_conndone_interrupt()
2207 dwc->gadget.ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
2208 dwc->gadget.speed = USB_SPEED_HIGH; in dwc3_gadget_conndone_interrupt()
2213 dwc->gadget.ep0->maxpacket = 64; in dwc3_gadget_conndone_interrupt()
2214 dwc->gadget.speed = USB_SPEED_FULL; in dwc3_gadget_conndone_interrupt()
2218 dwc->gadget.ep0->maxpacket = 8; in dwc3_gadget_conndone_interrupt()
2219 dwc->gadget.speed = USB_SPEED_LOW; in dwc3_gadget_conndone_interrupt()
2223 dev_info(dwc->dev, "usb device is %s\n", in dwc3_gadget_conndone_interrupt()
2224 usb_speed_string(dwc->gadget.speed)); in dwc3_gadget_conndone_interrupt()
2228 if ((dwc->revision > DWC3_REVISION_194A) in dwc3_gadget_conndone_interrupt()
2230 reg = dwc3_readl(dwc->regs, DWC3_DCFG); in dwc3_gadget_conndone_interrupt()
2232 dwc3_writel(dwc->regs, DWC3_DCFG, reg); in dwc3_gadget_conndone_interrupt()
2234 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
2237 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold); in dwc3_gadget_conndone_interrupt()
2245 if (dwc->revision < DWC3_REVISION_240A && dwc->has_lpm_erratum) in dwc3_gadget_conndone_interrupt()
2248 if (dwc->has_lpm_erratum && dwc->revision >= DWC3_REVISION_240A) in dwc3_gadget_conndone_interrupt()
2249 reg |= DWC3_DCTL_LPM_ERRATA(dwc->lpm_nyet_threshold); in dwc3_gadget_conndone_interrupt()
2251 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_conndone_interrupt()
2253 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_conndone_interrupt()
2255 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_conndone_interrupt()
2258 dep = dwc->eps[0]; in dwc3_gadget_conndone_interrupt()
2262 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
2266 dep = dwc->eps[1]; in dwc3_gadget_conndone_interrupt()
2270 dev_err(dwc->dev, "failed to enable %s\n", dep->name); in dwc3_gadget_conndone_interrupt()
2283 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc) in dwc3_gadget_wakeup_interrupt() argument
2290 dwc->gadget_driver->resume(&dwc->gadget); in dwc3_gadget_wakeup_interrupt()
2293 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, in dwc3_gadget_linksts_change_interrupt() argument
2299 if (dwc->link_state == DWC3_LINK_STATE_POLL && dwc->check_linksts) { in dwc3_gadget_linksts_change_interrupt()
2300 dwc->check_linksts = false; in dwc3_gadget_linksts_change_interrupt()
2301 dwc->ts = get_timer(0); in dwc3_gadget_linksts_change_interrupt()
2321 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1); in dwc3_gadget_linksts_change_interrupt()
2322 if ((dwc->revision < DWC3_REVISION_250A) && in dwc3_gadget_linksts_change_interrupt()
2324 if ((dwc->link_state == DWC3_LINK_STATE_U3) && in dwc3_gadget_linksts_change_interrupt()
2326 dev_vdbg(dwc->dev, "ignoring transition U3 -> Resume\n"); in dwc3_gadget_linksts_change_interrupt()
2349 if (dwc->revision < DWC3_REVISION_183A) { in dwc3_gadget_linksts_change_interrupt()
2354 switch (dwc->link_state) { in dwc3_gadget_linksts_change_interrupt()
2357 reg = dwc3_readl(dwc->regs, DWC3_DCTL); in dwc3_gadget_linksts_change_interrupt()
2363 if (!dwc->u1u2) in dwc3_gadget_linksts_change_interrupt()
2364 dwc->u1u2 = reg & u1u2; in dwc3_gadget_linksts_change_interrupt()
2368 dwc3_writel(dwc->regs, DWC3_DCTL, reg); in dwc3_gadget_linksts_change_interrupt()
2379 if (dwc->speed == USB_SPEED_SUPER) in dwc3_gadget_linksts_change_interrupt()
2380 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
2384 dwc3_suspend_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
2387 dwc3_resume_gadget(dwc); in dwc3_gadget_linksts_change_interrupt()
2394 dwc->link_state = next; in dwc3_gadget_linksts_change_interrupt()
2397 static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, in dwc3_gadget_hibernation_interrupt() argument
2415 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) in dwc3_gadget_hibernation_interrupt()
2421 static void dwc3_gadget_interrupt(struct dwc3 *dwc, in dwc3_gadget_interrupt() argument
2426 dwc3_gadget_disconnect_interrupt(dwc); in dwc3_gadget_interrupt()
2429 dwc3_gadget_reset_interrupt(dwc); in dwc3_gadget_interrupt()
2432 dwc3_gadget_conndone_interrupt(dwc); in dwc3_gadget_interrupt()
2435 dwc3_gadget_wakeup_interrupt(dwc); in dwc3_gadget_interrupt()
2438 if (!dwc->has_hibernation) { in dwc3_gadget_interrupt()
2442 dwc3_gadget_hibernation_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
2445 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); in dwc3_gadget_interrupt()
2448 dev_vdbg(dwc->dev, "End of Periodic Frame\n"); in dwc3_gadget_interrupt()
2451 dev_vdbg(dwc->dev, "Start of Periodic Frame\n"); in dwc3_gadget_interrupt()
2454 dev_vdbg(dwc->dev, "Erratic Error\n"); in dwc3_gadget_interrupt()
2457 dev_vdbg(dwc->dev, "Command Complete\n"); in dwc3_gadget_interrupt()
2460 dev_vdbg(dwc->dev, "Overflow\n"); in dwc3_gadget_interrupt()
2463 dev_dbg(dwc->dev, "UNKNOWN IRQ %d\n", event->type); in dwc3_gadget_interrupt()
2467 static void dwc3_process_event_entry(struct dwc3 *dwc, in dwc3_process_event_entry() argument
2473 return dwc3_endpoint_interrupt(dwc, &event->depevt); in dwc3_process_event_entry()
2478 dwc3_gadget_interrupt(dwc, &event->devt); in dwc3_process_event_entry()
2482 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw); in dwc3_process_event_entry()
2486 static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf) in dwc3_process_event_buf() argument
2493 evt = dwc->ev_buffs[buf]; in dwc3_process_event_buf()
2504 dwc3_process_event_entry(dwc, &event); in dwc3_process_event_buf()
2518 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(buf), 4); in dwc3_process_event_buf()
2526 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf)); in dwc3_process_event_buf()
2528 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg); in dwc3_process_event_buf()
2535 struct dwc3 *dwc = _dwc; in dwc3_thread_interrupt() local
2540 spin_lock_irqsave(&dwc->lock, flags); in dwc3_thread_interrupt()
2542 for (i = 0; i < dwc->num_event_buffers; i++) in dwc3_thread_interrupt()
2543 ret |= dwc3_process_event_buf(dwc, i); in dwc3_thread_interrupt()
2545 spin_unlock_irqrestore(&dwc->lock, flags); in dwc3_thread_interrupt()
2550 static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc, u32 buf) in dwc3_check_event_buf() argument
2556 evt = dwc->ev_buffs[buf]; in dwc3_check_event_buf()
2559 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf)); in dwc3_check_event_buf()
2568 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf)); in dwc3_check_event_buf()
2570 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg); in dwc3_check_event_buf()
2577 struct dwc3 *dwc = _dwc; in dwc3_interrupt() local
2581 spin_lock(&dwc->lock); in dwc3_interrupt()
2583 for (i = 0; i < dwc->num_event_buffers; i++) { in dwc3_interrupt()
2586 status = dwc3_check_event_buf(dwc, i); in dwc3_interrupt()
2591 spin_unlock(&dwc->lock); in dwc3_interrupt()
2629 int dwc3_gadget_init(struct dwc3 *dwc) in dwc3_gadget_init() argument
2632 the_controller = dwc; in dwc3_gadget_init()
2634 dwc->ctrl_req = dma_alloc_coherent(sizeof(*dwc->ctrl_req), in dwc3_gadget_init()
2635 (unsigned long *)&dwc->ctrl_req_addr); in dwc3_gadget_init()
2636 if (!dwc->ctrl_req) { in dwc3_gadget_init()
2637 dev_err(dwc->dev, "failed to allocate ctrl request\n"); in dwc3_gadget_init()
2642 dwc->ep0_trb = dma_alloc_coherent(sizeof(*dwc->ep0_trb) * 2, in dwc3_gadget_init()
2643 (unsigned long *)&dwc->ep0_trb_addr); in dwc3_gadget_init()
2644 if (!dwc->ep0_trb) { in dwc3_gadget_init()
2645 dev_err(dwc->dev, "failed to allocate ep0 trb\n"); in dwc3_gadget_init()
2650 dwc->setup_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, in dwc3_gadget_init()
2652 if (!dwc->setup_buf) { in dwc3_gadget_init()
2657 dwc->ep0_bounce = dma_alloc_coherent(DWC3_EP0_BOUNCE_SIZE, in dwc3_gadget_init()
2658 (unsigned long *)&dwc->ep0_bounce_addr); in dwc3_gadget_init()
2659 if (!dwc->ep0_bounce) { in dwc3_gadget_init()
2660 dev_err(dwc->dev, "failed to allocate ep0 bounce buffer\n"); in dwc3_gadget_init()
2665 dwc->gadget.ops = &dwc3_gadget_ops; in dwc3_gadget_init()
2666 dwc->gadget.max_speed = dwc->maximum_speed; in dwc3_gadget_init()
2667 dwc->gadget.speed = USB_SPEED_UNKNOWN; in dwc3_gadget_init()
2668 dwc->gadget.name = "dwc3-gadget"; in dwc3_gadget_init()
2674 dwc->gadget.quirk_ep_out_aligned_size = true; in dwc3_gadget_init()
2681 ret = dwc3_gadget_init_endpoints(dwc); in dwc3_gadget_init()
2685 ret = usb_add_gadget_udc((struct device *)dwc->dev, &dwc->gadget); in dwc3_gadget_init()
2687 dev_err(dwc->dev, "failed to register udc\n"); in dwc3_gadget_init()
2694 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_init()
2695 dma_free_coherent(dwc->ep0_bounce); in dwc3_gadget_init()
2698 kfree(dwc->setup_buf); in dwc3_gadget_init()
2701 dma_free_coherent(dwc->ep0_trb); in dwc3_gadget_init()
2704 dma_free_coherent(dwc->ctrl_req); in dwc3_gadget_init()
2712 void dwc3_gadget_exit(struct dwc3 *dwc) in dwc3_gadget_exit() argument
2714 usb_del_gadget_udc(&dwc->gadget); in dwc3_gadget_exit()
2716 dwc3_gadget_free_endpoints(dwc); in dwc3_gadget_exit()
2718 dma_free_coherent(dwc->ep0_bounce); in dwc3_gadget_exit()
2720 kfree(dwc->setup_buf); in dwc3_gadget_exit()
2722 dma_free_coherent(dwc->ep0_trb); in dwc3_gadget_exit()
2724 dma_free_coherent(dwc->ctrl_req); in dwc3_gadget_exit()
2735 void dwc3_gadget_uboot_handle_interrupt(struct dwc3 *dwc) in dwc3_gadget_uboot_handle_interrupt() argument
2737 int ret = dwc3_interrupt(0, dwc); in dwc3_gadget_uboot_handle_interrupt()
2743 dwc3_thread_interrupt(0, dwc); in dwc3_gadget_uboot_handle_interrupt()
2746 for (i = 0; i < dwc->num_event_buffers; i++) { in dwc3_gadget_uboot_handle_interrupt()
2747 evt = dwc->ev_buffs[i]; in dwc3_gadget_uboot_handle_interrupt()