Commit fc19b1d0 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v4.16-rc2' of...

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.
parents b86b8eb6 98112041
...@@ -1917,7 +1917,9 @@ static void dwc2_hsotg_program_zlp(struct dwc2_hsotg *hsotg, ...@@ -1917,7 +1917,9 @@ static void dwc2_hsotg_program_zlp(struct dwc2_hsotg *hsotg,
/* Not specific buffer needed for ep0 ZLP */ /* Not specific buffer needed for ep0 ZLP */
dma_addr_t dma = hs_ep->desc_list_dma; dma_addr_t dma = hs_ep->desc_list_dma;
dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep); if (!index)
dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep);
dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0); dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0);
} else { } else {
dwc2_writel(DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) | 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,9 +2976,13 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
if (ints & DXEPINT_STSPHSERCVD) { if (ints & DXEPINT_STSPHSERCVD) {
dev_dbg(hsotg->dev, "%s: StsPhseRcvd\n", __func__); dev_dbg(hsotg->dev, "%s: StsPhseRcvd\n", __func__);
/* Move to STATUS IN for DDMA */ /* Safety check EP0 state when STSPHSERCVD asserted */
if (using_desc_dma(hsotg)) if (hsotg->ep0_state == DWC2_EP0_DATA_OUT) {
dwc2_hsotg_ep0_zlp(hsotg, true); /* Move to STATUS IN for DDMA */
if (using_desc_dma(hsotg))
dwc2_hsotg_ep0_zlp(hsotg, true);
}
} }
if (ints & DXEPINT_BACK2BACKSETUP) if (ints & DXEPINT_BACK2BACKSETUP)
...@@ -3375,12 +3381,6 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg, ...@@ -3375,12 +3381,6 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
dwc2_writel(dwc2_hsotg_ep0_mps(hsotg->eps_out[0]->ep.maxpacket) | dwc2_writel(dwc2_hsotg_ep0_mps(hsotg->eps_out[0]->ep.maxpacket) |
DXEPCTL_USBACTEP, hsotg->regs + DIEPCTL0); DXEPCTL_USBACTEP, hsotg->regs + DIEPCTL0);
dwc2_hsotg_enqueue_setup(hsotg);
dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n",
dwc2_readl(hsotg->regs + DIEPCTL0),
dwc2_readl(hsotg->regs + DOEPCTL0));
/* clear global NAKs */ /* clear global NAKs */
val = DCTL_CGOUTNAK | DCTL_CGNPINNAK; val = DCTL_CGOUTNAK | DCTL_CGNPINNAK;
if (!is_usb_reset) if (!is_usb_reset)
...@@ -3391,6 +3391,12 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg, ...@@ -3391,6 +3391,12 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
mdelay(3); mdelay(3);
hsotg->lx_state = DWC2_L0; hsotg->lx_state = DWC2_L0;
dwc2_hsotg_enqueue_setup(hsotg);
dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n",
dwc2_readl(hsotg->regs + DIEPCTL0),
dwc2_readl(hsotg->regs + DOEPCTL0));
} }
static void dwc2_hsotg_core_disconnect(struct dwc2_hsotg *hsotg) static void dwc2_hsotg_core_disconnect(struct dwc2_hsotg *hsotg)
......
...@@ -100,6 +100,8 @@ static void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode) ...@@ -100,6 +100,8 @@ static void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode)
reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG)); reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG));
reg |= DWC3_GCTL_PRTCAPDIR(mode); reg |= DWC3_GCTL_PRTCAPDIR(mode);
dwc3_writel(dwc->regs, DWC3_GCTL, reg); dwc3_writel(dwc->regs, DWC3_GCTL, reg);
dwc->current_dr_role = mode;
} }
static void __dwc3_set_mode(struct work_struct *work) static void __dwc3_set_mode(struct work_struct *work)
...@@ -133,8 +135,6 @@ static void __dwc3_set_mode(struct work_struct *work) ...@@ -133,8 +135,6 @@ static void __dwc3_set_mode(struct work_struct *work)
dwc3_set_prtcap(dwc, dwc->desired_dr_role); dwc3_set_prtcap(dwc, dwc->desired_dr_role);
dwc->current_dr_role = dwc->desired_dr_role;
spin_unlock_irqrestore(&dwc->lock, flags); spin_unlock_irqrestore(&dwc->lock, flags);
switch (dwc->desired_dr_role) { switch (dwc->desired_dr_role) {
...@@ -219,7 +219,7 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc) ...@@ -219,7 +219,7 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
* XHCI driver will reset the host block. If dwc3 was configured for * XHCI driver will reset the host block. If dwc3 was configured for
* host-only mode, then we can return early. * host-only mode, then we can return early.
*/ */
if (dwc->dr_mode == USB_DR_MODE_HOST) if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST)
return 0; return 0;
reg = dwc3_readl(dwc->regs, DWC3_DCTL); reg = dwc3_readl(dwc->regs, DWC3_DCTL);
...@@ -234,6 +234,9 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc) ...@@ -234,6 +234,9 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
udelay(1); udelay(1);
} while (--retries); } while (--retries);
phy_exit(dwc->usb3_generic_phy);
phy_exit(dwc->usb2_generic_phy);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -483,6 +486,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc) ...@@ -483,6 +486,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8); parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8);
} }
static int dwc3_core_ulpi_init(struct dwc3 *dwc)
{
int intf;
int ret = 0;
intf = DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3);
if (intf == DWC3_GHWPARAMS3_HSPHY_IFC_ULPI ||
(intf == DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI &&
dwc->hsphy_interface &&
!strncmp(dwc->hsphy_interface, "ulpi", 4)))
ret = dwc3_ulpi_init(dwc);
return ret;
}
/** /**
* dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
* @dwc: Pointer to our controller context structure * @dwc: Pointer to our controller context structure
...@@ -494,7 +513,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc) ...@@ -494,7 +513,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
static int dwc3_phy_setup(struct dwc3 *dwc) static int dwc3_phy_setup(struct dwc3 *dwc)
{ {
u32 reg; u32 reg;
int ret;
reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)); reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
...@@ -565,9 +583,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc) ...@@ -565,9 +583,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc)
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI: case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
ret = dwc3_ulpi_init(dwc);
if (ret)
return ret;
/* FALLTHROUGH */ /* FALLTHROUGH */
default: default:
break; break;
...@@ -724,6 +739,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc) ...@@ -724,6 +739,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc)
} }
static int dwc3_core_get_phy(struct dwc3 *dwc); static int dwc3_core_get_phy(struct dwc3 *dwc);
static int dwc3_core_ulpi_init(struct dwc3 *dwc);
/** /**
* dwc3_core_init - Low-level initialization of DWC3 Core * dwc3_core_init - Low-level initialization of DWC3 Core
...@@ -755,17 +771,27 @@ static int dwc3_core_init(struct dwc3 *dwc) ...@@ -755,17 +771,27 @@ static int dwc3_core_init(struct dwc3 *dwc)
dwc->maximum_speed = USB_SPEED_HIGH; dwc->maximum_speed = USB_SPEED_HIGH;
} }
ret = dwc3_core_get_phy(dwc); ret = dwc3_phy_setup(dwc);
if (ret) if (ret)
goto err0; goto err0;
ret = dwc3_core_soft_reset(dwc); if (!dwc->ulpi_ready) {
if (ret) ret = dwc3_core_ulpi_init(dwc);
goto err0; if (ret)
goto err0;
dwc->ulpi_ready = true;
}
ret = dwc3_phy_setup(dwc); if (!dwc->phys_ready) {
ret = dwc3_core_get_phy(dwc);
if (ret)
goto err0a;
dwc->phys_ready = true;
}
ret = dwc3_core_soft_reset(dwc);
if (ret) if (ret)
goto err0; goto err0a;
dwc3_core_setup_global_control(dwc); dwc3_core_setup_global_control(dwc);
dwc3_core_num_eps(dwc); dwc3_core_num_eps(dwc);
...@@ -838,6 +864,9 @@ static int dwc3_core_init(struct dwc3 *dwc) ...@@ -838,6 +864,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
phy_exit(dwc->usb2_generic_phy); phy_exit(dwc->usb2_generic_phy);
phy_exit(dwc->usb3_generic_phy); phy_exit(dwc->usb3_generic_phy);
err0a:
dwc3_ulpi_exit(dwc);
err0: err0:
return ret; return ret;
} }
...@@ -916,7 +945,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc) ...@@ -916,7 +945,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
switch (dwc->dr_mode) { switch (dwc->dr_mode) {
case USB_DR_MODE_PERIPHERAL: case USB_DR_MODE_PERIPHERAL:
dwc->current_dr_role = DWC3_GCTL_PRTCAP_DEVICE;
dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE);
if (dwc->usb2_phy) if (dwc->usb2_phy)
...@@ -932,7 +960,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc) ...@@ -932,7 +960,6 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
} }
break; break;
case USB_DR_MODE_HOST: case USB_DR_MODE_HOST:
dwc->current_dr_role = DWC3_GCTL_PRTCAP_HOST;
dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST); dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST);
if (dwc->usb2_phy) if (dwc->usb2_phy)
...@@ -1234,7 +1261,6 @@ static int dwc3_probe(struct platform_device *pdev) ...@@ -1234,7 +1261,6 @@ static int dwc3_probe(struct platform_device *pdev)
err3: err3:
dwc3_free_event_buffers(dwc); dwc3_free_event_buffers(dwc);
dwc3_ulpi_exit(dwc);
err2: err2:
pm_runtime_allow(&pdev->dev); pm_runtime_allow(&pdev->dev);
...@@ -1284,7 +1310,7 @@ static int dwc3_remove(struct platform_device *pdev) ...@@ -1284,7 +1310,7 @@ static int dwc3_remove(struct platform_device *pdev)
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int dwc3_suspend_common(struct dwc3 *dwc) static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
{ {
unsigned long flags; unsigned long flags;
...@@ -1296,6 +1322,10 @@ static int dwc3_suspend_common(struct dwc3 *dwc) ...@@ -1296,6 +1322,10 @@ static int dwc3_suspend_common(struct dwc3 *dwc)
dwc3_core_exit(dwc); dwc3_core_exit(dwc);
break; break;
case DWC3_GCTL_PRTCAP_HOST: case DWC3_GCTL_PRTCAP_HOST:
/* do nothing during host runtime_suspend */
if (!PMSG_IS_AUTO(msg))
dwc3_core_exit(dwc);
break;
default: default:
/* do nothing */ /* do nothing */
break; break;
...@@ -1304,7 +1334,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc) ...@@ -1304,7 +1334,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc)
return 0; return 0;
} }
static int dwc3_resume_common(struct dwc3 *dwc) static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
{ {
unsigned long flags; unsigned long flags;
int ret; int ret;
...@@ -1320,6 +1350,13 @@ static int dwc3_resume_common(struct dwc3 *dwc) ...@@ -1320,6 +1350,13 @@ static int dwc3_resume_common(struct dwc3 *dwc)
spin_unlock_irqrestore(&dwc->lock, flags); spin_unlock_irqrestore(&dwc->lock, flags);
break; break;
case DWC3_GCTL_PRTCAP_HOST: case DWC3_GCTL_PRTCAP_HOST:
/* nothing to do on host runtime_resume */
if (!PMSG_IS_AUTO(msg)) {
ret = dwc3_core_init(dwc);
if (ret)
return ret;
}
break;
default: default:
/* do nothing */ /* do nothing */
break; break;
...@@ -1331,12 +1368,11 @@ static int dwc3_resume_common(struct dwc3 *dwc) ...@@ -1331,12 +1368,11 @@ static int dwc3_resume_common(struct dwc3 *dwc)
static int dwc3_runtime_checks(struct dwc3 *dwc) static int dwc3_runtime_checks(struct dwc3 *dwc)
{ {
switch (dwc->current_dr_role) { switch (dwc->current_dr_role) {
case USB_DR_MODE_PERIPHERAL: case DWC3_GCTL_PRTCAP_DEVICE:
case USB_DR_MODE_OTG:
if (dwc->connected) if (dwc->connected)
return -EBUSY; return -EBUSY;
break; break;
case USB_DR_MODE_HOST: case DWC3_GCTL_PRTCAP_HOST:
default: default:
/* do nothing */ /* do nothing */
break; break;
...@@ -1353,7 +1389,7 @@ static int dwc3_runtime_suspend(struct device *dev) ...@@ -1353,7 +1389,7 @@ static int dwc3_runtime_suspend(struct device *dev)
if (dwc3_runtime_checks(dwc)) if (dwc3_runtime_checks(dwc))
return -EBUSY; return -EBUSY;
ret = dwc3_suspend_common(dwc); ret = dwc3_suspend_common(dwc, PMSG_AUTO_SUSPEND);
if (ret) if (ret)
return ret; return ret;
...@@ -1369,7 +1405,7 @@ static int dwc3_runtime_resume(struct device *dev) ...@@ -1369,7 +1405,7 @@ static int dwc3_runtime_resume(struct device *dev)
device_init_wakeup(dev, false); device_init_wakeup(dev, false);
ret = dwc3_resume_common(dwc); ret = dwc3_resume_common(dwc, PMSG_AUTO_RESUME);
if (ret) if (ret)
return ret; return ret;
...@@ -1416,7 +1452,7 @@ static int dwc3_suspend(struct device *dev) ...@@ -1416,7 +1452,7 @@ static int dwc3_suspend(struct device *dev)
struct dwc3 *dwc = dev_get_drvdata(dev); struct dwc3 *dwc = dev_get_drvdata(dev);
int ret; int ret;
ret = dwc3_suspend_common(dwc); ret = dwc3_suspend_common(dwc, PMSG_SUSPEND);
if (ret) if (ret)
return ret; return ret;
...@@ -1432,7 +1468,7 @@ static int dwc3_resume(struct device *dev) ...@@ -1432,7 +1468,7 @@ static int dwc3_resume(struct device *dev)
pinctrl_pm_select_default_state(dev); pinctrl_pm_select_default_state(dev);
ret = dwc3_resume_common(dwc); ret = dwc3_resume_common(dwc, PMSG_RESUME);
if (ret) if (ret)
return ret; return ret;
......
...@@ -158,13 +158,15 @@ ...@@ -158,13 +158,15 @@
#define DWC3_GDBGFIFOSPACE_TYPE(n) (((n) << 5) & 0x1e0) #define DWC3_GDBGFIFOSPACE_TYPE(n) (((n) << 5) & 0x1e0)
#define DWC3_GDBGFIFOSPACE_SPACE_AVAILABLE(n) (((n) >> 16) & 0xffff) #define DWC3_GDBGFIFOSPACE_SPACE_AVAILABLE(n) (((n) >> 16) & 0xffff)
#define DWC3_TXFIFOQ 1 #define DWC3_TXFIFOQ 0
#define DWC3_RXFIFOQ 3 #define DWC3_RXFIFOQ 1
#define DWC3_TXREQQ 5 #define DWC3_TXREQQ 2
#define DWC3_RXREQQ 7 #define DWC3_RXREQQ 3
#define DWC3_RXINFOQ 9 #define DWC3_RXINFOQ 4
#define DWC3_DESCFETCHQ 13 #define DWC3_PSTATQ 5
#define DWC3_EVENTQ 15 #define DWC3_DESCFETCHQ 6
#define DWC3_EVENTQ 7
#define DWC3_AUXEVENTQ 8
/* Global RX Threshold Configuration Register */ /* Global RX Threshold Configuration Register */
#define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19) #define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19)
...@@ -795,7 +797,9 @@ struct dwc3_scratchpad_array { ...@@ -795,7 +797,9 @@ struct dwc3_scratchpad_array {
* @usb3_phy: pointer to USB3 PHY * @usb3_phy: pointer to USB3 PHY
* @usb2_generic_phy: pointer to USB2 PHY * @usb2_generic_phy: pointer to USB2 PHY
* @usb3_generic_phy: pointer to USB3 PHY * @usb3_generic_phy: pointer to USB3 PHY
* @phys_ready: flag to indicate that PHYs are ready
* @ulpi: pointer to ulpi interface * @ulpi: pointer to ulpi interface
* @ulpi_ready: flag to indicate that ULPI is initialized
* @u2sel: parameter from Set SEL request. * @u2sel: parameter from Set SEL request.
* @u2pel: parameter from Set SEL request. * @u2pel: parameter from Set SEL request.
* @u1sel: parameter from Set SEL request. * @u1sel: parameter from Set SEL request.
...@@ -893,7 +897,10 @@ struct dwc3 { ...@@ -893,7 +897,10 @@ struct dwc3 {
struct phy *usb2_generic_phy; struct phy *usb2_generic_phy;
struct phy *usb3_generic_phy; struct phy *usb3_generic_phy;
bool phys_ready;
struct ulpi *ulpi; struct ulpi *ulpi;
bool ulpi_ready;
void __iomem *regs; void __iomem *regs;
size_t regs_size; size_t regs_size;
......
...@@ -143,6 +143,7 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) ...@@ -143,6 +143,7 @@ static int dwc3_of_simple_remove(struct platform_device *pdev)
clk_disable_unprepare(simple->clks[i]); clk_disable_unprepare(simple->clks[i]);
clk_put(simple->clks[i]); clk_put(simple->clks[i]);
} }
simple->num_clocks = 0;
reset_control_assert(simple->resets); reset_control_assert(simple->resets);
reset_control_put(simple->resets); reset_control_put(simple->resets);
......
...@@ -582,9 +582,25 @@ static int dwc3_omap_resume(struct device *dev) ...@@ -582,9 +582,25 @@ static int dwc3_omap_resume(struct device *dev)
return 0; return 0;
} }
static void dwc3_omap_complete(struct device *dev)
{
struct dwc3_omap *omap = dev_get_drvdata(dev);
if (extcon_get_state(omap->edev, EXTCON_USB))
dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
else
dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
if (extcon_get_state(omap->edev, EXTCON_USB_HOST))
dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
else
dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
}
static const struct dev_pm_ops dwc3_omap_dev_pm_ops = { static const struct dev_pm_ops dwc3_omap_dev_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(dwc3_omap_suspend, dwc3_omap_resume) SET_SYSTEM_SLEEP_PM_OPS(dwc3_omap_suspend, dwc3_omap_resume)
.complete = dwc3_omap_complete,
}; };
#define DEV_PM_OPS (&dwc3_omap_dev_pm_ops) #define DEV_PM_OPS (&dwc3_omap_dev_pm_ops)
......
...@@ -854,7 +854,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, ...@@ -854,7 +854,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
trb++; trb++;
trb->ctrl &= ~DWC3_TRB_CTRL_HWO; trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
trace_dwc3_complete_trb(ep0, trb); trace_dwc3_complete_trb(ep0, trb);
ep0->trb_enqueue = 0;
if (r->direction)
dwc->eps[1]->trb_enqueue = 0;
else
dwc->eps[0]->trb_enqueue = 0;
dwc->ep0_bounced = false; dwc->ep0_bounced = false;
} }
......
...@@ -2745,6 +2745,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) ...@@ -2745,6 +2745,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
break; break;
} }
dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket;
/* Enable USB2 LPM Capability */ /* Enable USB2 LPM Capability */
if ((dwc->revision > DWC3_REVISION_194A) && if ((dwc->revision > DWC3_REVISION_194A) &&
......
...@@ -1855,44 +1855,20 @@ static int ffs_func_eps_enable(struct ffs_function *func) ...@@ -1855,44 +1855,20 @@ static int ffs_func_eps_enable(struct ffs_function *func)
spin_lock_irqsave(&func->ffs->eps_lock, flags); spin_lock_irqsave(&func->ffs->eps_lock, flags);
while(count--) { while(count--) {
struct usb_endpoint_descriptor *ds;
struct usb_ss_ep_comp_descriptor *comp_desc = NULL;
int needs_comp_desc = false;
int desc_idx;
if (ffs->gadget->speed == USB_SPEED_SUPER) {
desc_idx = 2;
needs_comp_desc = true;
} else if (ffs->gadget->speed == USB_SPEED_HIGH)
desc_idx = 1;
else
desc_idx = 0;
/* fall-back to lower speed if desc missing for current speed */
do {
ds = ep->descs[desc_idx];
} while (!ds && --desc_idx >= 0);
if (!ds) {
ret = -EINVAL;
break;
}
ep->ep->driver_data = ep; ep->ep->driver_data = ep;
ep->ep->desc = ds;
if (needs_comp_desc) { ret = config_ep_by_speed(func->gadget, &func->function, ep->ep);
comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + if (ret) {
USB_DT_ENDPOINT_SIZE); pr_err("%s: config_ep_by_speed(%s) returned %d\n",
ep->ep->maxburst = comp_desc->bMaxBurst + 1; __func__, ep->ep->name, ret);
ep->ep->comp_desc = comp_desc; break;
} }
ret = usb_ep_enable(ep->ep); ret = usb_ep_enable(ep->ep);
if (likely(!ret)) { if (likely(!ret)) {
epfile->ep = ep; epfile->ep = ep;
epfile->in = usb_endpoint_dir_in(ds); epfile->in = usb_endpoint_dir_in(ep->ep->desc);
epfile->isoc = usb_endpoint_xfer_isoc(ds); epfile->isoc = usb_endpoint_xfer_isoc(ep->ep->desc);
} else { } else {
break; break;
} }
...@@ -2979,10 +2955,8 @@ static int _ffs_func_bind(struct usb_configuration *c, ...@@ -2979,10 +2955,8 @@ static int _ffs_func_bind(struct usb_configuration *c,
struct ffs_data *ffs = func->ffs; struct ffs_data *ffs = func->ffs;
const int full = !!func->ffs->fs_descs_count; const int full = !!func->ffs->fs_descs_count;
const int high = gadget_is_dualspeed(func->gadget) && const int high = !!func->ffs->hs_descs_count;
func->ffs->hs_descs_count; const int super = !!func->ffs->ss_descs_count;
const int super = gadget_is_superspeed(func->gadget) &&
func->ffs->ss_descs_count;
int fs_len, hs_len, ss_len, ret, i; int fs_len, hs_len, ss_len, ret, i;
struct ffs_ep *eps_ptr; struct ffs_ep *eps_ptr;
......
...@@ -524,6 +524,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) ...@@ -524,6 +524,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
return ret; return ret;
} }
iad_desc.bFirstInterface = ret;
std_ac_if_desc.bInterfaceNumber = ret; std_ac_if_desc.bInterfaceNumber = ret;
uac2->ac_intf = ret; uac2->ac_intf = ret;
uac2->ac_alt = 0; uac2->ac_alt = 0;
......
...@@ -274,7 +274,6 @@ config USB_SNP_UDC_PLAT ...@@ -274,7 +274,6 @@ config USB_SNP_UDC_PLAT
tristate "Synopsys USB 2.0 Device controller" tristate "Synopsys USB 2.0 Device controller"
depends on USB_GADGET && OF && HAS_DMA depends on USB_GADGET && OF && HAS_DMA
depends on EXTCON || EXTCON=n depends on EXTCON || EXTCON=n
select USB_GADGET_DUALSPEED
select USB_SNP_CORE select USB_SNP_CORE
default ARCH_BCM_IPROC default ARCH_BCM_IPROC
help help
......
...@@ -77,6 +77,7 @@ static int bdc_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) ...@@ -77,6 +77,7 @@ static int bdc_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
if (ret) { if (ret) {
dev_err(&pci->dev, dev_err(&pci->dev,
"couldn't add resources to bdc device\n"); "couldn't add resources to bdc device\n");
platform_device_put(bdc);
return ret; return ret;
} }
......
...@@ -180,8 +180,8 @@ EXPORT_SYMBOL_GPL(usb_ep_alloc_request); ...@@ -180,8 +180,8 @@ EXPORT_SYMBOL_GPL(usb_ep_alloc_request);
void usb_ep_free_request(struct usb_ep *ep, void usb_ep_free_request(struct usb_ep *ep,
struct usb_request *req) struct usb_request *req)
{ {
ep->ops->free_request(ep, req);
trace_usb_ep_free_request(ep, req, 0); trace_usb_ep_free_request(ep, req, 0);
ep->ops->free_request(ep, req);
} }
EXPORT_SYMBOL_GPL(usb_ep_free_request); EXPORT_SYMBOL_GPL(usb_ep_free_request);
......
...@@ -1305,7 +1305,7 @@ static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe) ...@@ -1305,7 +1305,7 @@ static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
{ {
struct fsl_ep *ep = get_ep_by_pipe(udc, pipe); struct fsl_ep *ep = get_ep_by_pipe(udc, pipe);
if (ep->name) if (ep->ep.name)
nuke(ep, -ESHUTDOWN); nuke(ep, -ESHUTDOWN);
} }
...@@ -1693,7 +1693,7 @@ static void dtd_complete_irq(struct fsl_udc *udc) ...@@ -1693,7 +1693,7 @@ static void dtd_complete_irq(struct fsl_udc *udc)
curr_ep = get_ep_by_pipe(udc, i); curr_ep = get_ep_by_pipe(udc, i);
/* If the ep is configured */ /* If the ep is configured */
if (curr_ep->name == NULL) { if (!curr_ep->ep.name) {
WARNING("Invalid EP?"); WARNING("Invalid EP?");
continue; continue;
} }
......
...@@ -2410,7 +2410,7 @@ static int renesas_usb3_remove(struct platform_device *pdev) ...@@ -2410,7 +2410,7 @@ static int renesas_usb3_remove(struct platform_device *pdev)
__renesas_usb3_ep_free_request(usb3->ep0_req); __renesas_usb3_ep_free_request(usb3->ep0_req);
if (usb3->phy) if (usb3->phy)
phy_put(usb3->phy); phy_put(usb3->phy);
pm_runtime_disable(usb3_to_dev(usb3)); pm_runtime_disable(&pdev->dev);
return 0; return 0;
} }
......
...@@ -602,6 +602,9 @@ static enum usb_charger_type mxs_phy_charger_detect(struct usb_phy *phy) ...@@ -602,6 +602,9 @@ static enum usb_charger_type mxs_phy_charger_detect(struct usb_phy *phy)
void __iomem *base = phy->io_priv; void __iomem *base = phy->io_priv;
enum usb_charger_type chgr_type = UNKNOWN_TYPE; enum usb_charger_type chgr_type = UNKNOWN_TYPE;
if (!regmap)
return UNKNOWN_TYPE;
if (mxs_charger_data_contact_detect(mxs_phy)) if (mxs_charger_data_contact_detect(mxs_phy))
return chgr_type; return chgr_type;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment