]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
drivers: usb: Add DWC3 Xilinx ZynqMP glue logic
authorMichal Simek <michal.simek@xilinx.com>
Thu, 31 Mar 2016 11:53:58 +0000 (13:53 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 11 Jan 2017 13:10:38 +0000 (14:10 +0100)
By enabling BLK by default this is the next driver which needs to get
support for DM_USB. Adding generic DWC3 glue logic which only
parse nodes and read device mode. Based on it probe proper
host/peripheral DWC3 drivers for it.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
16 files changed:
arch/arm/dts/zynqmp-zcu100-revA.dts
arch/arm/dts/zynqmp-zcu100.dts
board/xilinx/zynqmp/zynqmp.c
configs/xilinx_zynqmp_ep_defconfig
configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
configs/xilinx_zynqmp_zcu100_defconfig
configs/xilinx_zynqmp_zcu100_revA_defconfig
configs/xilinx_zynqmp_zcu102_defconfig
configs/xilinx_zynqmp_zcu102_revB_defconfig
configs/xilinx_zynqmp_zcu106_defconfig
drivers/usb/dwc3/Kconfig
drivers/usb/dwc3/Makefile
drivers/usb/dwc3/dwc3-generic.c [new file with mode: 0644]
drivers/usb/host/xhci-zynqmp.c

index 053b7985b145b21e61470db85fb4d87c9b3bdedb..11c7b6b2facaba0b6f5ef568e57aee4b9b97aa8b 100644 (file)
        dr_mode = "peripheral";
 /*     phy-names = "usb3-phy";
        phys = <&lane2 PHY_TYPE_USB3 0 0 26000000>; */
+       maximum-speed = "high-speed"; /* super-speed */
 };
 
 /* ULPI SMSC USB3320 */
        dr_mode = "host";
 /*     phy-names = "usb3-phy";
        phys = <&lane3 PHY_TYPE_USB3 1 0 26000000>; */
+       maximum-speed = "high-speed"; /* super-speed */
 };
 
 &xilinx_drm {
index 0c4d2c6f95c53afd5e57f17ef6467e5de464c271..761a92586ba495ed2dfeab73a2e4e2046fa31abd 100644 (file)
        dr_mode = "peripheral";
 /*     phy-names = "usb3-phy";
        phys = <&lane2 PHY_TYPE_USB3 0 0 26000000>; */
+       maximum-speed = "high-speed"; /* super-speed */
 };
 
 /* ULPI SMSC USB3320 */
        dr_mode = "host";
 /*     phy-names = "usb3-phy";
        phys = <&lane3 PHY_TYPE_USB3 1 0 26000000>; */
+       maximum-speed = "high-speed"; /* super-speed */
 };
 
 &xilinx_drm {
index b7ceb3a736e54092a6c09221c20ef380fdfd21ad..d5747037b63c19efc66003309239def2779097a2 100644 (file)
@@ -318,56 +318,3 @@ int checkboard(void)
        puts("Board: Xilinx ZynqMP\n");
        return 0;
 }
-
-#ifndef CONFIG_DM_USB
-#ifdef CONFIG_USB_DWC3
-static struct dwc3_device dwc3_device_data0 = {
-       .maximum_speed = USB_SPEED_HIGH,
-       .base = ZYNQMP_USB0_XHCI_BASEADDR,
-       .dr_mode = USB_DR_MODE_PERIPHERAL,
-       .index = 0,
-};
-
-static struct dwc3_device dwc3_device_data1 = {
-       .maximum_speed = USB_SPEED_HIGH,
-       .base = ZYNQMP_USB1_XHCI_BASEADDR,
-       .dr_mode = USB_DR_MODE_PERIPHERAL,
-       .index = 1,
-};
-
-int usb_gadget_handle_interrupts(int index)
-{
-       dwc3_uboot_handle_interrupt(index);
-       return 0;
-}
-
-int board_usb_init(int index, enum usb_init_type init)
-{
-       debug("%s: index %x\n", __func__, index);
-
-#if defined(CONFIG_USB_GADGET_DOWNLOAD)
-       g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME);
-#endif
-
-       switch (index) {
-       case 0:
-               return dwc3_uboot_init(&dwc3_device_data0);
-       case 1:
-               return dwc3_uboot_init(&dwc3_device_data1);
-       };
-
-       return -1;
-}
-
-int board_usb_cleanup(int index, enum usb_init_type init)
-{
-       dwc3_uboot_exit(index);
-       return 0;
-}
-#endif
-#else
-int usb_gadget_handle_interrupts(int index)
-{
-       return 0;
-}
-#endif
index d7d17a71b2d5c82a1b8bc5992f0acc708ef6ed84..b072a185347665f8dcf03bb3328be29a7cf957e4 100644 (file)
@@ -57,6 +57,7 @@ CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_CADENCE=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_NAND_ARASAN=y
@@ -78,6 +79,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DOWNLOAD=y
index f51641c56bca4d68332e9678870735ec2c658b03..c6ab84083756551d735317c931a7773c1d31a399 100644 (file)
@@ -48,6 +48,7 @@ CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_CADENCE=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_DM_SPI_FLASH=y
@@ -68,6 +69,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index e8a587f204e94ea8e73cc647986f7657e4a03acf..1cb1af820d8306c06cd61ec929b59db053a4df67 100644 (file)
@@ -49,6 +49,7 @@ CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_CADENCE=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_NAND_ARASAN=y
 CONFIG_SPI_FLASH=y
@@ -66,6 +67,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index ffb1c9478a31f9eb0383095900debdc803e54397..707436803527e35726e40a6698bdba14c91f61c9 100644 (file)
@@ -40,11 +40,13 @@ CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_CADENCE=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_NAND_ARASAN=y
@@ -60,6 +62,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index 6604e77989d4adb3a277e690ee71b3f82ce7a691..ed5368f47d46e0df703eee621770937436d3fb46 100644 (file)
@@ -41,9 +41,11 @@ CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_DM_SPI_FLASH=y
@@ -64,6 +66,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index ac8a3b76c63f354e970e7453a61bed00a2add340..26d09ec17b35453269383acc9b949565a02e5c52 100644 (file)
@@ -43,9 +43,11 @@ CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_DM_SPI_FLASH=y
@@ -65,6 +67,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index b57bc281fb87ce8c857ca2eeb2a5f88e222d38d7..986f70e006abf5f168df94a64d839765a07deb04 100644 (file)
@@ -48,6 +48,7 @@ CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_DM_SPI_FLASH=y
@@ -68,6 +69,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index f99bdd431ebd0e26a7a20083f5dfd5f1cdb30a1a..cb99454e3c4c48c015cc88315985d34d3f207049 100644 (file)
@@ -47,6 +47,7 @@ CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_DM_SPI_FLASH=y
@@ -67,6 +68,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index dbff165c068bac22a26b47a317a355e644feb6eb..0da63bf89953e92faf6598c51e6dcc1f32c09e29 100644 (file)
@@ -41,9 +41,11 @@ CONFIG_OF_EMBED=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQMPPL=y
 CONFIG_DM_GPIO=y
+CONFIG_MISC=y
 CONFIG_DM_MMC=y
 CONFIG_ZYNQ_SDHCI=y
 CONFIG_DM_SPI_FLASH=y
@@ -64,6 +66,7 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
index e93398fe7c1c3c231857ce62f4580ca580a414ef..89357e48f3f13624eb243a26e80109223d1c72c9 100644 (file)
@@ -37,6 +37,12 @@ config USB_DWC3_OMAP
 
          Say 'Y' here if you have one such device
 
+config USB_DWC3_GENERIC
+       bool "Xilinx ZynqMP and similar Platforms"
+       depends on DM_USB && USB_DWC3
+       help
+         Some platforms can reuse this DWC3 generic implementation.
+
 menu "PHY Subsystem"
 
 config USB_DWC3_PHY_OMAP
index 2964bae0d8f4b7245a9faca3595543f7f096a5e4..e7d9181592829a984ea7b205b4d603c37af2b594 100644 (file)
@@ -9,5 +9,6 @@ dwc3-y                                  := core.o
 obj-$(CONFIG_USB_DWC3_GADGET)          += gadget.o ep0.o
 
 obj-$(CONFIG_USB_DWC3_OMAP)            += dwc3-omap.o
+obj-$(CONFIG_USB_DWC3_GENERIC)         += dwc3-generic.o
 obj-$(CONFIG_USB_DWC3_PHY_OMAP)                += ti_usb_phy.o
 obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG)     += samsung_usb_phy.o
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
new file mode 100644 (file)
index 0000000..a372cbb
--- /dev/null
@@ -0,0 +1,158 @@
+/**
+ * dwc3-generic.c - Generic DWC3 Glue layer
+ *
+ * Copyright (C) 2016 Xilinx, Inc.
+ *
+ * Based on dwc3-omap.c.
+ *
+ * SPDX-License-Identifier:     GPL-2.0
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+#include <linux/usb/otg.h>
+#include <linux/compat.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+#include <malloc.h>
+#include <usb.h>
+#include "core.h"
+#include "gadget.h"
+#include "linux-compat.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int usb_gadget_handle_interrupts(int index)
+{
+       struct dwc3 *priv;
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
+       if (!dev || ret) {
+               error("No USB device found\n");
+               return -ENODEV;
+       }
+
+       priv = dev_get_priv(dev);
+
+       dwc3_gadget_uboot_handle_interrupt(priv);
+
+       return 0;
+}
+
+static int dwc3_generic_peripheral_probe(struct udevice *dev)
+{
+       struct dwc3 *priv = dev_get_priv(dev);
+
+       return dwc3_init(priv);
+}
+
+static int dwc3_generic_peripheral_remove(struct udevice *dev)
+{
+       struct dwc3 *priv = dev_get_priv(dev);
+
+       dwc3_remove(priv);
+
+       return 0;
+}
+
+static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
+{
+       struct dwc3 *priv = dev_get_priv(dev);
+       int node = dev->of_offset;
+
+       priv->regs = (void *)dev_get_addr(dev);
+       priv->regs += DWC3_GLOBALS_REGS_START;
+
+       priv->maximum_speed = usb_get_maximum_speed(node);
+       if (priv->maximum_speed < 0) {
+               error("Invalid usb maximum speed\n");
+               return priv->maximum_speed;
+       }
+
+       priv->dr_mode = USB_DR_MODE_PERIPHERAL;
+
+       return 0;
+}
+
+static int dwc3_generic_peripheral_bind(struct udevice *dev)
+{
+       return device_probe(dev);
+}
+
+U_BOOT_DRIVER(dwc3_generic_peripheral) = {
+       .name   = "dwc3-generic-peripheral",
+       .id     = UCLASS_USB_DEV_GENERIC,
+       .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
+       .probe = dwc3_generic_peripheral_probe,
+       .remove = dwc3_generic_peripheral_remove,
+       .bind = dwc3_generic_peripheral_bind,
+       .platdata_auto_alloc_size = sizeof(struct usb_platdata),
+       .priv_auto_alloc_size = sizeof(struct dwc3),
+       .flags  = DM_FLAG_ALLOC_PRIV_DMA,
+};
+
+static int dwc3_generic_bind(struct udevice *parent)
+{
+       const void *fdt = gd->fdt_blob;
+       int node;
+       int ret;
+
+       for (node = fdt_first_subnode(fdt, parent->of_offset); node > 0;
+            node = fdt_next_subnode(fdt, node)) {
+               const char *name = fdt_get_name(fdt, node, NULL);
+               enum usb_dr_mode dr_mode;
+               struct udevice *dev;
+
+               debug("%s: subnode name: %s\n", __func__, name);
+               if (strncmp(name, "dwc3@", 4))
+                       continue;
+
+               dr_mode = usb_get_dr_mode(node);
+
+               switch (dr_mode) {
+               case USB_DR_MODE_PERIPHERAL:
+               case USB_DR_MODE_OTG:
+                       debug("%s: dr_mode: OTG or Peripheral\n", __func__);
+                       ret = device_bind_driver_to_node(parent,
+                                                        "dwc3-generic-peripheral",
+                                                        name, node, &dev);
+                       if (ret) {
+                               debug("%s: not able to bind usb device mode\n",
+                                     __func__);
+                               return ret;
+                       }
+                       break;
+               case USB_DR_MODE_HOST:
+                       debug("%s: dr_mode: HOST\n", __func__);
+                       ret = device_bind_driver_to_node(parent,
+                                                        "dwc3-generic-host",
+                                                        name, node, &dev);
+                       if (ret) {
+                               debug("%s: not able to bind usb host mode\n",
+                                     __func__);
+                               return ret;
+                       }
+                       break;
+               default:
+                       break;
+               };
+       }
+
+       return 0;
+}
+
+static const struct udevice_id dwc3_generic_ids[] = {
+       { .compatible = "xlnx,zynqmp-dwc3" },
+       { }
+};
+
+U_BOOT_DRIVER(dwc3_generic_wrapper) = {
+       .name   = "dwc3-generic-wrapper",
+       .id     = UCLASS_MISC,
+       .of_match = dwc3_generic_ids,
+       .bind = dwc3_generic_bind,
+};
index cec1bc46d0a8de7699ea90d93c02184e8a64651d..09753ebab54c49b41c36cfcd683c949d16d17c13 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <usb.h>
 #include <linux/errno.h>
 #include <asm/arch-zynqmp/hardware.h>
@@ -57,13 +58,23 @@ DECLARE_GLOBAL_DATA_PTR;
 #define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN    BIT(17)
 
 struct zynqmp_xhci {
+#ifdef CONFIG_DM_USB
+       struct usb_platdata usb_plat;
+#endif
+       struct xhci_ctrl ctrl;
        struct xhci_hccr *hcd;
        struct dwc3 *dwc3_reg;
 };
 
+#ifdef CONFIG_DM_USB
+struct zynqmp_xhci_platdata {
+       fdt_addr_t hcd_base;
+};
+#else
 static struct zynqmp_xhci zynqmp_xhci;
 
 unsigned long ctr_addr[] = CONFIG_ZYNQMP_XHCI_LIST;
+#endif
 
 static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
 {
@@ -81,6 +92,7 @@ static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
        return ret;
 }
 
+#ifndef CONFIG_DM_USB
 int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
 {
        struct zynqmp_xhci *ctx = &zynqmp_xhci;
@@ -114,6 +126,7 @@ int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
 
        return ret;
 }
+#endif
 
 void xhci_hcd_stop(int index)
 {
@@ -124,3 +137,60 @@ void xhci_hcd_stop(int index)
 
        return;
 }
+
+#ifdef CONFIG_DM_USB
+static int xhci_usb_probe(struct udevice *dev)
+{
+       struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
+       struct zynqmp_xhci *ctx = dev_get_priv(dev);
+       struct xhci_hcor *hcor;
+       int ret;
+
+       ctx->hcd = (struct xhci_hccr *)plat->hcd_base;
+       ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET);
+
+       ret = zynqmp_xhci_core_init(ctx);
+       if (ret) {
+               puts("XHCI: failed to initialize controller\n");
+               return -EINVAL;
+       }
+
+       hcor = (struct xhci_hcor *)((ulong)ctx->hcd +
+                                 HC_LENGTH(xhci_readl(&ctx->hcd->cr_capbase)));
+
+
+       return xhci_register(dev, ctx->hcd, hcor);
+}
+
+static int xhci_usb_remove(struct udevice *dev)
+{
+       return xhci_deregister(dev);
+}
+
+static int xhci_usb_ofdata_to_platdata(struct udevice *dev)
+{
+       struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
+       const void *blob = gd->fdt_blob;
+
+       /* Get the base address for XHCI controller from the device node */
+       plat->hcd_base = fdtdec_get_addr(blob, dev->of_offset, "reg");
+       if (plat->hcd_base == FDT_ADDR_T_NONE) {
+               debug("Can't get the XHCI register base address\n");
+               return -ENXIO;
+       }
+
+       return 0;
+}
+
+U_BOOT_DRIVER(dwc3_generic_host) = {
+       .name   = "dwc3-generic-host",
+       .id     = UCLASS_USB,
+       .ofdata_to_platdata = xhci_usb_ofdata_to_platdata,
+       .probe = xhci_usb_probe,
+       .remove = xhci_usb_remove,
+       .ops    = &xhci_usb_ops,
+       .platdata_auto_alloc_size = sizeof(struct zynqmp_xhci_platdata),
+       .priv_auto_alloc_size = sizeof(struct zynqmp_xhci),
+       .flags  = DM_FLAG_ALLOC_PRIV_DMA,
+};
+#endif