dwc_otg: use GUSBCFG to force host/device mode
Google-Bug-Id: 26390815
Change-Id: If9a50a6478bec8458fc1b3bf58aad8184ec90b91
diff --git a/drivers/usb/dwc_otg/dwc_otg_cil.c b/drivers/usb/dwc_otg/dwc_otg_cil.c
index b5de301..0ea097f 100644
--- a/drivers/usb/dwc_otg/dwc_otg_cil.c
+++ b/drivers/usb/dwc_otg/dwc_otg_cil.c
@@ -1206,11 +1206,13 @@
gahbcfg_data_t ahbcfg = {.d32 = 0 };
gusbcfg_data_t usbcfg = {.d32 = 0 };
gi2cctl_data_t i2cctl = {.d32 = 0 };
+ gusbcfg_data_t usbcfg_prev;
DWC_DEBUGPL(DBG_CILV, "dwc_otg_core_init(%p)\n", core_if);
/* Common Initialization */
usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg);
+ usbcfg_prev.d32 = usbcfg.d32;
/* Program the ULPI External VBUS bit if needed */
usbcfg.b.ulpi_ext_vbus_drv =
@@ -1465,8 +1467,22 @@
break;
}
+#if defined(CONFIG_DWC_OTG_HOST_ONLY)
+ usbcfg.b.force_dev_mode = 0;
+ usbcfg.b.force_host_mode = 1;
+#elif defined(CONFIG_DWC_OTG_DEVICE_ONLY)
+ usbcfg.b.force_dev_mode = 1;
+ usbcfg.b.force_host_mode = 0;
+#endif
+
DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32);
+ if ((usbcfg.b.force_dev_mode != usbcfg_prev.b.force_dev_mode) ||
+ (usbcfg.b.force_host_mode != usbcfg_prev.b.force_host_mode)) {
+ /* wait for mode change to become effective */
+ dwc_mdelay(25);
+ }
+
#ifdef CONFIG_USB_DWC_OTG_LPM
if (core_if->core_params->lpm_enable) {
glpmcfg_data_t lpmcfg = {.d32 = 0 };