diff --git a/drivers/usb/dwc3/dwc3-msm-core.c b/drivers/usb/dwc3/dwc3-msm-core.c index 5c179a9110f3..a3a01127a007 100644 --- a/drivers/usb/dwc3/dwc3-msm-core.c +++ b/drivers/usb/dwc3/dwc3-msm-core.c @@ -587,6 +587,8 @@ struct dwc3_msm { bool dis_sending_cm_l1_quirk; bool use_eusb2_phy; bool force_gen1; + bool cached_dis_u1_entry_quirk; + bool cached_dis_u2_entry_quirk; }; #define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */ @@ -3217,6 +3219,34 @@ static void mdwc3_usb2_phy_soft_reset(struct dwc3_msm *mdwc) dwc3_msm_write_reg(mdwc->base, DWC3_GUSB2PHYCFG(0), val); } +static void mdwc3_update_u1u2_value(struct dwc3 *dwc) +{ + struct dwc3_msm *mdwc = dev_get_drvdata(dwc->dev->parent); + static bool read_u1u2; + + /* cache DT based initial value once */ + if (!read_u1u2) { + mdwc->cached_dis_u1_entry_quirk = dwc->dis_u1_entry_quirk; + mdwc->cached_dis_u2_entry_quirk = dwc->dis_u2_entry_quirk; + read_u1u2 = true; + dbg_log_string("cached_dt_param: u1_disable:%d u2_disable:%d\n", + mdwc->cached_dis_u1_entry_quirk, mdwc->cached_dis_u2_entry_quirk); + } + + /* Enable u1u2 for USB super speed (gen1) only with quirks enable it */ + if (dwc->speed == DWC3_DSTS_SUPERSPEED) { + dwc->dis_u1_entry_quirk = mdwc->cached_dis_u1_entry_quirk; + dwc->dis_u2_entry_quirk = mdwc->cached_dis_u2_entry_quirk; + } else { + dwc->dis_u1_entry_quirk = true; + dwc->dis_u2_entry_quirk = true; + } + + dbg_log_string("speed:%d u1:%s u2:%s\n", + dwc->speed, dwc->dis_u1_entry_quirk ? "disabled" : "enabled", + dwc->dis_u2_entry_quirk ? "disabled" : "enabled"); +} + void dwc3_msm_notify_event(struct dwc3 *dwc, enum dwc3_notify_event event, unsigned int value) { @@ -3271,6 +3301,7 @@ void dwc3_msm_notify_event(struct dwc3 *dwc, PWR_EVNT_LPM_OUT_L1_MASK, 1); atomic_set(&mdwc->in_lpm, 0); + mdwc3_update_u1u2_value(dwc); break; case DWC3_GSI_EVT_BUF_ALLOC: dev_dbg(mdwc->dev, "DWC3_GSI_EVT_BUF_ALLOC\n");