|
@@ -3372,6 +3372,9 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
|
|
|
val |= DCTL_SFTDISCON;
|
|
val |= DCTL_SFTDISCON;
|
|
|
dwc2_set_bit(hsotg->regs + DCTL, val);
|
|
dwc2_set_bit(hsotg->regs + DCTL, val);
|
|
|
|
|
|
|
|
|
|
+ /* configure the core to support LPM */
|
|
|
|
|
+ dwc2_gadget_init_lpm(hsotg);
|
|
|
|
|
+
|
|
|
/* must be at-least 3ms to allow bus to see disconnect */
|
|
/* must be at-least 3ms to allow bus to see disconnect */
|
|
|
mdelay(3);
|
|
mdelay(3);
|
|
|
|
|
|
|
@@ -4862,3 +4865,26 @@ int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * dwc2_gadget_init_lpm - Configure the core to support LPM in device mode
|
|
|
|
|
+ *
|
|
|
|
|
+ * @hsotg: Programming view of DWC_otg controller
|
|
|
|
|
+ *
|
|
|
|
|
+ */
|
|
|
|
|
+void dwc2_gadget_init_lpm(struct dwc2_hsotg *hsotg)
|
|
|
|
|
+{
|
|
|
|
|
+ u32 val;
|
|
|
|
|
+
|
|
|
|
|
+ if (!hsotg->params.lpm)
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ val = GLPMCFG_LPMCAP | GLPMCFG_APPL1RES;
|
|
|
|
|
+ val |= hsotg->params.hird_threshold_en ? GLPMCFG_HIRD_THRES_EN : 0;
|
|
|
|
|
+ val |= hsotg->params.lpm_clock_gating ? GLPMCFG_ENBLSLPM : 0;
|
|
|
|
|
+ val |= hsotg->params.hird_threshold << GLPMCFG_HIRD_THRES_SHIFT;
|
|
|
|
|
+ val |= hsotg->params.besl ? GLPMCFG_ENBESL : 0;
|
|
|
|
|
+ dwc2_writel(val, hsotg->regs + GLPMCFG);
|
|
|
|
|
+ dev_dbg(hsotg->dev, "GLPMCFG=0x%08x\n", dwc2_readl(hsotg->regs
|
|
|
|
|
+ + GLPMCFG));
|
|
|
|
|
+}
|