usb: dwc3: add xHCI Host support

The Designware USB3 IP can be configured with
an internal xHCI. If we're running on such a
version, let's start the xHCI stack.

Signed-off-by: Felipe Balbi <balbi@ti.com>
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index df15199..410835e 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -350,6 +350,8 @@
 		goto err1;
 	}
 
+	dwc->res = res;
+
 	res = request_mem_region(res->start, resource_size(res),
 			dev_name(&pdev->dev));
 	if (!res) {
@@ -401,7 +403,6 @@
 	mode = DWC3_MODE(dwc->hwparams.hwparams0);
 
 	switch (mode) {
-	case DWC3_MODE_DRD:
 	case DWC3_MODE_DEVICE:
 		ret = dwc3_gadget_init(dwc);
 		if (ret) {
@@ -409,6 +410,26 @@
 			goto err4;
 		}
 		break;
+	case DWC3_MODE_HOST:
+		ret = dwc3_host_init(dwc);
+		if (ret) {
+			dev_err(&pdev->dev, "failed to initialize host\n");
+			goto err4;
+		}
+		break;
+	case DWC3_MODE_DRD:
+		ret = dwc3_host_init(dwc);
+		if (ret) {
+			dev_err(&pdev->dev, "failed to initialize host\n");
+			goto err4;
+		}
+
+		ret = dwc3_gadget_init(dwc);
+		if (ret) {
+			dev_err(&pdev->dev, "failed to initialize gadget\n");
+			goto err4;
+		}
+		break;
 	default:
 		dev_err(&pdev->dev, "Unsupported mode of operation %d\n", mode);
 		goto err4;
@@ -427,10 +448,16 @@
 
 err5:
 	switch (mode) {
-	case DWC3_MODE_DRD:
 	case DWC3_MODE_DEVICE:
 		dwc3_gadget_exit(dwc);
 		break;
+	case DWC3_MODE_HOST:
+		dwc3_host_exit(dwc);
+		break;
+	case DWC3_MODE_DRD:
+		dwc3_host_exit(dwc);
+		dwc3_gadget_exit(dwc);
+		break;
 	default:
 		/* do nothing */
 		break;
@@ -465,10 +492,16 @@
 	dwc3_debugfs_exit(dwc);
 
 	switch (dwc->mode) {
-	case DWC3_MODE_DRD:
 	case DWC3_MODE_DEVICE:
 		dwc3_gadget_exit(dwc);
 		break;
+	case DWC3_MODE_HOST:
+		dwc3_host_exit(dwc);
+		break;
+	case DWC3_MODE_DRD:
+		dwc3_host_exit(dwc);
+		dwc3_gadget_exit(dwc);
+		break;
 	default:
 		/* do nothing */
 		break;