Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e729c316 authored by Manu Gautam's avatar Manu Gautam Committed by Hemant Kumar
Browse files

usb: dwc3-msm: Disable RxTerm Detection by Core in U3 state



Before suspending SS-PHY RxTerm detection must be disabled,
and enabled after resuming SS-PHY as recommended in databook.
If this is not performed then Core detects RxTerm removal after
U3 exit which results in SS device getting disconnected.
After bus resume is complete some devices seem to re-establish
SS connection and enumerate where as some device do not enumerate
at all.

Change-Id: I96143c83a184d1b1a4852e23552f5f96caa531cb
Signed-off-by: default avatarManu Gautam <mgautam@codeaurora.org>
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent 3e70a303
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -299,6 +299,7 @@
#define DWC3_GUSB3PIPECTL_DISRXDETINP3	BIT(28)
#define DWC3_GUSB3PIPECTL_UX_EXIT_PX	BIT(27)
#define DWC3_GUSB3PIPECTL_REQP1P2P3	BIT(24)
#define DWC3_GUSB3PIPECTL_DISRXDETU3	BIT(22)
#define DWC3_GUSB3PIPECTL_DEP1P2P3(n)	((n) << 19)
#define DWC3_GUSB3PIPECTL_DEP1P2P3_MASK	DWC3_GUSB3PIPECTL_DEP1P2P3(7)
#define DWC3_GUSB3PIPECTL_DEP1P2P3_EN	DWC3_GUSB3PIPECTL_DEP1P2P3(1)
+13 −0
Original line number Diff line number Diff line
@@ -2294,6 +2294,12 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc)

	/* Suspend SS PHY */
	if (dwc->maximum_speed >= USB_SPEED_SUPER) {
		if (mdwc->in_host_mode) {
			u32 reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));

			reg |= DWC3_GUSB3PIPECTL_DISRXDETU3;
			dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);
		}
		/* indicate phy about SS mode */
		if (dwc3_msm_is_superspeed(mdwc))
			mdwc->ss_phy->flags |= DEVICE_IN_SS_MODE;
@@ -2465,6 +2471,13 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc)
		usb_phy_set_suspend(mdwc->ss_phy, 0);
		mdwc->ss_phy->flags &= ~DEVICE_IN_SS_MODE;
		mdwc->lpm_flags &= ~MDWC3_SS_PHY_SUSPEND;

		if (mdwc->in_host_mode) {
			u32 reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));

			reg &= ~DWC3_GUSB3PIPECTL_DISRXDETU3;
			dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);
		}
	}

	mdwc->hs_phy->flags &= ~(PHY_HSFS_MODE | PHY_LS_MODE);