diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-01 20:06:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-01 20:06:09 -0400 |
commit | 3e75c6de1ac33fe3500f44573d9212dc82c99f59 (patch) | |
tree | ef10932e204ba8a9885051b06d4524d284207d61 /drivers/usb/dwc3 | |
parent | cb1595563880a81dab6eab9a5ecb4520d2e76077 (diff) | |
parent | 940ab8f1ef9369da5b58a1bec6820bfd4a7b9042 (diff) |
Merge tag 'usb-3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB patches from Greg KH:
"Here's the big USB pull request for 3.15-rc1.
The normal set of patches, lots of controller driver updates, and a
smattering of individual USB driver updates as well.
All have been in linux-next for a while"
* tag 'usb-3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (249 commits)
xhci: Transition maintainership to Mathias Nyman.
USB: disable reset-resume when USB_QUIRK_RESET is set
USB: unbind all interfaces before rebinding any
usb: phy: Add ulpi IDs for SMSC USB3320 and TI TUSB1210
usb: gadget: tcm_usb_gadget: stop format strings
usb: gadget: f_fs: add missing spinlock and mutex unlock
usb: gadget: composite: switch over to ERR_CAST()
usb: gadget: inode: switch over to memdup_user()
usb: gadget: f_subset: switch over to PTR_RET
usb: gadget: lpc32xx_udc: fix wrong clk_put() sequence
USB: keyspan: remove dead debugging code
USB: serial: add missing newlines to dev_<level> messages.
USB: serial: add missing braces
USB: serial: continue to write on errors
USB: serial: continue to read on errors
USB: serial: make bulk_out_size a lower limit
USB: cypress_m8: fix potential scheduling while atomic
devicetree: bindings: document lsi,zevio-usb
usb: chipidea: add support for USB OTG controller on LSI Zevio SoCs
usb: chipidea: imx: Use dev_name() for ci_hdrc name to distinguish USBs
...
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r-- | drivers/usb/dwc3/core.c | 251 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.h | 105 | ||||
-rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 5 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 183 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.h | 12 |
5 files changed, 455 insertions, 101 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index a49217ae3533..d001417e8e37 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -61,9 +61,10 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode) | |||
61 | * dwc3_core_soft_reset - Issues core soft reset and PHY reset | 61 | * dwc3_core_soft_reset - Issues core soft reset and PHY reset |
62 | * @dwc: pointer to our context structure | 62 | * @dwc: pointer to our context structure |
63 | */ | 63 | */ |
64 | static void dwc3_core_soft_reset(struct dwc3 *dwc) | 64 | static int dwc3_core_soft_reset(struct dwc3 *dwc) |
65 | { | 65 | { |
66 | u32 reg; | 66 | u32 reg; |
67 | int ret; | ||
67 | 68 | ||
68 | /* Before Resetting PHY, put Core in Reset */ | 69 | /* Before Resetting PHY, put Core in Reset */ |
69 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); | 70 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); |
@@ -82,6 +83,15 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc) | |||
82 | 83 | ||
83 | usb_phy_init(dwc->usb2_phy); | 84 | usb_phy_init(dwc->usb2_phy); |
84 | usb_phy_init(dwc->usb3_phy); | 85 | usb_phy_init(dwc->usb3_phy); |
86 | ret = phy_init(dwc->usb2_generic_phy); | ||
87 | if (ret < 0) | ||
88 | return ret; | ||
89 | |||
90 | ret = phy_init(dwc->usb3_generic_phy); | ||
91 | if (ret < 0) { | ||
92 | phy_exit(dwc->usb2_generic_phy); | ||
93 | return ret; | ||
94 | } | ||
85 | mdelay(100); | 95 | mdelay(100); |
86 | 96 | ||
87 | /* Clear USB3 PHY reset */ | 97 | /* Clear USB3 PHY reset */ |
@@ -100,6 +110,8 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc) | |||
100 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); | 110 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); |
101 | reg &= ~DWC3_GCTL_CORESOFTRESET; | 111 | reg &= ~DWC3_GCTL_CORESOFTRESET; |
102 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); | 112 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); |
113 | |||
114 | return 0; | ||
103 | } | 115 | } |
104 | 116 | ||
105 | /** | 117 | /** |
@@ -242,6 +254,90 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc) | |||
242 | } | 254 | } |
243 | } | 255 | } |
244 | 256 | ||
257 | static int dwc3_alloc_scratch_buffers(struct dwc3 *dwc) | ||
258 | { | ||
259 | if (!dwc->has_hibernation) | ||
260 | return 0; | ||
261 | |||
262 | if (!dwc->nr_scratch) | ||
263 | return 0; | ||
264 | |||
265 | dwc->scratchbuf = kmalloc_array(dwc->nr_scratch, | ||
266 | DWC3_SCRATCHBUF_SIZE, GFP_KERNEL); | ||
267 | if (!dwc->scratchbuf) | ||
268 | return -ENOMEM; | ||
269 | |||
270 | return 0; | ||
271 | } | ||
272 | |||
273 | static int dwc3_setup_scratch_buffers(struct dwc3 *dwc) | ||
274 | { | ||
275 | dma_addr_t scratch_addr; | ||
276 | u32 param; | ||
277 | int ret; | ||
278 | |||
279 | if (!dwc->has_hibernation) | ||
280 | return 0; | ||
281 | |||
282 | if (!dwc->nr_scratch) | ||
283 | return 0; | ||
284 | |||
285 | /* should never fall here */ | ||
286 | if (!WARN_ON(dwc->scratchbuf)) | ||
287 | return 0; | ||
288 | |||
289 | scratch_addr = dma_map_single(dwc->dev, dwc->scratchbuf, | ||
290 | dwc->nr_scratch * DWC3_SCRATCHBUF_SIZE, | ||
291 | DMA_BIDIRECTIONAL); | ||
292 | if (dma_mapping_error(dwc->dev, scratch_addr)) { | ||
293 | dev_err(dwc->dev, "failed to map scratch buffer\n"); | ||
294 | ret = -EFAULT; | ||
295 | goto err0; | ||
296 | } | ||
297 | |||
298 | dwc->scratch_addr = scratch_addr; | ||
299 | |||
300 | param = lower_32_bits(scratch_addr); | ||
301 | |||
302 | ret = dwc3_send_gadget_generic_command(dwc, | ||
303 | DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO, param); | ||
304 | if (ret < 0) | ||
305 | goto err1; | ||
306 | |||
307 | param = upper_32_bits(scratch_addr); | ||
308 | |||
309 | ret = dwc3_send_gadget_generic_command(dwc, | ||
310 | DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI, param); | ||
311 | if (ret < 0) | ||
312 | goto err1; | ||
313 | |||
314 | return 0; | ||
315 | |||
316 | err1: | ||
317 | dma_unmap_single(dwc->dev, dwc->scratch_addr, dwc->nr_scratch * | ||
318 | DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL); | ||
319 | |||
320 | err0: | ||
321 | return ret; | ||
322 | } | ||
323 | |||
324 | static void dwc3_free_scratch_buffers(struct dwc3 *dwc) | ||
325 | { | ||
326 | if (!dwc->has_hibernation) | ||
327 | return; | ||
328 | |||
329 | if (!dwc->nr_scratch) | ||
330 | return; | ||
331 | |||
332 | /* should never fall here */ | ||
333 | if (!WARN_ON(dwc->scratchbuf)) | ||
334 | return; | ||
335 | |||
336 | dma_unmap_single(dwc->dev, dwc->scratch_addr, dwc->nr_scratch * | ||
337 | DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL); | ||
338 | kfree(dwc->scratchbuf); | ||
339 | } | ||
340 | |||
245 | static void dwc3_core_num_eps(struct dwc3 *dwc) | 341 | static void dwc3_core_num_eps(struct dwc3 *dwc) |
246 | { | 342 | { |
247 | struct dwc3_hwparams *parms = &dwc->hwparams; | 343 | struct dwc3_hwparams *parms = &dwc->hwparams; |
@@ -277,6 +373,7 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc) | |||
277 | static int dwc3_core_init(struct dwc3 *dwc) | 373 | static int dwc3_core_init(struct dwc3 *dwc) |
278 | { | 374 | { |
279 | unsigned long timeout; | 375 | unsigned long timeout; |
376 | u32 hwparams4 = dwc->hwparams.hwparams4; | ||
280 | u32 reg; | 377 | u32 reg; |
281 | int ret; | 378 | int ret; |
282 | 379 | ||
@@ -306,7 +403,9 @@ static int dwc3_core_init(struct dwc3 *dwc) | |||
306 | cpu_relax(); | 403 | cpu_relax(); |
307 | } while (true); | 404 | } while (true); |
308 | 405 | ||
309 | dwc3_core_soft_reset(dwc); | 406 | ret = dwc3_core_soft_reset(dwc); |
407 | if (ret) | ||
408 | goto err0; | ||
310 | 409 | ||
311 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); | 410 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); |
312 | reg &= ~DWC3_GCTL_SCALEDOWN_MASK; | 411 | reg &= ~DWC3_GCTL_SCALEDOWN_MASK; |
@@ -314,7 +413,29 @@ static int dwc3_core_init(struct dwc3 *dwc) | |||
314 | 413 | ||
315 | switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1)) { | 414 | switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1)) { |
316 | case DWC3_GHWPARAMS1_EN_PWROPT_CLK: | 415 | case DWC3_GHWPARAMS1_EN_PWROPT_CLK: |
317 | reg &= ~DWC3_GCTL_DSBLCLKGTNG; | 416 | /** |
417 | * WORKAROUND: DWC3 revisions between 2.10a and 2.50a have an | ||
418 | * issue which would cause xHCI compliance tests to fail. | ||
419 | * | ||
420 | * Because of that we cannot enable clock gating on such | ||
421 | * configurations. | ||
422 | * | ||
423 | * Refers to: | ||
424 | * | ||
425 | * STAR#9000588375: Clock Gating, SOF Issues when ref_clk-Based | ||
426 | * SOF/ITP Mode Used | ||
427 | */ | ||
428 | if ((dwc->dr_mode == USB_DR_MODE_HOST || | ||
429 | dwc->dr_mode == USB_DR_MODE_OTG) && | ||
430 | (dwc->revision >= DWC3_REVISION_210A && | ||
431 | dwc->revision <= DWC3_REVISION_250A)) | ||
432 | reg |= DWC3_GCTL_DSBLCLKGTNG | DWC3_GCTL_SOFITPSYNC; | ||
433 | else | ||
434 | reg &= ~DWC3_GCTL_DSBLCLKGTNG; | ||
435 | break; | ||
436 | case DWC3_GHWPARAMS1_EN_PWROPT_HIB: | ||
437 | /* enable hibernation here */ | ||
438 | dwc->nr_scratch = DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(hwparams4); | ||
318 | break; | 439 | break; |
319 | default: | 440 | default: |
320 | dev_dbg(dwc->dev, "No power optimization available\n"); | 441 | dev_dbg(dwc->dev, "No power optimization available\n"); |
@@ -333,16 +454,36 @@ static int dwc3_core_init(struct dwc3 *dwc) | |||
333 | 454 | ||
334 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); | 455 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); |
335 | 456 | ||
457 | ret = dwc3_alloc_scratch_buffers(dwc); | ||
458 | if (ret) | ||
459 | goto err1; | ||
460 | |||
461 | ret = dwc3_setup_scratch_buffers(dwc); | ||
462 | if (ret) | ||
463 | goto err2; | ||
464 | |||
336 | return 0; | 465 | return 0; |
337 | 466 | ||
467 | err2: | ||
468 | dwc3_free_scratch_buffers(dwc); | ||
469 | |||
470 | err1: | ||
471 | usb_phy_shutdown(dwc->usb2_phy); | ||
472 | usb_phy_shutdown(dwc->usb3_phy); | ||
473 | phy_exit(dwc->usb2_generic_phy); | ||
474 | phy_exit(dwc->usb3_generic_phy); | ||
475 | |||
338 | err0: | 476 | err0: |
339 | return ret; | 477 | return ret; |
340 | } | 478 | } |
341 | 479 | ||
342 | static void dwc3_core_exit(struct dwc3 *dwc) | 480 | static void dwc3_core_exit(struct dwc3 *dwc) |
343 | { | 481 | { |
482 | dwc3_free_scratch_buffers(dwc); | ||
344 | usb_phy_shutdown(dwc->usb2_phy); | 483 | usb_phy_shutdown(dwc->usb2_phy); |
345 | usb_phy_shutdown(dwc->usb3_phy); | 484 | usb_phy_shutdown(dwc->usb3_phy); |
485 | phy_exit(dwc->usb2_generic_phy); | ||
486 | phy_exit(dwc->usb3_generic_phy); | ||
346 | } | 487 | } |
347 | 488 | ||
348 | #define DWC3_ALIGN_MASK (16 - 1) | 489 | #define DWC3_ALIGN_MASK (16 - 1) |
@@ -411,32 +552,52 @@ static int dwc3_probe(struct platform_device *pdev) | |||
411 | 552 | ||
412 | if (IS_ERR(dwc->usb2_phy)) { | 553 | if (IS_ERR(dwc->usb2_phy)) { |
413 | ret = PTR_ERR(dwc->usb2_phy); | 554 | ret = PTR_ERR(dwc->usb2_phy); |
414 | 555 | if (ret == -ENXIO || ret == -ENODEV) { | |
415 | /* | 556 | dwc->usb2_phy = NULL; |
416 | * if -ENXIO is returned, it means PHY layer wasn't | 557 | } else if (ret == -EPROBE_DEFER) { |
417 | * enabled, so it makes no sense to return -EPROBE_DEFER | ||
418 | * in that case, since no PHY driver will ever probe. | ||
419 | */ | ||
420 | if (ret == -ENXIO) | ||
421 | return ret; | 558 | return ret; |
422 | 559 | } else { | |
423 | dev_err(dev, "no usb2 phy configured\n"); | 560 | dev_err(dev, "no usb2 phy configured\n"); |
424 | return -EPROBE_DEFER; | 561 | return ret; |
562 | } | ||
425 | } | 563 | } |
426 | 564 | ||
427 | if (IS_ERR(dwc->usb3_phy)) { | 565 | if (IS_ERR(dwc->usb3_phy)) { |
428 | ret = PTR_ERR(dwc->usb3_phy); | 566 | ret = PTR_ERR(dwc->usb3_phy); |
567 | if (ret == -ENXIO || ret == -ENODEV) { | ||
568 | dwc->usb3_phy = NULL; | ||
569 | } else if (ret == -EPROBE_DEFER) { | ||
570 | return ret; | ||
571 | } else { | ||
572 | dev_err(dev, "no usb3 phy configured\n"); | ||
573 | return ret; | ||
574 | } | ||
575 | } | ||
429 | 576 | ||
430 | /* | 577 | dwc->usb2_generic_phy = devm_phy_get(dev, "usb2-phy"); |
431 | * if -ENXIO is returned, it means PHY layer wasn't | 578 | if (IS_ERR(dwc->usb2_generic_phy)) { |
432 | * enabled, so it makes no sense to return -EPROBE_DEFER | 579 | ret = PTR_ERR(dwc->usb2_generic_phy); |
433 | * in that case, since no PHY driver will ever probe. | 580 | if (ret == -ENOSYS || ret == -ENODEV) { |
434 | */ | 581 | dwc->usb2_generic_phy = NULL; |
435 | if (ret == -ENXIO) | 582 | } else if (ret == -EPROBE_DEFER) { |
583 | return ret; | ||
584 | } else { | ||
585 | dev_err(dev, "no usb2 phy configured\n"); | ||
436 | return ret; | 586 | return ret; |
587 | } | ||
588 | } | ||
437 | 589 | ||
438 | dev_err(dev, "no usb3 phy configured\n"); | 590 | dwc->usb3_generic_phy = devm_phy_get(dev, "usb3-phy"); |
439 | return -EPROBE_DEFER; | 591 | if (IS_ERR(dwc->usb3_generic_phy)) { |
592 | ret = PTR_ERR(dwc->usb3_generic_phy); | ||
593 | if (ret == -ENOSYS || ret == -ENODEV) { | ||
594 | dwc->usb3_generic_phy = NULL; | ||
595 | } else if (ret == -EPROBE_DEFER) { | ||
596 | return ret; | ||
597 | } else { | ||
598 | dev_err(dev, "no usb3 phy configured\n"); | ||
599 | return ret; | ||
600 | } | ||
440 | } | 601 | } |
441 | 602 | ||
442 | dwc->xhci_resources[0].start = res->start; | 603 | dwc->xhci_resources[0].start = res->start; |
@@ -479,6 +640,14 @@ static int dwc3_probe(struct platform_device *pdev) | |||
479 | goto err0; | 640 | goto err0; |
480 | } | 641 | } |
481 | 642 | ||
643 | if (IS_ENABLED(CONFIG_USB_DWC3_HOST)) | ||
644 | dwc->dr_mode = USB_DR_MODE_HOST; | ||
645 | else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET)) | ||
646 | dwc->dr_mode = USB_DR_MODE_PERIPHERAL; | ||
647 | |||
648 | if (dwc->dr_mode == USB_DR_MODE_UNKNOWN) | ||
649 | dwc->dr_mode = USB_DR_MODE_OTG; | ||
650 | |||
482 | ret = dwc3_core_init(dwc); | 651 | ret = dwc3_core_init(dwc); |
483 | if (ret) { | 652 | if (ret) { |
484 | dev_err(dev, "failed to initialize core\n"); | 653 | dev_err(dev, "failed to initialize core\n"); |
@@ -487,21 +656,20 @@ static int dwc3_probe(struct platform_device *pdev) | |||
487 | 656 | ||
488 | usb_phy_set_suspend(dwc->usb2_phy, 0); | 657 | usb_phy_set_suspend(dwc->usb2_phy, 0); |
489 | usb_phy_set_suspend(dwc->usb3_phy, 0); | 658 | usb_phy_set_suspend(dwc->usb3_phy, 0); |
659 | ret = phy_power_on(dwc->usb2_generic_phy); | ||
660 | if (ret < 0) | ||
661 | goto err1; | ||
662 | |||
663 | ret = phy_power_on(dwc->usb3_generic_phy); | ||
664 | if (ret < 0) | ||
665 | goto err_usb2phy_power; | ||
490 | 666 | ||
491 | ret = dwc3_event_buffers_setup(dwc); | 667 | ret = dwc3_event_buffers_setup(dwc); |
492 | if (ret) { | 668 | if (ret) { |
493 | dev_err(dwc->dev, "failed to setup event buffers\n"); | 669 | dev_err(dwc->dev, "failed to setup event buffers\n"); |
494 | goto err1; | 670 | goto err_usb3phy_power; |
495 | } | 671 | } |
496 | 672 | ||
497 | if (IS_ENABLED(CONFIG_USB_DWC3_HOST)) | ||
498 | dwc->dr_mode = USB_DR_MODE_HOST; | ||
499 | else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET)) | ||
500 | dwc->dr_mode = USB_DR_MODE_PERIPHERAL; | ||
501 | |||
502 | if (dwc->dr_mode == USB_DR_MODE_UNKNOWN) | ||
503 | dwc->dr_mode = USB_DR_MODE_OTG; | ||
504 | |||
505 | switch (dwc->dr_mode) { | 673 | switch (dwc->dr_mode) { |
506 | case USB_DR_MODE_PERIPHERAL: | 674 | case USB_DR_MODE_PERIPHERAL: |
507 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); | 675 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); |
@@ -568,6 +736,12 @@ err3: | |||
568 | err2: | 736 | err2: |
569 | dwc3_event_buffers_cleanup(dwc); | 737 | dwc3_event_buffers_cleanup(dwc); |
570 | 738 | ||
739 | err_usb3phy_power: | ||
740 | phy_power_off(dwc->usb3_generic_phy); | ||
741 | |||
742 | err_usb2phy_power: | ||
743 | phy_power_off(dwc->usb2_generic_phy); | ||
744 | |||
571 | err1: | 745 | err1: |
572 | usb_phy_set_suspend(dwc->usb2_phy, 1); | 746 | usb_phy_set_suspend(dwc->usb2_phy, 1); |
573 | usb_phy_set_suspend(dwc->usb3_phy, 1); | 747 | usb_phy_set_suspend(dwc->usb3_phy, 1); |
@@ -585,6 +759,8 @@ static int dwc3_remove(struct platform_device *pdev) | |||
585 | 759 | ||
586 | usb_phy_set_suspend(dwc->usb2_phy, 1); | 760 | usb_phy_set_suspend(dwc->usb2_phy, 1); |
587 | usb_phy_set_suspend(dwc->usb3_phy, 1); | 761 | usb_phy_set_suspend(dwc->usb3_phy, 1); |
762 | phy_power_off(dwc->usb2_generic_phy); | ||
763 | phy_power_off(dwc->usb3_generic_phy); | ||
588 | 764 | ||
589 | pm_runtime_put_sync(&pdev->dev); | 765 | pm_runtime_put_sync(&pdev->dev); |
590 | pm_runtime_disable(&pdev->dev); | 766 | pm_runtime_disable(&pdev->dev); |
@@ -682,6 +858,8 @@ static int dwc3_suspend(struct device *dev) | |||
682 | 858 | ||
683 | usb_phy_shutdown(dwc->usb3_phy); | 859 | usb_phy_shutdown(dwc->usb3_phy); |
684 | usb_phy_shutdown(dwc->usb2_phy); | 860 | usb_phy_shutdown(dwc->usb2_phy); |
861 | phy_exit(dwc->usb2_generic_phy); | ||
862 | phy_exit(dwc->usb3_generic_phy); | ||
685 | 863 | ||
686 | return 0; | 864 | return 0; |
687 | } | 865 | } |
@@ -690,9 +868,17 @@ static int dwc3_resume(struct device *dev) | |||
690 | { | 868 | { |
691 | struct dwc3 *dwc = dev_get_drvdata(dev); | 869 | struct dwc3 *dwc = dev_get_drvdata(dev); |
692 | unsigned long flags; | 870 | unsigned long flags; |
871 | int ret; | ||
693 | 872 | ||
694 | usb_phy_init(dwc->usb3_phy); | 873 | usb_phy_init(dwc->usb3_phy); |
695 | usb_phy_init(dwc->usb2_phy); | 874 | usb_phy_init(dwc->usb2_phy); |
875 | ret = phy_init(dwc->usb2_generic_phy); | ||
876 | if (ret < 0) | ||
877 | return ret; | ||
878 | |||
879 | ret = phy_init(dwc->usb3_generic_phy); | ||
880 | if (ret < 0) | ||
881 | goto err_usb2phy_init; | ||
696 | 882 | ||
697 | spin_lock_irqsave(&dwc->lock, flags); | 883 | spin_lock_irqsave(&dwc->lock, flags); |
698 | 884 | ||
@@ -716,6 +902,11 @@ static int dwc3_resume(struct device *dev) | |||
716 | pm_runtime_enable(dev); | 902 | pm_runtime_enable(dev); |
717 | 903 | ||
718 | return 0; | 904 | return 0; |
905 | |||
906 | err_usb2phy_init: | ||
907 | phy_exit(dwc->usb2_generic_phy); | ||
908 | |||
909 | return ret; | ||
719 | } | 910 | } |
720 | 911 | ||
721 | static const struct dev_pm_ops dwc3_dev_pm_ops = { | 912 | static const struct dev_pm_ops dwc3_dev_pm_ops = { |
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index f8af8d44af85..57332e3768e4 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -31,11 +31,14 @@ | |||
31 | #include <linux/usb/gadget.h> | 31 | #include <linux/usb/gadget.h> |
32 | #include <linux/usb/otg.h> | 32 | #include <linux/usb/otg.h> |
33 | 33 | ||
34 | #include <linux/phy/phy.h> | ||
35 | |||
34 | /* Global constants */ | 36 | /* Global constants */ |
35 | #define DWC3_EP0_BOUNCE_SIZE 512 | 37 | #define DWC3_EP0_BOUNCE_SIZE 512 |
36 | #define DWC3_ENDPOINTS_NUM 32 | 38 | #define DWC3_ENDPOINTS_NUM 32 |
37 | #define DWC3_XHCI_RESOURCES_NUM 2 | 39 | #define DWC3_XHCI_RESOURCES_NUM 2 |
38 | 40 | ||
41 | #define DWC3_SCRATCHBUF_SIZE 4096 /* each buffer is assumed to be 4KiB */ | ||
39 | #define DWC3_EVENT_SIZE 4 /* bytes */ | 42 | #define DWC3_EVENT_SIZE 4 /* bytes */ |
40 | #define DWC3_EVENT_MAX_NUM 64 /* 2 events/endpoint */ | 43 | #define DWC3_EVENT_MAX_NUM 64 /* 2 events/endpoint */ |
41 | #define DWC3_EVENT_BUFFERS_SIZE (DWC3_EVENT_SIZE * DWC3_EVENT_MAX_NUM) | 44 | #define DWC3_EVENT_BUFFERS_SIZE (DWC3_EVENT_SIZE * DWC3_EVENT_MAX_NUM) |
@@ -157,6 +160,7 @@ | |||
157 | #define DWC3_GCTL_PRTCAP_OTG 3 | 160 | #define DWC3_GCTL_PRTCAP_OTG 3 |
158 | 161 | ||
159 | #define DWC3_GCTL_CORESOFTRESET (1 << 11) | 162 | #define DWC3_GCTL_CORESOFTRESET (1 << 11) |
163 | #define DWC3_GCTL_SOFITPSYNC (1 << 10) | ||
160 | #define DWC3_GCTL_SCALEDOWN(n) ((n) << 4) | 164 | #define DWC3_GCTL_SCALEDOWN(n) ((n) << 4) |
161 | #define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3) | 165 | #define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3) |
162 | #define DWC3_GCTL_DISSCRAMBLE (1 << 3) | 166 | #define DWC3_GCTL_DISSCRAMBLE (1 << 3) |
@@ -318,7 +322,7 @@ | |||
318 | /* Device Endpoint Command Register */ | 322 | /* Device Endpoint Command Register */ |
319 | #define DWC3_DEPCMD_PARAM_SHIFT 16 | 323 | #define DWC3_DEPCMD_PARAM_SHIFT 16 |
320 | #define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT) | 324 | #define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT) |
321 | #define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) | 325 | #define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) |
322 | #define DWC3_DEPCMD_STATUS(x) (((x) >> 15) & 1) | 326 | #define DWC3_DEPCMD_STATUS(x) (((x) >> 15) & 1) |
323 | #define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11) | 327 | #define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11) |
324 | #define DWC3_DEPCMD_CMDACT (1 << 10) | 328 | #define DWC3_DEPCMD_CMDACT (1 << 10) |
@@ -393,6 +397,7 @@ struct dwc3_event_buffer { | |||
393 | * @busy_slot: first slot which is owned by HW | 397 | * @busy_slot: first slot which is owned by HW |
394 | * @desc: usb_endpoint_descriptor pointer | 398 | * @desc: usb_endpoint_descriptor pointer |
395 | * @dwc: pointer to DWC controller | 399 | * @dwc: pointer to DWC controller |
400 | * @saved_state: ep state saved during hibernation | ||
396 | * @flags: endpoint flags (wedged, stalled, ...) | 401 | * @flags: endpoint flags (wedged, stalled, ...) |
397 | * @current_trb: index of current used trb | 402 | * @current_trb: index of current used trb |
398 | * @number: endpoint number (1 - 15) | 403 | * @number: endpoint number (1 - 15) |
@@ -415,6 +420,7 @@ struct dwc3_ep { | |||
415 | const struct usb_ss_ep_comp_descriptor *comp_desc; | 420 | const struct usb_ss_ep_comp_descriptor *comp_desc; |
416 | struct dwc3 *dwc; | 421 | struct dwc3 *dwc; |
417 | 422 | ||
423 | u32 saved_state; | ||
418 | unsigned flags; | 424 | unsigned flags; |
419 | #define DWC3_EP_ENABLED (1 << 0) | 425 | #define DWC3_EP_ENABLED (1 << 0) |
420 | #define DWC3_EP_STALL (1 << 1) | 426 | #define DWC3_EP_STALL (1 << 1) |
@@ -598,6 +604,7 @@ struct dwc3_scratchpad_array { | |||
598 | * @ep0_trb: dma address of ep0_trb | 604 | * @ep0_trb: dma address of ep0_trb |
599 | * @ep0_usb_req: dummy req used while handling STD USB requests | 605 | * @ep0_usb_req: dummy req used while handling STD USB requests |
600 | * @ep0_bounce_addr: dma address of ep0_bounce | 606 | * @ep0_bounce_addr: dma address of ep0_bounce |
607 | * @scratch_addr: dma address of scratchbuf | ||
601 | * @lock: for synchronizing | 608 | * @lock: for synchronizing |
602 | * @dev: pointer to our struct device | 609 | * @dev: pointer to our struct device |
603 | * @xhci: pointer to our xHCI child | 610 | * @xhci: pointer to our xHCI child |
@@ -606,6 +613,7 @@ struct dwc3_scratchpad_array { | |||
606 | * @gadget_driver: pointer to the gadget driver | 613 | * @gadget_driver: pointer to the gadget driver |
607 | * @regs: base address for our registers | 614 | * @regs: base address for our registers |
608 | * @regs_size: address space size | 615 | * @regs_size: address space size |
616 | * @nr_scratch: number of scratch buffers | ||
609 | * @num_event_buffers: calculated number of event buffers | 617 | * @num_event_buffers: calculated number of event buffers |
610 | * @u1u2: only used on revisions <1.83a for workaround | 618 | * @u1u2: only used on revisions <1.83a for workaround |
611 | * @maximum_speed: maximum speed requested (mainly for testing purposes) | 619 | * @maximum_speed: maximum speed requested (mainly for testing purposes) |
@@ -613,16 +621,10 @@ struct dwc3_scratchpad_array { | |||
613 | * @dr_mode: requested mode of operation | 621 | * @dr_mode: requested mode of operation |
614 | * @usb2_phy: pointer to USB2 PHY | 622 | * @usb2_phy: pointer to USB2 PHY |
615 | * @usb3_phy: pointer to USB3 PHY | 623 | * @usb3_phy: pointer to USB3 PHY |
624 | * @usb2_generic_phy: pointer to USB2 PHY | ||
625 | * @usb3_generic_phy: pointer to USB3 PHY | ||
616 | * @dcfg: saved contents of DCFG register | 626 | * @dcfg: saved contents of DCFG register |
617 | * @gctl: saved contents of GCTL register | 627 | * @gctl: saved contents of GCTL register |
618 | * @is_selfpowered: true when we are selfpowered | ||
619 | * @three_stage_setup: set if we perform a three phase setup | ||
620 | * @ep0_bounced: true when we used bounce buffer | ||
621 | * @ep0_expect_in: true when we expect a DATA IN transfer | ||
622 | * @start_config_issued: true when StartConfig command has been issued | ||
623 | * @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround | ||
624 | * @needs_fifo_resize: not all users might want fifo resizing, flag it | ||
625 | * @resize_fifos: tells us it's ok to reconfigure our TxFIFO sizes. | ||
626 | * @isoch_delay: wValue from Set Isochronous Delay request; | 628 | * @isoch_delay: wValue from Set Isochronous Delay request; |
627 | * @u2sel: parameter from Set SEL request. | 629 | * @u2sel: parameter from Set SEL request. |
628 | * @u2pel: parameter from Set SEL request. | 630 | * @u2pel: parameter from Set SEL request. |
@@ -637,15 +639,31 @@ struct dwc3_scratchpad_array { | |||
637 | * @mem: points to start of memory which is used for this struct. | 639 | * @mem: points to start of memory which is used for this struct. |
638 | * @hwparams: copy of hwparams registers | 640 | * @hwparams: copy of hwparams registers |
639 | * @root: debugfs root folder pointer | 641 | * @root: debugfs root folder pointer |
642 | * @regset: debugfs pointer to regdump file | ||
643 | * @test_mode: true when we're entering a USB test mode | ||
644 | * @test_mode_nr: test feature selector | ||
645 | * @delayed_status: true when gadget driver asks for delayed status | ||
646 | * @ep0_bounced: true when we used bounce buffer | ||
647 | * @ep0_expect_in: true when we expect a DATA IN transfer | ||
648 | * @has_hibernation: true when dwc3 was configured with Hibernation | ||
649 | * @is_selfpowered: true when we are selfpowered | ||
650 | * @needs_fifo_resize: not all users might want fifo resizing, flag it | ||
651 | * @pullups_connected: true when Run/Stop bit is set | ||
652 | * @resize_fifos: tells us it's ok to reconfigure our TxFIFO sizes. | ||
653 | * @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround | ||
654 | * @start_config_issued: true when StartConfig command has been issued | ||
655 | * @three_stage_setup: set if we perform a three phase setup | ||
640 | */ | 656 | */ |
641 | struct dwc3 { | 657 | struct dwc3 { |
642 | struct usb_ctrlrequest *ctrl_req; | 658 | struct usb_ctrlrequest *ctrl_req; |
643 | struct dwc3_trb *ep0_trb; | 659 | struct dwc3_trb *ep0_trb; |
644 | void *ep0_bounce; | 660 | void *ep0_bounce; |
661 | void *scratchbuf; | ||
645 | u8 *setup_buf; | 662 | u8 *setup_buf; |
646 | dma_addr_t ctrl_req_addr; | 663 | dma_addr_t ctrl_req_addr; |
647 | dma_addr_t ep0_trb_addr; | 664 | dma_addr_t ep0_trb_addr; |
648 | dma_addr_t ep0_bounce_addr; | 665 | dma_addr_t ep0_bounce_addr; |
666 | dma_addr_t scratch_addr; | ||
649 | struct dwc3_request ep0_usb_req; | 667 | struct dwc3_request ep0_usb_req; |
650 | 668 | ||
651 | /* device lock */ | 669 | /* device lock */ |
@@ -665,6 +683,9 @@ struct dwc3 { | |||
665 | struct usb_phy *usb2_phy; | 683 | struct usb_phy *usb2_phy; |
666 | struct usb_phy *usb3_phy; | 684 | struct usb_phy *usb3_phy; |
667 | 685 | ||
686 | struct phy *usb2_generic_phy; | ||
687 | struct phy *usb3_generic_phy; | ||
688 | |||
668 | void __iomem *regs; | 689 | void __iomem *regs; |
669 | size_t regs_size; | 690 | size_t regs_size; |
670 | 691 | ||
@@ -674,6 +695,7 @@ struct dwc3 { | |||
674 | u32 dcfg; | 695 | u32 dcfg; |
675 | u32 gctl; | 696 | u32 gctl; |
676 | 697 | ||
698 | u32 nr_scratch; | ||
677 | u32 num_event_buffers; | 699 | u32 num_event_buffers; |
678 | u32 u1u2; | 700 | u32 u1u2; |
679 | u32 maximum_speed; | 701 | u32 maximum_speed; |
@@ -695,17 +717,9 @@ struct dwc3 { | |||
695 | #define DWC3_REVISION_230A 0x5533230a | 717 | #define DWC3_REVISION_230A 0x5533230a |
696 | #define DWC3_REVISION_240A 0x5533240a | 718 | #define DWC3_REVISION_240A 0x5533240a |
697 | #define DWC3_REVISION_250A 0x5533250a | 719 | #define DWC3_REVISION_250A 0x5533250a |
698 | 720 | #define DWC3_REVISION_260A 0x5533260a | |
699 | unsigned is_selfpowered:1; | 721 | #define DWC3_REVISION_270A 0x5533270a |
700 | unsigned three_stage_setup:1; | 722 | #define DWC3_REVISION_280A 0x5533280a |
701 | unsigned ep0_bounced:1; | ||
702 | unsigned ep0_expect_in:1; | ||
703 | unsigned start_config_issued:1; | ||
704 | unsigned setup_packet_pending:1; | ||
705 | unsigned delayed_status:1; | ||
706 | unsigned needs_fifo_resize:1; | ||
707 | unsigned resize_fifos:1; | ||
708 | unsigned pullups_connected:1; | ||
709 | 723 | ||
710 | enum dwc3_ep0_next ep0_next_event; | 724 | enum dwc3_ep0_next ep0_next_event; |
711 | enum dwc3_ep0_state ep0state; | 725 | enum dwc3_ep0_state ep0state; |
@@ -730,6 +744,18 @@ struct dwc3 { | |||
730 | 744 | ||
731 | u8 test_mode; | 745 | u8 test_mode; |
732 | u8 test_mode_nr; | 746 | u8 test_mode_nr; |
747 | |||
748 | unsigned delayed_status:1; | ||
749 | unsigned ep0_bounced:1; | ||
750 | unsigned ep0_expect_in:1; | ||
751 | unsigned has_hibernation:1; | ||
752 | unsigned is_selfpowered:1; | ||
753 | unsigned needs_fifo_resize:1; | ||
754 | unsigned pullups_connected:1; | ||
755 | unsigned resize_fifos:1; | ||
756 | unsigned setup_packet_pending:1; | ||
757 | unsigned start_config_issued:1; | ||
758 | unsigned three_stage_setup:1; | ||
733 | }; | 759 | }; |
734 | 760 | ||
735 | /* -------------------------------------------------------------------------- */ | 761 | /* -------------------------------------------------------------------------- */ |
@@ -815,15 +841,15 @@ struct dwc3_event_depevt { | |||
815 | * 12 - VndrDevTstRcved | 841 | * 12 - VndrDevTstRcved |
816 | * @reserved15_12: Reserved, not used | 842 | * @reserved15_12: Reserved, not used |
817 | * @event_info: Information about this event | 843 | * @event_info: Information about this event |
818 | * @reserved31_24: Reserved, not used | 844 | * @reserved31_25: Reserved, not used |
819 | */ | 845 | */ |
820 | struct dwc3_event_devt { | 846 | struct dwc3_event_devt { |
821 | u32 one_bit:1; | 847 | u32 one_bit:1; |
822 | u32 device_event:7; | 848 | u32 device_event:7; |
823 | u32 type:4; | 849 | u32 type:4; |
824 | u32 reserved15_12:4; | 850 | u32 reserved15_12:4; |
825 | u32 event_info:8; | 851 | u32 event_info:9; |
826 | u32 reserved31_24:8; | 852 | u32 reserved31_25:7; |
827 | } __packed; | 853 | } __packed; |
828 | 854 | ||
829 | /** | 855 | /** |
@@ -856,6 +882,19 @@ union dwc3_event { | |||
856 | struct dwc3_event_gevt gevt; | 882 | struct dwc3_event_gevt gevt; |
857 | }; | 883 | }; |
858 | 884 | ||
885 | /** | ||
886 | * struct dwc3_gadget_ep_cmd_params - representation of endpoint command | ||
887 | * parameters | ||
888 | * @param2: third parameter | ||
889 | * @param1: second parameter | ||
890 | * @param0: first parameter | ||
891 | */ | ||
892 | struct dwc3_gadget_ep_cmd_params { | ||
893 | u32 param2; | ||
894 | u32 param1; | ||
895 | u32 param0; | ||
896 | }; | ||
897 | |||
859 | /* | 898 | /* |
860 | * DWC3 Features to be used as Driver Data | 899 | * DWC3 Features to be used as Driver Data |
861 | */ | 900 | */ |
@@ -881,11 +920,31 @@ static inline void dwc3_host_exit(struct dwc3 *dwc) | |||
881 | #if IS_ENABLED(CONFIG_USB_DWC3_GADGET) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) | 920 | #if IS_ENABLED(CONFIG_USB_DWC3_GADGET) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) |
882 | int dwc3_gadget_init(struct dwc3 *dwc); | 921 | int dwc3_gadget_init(struct dwc3 *dwc); |
883 | void dwc3_gadget_exit(struct dwc3 *dwc); | 922 | void dwc3_gadget_exit(struct dwc3 *dwc); |
923 | int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode); | ||
924 | int dwc3_gadget_get_link_state(struct dwc3 *dwc); | ||
925 | int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state); | ||
926 | int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | ||
927 | unsigned cmd, struct dwc3_gadget_ep_cmd_params *params); | ||
928 | int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param); | ||
884 | #else | 929 | #else |
885 | static inline int dwc3_gadget_init(struct dwc3 *dwc) | 930 | static inline int dwc3_gadget_init(struct dwc3 *dwc) |
886 | { return 0; } | 931 | { return 0; } |
887 | static inline void dwc3_gadget_exit(struct dwc3 *dwc) | 932 | static inline void dwc3_gadget_exit(struct dwc3 *dwc) |
888 | { } | 933 | { } |
934 | static inline int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode) | ||
935 | { return 0; } | ||
936 | static inline int dwc3_gadget_get_link_state(struct dwc3 *dwc) | ||
937 | { return 0; } | ||
938 | static inline int dwc3_gadget_set_link_state(struct dwc3 *dwc, | ||
939 | enum dwc3_link_state state) | ||
940 | { return 0; } | ||
941 | |||
942 | static inline int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | ||
943 | unsigned cmd, struct dwc3_gadget_ep_cmd_params *params) | ||
944 | { return 0; } | ||
945 | static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc, | ||
946 | int cmd, u32 param) | ||
947 | { return 0; } | ||
889 | #endif | 948 | #endif |
890 | 949 | ||
891 | /* power management interface */ | 950 | /* power management interface */ |
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index b1d7ee6e40b7..1160ff41bed4 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -423,11 +423,6 @@ static int dwc3_omap_probe(struct platform_device *pdev) | |||
423 | } | 423 | } |
424 | 424 | ||
425 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 425 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
426 | if (!res) { | ||
427 | dev_err(dev, "missing memory base resource\n"); | ||
428 | return -EINVAL; | ||
429 | } | ||
430 | |||
431 | base = devm_ioremap_resource(dev, res); | 426 | base = devm_ioremap_resource(dev, res); |
432 | if (IS_ERR(base)) | 427 | if (IS_ERR(base)) |
433 | return PTR_ERR(base); | 428 | return PTR_ERR(base); |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 2da0a5a2803a..a740eac74d56 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -68,6 +68,22 @@ int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | /** | 70 | /** |
71 | * dwc3_gadget_get_link_state - Gets current state of USB Link | ||
72 | * @dwc: pointer to our context structure | ||
73 | * | ||
74 | * Caller should take care of locking. This function will | ||
75 | * return the link state on success (>= 0) or -ETIMEDOUT. | ||
76 | */ | ||
77 | int dwc3_gadget_get_link_state(struct dwc3 *dwc) | ||
78 | { | ||
79 | u32 reg; | ||
80 | |||
81 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); | ||
82 | |||
83 | return DWC3_DSTS_USBLNKST(reg); | ||
84 | } | ||
85 | |||
86 | /** | ||
71 | * dwc3_gadget_set_link_state - Sets USB Link to a particular State | 87 | * dwc3_gadget_set_link_state - Sets USB Link to a particular State |
72 | * @dwc: pointer to our context structure | 88 | * @dwc: pointer to our context structure |
73 | * @state: the state to put link into | 89 | * @state: the state to put link into |
@@ -417,7 +433,7 @@ static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep) | |||
417 | static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, | 433 | static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, |
418 | const struct usb_endpoint_descriptor *desc, | 434 | const struct usb_endpoint_descriptor *desc, |
419 | const struct usb_ss_ep_comp_descriptor *comp_desc, | 435 | const struct usb_ss_ep_comp_descriptor *comp_desc, |
420 | bool ignore) | 436 | bool ignore, bool restore) |
421 | { | 437 | { |
422 | struct dwc3_gadget_ep_cmd_params params; | 438 | struct dwc3_gadget_ep_cmd_params params; |
423 | 439 | ||
@@ -436,6 +452,11 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
436 | if (ignore) | 452 | if (ignore) |
437 | params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM; | 453 | params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM; |
438 | 454 | ||
455 | if (restore) { | ||
456 | params.param0 |= DWC3_DEPCFG_ACTION_RESTORE; | ||
457 | params.param2 |= dep->saved_state; | ||
458 | } | ||
459 | |||
439 | params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN | 460 | params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN |
440 | | DWC3_DEPCFG_XFER_NOT_READY_EN; | 461 | | DWC3_DEPCFG_XFER_NOT_READY_EN; |
441 | 462 | ||
@@ -494,7 +515,7 @@ static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep) | |||
494 | static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | 515 | static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, |
495 | const struct usb_endpoint_descriptor *desc, | 516 | const struct usb_endpoint_descriptor *desc, |
496 | const struct usb_ss_ep_comp_descriptor *comp_desc, | 517 | const struct usb_ss_ep_comp_descriptor *comp_desc, |
497 | bool ignore) | 518 | bool ignore, bool restore) |
498 | { | 519 | { |
499 | struct dwc3 *dwc = dep->dwc; | 520 | struct dwc3 *dwc = dep->dwc; |
500 | u32 reg; | 521 | u32 reg; |
@@ -508,7 +529,8 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
508 | return ret; | 529 | return ret; |
509 | } | 530 | } |
510 | 531 | ||
511 | ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore); | 532 | ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore, |
533 | restore); | ||
512 | if (ret) | 534 | if (ret) |
513 | return ret; | 535 | return ret; |
514 | 536 | ||
@@ -548,13 +570,13 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
548 | return 0; | 570 | return 0; |
549 | } | 571 | } |
550 | 572 | ||
551 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum); | 573 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force); |
552 | static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) | 574 | static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) |
553 | { | 575 | { |
554 | struct dwc3_request *req; | 576 | struct dwc3_request *req; |
555 | 577 | ||
556 | if (!list_empty(&dep->req_queued)) { | 578 | if (!list_empty(&dep->req_queued)) { |
557 | dwc3_stop_active_transfer(dwc, dep->number); | 579 | dwc3_stop_active_transfer(dwc, dep->number, true); |
558 | 580 | ||
559 | /* - giveback all requests to gadget driver */ | 581 | /* - giveback all requests to gadget driver */ |
560 | while (!list_empty(&dep->req_queued)) { | 582 | while (!list_empty(&dep->req_queued)) { |
@@ -659,7 +681,7 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep, | |||
659 | } | 681 | } |
660 | 682 | ||
661 | spin_lock_irqsave(&dwc->lock, flags); | 683 | spin_lock_irqsave(&dwc->lock, flags); |
662 | ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false); | 684 | ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false, false); |
663 | spin_unlock_irqrestore(&dwc->lock, flags); | 685 | spin_unlock_irqrestore(&dwc->lock, flags); |
664 | 686 | ||
665 | return ret; | 687 | return ret; |
@@ -771,9 +793,6 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
771 | trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; | 793 | trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; |
772 | else | 794 | else |
773 | trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS; | 795 | trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS; |
774 | |||
775 | if (!req->request.no_interrupt && !chain) | ||
776 | trb->ctrl |= DWC3_TRB_CTRL_IOC; | ||
777 | break; | 796 | break; |
778 | 797 | ||
779 | case USB_ENDPOINT_XFER_BULK: | 798 | case USB_ENDPOINT_XFER_BULK: |
@@ -788,6 +807,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
788 | BUG(); | 807 | BUG(); |
789 | } | 808 | } |
790 | 809 | ||
810 | if (!req->request.no_interrupt && !chain) | ||
811 | trb->ctrl |= DWC3_TRB_CTRL_IOC; | ||
812 | |||
791 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | 813 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { |
792 | trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; | 814 | trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; |
793 | trb->ctrl |= DWC3_TRB_CTRL_CSP; | 815 | trb->ctrl |= DWC3_TRB_CTRL_CSP; |
@@ -1077,7 +1099,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
1077 | */ | 1099 | */ |
1078 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | 1100 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { |
1079 | if (list_empty(&dep->req_queued)) { | 1101 | if (list_empty(&dep->req_queued)) { |
1080 | dwc3_stop_active_transfer(dwc, dep->number); | 1102 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1081 | dep->flags = DWC3_EP_ENABLED; | 1103 | dep->flags = DWC3_EP_ENABLED; |
1082 | } | 1104 | } |
1083 | return 0; | 1105 | return 0; |
@@ -1107,6 +1129,23 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
1107 | return ret; | 1129 | return ret; |
1108 | } | 1130 | } |
1109 | 1131 | ||
1132 | /* | ||
1133 | * 4. Stream Capable Bulk Endpoints. We need to start the transfer | ||
1134 | * right away, otherwise host will not know we have streams to be | ||
1135 | * handled. | ||
1136 | */ | ||
1137 | if (dep->stream_capable) { | ||
1138 | int ret; | ||
1139 | |||
1140 | ret = __dwc3_gadget_kick_transfer(dep, 0, true); | ||
1141 | if (ret && ret != -EBUSY) { | ||
1142 | struct dwc3 *dwc = dep->dwc; | ||
1143 | |||
1144 | dev_dbg(dwc->dev, "%s: failed to kick transfers\n", | ||
1145 | dep->name); | ||
1146 | } | ||
1147 | } | ||
1148 | |||
1110 | return 0; | 1149 | return 0; |
1111 | } | 1150 | } |
1112 | 1151 | ||
@@ -1163,7 +1202,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, | |||
1163 | } | 1202 | } |
1164 | if (r == req) { | 1203 | if (r == req) { |
1165 | /* wait until it is processed */ | 1204 | /* wait until it is processed */ |
1166 | dwc3_stop_active_transfer(dwc, dep->number); | 1205 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1167 | goto out1; | 1206 | goto out1; |
1168 | } | 1207 | } |
1169 | dev_err(dwc->dev, "request %p was not queued to %s\n", | 1208 | dev_err(dwc->dev, "request %p was not queued to %s\n", |
@@ -1194,8 +1233,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value) | |||
1194 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, | 1233 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, |
1195 | DWC3_DEPCMD_SETSTALL, ¶ms); | 1234 | DWC3_DEPCMD_SETSTALL, ¶ms); |
1196 | if (ret) | 1235 | if (ret) |
1197 | dev_err(dwc->dev, "failed to %s STALL on %s\n", | 1236 | dev_err(dwc->dev, "failed to set STALL on %s\n", |
1198 | value ? "set" : "clear", | ||
1199 | dep->name); | 1237 | dep->name); |
1200 | else | 1238 | else |
1201 | dep->flags |= DWC3_EP_STALL; | 1239 | dep->flags |= DWC3_EP_STALL; |
@@ -1203,8 +1241,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value) | |||
1203 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, | 1241 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, |
1204 | DWC3_DEPCMD_CLEARSTALL, ¶ms); | 1242 | DWC3_DEPCMD_CLEARSTALL, ¶ms); |
1205 | if (ret) | 1243 | if (ret) |
1206 | dev_err(dwc->dev, "failed to %s STALL on %s\n", | 1244 | dev_err(dwc->dev, "failed to clear STALL on %s\n", |
1207 | value ? "set" : "clear", | ||
1208 | dep->name); | 1245 | dep->name); |
1209 | else | 1246 | else |
1210 | dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); | 1247 | dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); |
@@ -1387,7 +1424,7 @@ static int dwc3_gadget_set_selfpowered(struct usb_gadget *g, | |||
1387 | return 0; | 1424 | return 0; |
1388 | } | 1425 | } |
1389 | 1426 | ||
1390 | static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on) | 1427 | static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) |
1391 | { | 1428 | { |
1392 | u32 reg; | 1429 | u32 reg; |
1393 | u32 timeout = 500; | 1430 | u32 timeout = 500; |
@@ -1402,9 +1439,17 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on) | |||
1402 | if (dwc->revision >= DWC3_REVISION_194A) | 1439 | if (dwc->revision >= DWC3_REVISION_194A) |
1403 | reg &= ~DWC3_DCTL_KEEP_CONNECT; | 1440 | reg &= ~DWC3_DCTL_KEEP_CONNECT; |
1404 | reg |= DWC3_DCTL_RUN_STOP; | 1441 | reg |= DWC3_DCTL_RUN_STOP; |
1442 | |||
1443 | if (dwc->has_hibernation) | ||
1444 | reg |= DWC3_DCTL_KEEP_CONNECT; | ||
1445 | |||
1405 | dwc->pullups_connected = true; | 1446 | dwc->pullups_connected = true; |
1406 | } else { | 1447 | } else { |
1407 | reg &= ~DWC3_DCTL_RUN_STOP; | 1448 | reg &= ~DWC3_DCTL_RUN_STOP; |
1449 | |||
1450 | if (dwc->has_hibernation && !suspend) | ||
1451 | reg &= ~DWC3_DCTL_KEEP_CONNECT; | ||
1452 | |||
1408 | dwc->pullups_connected = false; | 1453 | dwc->pullups_connected = false; |
1409 | } | 1454 | } |
1410 | 1455 | ||
@@ -1442,7 +1487,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) | |||
1442 | is_on = !!is_on; | 1487 | is_on = !!is_on; |
1443 | 1488 | ||
1444 | spin_lock_irqsave(&dwc->lock, flags); | 1489 | spin_lock_irqsave(&dwc->lock, flags); |
1445 | ret = dwc3_gadget_run_stop(dwc, is_on); | 1490 | ret = dwc3_gadget_run_stop(dwc, is_on, false); |
1446 | spin_unlock_irqrestore(&dwc->lock, flags); | 1491 | spin_unlock_irqrestore(&dwc->lock, flags); |
1447 | 1492 | ||
1448 | return ret; | 1493 | return ret; |
@@ -1549,14 +1594,16 @@ static int dwc3_gadget_start(struct usb_gadget *g, | |||
1549 | dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); | 1594 | dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); |
1550 | 1595 | ||
1551 | dep = dwc->eps[0]; | 1596 | dep = dwc->eps[0]; |
1552 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); | 1597 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false, |
1598 | false); | ||
1553 | if (ret) { | 1599 | if (ret) { |
1554 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); | 1600 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); |
1555 | goto err2; | 1601 | goto err2; |
1556 | } | 1602 | } |
1557 | 1603 | ||
1558 | dep = dwc->eps[1]; | 1604 | dep = dwc->eps[1]; |
1559 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); | 1605 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false, |
1606 | false); | ||
1560 | if (ret) { | 1607 | if (ret) { |
1561 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); | 1608 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); |
1562 | goto err3; | 1609 | goto err3; |
@@ -1849,15 +1896,12 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
1849 | */ | 1896 | */ |
1850 | dep->flags = DWC3_EP_PENDING_REQUEST; | 1897 | dep->flags = DWC3_EP_PENDING_REQUEST; |
1851 | } else { | 1898 | } else { |
1852 | dwc3_stop_active_transfer(dwc, dep->number); | 1899 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1853 | dep->flags = DWC3_EP_ENABLED; | 1900 | dep->flags = DWC3_EP_ENABLED; |
1854 | } | 1901 | } |
1855 | return 1; | 1902 | return 1; |
1856 | } | 1903 | } |
1857 | 1904 | ||
1858 | if ((event->status & DEPEVT_STATUS_IOC) && | ||
1859 | (trb->ctrl & DWC3_TRB_CTRL_IOC)) | ||
1860 | return 0; | ||
1861 | return 1; | 1905 | return 1; |
1862 | } | 1906 | } |
1863 | 1907 | ||
@@ -1999,7 +2043,25 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc) | |||
1999 | } | 2043 | } |
2000 | } | 2044 | } |
2001 | 2045 | ||
2002 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) | 2046 | static void dwc3_suspend_gadget(struct dwc3 *dwc) |
2047 | { | ||
2048 | if (dwc->gadget_driver && dwc->gadget_driver->suspend) { | ||
2049 | spin_unlock(&dwc->lock); | ||
2050 | dwc->gadget_driver->suspend(&dwc->gadget); | ||
2051 | spin_lock(&dwc->lock); | ||
2052 | } | ||
2053 | } | ||
2054 | |||
2055 | static void dwc3_resume_gadget(struct dwc3 *dwc) | ||
2056 | { | ||
2057 | if (dwc->gadget_driver && dwc->gadget_driver->resume) { | ||
2058 | spin_unlock(&dwc->lock); | ||
2059 | dwc->gadget_driver->resume(&dwc->gadget); | ||
2060 | spin_lock(&dwc->lock); | ||
2061 | } | ||
2062 | } | ||
2063 | |||
2064 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force) | ||
2003 | { | 2065 | { |
2004 | struct dwc3_ep *dep; | 2066 | struct dwc3_ep *dep; |
2005 | struct dwc3_gadget_ep_cmd_params params; | 2067 | struct dwc3_gadget_ep_cmd_params params; |
@@ -2031,7 +2093,8 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) | |||
2031 | */ | 2093 | */ |
2032 | 2094 | ||
2033 | cmd = DWC3_DEPCMD_ENDTRANSFER; | 2095 | cmd = DWC3_DEPCMD_ENDTRANSFER; |
2034 | cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC; | 2096 | cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0; |
2097 | cmd |= DWC3_DEPCMD_CMDIOC; | ||
2035 | cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); | 2098 | cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); |
2036 | memset(¶ms, 0, sizeof(params)); | 2099 | memset(¶ms, 0, sizeof(params)); |
2037 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); | 2100 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); |
@@ -2260,17 +2323,23 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) | |||
2260 | reg |= DWC3_DCTL_HIRD_THRES(12); | 2323 | reg |= DWC3_DCTL_HIRD_THRES(12); |
2261 | 2324 | ||
2262 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | 2325 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
2326 | } else { | ||
2327 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | ||
2328 | reg &= ~DWC3_DCTL_HIRD_THRES_MASK; | ||
2329 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | ||
2263 | } | 2330 | } |
2264 | 2331 | ||
2265 | dep = dwc->eps[0]; | 2332 | dep = dwc->eps[0]; |
2266 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true); | 2333 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true, |
2334 | false); | ||
2267 | if (ret) { | 2335 | if (ret) { |
2268 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); | 2336 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); |
2269 | return; | 2337 | return; |
2270 | } | 2338 | } |
2271 | 2339 | ||
2272 | dep = dwc->eps[1]; | 2340 | dep = dwc->eps[1]; |
2273 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true); | 2341 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true, |
2342 | false); | ||
2274 | if (ret) { | 2343 | if (ret) { |
2275 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); | 2344 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); |
2276 | return; | 2345 | return; |
@@ -2378,9 +2447,50 @@ static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc, | |||
2378 | 2447 | ||
2379 | dwc->link_state = next; | 2448 | dwc->link_state = next; |
2380 | 2449 | ||
2450 | switch (next) { | ||
2451 | case DWC3_LINK_STATE_U1: | ||
2452 | if (dwc->speed == USB_SPEED_SUPER) | ||
2453 | dwc3_suspend_gadget(dwc); | ||
2454 | break; | ||
2455 | case DWC3_LINK_STATE_U2: | ||
2456 | case DWC3_LINK_STATE_U3: | ||
2457 | dwc3_suspend_gadget(dwc); | ||
2458 | break; | ||
2459 | case DWC3_LINK_STATE_RESUME: | ||
2460 | dwc3_resume_gadget(dwc); | ||
2461 | break; | ||
2462 | default: | ||
2463 | /* do nothing */ | ||
2464 | break; | ||
2465 | } | ||
2466 | |||
2381 | dev_vdbg(dwc->dev, "%s link %d\n", __func__, dwc->link_state); | 2467 | dev_vdbg(dwc->dev, "%s link %d\n", __func__, dwc->link_state); |
2382 | } | 2468 | } |
2383 | 2469 | ||
2470 | static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc, | ||
2471 | unsigned int evtinfo) | ||
2472 | { | ||
2473 | unsigned int is_ss = evtinfo & BIT(4); | ||
2474 | |||
2475 | /** | ||
2476 | * WORKAROUND: DWC3 revison 2.20a with hibernation support | ||
2477 | * have a known issue which can cause USB CV TD.9.23 to fail | ||
2478 | * randomly. | ||
2479 | * | ||
2480 | * Because of this issue, core could generate bogus hibernation | ||
2481 | * events which SW needs to ignore. | ||
2482 | * | ||
2483 | * Refers to: | ||
2484 | * | ||
2485 | * STAR#9000546576: Device Mode Hibernation: Issue in USB 2.0 | ||
2486 | * Device Fallback from SuperSpeed | ||
2487 | */ | ||
2488 | if (is_ss ^ (dwc->speed == USB_SPEED_SUPER)) | ||
2489 | return; | ||
2490 | |||
2491 | /* enter hibernation here */ | ||
2492 | } | ||
2493 | |||
2384 | static void dwc3_gadget_interrupt(struct dwc3 *dwc, | 2494 | static void dwc3_gadget_interrupt(struct dwc3 *dwc, |
2385 | const struct dwc3_event_devt *event) | 2495 | const struct dwc3_event_devt *event) |
2386 | { | 2496 | { |
@@ -2397,6 +2507,13 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc, | |||
2397 | case DWC3_DEVICE_EVENT_WAKEUP: | 2507 | case DWC3_DEVICE_EVENT_WAKEUP: |
2398 | dwc3_gadget_wakeup_interrupt(dwc); | 2508 | dwc3_gadget_wakeup_interrupt(dwc); |
2399 | break; | 2509 | break; |
2510 | case DWC3_DEVICE_EVENT_HIBER_REQ: | ||
2511 | if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation, | ||
2512 | "unexpected hibernation event\n")) | ||
2513 | break; | ||
2514 | |||
2515 | dwc3_gadget_hibernation_interrupt(dwc, event->event_info); | ||
2516 | break; | ||
2400 | case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE: | 2517 | case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE: |
2401 | dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); | 2518 | dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); |
2402 | break; | 2519 | break; |
@@ -2661,8 +2778,10 @@ void dwc3_gadget_exit(struct dwc3 *dwc) | |||
2661 | 2778 | ||
2662 | int dwc3_gadget_prepare(struct dwc3 *dwc) | 2779 | int dwc3_gadget_prepare(struct dwc3 *dwc) |
2663 | { | 2780 | { |
2664 | if (dwc->pullups_connected) | 2781 | if (dwc->pullups_connected) { |
2665 | dwc3_gadget_disable_irq(dwc); | 2782 | dwc3_gadget_disable_irq(dwc); |
2783 | dwc3_gadget_run_stop(dwc, true, true); | ||
2784 | } | ||
2666 | 2785 | ||
2667 | return 0; | 2786 | return 0; |
2668 | } | 2787 | } |
@@ -2671,7 +2790,7 @@ void dwc3_gadget_complete(struct dwc3 *dwc) | |||
2671 | { | 2790 | { |
2672 | if (dwc->pullups_connected) { | 2791 | if (dwc->pullups_connected) { |
2673 | dwc3_gadget_enable_irq(dwc); | 2792 | dwc3_gadget_enable_irq(dwc); |
2674 | dwc3_gadget_run_stop(dwc, true); | 2793 | dwc3_gadget_run_stop(dwc, true, false); |
2675 | } | 2794 | } |
2676 | } | 2795 | } |
2677 | 2796 | ||
@@ -2694,12 +2813,14 @@ int dwc3_gadget_resume(struct dwc3 *dwc) | |||
2694 | dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); | 2813 | dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); |
2695 | 2814 | ||
2696 | dep = dwc->eps[0]; | 2815 | dep = dwc->eps[0]; |
2697 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); | 2816 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false, |
2817 | false); | ||
2698 | if (ret) | 2818 | if (ret) |
2699 | goto err0; | 2819 | goto err0; |
2700 | 2820 | ||
2701 | dep = dwc->eps[1]; | 2821 | dep = dwc->eps[1]; |
2702 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); | 2822 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false, |
2823 | false); | ||
2703 | if (ret) | 2824 | if (ret) |
2704 | goto err1; | 2825 | goto err1; |
2705 | 2826 | ||
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h index febe1aa7b714..a0ee75b68a80 100644 --- a/drivers/usb/dwc3/gadget.h +++ b/drivers/usb/dwc3/gadget.h | |||
@@ -56,12 +56,6 @@ struct dwc3; | |||
56 | /* DEPXFERCFG parameter 0 */ | 56 | /* DEPXFERCFG parameter 0 */ |
57 | #define DWC3_DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff) | 57 | #define DWC3_DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff) |
58 | 58 | ||
59 | struct dwc3_gadget_ep_cmd_params { | ||
60 | u32 param2; | ||
61 | u32 param1; | ||
62 | u32 param0; | ||
63 | }; | ||
64 | |||
65 | /* -------------------------------------------------------------------------- */ | 59 | /* -------------------------------------------------------------------------- */ |
66 | 60 | ||
67 | #define to_dwc3_request(r) (container_of(r, struct dwc3_request, request)) | 61 | #define to_dwc3_request(r) (container_of(r, struct dwc3_request, request)) |
@@ -85,9 +79,6 @@ static inline void dwc3_gadget_move_request_queued(struct dwc3_request *req) | |||
85 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | 79 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, |
86 | int status); | 80 | int status); |
87 | 81 | ||
88 | int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode); | ||
89 | int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state); | ||
90 | |||
91 | void dwc3_ep0_interrupt(struct dwc3 *dwc, | 82 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
92 | const struct dwc3_event_depevt *event); | 83 | const struct dwc3_event_depevt *event); |
93 | void dwc3_ep0_out_start(struct dwc3 *dwc); | 84 | void dwc3_ep0_out_start(struct dwc3 *dwc); |
@@ -95,9 +86,6 @@ int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); | |||
95 | int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, | 86 | int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, |
96 | gfp_t gfp_flags); | 87 | gfp_t gfp_flags); |
97 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value); | 88 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value); |
98 | int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | ||
99 | unsigned cmd, struct dwc3_gadget_ep_cmd_params *params); | ||
100 | int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param); | ||
101 | 89 | ||
102 | /** | 90 | /** |
103 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW | 91 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW |