diff --git a/board/rockchip/evb_rv1103b/evb_rv1103b.c b/board/rockchip/evb_rv1103b/evb_rv1103b.c
index 994ede3204aa8b2958ab257d849bfeaa52cb3cd8..25c69098a55f4fa57c6bb23afc39d20074147d8f 100644
--- a/board/rockchip/evb_rv1103b/evb_rv1103b.c
+++ b/board/rockchip/evb_rv1103b/evb_rv1103b.c
@@ -11,6 +11,12 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define PERI_CRU_BASE			0x20000000
+#define PERICRU_PERISOFTRST_CON06	0x0a18
+#define GRF_SYS_BASE			0x20150000
+#define GRF_SYS_USBPHY_CON0		0x0050
+#define GRF_SYS_USBPHY_CON2		0x0058
+
 #ifdef CONFIG_USB_DWC3
 static struct dwc3_device dwc3_device_data = {
 	.maximum_speed = USB_SPEED_HIGH,
@@ -27,8 +33,24 @@ int usb_gadget_handle_interrupts(void)
 	return 0;
 }
 
+static void usb_reset_otg_controller(void)
+{
+	writel(0x02000200, PERI_CRU_BASE + PERICRU_PERISOFTRST_CON06);
+	mdelay(1);
+	writel(0x02000000, PERI_CRU_BASE + PERICRU_PERISOFTRST_CON06);
+	mdelay(1);
+}
+
 int board_usb_init(int index, enum usb_init_type init)
 {
+	usb_reset_otg_controller();
+
+	/* Resume usb2 phy to normal mode */
+	writel(0x01ff0000, GRF_SYS_BASE + GRF_SYS_USBPHY_CON0);
+
+	/* Select usb utmi bvalid from grf and set bvalid high */
+	writel(0xc000c000, GRF_SYS_BASE + GRF_SYS_USBPHY_CON2);
+
 	return dwc3_uboot_init(&dwc3_device_data);
 }
 #endif