static enum dwc_otg_state do_connector_id_status(struct dwc_otg2 *otg)
{
u32 events = 0, user_events = 0;
- u32 otg_mask = 0, user_mask = 0;
+ u32 otg_mask = 0, user_mask = 0, phyval;
enum dwc_otg_state state = DWC_STATE_INVALID;
otg_dbg(otg, "\n");
otg_write(otg, OEVTEN, OEVT_CONN_ID_STS_CHNG_EVNT);
otg_write(otg, OCTL, OCTL_PERI_MODE);
+ /* This is a hardware workaround.
+ * xHCI RxDetect state is not work well when USB3
+ * PHY under P3 state. So force PHY change to P2 when
+ * xHCI want to perform receiver detection.
+ */
+ phyval = otg_read(otg, GUSB3PIPECTL0);
+ phyval |= GUSB3PIPE_DISRXDETP3;
+ otg_write(otg, GUSB3PIPECTL0, phyval);
+
msleep(60);
#ifndef SUPPORT_USER_ID_CHANGE_EVENTS
#define GUSB3PIPECTL0 0xc2c0
#define GUSB3PIPECTL_SUS_EN 0x20000
+#define GUSB3PIPE_DISRXDETP3 (1 << 28)
#define GHWPARAMS6 0xc158
#define GHWPARAMS6_SRP_SUPPORT_ENABLED 0x0400