149d67454SMichal Simek // SPDX-License-Identifier: GPL-2.0 249d67454SMichal Simek /* 349d67454SMichal Simek * Generic DWC3 Glue layer 449d67454SMichal Simek * 549d67454SMichal Simek * Copyright (C) 2016 - 2018 Xilinx, Inc. 649d67454SMichal Simek * 749d67454SMichal Simek * Based on dwc3-omap.c. 849d67454SMichal Simek */ 949d67454SMichal Simek 1049d67454SMichal Simek #include <common.h> 1193991cf1SJean-Jacques Hiblot #include <asm-generic/io.h> 1249d67454SMichal Simek #include <dm.h> 1349d67454SMichal Simek #include <dm/device-internal.h> 1449d67454SMichal Simek #include <dm/lists.h> 15446e3a20SJean-Jacques Hiblot #include <dwc3-uboot.h> 1649d67454SMichal Simek #include <linux/usb/ch9.h> 1749d67454SMichal Simek #include <linux/usb/gadget.h> 1849d67454SMichal Simek #include <malloc.h> 1949d67454SMichal Simek #include <usb.h> 2049d67454SMichal Simek #include "core.h" 2149d67454SMichal Simek #include "gadget.h" 22446e3a20SJean-Jacques Hiblot #include <reset.h> 23446e3a20SJean-Jacques Hiblot #include <clk.h> 2449d67454SMichal Simek 25687ab545SJean-Jacques Hiblot #if CONFIG_IS_ENABLED(DM_USB_GADGET) 26446e3a20SJean-Jacques Hiblot struct dwc3_generic_peripheral { 27446e3a20SJean-Jacques Hiblot struct dwc3 dwc3; 28446e3a20SJean-Jacques Hiblot struct phy *phys; 29446e3a20SJean-Jacques Hiblot int num_phys; 30446e3a20SJean-Jacques Hiblot fdt_addr_t base; 31446e3a20SJean-Jacques Hiblot }; 32446e3a20SJean-Jacques Hiblot 33ff8d7558SJean-Jacques Hiblot int dm_usb_gadget_handle_interrupts(struct udevice *dev) 3449d67454SMichal Simek { 35446e3a20SJean-Jacques Hiblot struct dwc3_generic_peripheral *priv = dev_get_priv(dev); 36446e3a20SJean-Jacques Hiblot struct dwc3 *dwc3 = &priv->dwc3; 3749d67454SMichal Simek 38446e3a20SJean-Jacques Hiblot dwc3_gadget_uboot_handle_interrupt(dwc3); 3949d67454SMichal Simek 4049d67454SMichal Simek return 0; 4149d67454SMichal Simek } 4249d67454SMichal Simek 4349d67454SMichal Simek static int dwc3_generic_peripheral_probe(struct udevice *dev) 4449d67454SMichal Simek { 45446e3a20SJean-Jacques Hiblot int rc; 46446e3a20SJean-Jacques Hiblot struct dwc3_generic_peripheral *priv = dev_get_priv(dev); 47446e3a20SJean-Jacques Hiblot struct dwc3 *dwc3 = &priv->dwc3; 4849d67454SMichal Simek 49446e3a20SJean-Jacques Hiblot rc = dwc3_setup_phy(dev, &priv->phys, &priv->num_phys); 50446e3a20SJean-Jacques Hiblot if (rc) 51446e3a20SJean-Jacques Hiblot return rc; 52446e3a20SJean-Jacques Hiblot 53446e3a20SJean-Jacques Hiblot dwc3->regs = map_physmem(priv->base, DWC3_OTG_REGS_END, MAP_NOCACHE); 54446e3a20SJean-Jacques Hiblot dwc3->regs += DWC3_GLOBALS_REGS_START; 55446e3a20SJean-Jacques Hiblot dwc3->dev = dev; 56446e3a20SJean-Jacques Hiblot 57446e3a20SJean-Jacques Hiblot rc = dwc3_init(dwc3); 58446e3a20SJean-Jacques Hiblot if (rc) { 59446e3a20SJean-Jacques Hiblot unmap_physmem(dwc3->regs, MAP_NOCACHE); 60446e3a20SJean-Jacques Hiblot return rc; 61446e3a20SJean-Jacques Hiblot } 62446e3a20SJean-Jacques Hiblot 63446e3a20SJean-Jacques Hiblot return 0; 6449d67454SMichal Simek } 6549d67454SMichal Simek 6649d67454SMichal Simek static int dwc3_generic_peripheral_remove(struct udevice *dev) 6749d67454SMichal Simek { 68446e3a20SJean-Jacques Hiblot struct dwc3_generic_peripheral *priv = dev_get_priv(dev); 69446e3a20SJean-Jacques Hiblot struct dwc3 *dwc3 = &priv->dwc3; 7049d67454SMichal Simek 71446e3a20SJean-Jacques Hiblot dwc3_remove(dwc3); 72446e3a20SJean-Jacques Hiblot dwc3_shutdown_phy(dev, priv->phys, priv->num_phys); 73446e3a20SJean-Jacques Hiblot unmap_physmem(dwc3->regs, MAP_NOCACHE); 7449d67454SMichal Simek 7549d67454SMichal Simek return 0; 7649d67454SMichal Simek } 7749d67454SMichal Simek 7849d67454SMichal Simek static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev) 7949d67454SMichal Simek { 80446e3a20SJean-Jacques Hiblot struct dwc3_generic_peripheral *priv = dev_get_priv(dev); 81446e3a20SJean-Jacques Hiblot struct dwc3 *dwc3 = &priv->dwc3; 8249d67454SMichal Simek int node = dev_of_offset(dev); 8349d67454SMichal Simek 84446e3a20SJean-Jacques Hiblot priv->base = devfdt_get_addr(dev); 8549d67454SMichal Simek 86446e3a20SJean-Jacques Hiblot dwc3->maximum_speed = usb_get_maximum_speed(node); 87446e3a20SJean-Jacques Hiblot if (dwc3->maximum_speed == USB_SPEED_UNKNOWN) { 8849d67454SMichal Simek pr_err("Invalid usb maximum speed\n"); 8949d67454SMichal Simek return -ENODEV; 9049d67454SMichal Simek } 9149d67454SMichal Simek 92446e3a20SJean-Jacques Hiblot dwc3->dr_mode = usb_get_dr_mode(node); 93446e3a20SJean-Jacques Hiblot if (dwc3->dr_mode == USB_DR_MODE_UNKNOWN) { 9449d67454SMichal Simek pr_err("Invalid usb mode setup\n"); 9549d67454SMichal Simek return -ENODEV; 9649d67454SMichal Simek } 9749d67454SMichal Simek 9849d67454SMichal Simek return 0; 9949d67454SMichal Simek } 10049d67454SMichal Simek 10149d67454SMichal Simek U_BOOT_DRIVER(dwc3_generic_peripheral) = { 10249d67454SMichal Simek .name = "dwc3-generic-peripheral", 10301311624SJean-Jacques Hiblot .id = UCLASS_USB_GADGET_GENERIC, 10449d67454SMichal Simek .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata, 10549d67454SMichal Simek .probe = dwc3_generic_peripheral_probe, 10649d67454SMichal Simek .remove = dwc3_generic_peripheral_remove, 107446e3a20SJean-Jacques Hiblot .priv_auto_alloc_size = sizeof(struct dwc3_generic_peripheral), 10849d67454SMichal Simek }; 109687ab545SJean-Jacques Hiblot #endif 11049d67454SMichal Simek 111446e3a20SJean-Jacques Hiblot struct dwc3_glue_data { 112446e3a20SJean-Jacques Hiblot struct clk_bulk clks; 113446e3a20SJean-Jacques Hiblot struct reset_ctl_bulk resets; 11493991cf1SJean-Jacques Hiblot fdt_addr_t regs; 11593991cf1SJean-Jacques Hiblot }; 11693991cf1SJean-Jacques Hiblot 11793991cf1SJean-Jacques Hiblot struct dwc3_glue_ops { 11893991cf1SJean-Jacques Hiblot void (*select_dr_mode)(struct udevice *dev, int index, 11993991cf1SJean-Jacques Hiblot enum usb_dr_mode mode); 120446e3a20SJean-Jacques Hiblot }; 121446e3a20SJean-Jacques Hiblot 122*d66e54acSJean-Jacques Hiblot void dwc3_ti_select_dr_mode(struct udevice *dev, int index, 123*d66e54acSJean-Jacques Hiblot enum usb_dr_mode mode) 124*d66e54acSJean-Jacques Hiblot { 125*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS 0x0084 126*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_OFFSET 0x0480 127*d66e54acSJean-Jacques Hiblot 128*d66e54acSJean-Jacques Hiblot /* UTMI_OTG_STATUS REGISTER */ 129*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_SW_MODE BIT(31) 130*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT BIT(9) 131*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_TXBITSTUFFENABLE BIT(8) 132*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_IDDIG BIT(4) 133*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_SESSEND BIT(3) 134*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_SESSVALID BIT(2) 135*d66e54acSJean-Jacques Hiblot #define USBOTGSS_UTMI_OTG_STATUS_VBUSVALID BIT(1) 136*d66e54acSJean-Jacques Hiblot enum dwc3_omap_utmi_mode { 137*d66e54acSJean-Jacques Hiblot DWC3_OMAP_UTMI_MODE_UNKNOWN = 0, 138*d66e54acSJean-Jacques Hiblot DWC3_OMAP_UTMI_MODE_HW, 139*d66e54acSJean-Jacques Hiblot DWC3_OMAP_UTMI_MODE_SW, 140*d66e54acSJean-Jacques Hiblot }; 141*d66e54acSJean-Jacques Hiblot 142*d66e54acSJean-Jacques Hiblot u32 use_id_pin; 143*d66e54acSJean-Jacques Hiblot u32 host_mode; 144*d66e54acSJean-Jacques Hiblot u32 reg; 145*d66e54acSJean-Jacques Hiblot u32 utmi_mode; 146*d66e54acSJean-Jacques Hiblot u32 utmi_status_offset = USBOTGSS_UTMI_OTG_STATUS; 147*d66e54acSJean-Jacques Hiblot 148*d66e54acSJean-Jacques Hiblot struct dwc3_glue_data *glue = dev_get_platdata(dev); 149*d66e54acSJean-Jacques Hiblot void *base = map_physmem(glue->regs, 0x10000, MAP_NOCACHE); 150*d66e54acSJean-Jacques Hiblot 151*d66e54acSJean-Jacques Hiblot if (device_is_compatible(dev, "ti,am437x-dwc3")) 152*d66e54acSJean-Jacques Hiblot utmi_status_offset += USBOTGSS_UTMI_OTG_OFFSET; 153*d66e54acSJean-Jacques Hiblot 154*d66e54acSJean-Jacques Hiblot utmi_mode = dev_read_u32_default(dev, "utmi-mode", 155*d66e54acSJean-Jacques Hiblot DWC3_OMAP_UTMI_MODE_UNKNOWN); 156*d66e54acSJean-Jacques Hiblot if (utmi_mode != DWC3_OMAP_UTMI_MODE_HW) { 157*d66e54acSJean-Jacques Hiblot debug("%s: OTG is not supported. defaulting to PERIPHERAL\n", 158*d66e54acSJean-Jacques Hiblot dev->name); 159*d66e54acSJean-Jacques Hiblot mode = USB_DR_MODE_PERIPHERAL; 160*d66e54acSJean-Jacques Hiblot } 161*d66e54acSJean-Jacques Hiblot 162*d66e54acSJean-Jacques Hiblot switch (mode) { 163*d66e54acSJean-Jacques Hiblot case USB_DR_MODE_PERIPHERAL: 164*d66e54acSJean-Jacques Hiblot use_id_pin = 0; 165*d66e54acSJean-Jacques Hiblot host_mode = 0; 166*d66e54acSJean-Jacques Hiblot break; 167*d66e54acSJean-Jacques Hiblot case USB_DR_MODE_HOST: 168*d66e54acSJean-Jacques Hiblot use_id_pin = 0; 169*d66e54acSJean-Jacques Hiblot host_mode = 1; 170*d66e54acSJean-Jacques Hiblot break; 171*d66e54acSJean-Jacques Hiblot case USB_DR_MODE_OTG: 172*d66e54acSJean-Jacques Hiblot default: 173*d66e54acSJean-Jacques Hiblot use_id_pin = 1; 174*d66e54acSJean-Jacques Hiblot host_mode = 0; 175*d66e54acSJean-Jacques Hiblot break; 176*d66e54acSJean-Jacques Hiblot } 177*d66e54acSJean-Jacques Hiblot 178*d66e54acSJean-Jacques Hiblot reg = readl(base + utmi_status_offset); 179*d66e54acSJean-Jacques Hiblot 180*d66e54acSJean-Jacques Hiblot reg &= ~(USBOTGSS_UTMI_OTG_STATUS_SW_MODE); 181*d66e54acSJean-Jacques Hiblot if (!use_id_pin) 182*d66e54acSJean-Jacques Hiblot reg |= USBOTGSS_UTMI_OTG_STATUS_SW_MODE; 183*d66e54acSJean-Jacques Hiblot 184*d66e54acSJean-Jacques Hiblot writel(reg, base + utmi_status_offset); 185*d66e54acSJean-Jacques Hiblot 186*d66e54acSJean-Jacques Hiblot reg &= ~(USBOTGSS_UTMI_OTG_STATUS_SESSEND | 187*d66e54acSJean-Jacques Hiblot USBOTGSS_UTMI_OTG_STATUS_VBUSVALID | 188*d66e54acSJean-Jacques Hiblot USBOTGSS_UTMI_OTG_STATUS_IDDIG); 189*d66e54acSJean-Jacques Hiblot 190*d66e54acSJean-Jacques Hiblot reg |= USBOTGSS_UTMI_OTG_STATUS_SESSVALID | 191*d66e54acSJean-Jacques Hiblot USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT; 192*d66e54acSJean-Jacques Hiblot 193*d66e54acSJean-Jacques Hiblot if (!host_mode) 194*d66e54acSJean-Jacques Hiblot reg |= USBOTGSS_UTMI_OTG_STATUS_IDDIG | 195*d66e54acSJean-Jacques Hiblot USBOTGSS_UTMI_OTG_STATUS_VBUSVALID; 196*d66e54acSJean-Jacques Hiblot 197*d66e54acSJean-Jacques Hiblot writel(reg, base + utmi_status_offset); 198*d66e54acSJean-Jacques Hiblot 199*d66e54acSJean-Jacques Hiblot unmap_physmem(base, MAP_NOCACHE); 200*d66e54acSJean-Jacques Hiblot } 201*d66e54acSJean-Jacques Hiblot 202*d66e54acSJean-Jacques Hiblot struct dwc3_glue_ops ti_ops = { 203*d66e54acSJean-Jacques Hiblot .select_dr_mode = dwc3_ti_select_dr_mode, 204*d66e54acSJean-Jacques Hiblot }; 205*d66e54acSJean-Jacques Hiblot 206446e3a20SJean-Jacques Hiblot static int dwc3_glue_bind(struct udevice *parent) 20749d67454SMichal Simek { 20849d67454SMichal Simek const void *fdt = gd->fdt_blob; 20949d67454SMichal Simek int node; 21049d67454SMichal Simek int ret; 21149d67454SMichal Simek 21249d67454SMichal Simek for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0; 21349d67454SMichal Simek node = fdt_next_subnode(fdt, node)) { 21449d67454SMichal Simek const char *name = fdt_get_name(fdt, node, NULL); 21549d67454SMichal Simek enum usb_dr_mode dr_mode; 21649d67454SMichal Simek struct udevice *dev; 217446e3a20SJean-Jacques Hiblot const char *driver = NULL; 21849d67454SMichal Simek 21949d67454SMichal Simek debug("%s: subnode name: %s\n", __func__, name); 22049d67454SMichal Simek 22149d67454SMichal Simek dr_mode = usb_get_dr_mode(node); 22249d67454SMichal Simek 22349d67454SMichal Simek switch (dr_mode) { 22449d67454SMichal Simek case USB_DR_MODE_PERIPHERAL: 22549d67454SMichal Simek case USB_DR_MODE_OTG: 226446e3a20SJean-Jacques Hiblot #if CONFIG_IS_ENABLED(DM_USB_GADGET) 22749d67454SMichal Simek debug("%s: dr_mode: OTG or Peripheral\n", __func__); 22849d67454SMichal Simek driver = "dwc3-generic-peripheral"; 229446e3a20SJean-Jacques Hiblot #endif 23049d67454SMichal Simek break; 23149d67454SMichal Simek case USB_DR_MODE_HOST: 23249d67454SMichal Simek debug("%s: dr_mode: HOST\n", __func__); 233446e3a20SJean-Jacques Hiblot driver = "xhci-dwc3"; 23449d67454SMichal Simek break; 23549d67454SMichal Simek default: 23649d67454SMichal Simek debug("%s: unsupported dr_mode\n", __func__); 23749d67454SMichal Simek return -ENODEV; 23849d67454SMichal Simek }; 23949d67454SMichal Simek 240446e3a20SJean-Jacques Hiblot if (!driver) 241446e3a20SJean-Jacques Hiblot continue; 242446e3a20SJean-Jacques Hiblot 24349d67454SMichal Simek ret = device_bind_driver_to_node(parent, driver, name, 24449d67454SMichal Simek offset_to_ofnode(node), &dev); 24549d67454SMichal Simek if (ret) { 24649d67454SMichal Simek debug("%s: not able to bind usb device mode\n", 24749d67454SMichal Simek __func__); 24849d67454SMichal Simek return ret; 24949d67454SMichal Simek } 25049d67454SMichal Simek } 25149d67454SMichal Simek 25249d67454SMichal Simek return 0; 25349d67454SMichal Simek } 25449d67454SMichal Simek 255446e3a20SJean-Jacques Hiblot static int dwc3_glue_reset_init(struct udevice *dev, 256446e3a20SJean-Jacques Hiblot struct dwc3_glue_data *glue) 257446e3a20SJean-Jacques Hiblot { 258446e3a20SJean-Jacques Hiblot int ret; 259446e3a20SJean-Jacques Hiblot 260446e3a20SJean-Jacques Hiblot ret = reset_get_bulk(dev, &glue->resets); 261446e3a20SJean-Jacques Hiblot if (ret == -ENOTSUPP) 262446e3a20SJean-Jacques Hiblot return 0; 263446e3a20SJean-Jacques Hiblot else if (ret) 264446e3a20SJean-Jacques Hiblot return ret; 265446e3a20SJean-Jacques Hiblot 266446e3a20SJean-Jacques Hiblot ret = reset_deassert_bulk(&glue->resets); 267446e3a20SJean-Jacques Hiblot if (ret) { 268446e3a20SJean-Jacques Hiblot reset_release_bulk(&glue->resets); 269446e3a20SJean-Jacques Hiblot return ret; 270446e3a20SJean-Jacques Hiblot } 271446e3a20SJean-Jacques Hiblot 272446e3a20SJean-Jacques Hiblot return 0; 273446e3a20SJean-Jacques Hiblot } 274446e3a20SJean-Jacques Hiblot 275446e3a20SJean-Jacques Hiblot static int dwc3_glue_clk_init(struct udevice *dev, 276446e3a20SJean-Jacques Hiblot struct dwc3_glue_data *glue) 277446e3a20SJean-Jacques Hiblot { 278446e3a20SJean-Jacques Hiblot int ret; 279446e3a20SJean-Jacques Hiblot 280446e3a20SJean-Jacques Hiblot ret = clk_get_bulk(dev, &glue->clks); 281446e3a20SJean-Jacques Hiblot if (ret == -ENOSYS) 282446e3a20SJean-Jacques Hiblot return 0; 283446e3a20SJean-Jacques Hiblot if (ret) 284446e3a20SJean-Jacques Hiblot return ret; 285446e3a20SJean-Jacques Hiblot 286446e3a20SJean-Jacques Hiblot #if CONFIG_IS_ENABLED(CLK) 287446e3a20SJean-Jacques Hiblot ret = clk_enable_bulk(&glue->clks); 288446e3a20SJean-Jacques Hiblot if (ret) { 289446e3a20SJean-Jacques Hiblot clk_release_bulk(&glue->clks); 290446e3a20SJean-Jacques Hiblot return ret; 291446e3a20SJean-Jacques Hiblot } 292446e3a20SJean-Jacques Hiblot #endif 293446e3a20SJean-Jacques Hiblot 294446e3a20SJean-Jacques Hiblot return 0; 295446e3a20SJean-Jacques Hiblot } 296446e3a20SJean-Jacques Hiblot 297446e3a20SJean-Jacques Hiblot static int dwc3_glue_probe(struct udevice *dev) 298446e3a20SJean-Jacques Hiblot { 29993991cf1SJean-Jacques Hiblot struct dwc3_glue_ops *ops = (struct dwc3_glue_ops *)dev_get_driver_data(dev); 300446e3a20SJean-Jacques Hiblot struct dwc3_glue_data *glue = dev_get_platdata(dev); 30193991cf1SJean-Jacques Hiblot struct udevice *child = NULL; 30293991cf1SJean-Jacques Hiblot int index = 0; 303446e3a20SJean-Jacques Hiblot int ret; 304446e3a20SJean-Jacques Hiblot 30593991cf1SJean-Jacques Hiblot glue->regs = dev_read_addr(dev); 30693991cf1SJean-Jacques Hiblot 307446e3a20SJean-Jacques Hiblot ret = dwc3_glue_clk_init(dev, glue); 308446e3a20SJean-Jacques Hiblot if (ret) 309446e3a20SJean-Jacques Hiblot return ret; 310446e3a20SJean-Jacques Hiblot 311446e3a20SJean-Jacques Hiblot ret = dwc3_glue_reset_init(dev, glue); 312446e3a20SJean-Jacques Hiblot if (ret) 313446e3a20SJean-Jacques Hiblot return ret; 314446e3a20SJean-Jacques Hiblot 31593991cf1SJean-Jacques Hiblot ret = device_find_first_child(dev, &child); 31693991cf1SJean-Jacques Hiblot if (ret) 31793991cf1SJean-Jacques Hiblot return ret; 31893991cf1SJean-Jacques Hiblot 31993991cf1SJean-Jacques Hiblot while (child) { 32093991cf1SJean-Jacques Hiblot enum usb_dr_mode dr_mode; 32193991cf1SJean-Jacques Hiblot 32293991cf1SJean-Jacques Hiblot dr_mode = usb_get_dr_mode(dev_of_offset(child)); 32393991cf1SJean-Jacques Hiblot device_find_next_child(&child); 32493991cf1SJean-Jacques Hiblot if (ops && ops->select_dr_mode) 32593991cf1SJean-Jacques Hiblot ops->select_dr_mode(dev, index, dr_mode); 32693991cf1SJean-Jacques Hiblot index++; 32793991cf1SJean-Jacques Hiblot } 32893991cf1SJean-Jacques Hiblot 329446e3a20SJean-Jacques Hiblot return 0; 330446e3a20SJean-Jacques Hiblot } 331446e3a20SJean-Jacques Hiblot 332446e3a20SJean-Jacques Hiblot static int dwc3_glue_remove(struct udevice *dev) 333446e3a20SJean-Jacques Hiblot { 334446e3a20SJean-Jacques Hiblot struct dwc3_glue_data *glue = dev_get_platdata(dev); 335446e3a20SJean-Jacques Hiblot 336446e3a20SJean-Jacques Hiblot reset_release_bulk(&glue->resets); 337446e3a20SJean-Jacques Hiblot 338446e3a20SJean-Jacques Hiblot clk_release_bulk(&glue->clks); 339446e3a20SJean-Jacques Hiblot 340446e3a20SJean-Jacques Hiblot return dm_scan_fdt_dev(dev); 341446e3a20SJean-Jacques Hiblot } 342446e3a20SJean-Jacques Hiblot 343446e3a20SJean-Jacques Hiblot static const struct udevice_id dwc3_glue_ids[] = { 34449d67454SMichal Simek { .compatible = "xlnx,zynqmp-dwc3" }, 345*d66e54acSJean-Jacques Hiblot { .compatible = "ti,dwc3", .data = (ulong)&ti_ops }, 34649d67454SMichal Simek { } 34749d67454SMichal Simek }; 34849d67454SMichal Simek 34949d67454SMichal Simek U_BOOT_DRIVER(dwc3_generic_wrapper) = { 35049d67454SMichal Simek .name = "dwc3-generic-wrapper", 35149d67454SMichal Simek .id = UCLASS_MISC, 352446e3a20SJean-Jacques Hiblot .of_match = dwc3_glue_ids, 353446e3a20SJean-Jacques Hiblot .bind = dwc3_glue_bind, 354446e3a20SJean-Jacques Hiblot .probe = dwc3_glue_probe, 355446e3a20SJean-Jacques Hiblot .remove = dwc3_glue_remove, 356446e3a20SJean-Jacques Hiblot .platdata_auto_alloc_size = sizeof(struct dwc3_glue_data), 357446e3a20SJean-Jacques Hiblot 35849d67454SMichal Simek }; 359