void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode)
{
- u32 reg;
+ u32 reg, reg_mode;
- if (mode != DWC3_GCTL_PRTCAP_NONE) {
- reg = dwc3_readl(dwc->regs, DWC3_GCTL);
- reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG));
- reg |= DWC3_GCTL_PRTCAPDIR(mode);
- dwc3_writel(dwc->regs, DWC3_GCTL, reg);
- }
+ /* Set PRTCAPDIR to be device mode for disconnect */
+ if (mode != DWC3_GCTL_PRTCAP_HOST)
+ reg_mode = DWC3_GCTL_PRTCAP_DEVICE;
+ else
+ reg_mode = DWC3_GCTL_PRTCAP_HOST;
+
+ reg = dwc3_readl(dwc->regs, DWC3_GCTL);
+ reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG));
+ reg |= DWC3_GCTL_PRTCAPDIR(reg_mode);
+ dwc3_writel(dwc->regs, DWC3_GCTL, reg);
dwc->current_dr_role = mode;
}