diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-02-16 03:30:05 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-02-16 03:30:05 -0500 |
commit | fc19b1d09414912a327cf0a4b5ba2050ac7ad59d (patch) | |
tree | 549a6f4e77fc7c57b670273333eeabde34509aab /drivers | |
parent | b86b8eb6fecb5a4bac1ed0ca925c4082a61ea6e9 (diff) | |
parent | 98112041bcca164676367e261c8c1073ef70cb51 (diff) |
Merge tag 'fixes-for-v4.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
Felipe writes:
usb: fixes for v4.16-rc2
First set of fixes for current -rc cycle. Most of the changes are on
dwc3 this time around (59%) with some function changes (25%).
Out of the those, the most important fixes are:
- EP0 TRB counter fix on dwc3
- dwc3-omap stopped missing events during suspend/resume
- maxpacket size fix for ep0 in dwc3
- Descriptor processing fix for functionfs
Apart from these, your usual set of important-but-not-so-critical
fixes all over the place.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/dwc2/gadget.c | 26 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.c | 86 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.h | 21 | ||||
-rw-r--r-- | drivers/usb/dwc3/dwc3-of-simple.c | 1 | ||||
-rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 16 | ||||
-rw-r--r-- | drivers/usb/dwc3/ep0.c | 7 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 44 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_uac2.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/Kconfig | 1 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/bdc/bdc_pci.c | 1 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/core.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/fsl_udc_core.c | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/renesas_usb3.c | 2 | ||||
-rw-r--r-- | drivers/usb/phy/phy-mxs-usb.c | 3 |
15 files changed, 135 insertions, 83 deletions
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index e4c3ce0de5de..5bcad1d869b5 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
@@ -1917,7 +1917,9 @@ static void dwc2_hsotg_program_zlp(struct dwc2_hsotg *hsotg, | |||
1917 | /* Not specific buffer needed for ep0 ZLP */ | 1917 | /* Not specific buffer needed for ep0 ZLP */ |
1918 | dma_addr_t dma = hs_ep->desc_list_dma; | 1918 | dma_addr_t dma = hs_ep->desc_list_dma; |
1919 | 1919 | ||
1920 | dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep); | 1920 | if (!index) |
1921 | dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep); | ||
1922 | |||
1921 | dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0); | 1923 | dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0); |
1922 | } else { | 1924 | } else { |
1923 | dwc2_writel(DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) | | 1925 | dwc2_writel(DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) | |
@@ -2974,9 +2976,13 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx, | |||
2974 | if (ints & DXEPINT_STSPHSERCVD) { | 2976 | if (ints & DXEPINT_STSPHSERCVD) { |
2975 | dev_dbg(hsotg->dev, "%s: StsPhseRcvd\n", __func__); | 2977 | dev_dbg(hsotg->dev, "%s: StsPhseRcvd\n", __func__); |
2976 | 2978 | ||
2977 | /* Move to STATUS IN for DDMA */ | 2979 | /* Safety check EP0 state when STSPHSERCVD asserted */ |
2978 | if (using_desc_dma(hsotg)) | 2980 | if (hsotg->ep0_state == DWC2_EP0_DATA_OUT) { |
2979 | dwc2_hsotg_ep0_zlp(hsotg, true); | 2981 | /* Move to STATUS IN for DDMA */ |
2982 | if (using_desc_dma(hsotg)) | ||
2983 | dwc2_hsotg_ep0_zlp(hsotg, true); | ||
2984 | } | ||
2985 | |||
2980 | } | 2986 | } |
2981 | 2987 | ||
2982 | if (ints & DXEPINT_BACK2BACKSETUP) | 2988 | if (ints & DXEPINT_BACK2BACKSETUP) |
@@ -3375,12 +3381,6 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg, | |||
3375 | dwc2_writel(dwc2_hsotg_ep0_mps(hsotg->eps_out[0]->ep.maxpacket) | | 3381 | dwc2_writel(dwc2_hsotg_ep0_mps(hsotg->eps_out[0]->ep.maxpacket) | |
3376 | DXEPCTL_USBACTEP, hsotg->regs + DIEPCTL0); | 3382 | DXEPCTL_USBACTEP, hsotg->regs + DIEPCTL0); |
3377 | 3383 | ||
3378 | dwc2_hsotg_enqueue_setup(hsotg); | ||
3379 | |||
3380 | dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n", | ||
3381 | dwc2_readl(hsotg->regs + DIEPCTL0), | ||
3382 | dwc2_readl(hsotg->regs + DOEPCTL0)); | ||
3383 | |||
3384 | /* clear global NAKs */ | 3384 | /* clear global NAKs */ |
3385 | val = DCTL_CGOUTNAK | DCTL_CGNPINNAK; | 3385 | val = DCTL_CGOUTNAK | DCTL_CGNPINNAK; |
3386 | if (!is_usb_reset) | 3386 | if (!is_usb_reset) |
@@ -3391,6 +3391,12 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg, | |||
3391 | mdelay(3); | 3391 | mdelay(3); |
3392 | 3392 | ||
3393 | hsotg->lx_state = DWC2_L0; | 3393 | hsotg->lx_state = DWC2_L0; |
3394 | |||
3395 | dwc2_hsotg_enqueue_setup(hsotg); | ||
3396 | |||
3397 | dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n", | ||
3398 | dwc2_readl(hsotg->regs + DIEPCTL0), | ||
3399 | dwc2_readl(hsotg->regs + DOEPCTL0)); | ||
3394 | } | 3400 | } |
3395 | 3401 | ||
3396 | static void dwc2_hsotg_core_disconnect(struct dwc2_hsotg *hsotg) | 3402 | static void dwc2_hsotg_core_disconnect(struct dwc2_hsotg *hsotg) |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index ade2ab00d37a..f1d838a4acd6 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -100,6 +100,8 @@ static void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode) | |||
100 | reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG)); | 100 | reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG)); |
101 | reg |= DWC3_GCTL_PRTCAPDIR(mode); | 101 | reg |= DWC3_GCTL_PRTCAPDIR(mode); |
102 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); | 102 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); |
103 | |||
104 | dwc->current_dr_role = mode; | ||
103 | } | 105 | } |
104 | 106 | ||
105 | static void __dwc3_set_mode(struct work_struct *work) | 107 | static void __dwc3_set_mode(struct work_struct *work) |
@@ -133,8 +135,6 @@ static void __dwc3_set_mode(struct work_struct *work) | |||
133 | 135 | ||
134 | dwc3_set_prtcap(dwc, dwc->desired_dr_role); | 136 | dwc3_set_prtcap(dwc, dwc->desired_dr_role); |
135 | 137 | ||
136 | dwc->current_dr_role = dwc->desired_dr_role; | ||
137 | |||
138 | spin_unlock_irqrestore(&dwc->lock, flags); | 138 | spin_unlock_irqrestore(&dwc->lock, flags); |
139 | 139 | ||
140 | switch (dwc->desired_dr_role) { | 140 | switch (dwc->desired_dr_role) { |
@@ -219,7 +219,7 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc) | |||
219 | * XHCI driver will reset the host block. If dwc3 was configured for | 219 | * XHCI driver will reset the host block. If dwc3 was configured for |
220 | * host-only mode, then we can return early. | 220 | * host-only mode, then we can return early. |
221 | */ | 221 | */ |
222 | if (dwc->dr_mode == USB_DR_MODE_HOST) | 222 | if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST) |
223 | return 0; | 223 | return 0; |
224 | 224 | ||
225 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | 225 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
@@ -234,6 +234,9 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc) | |||
234 | udelay(1); | 234 | udelay(1); |
235 | } while (--retries); | 235 | } while (--retries); |
236 | 236 | ||
237 | phy_exit(dwc->usb3_generic_phy); | ||
238 | phy_exit(dwc->usb2_generic_phy); | ||
239 | |||
237 | return -ETIMEDOUT; | 240 | return -ETIMEDOUT; |
238 | } | 241 | } |
239 | 242 | ||
@@ -483,6 +486,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc) | |||
483 | parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8); | 486 | parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8); |
484 | } | 487 | } |
485 | 488 | ||
489 | static int dwc3_core_ulpi_init(struct dwc3 *dwc) | ||
490 | { | ||
491 | int intf; | ||
492 | int ret = 0; | ||
493 | |||
494 | intf = DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3); | ||
495 | |||
496 | if (intf == DWC3_GHWPARAMS3_HSPHY_IFC_ULPI || | ||
497 | (intf == DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI && | ||
498 | dwc->hsphy_interface && | ||
499 | !strncmp(dwc->hsphy_interface, "ulpi", 4))) | ||
500 | ret = dwc3_ulpi_init(dwc); | ||
501 | |||
502 | return ret; | ||
503 | } | ||
504 | |||
486 | /** | 505 | /** |
487 | * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core | 506 | * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core |
488 | * @dwc: Pointer to our controller context structure | 507 | * @dwc: Pointer to our controller context structure |
@@ -494,7 +513,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc) | |||
494 | static int dwc3_phy_setup(struct dwc3 *dwc) | 513 | static int dwc3_phy_setup(struct dwc3 *dwc) |
495 | { | 514 | { |
496 | u32 reg; | 515 | u32 reg; |
497 | int ret; | ||
498 | 516 | ||
499 | reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)); | 517 | reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)); |
500 | 518 | ||
@@ -565,9 +583,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc) | |||
565 | } | 583 | } |
566 | /* FALLTHROUGH */ | 584 | /* FALLTHROUGH */ |
567 | case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI: | 585 | case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI: |
568 | ret = dwc3_ulpi_init(dwc); | ||
569 | if (ret) | ||
570 | return ret; | ||
571 | /* FALLTHROUGH */ | 586 | /* FALLTHROUGH */ |
572 | default: | 587 | default: |
573 | break; | 588 | break; |
@@ -724,6 +739,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc) | |||
724 | } | 739 | } |
725 | 740 | ||
726 | static int dwc3_core_get_phy(struct dwc3 *dwc); | 741 | static int dwc3_core_get_phy(struct dwc3 *dwc); |
742 | static int dwc3_core_ulpi_init(struct dwc3 *dwc); | ||
727 | 743 | ||
728 | /** | 744 | /** |
729 | * dwc3_core_init - Low-level initialization of DWC3 Core | 745 | * dwc3_core_init - Low-level initialization of DWC3 Core |
@@ -755,17 +771,27 @@ static int dwc3_core_init(struct dwc3 *dwc) | |||
755 | dwc->maximum_speed = USB_SPEED_HIGH; | 771 | dwc->maximum_speed = USB_SPEED_HIGH; |
756 | } | 772 | } |
757 | 773 | ||
758 | ret = dwc3_core_get_phy(dwc); | 774 | ret = dwc3_phy_setup(dwc); |
759 | if (ret) | 775 | if (ret) |
760 | goto err0; | 776 | goto err0; |
761 | 777 | ||
762 | ret = dwc3_core_soft_reset(dwc); | 778 | if (!dwc->ulpi_ready) { |
763 | if (ret) | 779 | ret = dwc3_core_ulpi_init(dwc); |
764 | goto err0; | 780 | if (ret) |
781 | goto err0; | ||
782 | dwc->ulpi_ready = true; | ||
783 | } | ||
765 | 784 | ||
766 | ret = dwc3_phy_setup(dwc); | 785 | if (!dwc->phys_ready) { |
786 | ret = dwc3_core_get_phy(dwc); | ||
787 | if (ret) | ||
788 | goto err0a; | ||
789 | dwc->phys_ready = true; | ||
790 | } | ||
791 | |||
792 | ret = dwc3_core_soft_reset(dwc); | ||
767 | if (ret) | 793 | if (ret) |
768 | goto err0; | 794 | goto err0a; |
769 | 795 | ||
770 | dwc3_core_setup_global_control(dwc); | 796 | dwc3_core_setup_global_control(dwc); |
771 | dwc3_core_num_eps(dwc); | 797 | dwc3_core_num_eps(dwc); |
@@ -838,6 +864,9 @@ err1: | |||
838 | phy_exit(dwc->usb2_generic_phy); | 864 | phy_exit(dwc->usb2_generic_phy); |
839 | phy_exit(dwc->usb3_generic_phy); | 865 | phy_exit(dwc->usb3_generic_phy); |
840 | 866 | ||
867 | err0a: | ||
868 | dwc3_ulpi_exit(dwc); | ||
869 | |||
841 | err0: | 870 | err0: |
842 | return ret; | 871 | return ret; |
843 | } | 872 | } |
@@ -916,7 +945,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc) | |||
916 | 945 | ||
917 | switch (dwc->dr_mode) { | 946 | switch (dwc->dr_mode) { |
918 | case USB_DR_MODE_PERIPHERAL: | 947 | case USB_DR_MODE_PERIPHERAL: |
919 | dwc->current_dr_role = DWC3_GCTL_PRTCAP_DEVICE; | ||
920 | dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); | 948 | dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); |
921 | 949 | ||
922 | if (dwc->usb2_phy) | 950 | if (dwc->usb2_phy) |
@@ -932,7 +960,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc) | |||
932 | } | 960 | } |
933 | break; | 961 | break; |
934 | case USB_DR_MODE_HOST: | 962 | case USB_DR_MODE_HOST: |
935 | dwc->current_dr_role = DWC3_GCTL_PRTCAP_HOST; | ||
936 | dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST); | 963 | dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST); |
937 | 964 | ||
938 | if (dwc->usb2_phy) | 965 | if (dwc->usb2_phy) |
@@ -1234,7 +1261,6 @@ err4: | |||
1234 | 1261 | ||
1235 | err3: | 1262 | err3: |
1236 | dwc3_free_event_buffers(dwc); | 1263 | dwc3_free_event_buffers(dwc); |
1237 | dwc3_ulpi_exit(dwc); | ||
1238 | 1264 | ||
1239 | err2: | 1265 | err2: |
1240 | pm_runtime_allow(&pdev->dev); | 1266 | pm_runtime_allow(&pdev->dev); |
@@ -1284,7 +1310,7 @@ static int dwc3_remove(struct platform_device *pdev) | |||
1284 | } | 1310 | } |
1285 | 1311 | ||
1286 | #ifdef CONFIG_PM | 1312 | #ifdef CONFIG_PM |
1287 | static int dwc3_suspend_common(struct dwc3 *dwc) | 1313 | static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) |
1288 | { | 1314 | { |
1289 | unsigned long flags; | 1315 | unsigned long flags; |
1290 | 1316 | ||
@@ -1296,6 +1322,10 @@ static int dwc3_suspend_common(struct dwc3 *dwc) | |||
1296 | dwc3_core_exit(dwc); | 1322 | dwc3_core_exit(dwc); |
1297 | break; | 1323 | break; |
1298 | case DWC3_GCTL_PRTCAP_HOST: | 1324 | case DWC3_GCTL_PRTCAP_HOST: |
1325 | /* do nothing during host runtime_suspend */ | ||
1326 | if (!PMSG_IS_AUTO(msg)) | ||
1327 | dwc3_core_exit(dwc); | ||
1328 | break; | ||
1299 | default: | 1329 | default: |
1300 | /* do nothing */ | 1330 | /* do nothing */ |
1301 | break; | 1331 | break; |
@@ -1304,7 +1334,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc) | |||
1304 | return 0; | 1334 | return 0; |
1305 | } | 1335 | } |
1306 | 1336 | ||
1307 | static int dwc3_resume_common(struct dwc3 *dwc) | 1337 | static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg) |
1308 | { | 1338 | { |
1309 | unsigned long flags; | 1339 | unsigned long flags; |
1310 | int ret; | 1340 | int ret; |
@@ -1320,6 +1350,13 @@ static int dwc3_resume_common(struct dwc3 *dwc) | |||
1320 | spin_unlock_irqrestore(&dwc->lock, flags); | 1350 | spin_unlock_irqrestore(&dwc->lock, flags); |
1321 | break; | 1351 | break; |
1322 | case DWC3_GCTL_PRTCAP_HOST: | 1352 | case DWC3_GCTL_PRTCAP_HOST: |
1353 | /* nothing to do on host runtime_resume */ | ||
1354 | if (!PMSG_IS_AUTO(msg)) { | ||
1355 | ret = dwc3_core_init(dwc); | ||
1356 | if (ret) | ||
1357 | return ret; | ||
1358 | } | ||
1359 | break; | ||
1323 | default: | 1360 | default: |
1324 | /* do nothing */ | 1361 | /* do nothing */ |
1325 | break; | 1362 | break; |
@@ -1331,12 +1368,11 @@ static int dwc3_resume_common(struct dwc3 *dwc) | |||
1331 | static int dwc3_runtime_checks(struct dwc3 *dwc) | 1368 | static int dwc3_runtime_checks(struct dwc3 *dwc) |
1332 | { | 1369 | { |
1333 | switch (dwc->current_dr_role) { | 1370 | switch (dwc->current_dr_role) { |
1334 | case USB_DR_MODE_PERIPHERAL: | 1371 | case DWC3_GCTL_PRTCAP_DEVICE: |
1335 | case USB_DR_MODE_OTG: | ||
1336 | if (dwc->connected) | 1372 | if (dwc->connected) |
1337 | return -EBUSY; | 1373 | return -EBUSY; |
1338 | break; | 1374 | break; |
1339 | case USB_DR_MODE_HOST: | 1375 | case DWC3_GCTL_PRTCAP_HOST: |
1340 | default: | 1376 | default: |
1341 | /* do nothing */ | 1377 | /* do nothing */ |
1342 | break; | 1378 | break; |
@@ -1353,7 +1389,7 @@ static int dwc3_runtime_suspend(struct device *dev) | |||
1353 | if (dwc3_runtime_checks(dwc)) | 1389 | if (dwc3_runtime_checks(dwc)) |
1354 | return -EBUSY; | 1390 | return -EBUSY; |
1355 | 1391 | ||
1356 | ret = dwc3_suspend_common(dwc); | 1392 | ret = dwc3_suspend_common(dwc, PMSG_AUTO_SUSPEND); |
1357 | if (ret) | 1393 | if (ret) |
1358 | return ret; | 1394 | return ret; |
1359 | 1395 | ||
@@ -1369,7 +1405,7 @@ static int dwc3_runtime_resume(struct device *dev) | |||
1369 | 1405 | ||
1370 | device_init_wakeup(dev, false); | 1406 | device_init_wakeup(dev, false); |
1371 | 1407 | ||
1372 | ret = dwc3_resume_common(dwc); | 1408 | ret = dwc3_resume_common(dwc, PMSG_AUTO_RESUME); |
1373 | if (ret) | 1409 | if (ret) |
1374 | return ret; | 1410 | return ret; |
1375 | 1411 | ||
@@ -1416,7 +1452,7 @@ static int dwc3_suspend(struct device *dev) | |||
1416 | struct dwc3 *dwc = dev_get_drvdata(dev); | 1452 | struct dwc3 *dwc = dev_get_drvdata(dev); |
1417 | int ret; | 1453 | int ret; |
1418 | 1454 | ||
1419 | ret = dwc3_suspend_common(dwc); | 1455 | ret = dwc3_suspend_common(dwc, PMSG_SUSPEND); |
1420 | if (ret) | 1456 | if (ret) |
1421 | return ret; | 1457 | return ret; |
1422 | 1458 | ||
@@ -1432,7 +1468,7 @@ static int dwc3_resume(struct device *dev) | |||
1432 | 1468 | ||
1433 | pinctrl_pm_select_default_state(dev); | 1469 | pinctrl_pm_select_default_state(dev); |
1434 | 1470 | ||
1435 | ret = dwc3_resume_common(dwc); | 1471 | ret = dwc3_resume_common(dwc, PMSG_RESUME); |
1436 | if (ret) | 1472 | if (ret) |
1437 | return ret; | 1473 | return ret; |
1438 | 1474 | ||
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 03c7aaaac926..860d2bc184d1 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -158,13 +158,15 @@ | |||
158 | #define DWC3_GDBGFIFOSPACE_TYPE(n) (((n) << 5) & 0x1e0) | 158 | #define DWC3_GDBGFIFOSPACE_TYPE(n) (((n) << 5) & 0x1e0) |
159 | #define DWC3_GDBGFIFOSPACE_SPACE_AVAILABLE(n) (((n) >> 16) & 0xffff) | 159 | #define DWC3_GDBGFIFOSPACE_SPACE_AVAILABLE(n) (((n) >> 16) & 0xffff) |
160 | 160 | ||
161 | #define DWC3_TXFIFOQ 1 | 161 | #define DWC3_TXFIFOQ 0 |
162 | #define DWC3_RXFIFOQ 3 | 162 | #define DWC3_RXFIFOQ 1 |
163 | #define DWC3_TXREQQ 5 | 163 | #define DWC3_TXREQQ 2 |
164 | #define DWC3_RXREQQ 7 | 164 | #define DWC3_RXREQQ 3 |
165 | #define DWC3_RXINFOQ 9 | 165 | #define DWC3_RXINFOQ 4 |
166 | #define DWC3_DESCFETCHQ 13 | 166 | #define DWC3_PSTATQ 5 |
167 | #define DWC3_EVENTQ 15 | 167 | #define DWC3_DESCFETCHQ 6 |
168 | #define DWC3_EVENTQ 7 | ||
169 | #define DWC3_AUXEVENTQ 8 | ||
168 | 170 | ||
169 | /* Global RX Threshold Configuration Register */ | 171 | /* Global RX Threshold Configuration Register */ |
170 | #define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19) | 172 | #define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19) |
@@ -795,7 +797,9 @@ struct dwc3_scratchpad_array { | |||
795 | * @usb3_phy: pointer to USB3 PHY | 797 | * @usb3_phy: pointer to USB3 PHY |
796 | * @usb2_generic_phy: pointer to USB2 PHY | 798 | * @usb2_generic_phy: pointer to USB2 PHY |
797 | * @usb3_generic_phy: pointer to USB3 PHY | 799 | * @usb3_generic_phy: pointer to USB3 PHY |
800 | * @phys_ready: flag to indicate that PHYs are ready | ||
798 | * @ulpi: pointer to ulpi interface | 801 | * @ulpi: pointer to ulpi interface |
802 | * @ulpi_ready: flag to indicate that ULPI is initialized | ||
799 | * @u2sel: parameter from Set SEL request. | 803 | * @u2sel: parameter from Set SEL request. |
800 | * @u2pel: parameter from Set SEL request. | 804 | * @u2pel: parameter from Set SEL request. |
801 | * @u1sel: parameter from Set SEL request. | 805 | * @u1sel: parameter from Set SEL request. |
@@ -893,7 +897,10 @@ struct dwc3 { | |||
893 | struct phy *usb2_generic_phy; | 897 | struct phy *usb2_generic_phy; |
894 | struct phy *usb3_generic_phy; | 898 | struct phy *usb3_generic_phy; |
895 | 899 | ||
900 | bool phys_ready; | ||
901 | |||
896 | struct ulpi *ulpi; | 902 | struct ulpi *ulpi; |
903 | bool ulpi_ready; | ||
897 | 904 | ||
898 | void __iomem *regs; | 905 | void __iomem *regs; |
899 | size_t regs_size; | 906 | size_t regs_size; |
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 7ae0eefc7cc7..e54c3622eb28 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c | |||
@@ -143,6 +143,7 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) | |||
143 | clk_disable_unprepare(simple->clks[i]); | 143 | clk_disable_unprepare(simple->clks[i]); |
144 | clk_put(simple->clks[i]); | 144 | clk_put(simple->clks[i]); |
145 | } | 145 | } |
146 | simple->num_clocks = 0; | ||
146 | 147 | ||
147 | reset_control_assert(simple->resets); | 148 | reset_control_assert(simple->resets); |
148 | reset_control_put(simple->resets); | 149 | reset_control_put(simple->resets); |
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index a4719e853b85..ed8b86517675 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -582,9 +582,25 @@ static int dwc3_omap_resume(struct device *dev) | |||
582 | return 0; | 582 | return 0; |
583 | } | 583 | } |
584 | 584 | ||
585 | static void dwc3_omap_complete(struct device *dev) | ||
586 | { | ||
587 | struct dwc3_omap *omap = dev_get_drvdata(dev); | ||
588 | |||
589 | if (extcon_get_state(omap->edev, EXTCON_USB)) | ||
590 | dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID); | ||
591 | else | ||
592 | dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF); | ||
593 | |||
594 | if (extcon_get_state(omap->edev, EXTCON_USB_HOST)) | ||
595 | dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND); | ||
596 | else | ||
597 | dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT); | ||
598 | } | ||
599 | |||
585 | static const struct dev_pm_ops dwc3_omap_dev_pm_ops = { | 600 | static const struct dev_pm_ops dwc3_omap_dev_pm_ops = { |
586 | 601 | ||
587 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_omap_suspend, dwc3_omap_resume) | 602 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_omap_suspend, dwc3_omap_resume) |
603 | .complete = dwc3_omap_complete, | ||
588 | }; | 604 | }; |
589 | 605 | ||
590 | #define DEV_PM_OPS (&dwc3_omap_dev_pm_ops) | 606 | #define DEV_PM_OPS (&dwc3_omap_dev_pm_ops) |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 9c2e4a17918e..18be31d5743a 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
@@ -854,7 +854,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
854 | trb++; | 854 | trb++; |
855 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | 855 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; |
856 | trace_dwc3_complete_trb(ep0, trb); | 856 | trace_dwc3_complete_trb(ep0, trb); |
857 | ep0->trb_enqueue = 0; | 857 | |
858 | if (r->direction) | ||
859 | dwc->eps[1]->trb_enqueue = 0; | ||
860 | else | ||
861 | dwc->eps[0]->trb_enqueue = 0; | ||
862 | |||
858 | dwc->ep0_bounced = false; | 863 | dwc->ep0_bounced = false; |
859 | } | 864 | } |
860 | 865 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 616ef49ccb49..2bda4eb1e9ac 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -2745,6 +2745,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) | |||
2745 | break; | 2745 | break; |
2746 | } | 2746 | } |
2747 | 2747 | ||
2748 | dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket; | ||
2749 | |||
2748 | /* Enable USB2 LPM Capability */ | 2750 | /* Enable USB2 LPM Capability */ |
2749 | 2751 | ||
2750 | if ((dwc->revision > DWC3_REVISION_194A) && | 2752 | if ((dwc->revision > DWC3_REVISION_194A) && |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 8f2cf3baa19c..c2592d883f67 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
@@ -1855,44 +1855,20 @@ static int ffs_func_eps_enable(struct ffs_function *func) | |||
1855 | 1855 | ||
1856 | spin_lock_irqsave(&func->ffs->eps_lock, flags); | 1856 | spin_lock_irqsave(&func->ffs->eps_lock, flags); |
1857 | while(count--) { | 1857 | while(count--) { |
1858 | struct usb_endpoint_descriptor *ds; | ||
1859 | struct usb_ss_ep_comp_descriptor *comp_desc = NULL; | ||
1860 | int needs_comp_desc = false; | ||
1861 | int desc_idx; | ||
1862 | |||
1863 | if (ffs->gadget->speed == USB_SPEED_SUPER) { | ||
1864 | desc_idx = 2; | ||
1865 | needs_comp_desc = true; | ||
1866 | } else if (ffs->gadget->speed == USB_SPEED_HIGH) | ||
1867 | desc_idx = 1; | ||
1868 | else | ||
1869 | desc_idx = 0; | ||
1870 | |||
1871 | /* fall-back to lower speed if desc missing for current speed */ | ||
1872 | do { | ||
1873 | ds = ep->descs[desc_idx]; | ||
1874 | } while (!ds && --desc_idx >= 0); | ||
1875 | |||
1876 | if (!ds) { | ||
1877 | ret = -EINVAL; | ||
1878 | break; | ||
1879 | } | ||
1880 | |||
1881 | ep->ep->driver_data = ep; | 1858 | ep->ep->driver_data = ep; |
1882 | ep->ep->desc = ds; | ||
1883 | 1859 | ||
1884 | if (needs_comp_desc) { | 1860 | ret = config_ep_by_speed(func->gadget, &func->function, ep->ep); |
1885 | comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + | 1861 | if (ret) { |
1886 | USB_DT_ENDPOINT_SIZE); | 1862 | pr_err("%s: config_ep_by_speed(%s) returned %d\n", |
1887 | ep->ep->maxburst = comp_desc->bMaxBurst + 1; | 1863 | __func__, ep->ep->name, ret); |
1888 | ep->ep->comp_desc = comp_desc; | 1864 | break; |
1889 | } | 1865 | } |
1890 | 1866 | ||
1891 | ret = usb_ep_enable(ep->ep); | 1867 | ret = usb_ep_enable(ep->ep); |
1892 | if (likely(!ret)) { | 1868 | if (likely(!ret)) { |
1893 | epfile->ep = ep; | 1869 | epfile->ep = ep; |
1894 | epfile->in = usb_endpoint_dir_in(ds); | 1870 | epfile->in = usb_endpoint_dir_in(ep->ep->desc); |
1895 | epfile->isoc = usb_endpoint_xfer_isoc(ds); | 1871 | epfile->isoc = usb_endpoint_xfer_isoc(ep->ep->desc); |
1896 | } else { | 1872 | } else { |
1897 | break; | 1873 | break; |
1898 | } | 1874 | } |
@@ -2979,10 +2955,8 @@ static int _ffs_func_bind(struct usb_configuration *c, | |||
2979 | struct ffs_data *ffs = func->ffs; | 2955 | struct ffs_data *ffs = func->ffs; |
2980 | 2956 | ||
2981 | const int full = !!func->ffs->fs_descs_count; | 2957 | const int full = !!func->ffs->fs_descs_count; |
2982 | const int high = gadget_is_dualspeed(func->gadget) && | 2958 | const int high = !!func->ffs->hs_descs_count; |
2983 | func->ffs->hs_descs_count; | 2959 | const int super = !!func->ffs->ss_descs_count; |
2984 | const int super = gadget_is_superspeed(func->gadget) && | ||
2985 | func->ffs->ss_descs_count; | ||
2986 | 2960 | ||
2987 | int fs_len, hs_len, ss_len, ret, i; | 2961 | int fs_len, hs_len, ss_len, ret, i; |
2988 | struct ffs_ep *eps_ptr; | 2962 | struct ffs_ep *eps_ptr; |
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 11fe788b4308..d2dc1f00180b 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c | |||
@@ -524,6 +524,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
524 | dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); | 524 | dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); |
525 | return ret; | 525 | return ret; |
526 | } | 526 | } |
527 | iad_desc.bFirstInterface = ret; | ||
528 | |||
527 | std_ac_if_desc.bInterfaceNumber = ret; | 529 | std_ac_if_desc.bInterfaceNumber = ret; |
528 | uac2->ac_intf = ret; | 530 | uac2->ac_intf = ret; |
529 | uac2->ac_alt = 0; | 531 | uac2->ac_alt = 0; |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 1e9567091d86..0875d38476ee 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
@@ -274,7 +274,6 @@ config USB_SNP_UDC_PLAT | |||
274 | tristate "Synopsys USB 2.0 Device controller" | 274 | tristate "Synopsys USB 2.0 Device controller" |
275 | depends on USB_GADGET && OF && HAS_DMA | 275 | depends on USB_GADGET && OF && HAS_DMA |
276 | depends on EXTCON || EXTCON=n | 276 | depends on EXTCON || EXTCON=n |
277 | select USB_GADGET_DUALSPEED | ||
278 | select USB_SNP_CORE | 277 | select USB_SNP_CORE |
279 | default ARCH_BCM_IPROC | 278 | default ARCH_BCM_IPROC |
280 | help | 279 | help |
diff --git a/drivers/usb/gadget/udc/bdc/bdc_pci.c b/drivers/usb/gadget/udc/bdc/bdc_pci.c index 1e940f054cb8..6dbc489513cd 100644 --- a/drivers/usb/gadget/udc/bdc/bdc_pci.c +++ b/drivers/usb/gadget/udc/bdc/bdc_pci.c | |||
@@ -77,6 +77,7 @@ static int bdc_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) | |||
77 | if (ret) { | 77 | if (ret) { |
78 | dev_err(&pci->dev, | 78 | dev_err(&pci->dev, |
79 | "couldn't add resources to bdc device\n"); | 79 | "couldn't add resources to bdc device\n"); |
80 | platform_device_put(bdc); | ||
80 | return ret; | 81 | return ret; |
81 | } | 82 | } |
82 | 83 | ||
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 859d5b11ba4c..1f8b19d9cf97 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c | |||
@@ -180,8 +180,8 @@ EXPORT_SYMBOL_GPL(usb_ep_alloc_request); | |||
180 | void usb_ep_free_request(struct usb_ep *ep, | 180 | void usb_ep_free_request(struct usb_ep *ep, |
181 | struct usb_request *req) | 181 | struct usb_request *req) |
182 | { | 182 | { |
183 | ep->ops->free_request(ep, req); | ||
184 | trace_usb_ep_free_request(ep, req, 0); | 183 | trace_usb_ep_free_request(ep, req, 0); |
184 | ep->ops->free_request(ep, req); | ||
185 | } | 185 | } |
186 | EXPORT_SYMBOL_GPL(usb_ep_free_request); | 186 | EXPORT_SYMBOL_GPL(usb_ep_free_request); |
187 | 187 | ||
diff --git a/drivers/usb/gadget/udc/fsl_udc_core.c b/drivers/usb/gadget/udc/fsl_udc_core.c index e5b4ee96c4bf..56b517a38865 100644 --- a/drivers/usb/gadget/udc/fsl_udc_core.c +++ b/drivers/usb/gadget/udc/fsl_udc_core.c | |||
@@ -1305,7 +1305,7 @@ static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe) | |||
1305 | { | 1305 | { |
1306 | struct fsl_ep *ep = get_ep_by_pipe(udc, pipe); | 1306 | struct fsl_ep *ep = get_ep_by_pipe(udc, pipe); |
1307 | 1307 | ||
1308 | if (ep->name) | 1308 | if (ep->ep.name) |
1309 | nuke(ep, -ESHUTDOWN); | 1309 | nuke(ep, -ESHUTDOWN); |
1310 | } | 1310 | } |
1311 | 1311 | ||
@@ -1693,7 +1693,7 @@ static void dtd_complete_irq(struct fsl_udc *udc) | |||
1693 | curr_ep = get_ep_by_pipe(udc, i); | 1693 | curr_ep = get_ep_by_pipe(udc, i); |
1694 | 1694 | ||
1695 | /* If the ep is configured */ | 1695 | /* If the ep is configured */ |
1696 | if (curr_ep->name == NULL) { | 1696 | if (!curr_ep->ep.name) { |
1697 | WARNING("Invalid EP?"); | 1697 | WARNING("Invalid EP?"); |
1698 | continue; | 1698 | continue; |
1699 | } | 1699 | } |
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index 6e87af248367..409cde4e6a51 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c | |||
@@ -2410,7 +2410,7 @@ static int renesas_usb3_remove(struct platform_device *pdev) | |||
2410 | __renesas_usb3_ep_free_request(usb3->ep0_req); | 2410 | __renesas_usb3_ep_free_request(usb3->ep0_req); |
2411 | if (usb3->phy) | 2411 | if (usb3->phy) |
2412 | phy_put(usb3->phy); | 2412 | phy_put(usb3->phy); |
2413 | pm_runtime_disable(usb3_to_dev(usb3)); | 2413 | pm_runtime_disable(&pdev->dev); |
2414 | 2414 | ||
2415 | return 0; | 2415 | return 0; |
2416 | } | 2416 | } |
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index da031c45395a..fbec863350f6 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c | |||
@@ -602,6 +602,9 @@ static enum usb_charger_type mxs_phy_charger_detect(struct usb_phy *phy) | |||
602 | void __iomem *base = phy->io_priv; | 602 | void __iomem *base = phy->io_priv; |
603 | enum usb_charger_type chgr_type = UNKNOWN_TYPE; | 603 | enum usb_charger_type chgr_type = UNKNOWN_TYPE; |
604 | 604 | ||
605 | if (!regmap) | ||
606 | return UNKNOWN_TYPE; | ||
607 | |||
605 | if (mxs_charger_data_contact_detect(mxs_phy)) | 608 | if (mxs_charger_data_contact_detect(mxs_phy)) |
606 | return chgr_type; | 609 | return chgr_type; |
607 | 610 | ||