madrone otg wip

Change-Id: I7e8f3259638075b94836f470263a290aaf1b69b4
diff --git a/system/dev/board/imx8mevk/imx8mevk-usb.c b/system/dev/board/imx8mevk/imx8mevk-usb.c
index 1c11a96..8af1074 100644
--- a/system/dev/board/imx8mevk/imx8mevk-usb.c
+++ b/system/dev/board/imx8mevk/imx8mevk-usb.c
@@ -123,20 +123,21 @@
     volatile void* regs = io_buffer_virt(&usb_buf);
     //TODO: More stuff might be needed if we were to boot from our own bootloader.
     reg = readl(regs + USB_PHY_CTRL1);
-    reg &= ~(PHY_CTRL1_VDATSRCENB0 | PHY_CTRL1_VDATDETENB0);
-    reg |= PHY_CTRL1_RESET | PHY_CTRL1_ATERESET;
+    reg &= ~(USB_PHY_CTRL1_VDATSRCENB0 | USB_PHY_CTRL1_VDATDETENB0 |
+			USB_PHY_CTRL1_COMMONONN);
+    reg |= USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET;
     writel(reg, regs + USB_PHY_CTRL1);
 
     reg = readl(regs + USB_PHY_CTRL0);
-    reg |= PHY_CTRL0_REF_SSP_EN;
+    reg |= USB_PHY_CTRL0_REF_SSP_EN;
     writel(reg, regs + USB_PHY_CTRL0);
 
     reg = readl(regs + USB_PHY_CTRL2);
-    reg |= PHY_CTRL2_TXENABLEN0;
+    reg |= USB_PHY_CTRL2_TXENABLEN0;
     writel(reg, regs + USB_PHY_CTRL2);
 
     reg = readl(regs + USB_PHY_CTRL1);
-    reg &= ~(PHY_CTRL1_RESET | PHY_CTRL1_ATERESET);
+    reg &= ~(USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET);
     writel(reg, regs + USB_PHY_CTRL1);
 
     io_buffer_release(&usb_buf);
@@ -197,6 +198,7 @@
         zxlogf(ERROR, "imx_usb_init could not add usb2_dev: %d\n", status);
         return status;
     }
+
     return ZX_OK;
 }
 
diff --git a/system/dev/lib/imx8m/include/soc/imx8m/imx8m-hw.h b/system/dev/lib/imx8m/include/soc/imx8m/imx8m-hw.h
index 6d50c6e..61a8ae8a 100644
--- a/system/dev/lib/imx8m/include/soc/imx8m/imx8m-hw.h
+++ b/system/dev/lib/imx8m/include/soc/imx8m/imx8m-hw.h
@@ -258,11 +258,12 @@
 
 /* USB PHY CTRL Registers (undocumented) */
 #define USB_PHY_CTRL0               (0xF0040)
-#define PHY_CTRL0_REF_SSP_EN        (1 << 2)
+#define USB_PHY_CTRL0_REF_SSP_EN    (1 << 2)
 #define USB_PHY_CTRL1               (0xF0044)
-#define PHY_CTRL1_RESET             (1 << 0)
-#define PHY_CTRL1_ATERESET          (1 << 3)
-#define PHY_CTRL1_VDATSRCENB0       (1 << 19)
-#define PHY_CTRL1_VDATDETENB0       (1 << 20)
+#define USB_PHY_CTRL1_RESET         (1 << 0)
+#define USB_PHY_CTRL1_COMMONONN     (1 << 1)
+#define USB_PHY_CTRL1_ATERESET      (1 << 3)
+#define USB_PHY_CTRL1_VDATSRCENB0   (1 << 19)
+#define USB_PHY_CTRL1_VDATDETENB0   (1 << 20)
 #define USB_PHY_CTRL2               (0xF0048)
-#define PHY_CTRL2_TXENABLEN0        (1 << 8)
+#define USB_PHY_CTRL2_TXENABLEN0    (1 << 8)
diff --git a/system/dev/usb/dwc3/dwc3-regs.h b/system/dev/usb/dwc3/dwc3-regs.h
index b75c9d1..1530126 100644
--- a/system/dev/usb/dwc3/dwc3-regs.h
+++ b/system/dev/usb/dwc3/dwc3-regs.h
@@ -222,7 +222,7 @@
 #define GUSB2PHYACC_ULPI(n) (0xc280 + 4 * (n))  // Global USB 2.0 UTMI PHY Vendor Control Register
 
 #define GUSB3PIPECTL(n)     (0xc2c0 + 4 * (n))      // Global USB 3.1 PIPE Control Register
-#define GUSB3PIPECTL_PHY_SOFT_RST               (1 << 31)   // USB3 PHY Soft Reset
+#define GUSB3PIPECTL_PHYSOFTRST                 (1 << 31)   // USB3 PHY Soft Reset
 #define GUSB3PIPECTL_HST_PRT_CMPL               (1 << 30)
 #define GUSB3PIPECTL_DIS_RX_DET_P3              (1 << 28)
 #define GUSB3PIPECTL_UX_EXIT_IN_PX              (1 << 27)
diff --git a/system/dev/usb/dwc3/dwc3.c b/system/dev/usb/dwc3/dwc3.c
index 1254507..823fb56 100644
--- a/system/dev/usb/dwc3/dwc3.c
+++ b/system/dev/usb/dwc3/dwc3.c
@@ -89,6 +89,39 @@
 
     mtx_lock(&dwc->lock);
 
+    temp = DWC3_READ32(mmio + DCTL);
+    temp |= DCTL_CSFTRST;
+    DWC3_WRITE32(mmio + DCTL, temp);
+    dwc3_wait_bits(mmio + DCTL, DCTL_CSFTRST, 0);
+
+    temp = DWC3_READ32(mmio + GCTL);
+    temp |= GCTL_CORESOFTRESET;
+    DWC3_WRITE32(mmio + GCTL, temp);
+
+    /* Assert USB2 PHY reset */
+    temp = DWC3_READ32(mmio + GUSB2PHYCFG(0));
+    temp |= GUSB2PHYCFG_PHYSOFTRST;
+    DWC3_WRITE32(mmio + GUSB2PHYCFG(0), temp);
+
+    usleep(100 * 1000);
+
+    /* Clear USB3 PHY reset */
+    temp = DWC3_READ32(mmio + GUSB3PIPECTL(0));
+    temp &= ~GUSB3PIPECTL_PHYSOFTRST;
+    DWC3_WRITE32(mmio + GUSB3PIPECTL(0), temp);
+
+    /* Clear USB2 PHY reset */
+    temp = DWC3_READ32(mmio + GUSB2PHYCFG(0));
+    temp &= ~GUSB2PHYCFG_PHYSOFTRST;
+    DWC3_WRITE32(mmio + GUSB2PHYCFG(0), temp);
+
+    usleep(100 * 1000);
+
+    /* After PHYs are stable we can take Core out of reset state */
+    temp = DWC3_READ32(mmio + GCTL);
+    temp &= ~GCTL_CORESOFTRESET;
+    DWC3_WRITE32(mmio + GCTL, temp);
+
     // configure and enable PHYs
     temp = DWC3_READ32(mmio + GUSB2PHYCFG(0));
     temp &= ~(GUSB2PHYCFG_USBTRDTIM_MASK | GUSB2PHYCFG_SUSPENDUSB20);