diff options
Diffstat (limited to 'drivers/usb/dwc3/gadget.c')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 82 |
1 files changed, 43 insertions, 39 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 8f65ab3a3b92..a03a485205c7 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -139,7 +139,8 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state) | |||
139 | udelay(5); | 139 | udelay(5); |
140 | } | 140 | } |
141 | 141 | ||
142 | dev_vdbg(dwc->dev, "link state change request timed out\n"); | 142 | dwc3_trace(trace_dwc3_gadget, |
143 | "link state change request timed out"); | ||
143 | 144 | ||
144 | return -ETIMEDOUT; | 145 | return -ETIMEDOUT; |
145 | } | 146 | } |
@@ -219,7 +220,7 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) | |||
219 | 220 | ||
220 | fifo_size |= (last_fifo_depth << 16); | 221 | fifo_size |= (last_fifo_depth << 16); |
221 | 222 | ||
222 | dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", | 223 | dwc3_trace(trace_dwc3_gadget, "%s: Fifo Addr %04x Size %d", |
223 | dep->name, last_fifo_depth, fifo_size & 0xffff); | 224 | dep->name, last_fifo_depth, fifo_size & 0xffff); |
224 | 225 | ||
225 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); | 226 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); |
@@ -287,7 +288,8 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param) | |||
287 | do { | 288 | do { |
288 | reg = dwc3_readl(dwc->regs, DWC3_DGCMD); | 289 | reg = dwc3_readl(dwc->regs, DWC3_DGCMD); |
289 | if (!(reg & DWC3_DGCMD_CMDACT)) { | 290 | if (!(reg & DWC3_DGCMD_CMDACT)) { |
290 | dev_vdbg(dwc->dev, "Command Complete --> %d\n", | 291 | dwc3_trace(trace_dwc3_gadget, |
292 | "Command Complete --> %d", | ||
291 | DWC3_DGCMD_STATUS(reg)); | 293 | DWC3_DGCMD_STATUS(reg)); |
292 | return 0; | 294 | return 0; |
293 | } | 295 | } |
@@ -297,8 +299,11 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param) | |||
297 | * interrupt context. | 299 | * interrupt context. |
298 | */ | 300 | */ |
299 | timeout--; | 301 | timeout--; |
300 | if (!timeout) | 302 | if (!timeout) { |
303 | dwc3_trace(trace_dwc3_gadget, | ||
304 | "Command Timed Out"); | ||
301 | return -ETIMEDOUT; | 305 | return -ETIMEDOUT; |
306 | } | ||
302 | udelay(1); | 307 | udelay(1); |
303 | } while (1); | 308 | } while (1); |
304 | } | 309 | } |
@@ -320,7 +325,8 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | |||
320 | do { | 325 | do { |
321 | reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep)); | 326 | reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep)); |
322 | if (!(reg & DWC3_DEPCMD_CMDACT)) { | 327 | if (!(reg & DWC3_DEPCMD_CMDACT)) { |
323 | dev_vdbg(dwc->dev, "Command Complete --> %d\n", | 328 | dwc3_trace(trace_dwc3_gadget, |
329 | "Command Complete --> %d", | ||
324 | DWC3_DEPCMD_STATUS(reg)); | 330 | DWC3_DEPCMD_STATUS(reg)); |
325 | return 0; | 331 | return 0; |
326 | } | 332 | } |
@@ -330,8 +336,11 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | |||
330 | * interrupt context. | 336 | * interrupt context. |
331 | */ | 337 | */ |
332 | timeout--; | 338 | timeout--; |
333 | if (!timeout) | 339 | if (!timeout) { |
340 | dwc3_trace(trace_dwc3_gadget, | ||
341 | "Command Timed Out"); | ||
334 | return -ETIMEDOUT; | 342 | return -ETIMEDOUT; |
343 | } | ||
335 | 344 | ||
336 | udelay(1); | 345 | udelay(1); |
337 | } while (1); | 346 | } while (1); |
@@ -352,9 +361,6 @@ static int dwc3_alloc_trb_pool(struct dwc3_ep *dep) | |||
352 | if (dep->trb_pool) | 361 | if (dep->trb_pool) |
353 | return 0; | 362 | return 0; |
354 | 363 | ||
355 | if (dep->number == 0 || dep->number == 1) | ||
356 | return 0; | ||
357 | |||
358 | dep->trb_pool = dma_alloc_coherent(dwc->dev, | 364 | dep->trb_pool = dma_alloc_coherent(dwc->dev, |
359 | sizeof(struct dwc3_trb) * DWC3_TRB_NUM, | 365 | sizeof(struct dwc3_trb) * DWC3_TRB_NUM, |
360 | &dep->trb_pool_dma, GFP_KERNEL); | 366 | &dep->trb_pool_dma, GFP_KERNEL); |
@@ -492,7 +498,7 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
492 | u32 reg; | 498 | u32 reg; |
493 | int ret; | 499 | int ret; |
494 | 500 | ||
495 | dev_vdbg(dwc->dev, "Enabling %s\n", dep->name); | 501 | dwc3_trace(trace_dwc3_gadget, "Enabling %s", dep->name); |
496 | 502 | ||
497 | if (!(dep->flags & DWC3_EP_ENABLED)) { | 503 | if (!(dep->flags & DWC3_EP_ENABLED)) { |
498 | ret = dwc3_gadget_start_config(dwc, dep); | 504 | ret = dwc3_gadget_start_config(dwc, dep); |
@@ -729,10 +735,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
729 | struct dwc3_request *req, dma_addr_t dma, | 735 | struct dwc3_request *req, dma_addr_t dma, |
730 | unsigned length, unsigned last, unsigned chain, unsigned node) | 736 | unsigned length, unsigned last, unsigned chain, unsigned node) |
731 | { | 737 | { |
732 | struct dwc3 *dwc = dep->dwc; | ||
733 | struct dwc3_trb *trb; | 738 | struct dwc3_trb *trb; |
734 | 739 | ||
735 | dev_vdbg(dwc->dev, "%s: req %p dma %08llx length %d%s%s\n", | 740 | dwc3_trace(trace_dwc3_gadget, "%s: req %p dma %08llx length %d%s%s", |
736 | dep->name, req, (unsigned long long) dma, | 741 | dep->name, req, (unsigned long long) dma, |
737 | length, last ? " last" : "", | 742 | length, last ? " last" : "", |
738 | chain ? " chain" : ""); | 743 | chain ? " chain" : ""); |
@@ -934,7 +939,7 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param, | |||
934 | u32 cmd; | 939 | u32 cmd; |
935 | 940 | ||
936 | if (start_new && (dep->flags & DWC3_EP_BUSY)) { | 941 | if (start_new && (dep->flags & DWC3_EP_BUSY)) { |
937 | dev_vdbg(dwc->dev, "%s: endpoint busy\n", dep->name); | 942 | dwc3_trace(trace_dwc3_gadget, "%s: endpoint busy", dep->name); |
938 | return -EBUSY; | 943 | return -EBUSY; |
939 | } | 944 | } |
940 | dep->flags &= ~DWC3_EP_PENDING_REQUEST; | 945 | dep->flags &= ~DWC3_EP_PENDING_REQUEST; |
@@ -1005,8 +1010,9 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, | |||
1005 | u32 uf; | 1010 | u32 uf; |
1006 | 1011 | ||
1007 | if (list_empty(&dep->request_list)) { | 1012 | if (list_empty(&dep->request_list)) { |
1008 | dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", | 1013 | dwc3_trace(trace_dwc3_gadget, |
1009 | dep->name); | 1014 | "ISOC ep %s run out for requests", |
1015 | dep->name); | ||
1010 | dep->flags |= DWC3_EP_PENDING_REQUEST; | 1016 | dep->flags |= DWC3_EP_PENDING_REQUEST; |
1011 | return; | 1017 | return; |
1012 | } | 1018 | } |
@@ -1113,15 +1119,10 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
1113 | * handled. | 1119 | * handled. |
1114 | */ | 1120 | */ |
1115 | if (dep->stream_capable) { | 1121 | if (dep->stream_capable) { |
1116 | int ret; | ||
1117 | |||
1118 | ret = __dwc3_gadget_kick_transfer(dep, 0, true); | 1122 | ret = __dwc3_gadget_kick_transfer(dep, 0, true); |
1119 | if (ret && ret != -EBUSY) { | 1123 | if (ret && ret != -EBUSY) |
1120 | struct dwc3 *dwc = dep->dwc; | ||
1121 | |||
1122 | dev_dbg(dwc->dev, "%s: failed to kick transfers\n", | 1124 | dev_dbg(dwc->dev, "%s: failed to kick transfers\n", |
1123 | dep->name); | 1125 | dep->name); |
1124 | } | ||
1125 | } | 1126 | } |
1126 | 1127 | ||
1127 | return 0; | 1128 | return 0; |
@@ -1152,8 +1153,6 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, | |||
1152 | goto out; | 1153 | goto out; |
1153 | } | 1154 | } |
1154 | 1155 | ||
1155 | dev_vdbg(dwc->dev, "queing request %p to %s length %d\n", | ||
1156 | request, ep->name, request->length); | ||
1157 | trace_dwc3_ep_queue(req); | 1156 | trace_dwc3_ep_queue(req); |
1158 | 1157 | ||
1159 | ret = __dwc3_gadget_ep_queue(dep, req); | 1158 | ret = __dwc3_gadget_ep_queue(dep, req); |
@@ -1416,7 +1415,7 @@ static int dwc3_gadget_set_selfpowered(struct usb_gadget *g, | |||
1416 | unsigned long flags; | 1415 | unsigned long flags; |
1417 | 1416 | ||
1418 | spin_lock_irqsave(&dwc->lock, flags); | 1417 | spin_lock_irqsave(&dwc->lock, flags); |
1419 | dwc->is_selfpowered = !!is_selfpowered; | 1418 | g->is_selfpowered = !!is_selfpowered; |
1420 | spin_unlock_irqrestore(&dwc->lock, flags); | 1419 | spin_unlock_irqrestore(&dwc->lock, flags); |
1421 | 1420 | ||
1422 | return 0; | 1421 | return 0; |
@@ -1468,7 +1467,7 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) | |||
1468 | udelay(1); | 1467 | udelay(1); |
1469 | } while (1); | 1468 | } while (1); |
1470 | 1469 | ||
1471 | dev_vdbg(dwc->dev, "gadget %s data soft-%s\n", | 1470 | dwc3_trace(trace_dwc3_gadget, "gadget %s data soft-%s", |
1472 | dwc->gadget_driver | 1471 | dwc->gadget_driver |
1473 | ? dwc->gadget_driver->function : "no-function", | 1472 | ? dwc->gadget_driver->function : "no-function", |
1474 | is_on ? "connect" : "disconnect"); | 1473 | is_on ? "connect" : "disconnect"); |
@@ -1688,7 +1687,7 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc, | |||
1688 | 1687 | ||
1689 | dep->endpoint.name = dep->name; | 1688 | dep->endpoint.name = dep->name; |
1690 | 1689 | ||
1691 | dev_vdbg(dwc->dev, "initializing %s\n", dep->name); | 1690 | dwc3_trace(trace_dwc3_gadget, "initializing %s", dep->name); |
1692 | 1691 | ||
1693 | if (epnum == 0 || epnum == 1) { | 1692 | if (epnum == 0 || epnum == 1) { |
1694 | usb_ep_set_maxpacket_limit(&dep->endpoint, 512); | 1693 | usb_ep_set_maxpacket_limit(&dep->endpoint, 512); |
@@ -1725,13 +1724,15 @@ static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) | |||
1725 | 1724 | ||
1726 | ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0); | 1725 | ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0); |
1727 | if (ret < 0) { | 1726 | if (ret < 0) { |
1728 | dev_vdbg(dwc->dev, "failed to allocate OUT endpoints\n"); | 1727 | dwc3_trace(trace_dwc3_gadget, |
1728 | "failed to allocate OUT endpoints"); | ||
1729 | return ret; | 1729 | return ret; |
1730 | } | 1730 | } |
1731 | 1731 | ||
1732 | ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1); | 1732 | ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1); |
1733 | if (ret < 0) { | 1733 | if (ret < 0) { |
1734 | dev_vdbg(dwc->dev, "failed to allocate IN endpoints\n"); | 1734 | dwc3_trace(trace_dwc3_gadget, |
1735 | "failed to allocate IN endpoints"); | ||
1735 | return ret; | 1736 | return ret; |
1736 | } | 1737 | } |
1737 | 1738 | ||
@@ -1977,7 +1978,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, | |||
1977 | } else { | 1978 | } else { |
1978 | int ret; | 1979 | int ret; |
1979 | 1980 | ||
1980 | dev_vdbg(dwc->dev, "%s: reason %s\n", | 1981 | dwc3_trace(trace_dwc3_gadget, "%s: reason %s", |
1981 | dep->name, event->status & | 1982 | dep->name, event->status & |
1982 | DEPEVT_STATUS_TRANSFER_ACTIVE | 1983 | DEPEVT_STATUS_TRANSFER_ACTIVE |
1983 | ? "Transfer Active" | 1984 | ? "Transfer Active" |
@@ -2001,7 +2002,8 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, | |||
2001 | 2002 | ||
2002 | switch (event->status) { | 2003 | switch (event->status) { |
2003 | case DEPEVT_STREAMEVT_FOUND: | 2004 | case DEPEVT_STREAMEVT_FOUND: |
2004 | dev_vdbg(dwc->dev, "Stream %d found and started\n", | 2005 | dwc3_trace(trace_dwc3_gadget, |
2006 | "Stream %d found and started", | ||
2005 | event->parameters); | 2007 | event->parameters); |
2006 | 2008 | ||
2007 | break; | 2009 | break; |
@@ -2015,7 +2017,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, | |||
2015 | dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); | 2017 | dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); |
2016 | break; | 2018 | break; |
2017 | case DWC3_DEPEVT_EPCMDCMPLT: | 2019 | case DWC3_DEPEVT_EPCMDCMPLT: |
2018 | dev_vdbg(dwc->dev, "Endpoint Command Complete\n"); | 2020 | dwc3_trace(trace_dwc3_gadget, "Endpoint Command Complete"); |
2019 | break; | 2021 | break; |
2020 | } | 2022 | } |
2021 | } | 2023 | } |
@@ -2043,6 +2045,7 @@ static void dwc3_resume_gadget(struct dwc3 *dwc) | |||
2043 | if (dwc->gadget_driver && dwc->gadget_driver->resume) { | 2045 | if (dwc->gadget_driver && dwc->gadget_driver->resume) { |
2044 | spin_unlock(&dwc->lock); | 2046 | spin_unlock(&dwc->lock); |
2045 | dwc->gadget_driver->resume(&dwc->gadget); | 2047 | dwc->gadget_driver->resume(&dwc->gadget); |
2048 | spin_lock(&dwc->lock); | ||
2046 | } | 2049 | } |
2047 | } | 2050 | } |
2048 | 2051 | ||
@@ -2079,7 +2082,7 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force) | |||
2079 | * We have discussed this with the IP Provider and it was | 2082 | * We have discussed this with the IP Provider and it was |
2080 | * suggested to giveback all requests here, but give HW some | 2083 | * suggested to giveback all requests here, but give HW some |
2081 | * extra time to synchronize with the interconnect. We're using | 2084 | * extra time to synchronize with the interconnect. We're using |
2082 | * an arbitraty 100us delay for that. | 2085 | * an arbitrary 100us delay for that. |
2083 | * | 2086 | * |
2084 | * Note also that a similar handling was tested by Synopsys | 2087 | * Note also that a similar handling was tested by Synopsys |
2085 | * (thanks a lot Paul) and nothing bad has come out of it. | 2088 | * (thanks a lot Paul) and nothing bad has come out of it. |
@@ -2389,7 +2392,8 @@ static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, | |||
2389 | (pwropt != DWC3_GHWPARAMS1_EN_PWROPT_HIB)) { | 2392 | (pwropt != DWC3_GHWPARAMS1_EN_PWROPT_HIB)) { |
2390 | if ((dwc->link_state == DWC3_LINK_STATE_U3) && | 2393 | if ((dwc->link_state == DWC3_LINK_STATE_U3) && |
2391 | (next == DWC3_LINK_STATE_RESUME)) { | 2394 | (next == DWC3_LINK_STATE_RESUME)) { |
2392 | dev_vdbg(dwc->dev, "ignoring transition U3 -> Resume\n"); | 2395 | dwc3_trace(trace_dwc3_gadget, |
2396 | "ignoring transition U3 -> Resume"); | ||
2393 | return; | 2397 | return; |
2394 | } | 2398 | } |
2395 | } | 2399 | } |
@@ -2511,22 +2515,22 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc, | |||
2511 | dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); | 2515 | dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); |
2512 | break; | 2516 | break; |
2513 | case DWC3_DEVICE_EVENT_EOPF: | 2517 | case DWC3_DEVICE_EVENT_EOPF: |
2514 | dev_vdbg(dwc->dev, "End of Periodic Frame\n"); | 2518 | dwc3_trace(trace_dwc3_gadget, "End of Periodic Frame"); |
2515 | break; | 2519 | break; |
2516 | case DWC3_DEVICE_EVENT_SOF: | 2520 | case DWC3_DEVICE_EVENT_SOF: |
2517 | dev_vdbg(dwc->dev, "Start of Periodic Frame\n"); | 2521 | dwc3_trace(trace_dwc3_gadget, "Start of Periodic Frame"); |
2518 | break; | 2522 | break; |
2519 | case DWC3_DEVICE_EVENT_ERRATIC_ERROR: | 2523 | case DWC3_DEVICE_EVENT_ERRATIC_ERROR: |
2520 | dev_vdbg(dwc->dev, "Erratic Error\n"); | 2524 | dwc3_trace(trace_dwc3_gadget, "Erratic Error"); |
2521 | break; | 2525 | break; |
2522 | case DWC3_DEVICE_EVENT_CMD_CMPL: | 2526 | case DWC3_DEVICE_EVENT_CMD_CMPL: |
2523 | dev_vdbg(dwc->dev, "Command Complete\n"); | 2527 | dwc3_trace(trace_dwc3_gadget, "Command Complete"); |
2524 | break; | 2528 | break; |
2525 | case DWC3_DEVICE_EVENT_OVERFLOW: | 2529 | case DWC3_DEVICE_EVENT_OVERFLOW: |
2526 | dev_vdbg(dwc->dev, "Overflow\n"); | 2530 | dwc3_trace(trace_dwc3_gadget, "Overflow"); |
2527 | break; | 2531 | break; |
2528 | default: | 2532 | default: |
2529 | dev_dbg(dwc->dev, "UNKNOWN IRQ %d\n", event->type); | 2533 | dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type); |
2530 | } | 2534 | } |
2531 | } | 2535 | } |
2532 | 2536 | ||