Lines Matching +full:keystone +full:- +full:dwc3
1 // SPDX-License-Identifier: GPL-2.0
3 * Generic DWC3 Glue layer
5 * Copyright (C) 2016 - 2018 Xilinx, Inc.
7 * Based on dwc3-omap.c.
11 #include <asm-generic/io.h>
13 #include <dm/device-internal.h>
15 #include <dwc3-uboot.h>
40 struct dwc3 dwc3; member
55 struct dwc3 *dwc3 = &priv->dwc3; in dwc3_generic_probe() local
56 struct dwc3_glue_data *glue = dev_get_platdata(dev->parent); in dwc3_generic_probe()
58 dwc3->dev = dev; in dwc3_generic_probe()
59 dwc3->maximum_speed = plat->maximum_speed; in dwc3_generic_probe()
60 dwc3->dr_mode = plat->dr_mode; in dwc3_generic_probe()
62 dwc3_of_parse(dwc3); in dwc3_generic_probe()
69 if (device_is_compatible(dev->parent, "rockchip,rk3399-dwc3")) { in dwc3_generic_probe()
70 reset_assert_bulk(&glue->resets); in dwc3_generic_probe()
74 rc = dwc3_setup_phy(dev, &priv->phys, &priv->num_phys); in dwc3_generic_probe()
78 if (device_is_compatible(dev->parent, "rockchip,rk3399-dwc3")) in dwc3_generic_probe()
79 reset_deassert_bulk(&glue->resets); in dwc3_generic_probe()
81 priv->base = map_physmem(plat->base, DWC3_OTG_REGS_END, MAP_NOCACHE); in dwc3_generic_probe()
82 dwc3->regs = priv->base + DWC3_GLOBALS_REGS_START; in dwc3_generic_probe()
85 rc = dwc3_init(dwc3); in dwc3_generic_probe()
87 unmap_physmem(priv->base, MAP_NOCACHE); in dwc3_generic_probe()
97 struct dwc3 *dwc3 = &priv->dwc3; in dwc3_generic_remove() local
99 dwc3_remove(dwc3); in dwc3_generic_remove()
100 dwc3_shutdown_phy(dev, priv->phys, priv->num_phys); in dwc3_generic_remove()
101 unmap_physmem(dwc3->regs, MAP_NOCACHE); in dwc3_generic_remove()
109 ofnode node = dev->node; in dwc3_generic_ofdata_to_platdata()
111 plat->base = dev_read_addr(dev); in dwc3_generic_ofdata_to_platdata()
113 plat->maximum_speed = usb_get_maximum_speed(node); in dwc3_generic_ofdata_to_platdata()
114 if (plat->maximum_speed == USB_SPEED_UNKNOWN) { in dwc3_generic_ofdata_to_platdata()
116 plat->maximum_speed = USB_SPEED_SUPER; in dwc3_generic_ofdata_to_platdata()
119 plat->dr_mode = usb_get_dr_mode(node); in dwc3_generic_ofdata_to_platdata()
120 if (plat->dr_mode == USB_DR_MODE_UNKNOWN) { in dwc3_generic_ofdata_to_platdata()
122 return -ENODEV; in dwc3_generic_ofdata_to_platdata()
123 } else if (plat->dr_mode != USB_DR_MODE_HOST && in dwc3_generic_ofdata_to_platdata()
124 !strcmp(dev->driver->name, "dwc3-generic-host")) { in dwc3_generic_ofdata_to_platdata()
126 plat->dr_mode = USB_DR_MODE_HOST; in dwc3_generic_ofdata_to_platdata()
136 struct dwc3 *dwc3 = &priv->dwc3; in dm_usb_gadget_handle_interrupts() local
138 dwc3_gadget_uboot_handle_interrupt(dwc3); in dm_usb_gadget_handle_interrupts()
158 .name = "dwc3-generic-peripheral",
176 rc = dwc3_generic_probe(dev, &priv->gen_priv); in dwc3_generic_host_probe()
180 hccr = (struct xhci_hccr *)priv->gen_priv.base; in dwc3_generic_host_probe()
181 hcor = (struct xhci_hcor *)(priv->gen_priv.base + in dwc3_generic_host_probe()
182 HC_LENGTH(xhci_readl(&(hccr)->cr_capbase))); in dwc3_generic_host_probe()
196 return dwc3_generic_remove(dev, &priv->gen_priv); in dwc3_generic_host_remove()
200 .name = "dwc3-generic-host",
244 void *base = map_physmem(glue->regs, 0x10000, MAP_NOCACHE); in dwc3_ti_select_dr_mode()
246 if (device_is_compatible(dev, "ti,am437x-dwc3")) in dwc3_ti_select_dr_mode()
249 utmi_mode = dev_read_u32_default(dev, "utmi-mode", in dwc3_ti_select_dr_mode()
253 dev->name); in dwc3_ti_select_dr_mode()
306 ofnode_for_each_subnode(node, parent->node) { in dwc3_glue_bind()
320 driver = "dwc3-generic-host"; in dwc3_glue_bind()
326 driver = "dwc3-generic-peripheral"; in dwc3_glue_bind()
332 driver = "dwc3-generic-host"; in dwc3_glue_bind()
337 return -ENODEV; in dwc3_glue_bind()
360 ret = reset_get_bulk(dev, &glue->resets); in dwc3_glue_reset_init()
361 if (ret == -ENOTSUPP || ret == -ENOENT) in dwc3_glue_reset_init()
366 ret = reset_deassert_bulk(&glue->resets); in dwc3_glue_reset_init()
368 reset_release_bulk(&glue->resets); in dwc3_glue_reset_init()
380 ret = clk_get_bulk(dev, &glue->clks); in dwc3_glue_clk_init()
381 if (ret == -ENOSYS || ret == -ENOENT) in dwc3_glue_clk_init()
387 ret = clk_enable_bulk(&glue->clks); in dwc3_glue_clk_init()
389 clk_release_bulk(&glue->clks); in dwc3_glue_clk_init()
405 glue->regs = dev_read_addr(dev); in dwc3_glue_probe()
419 if (glue->resets.count < 1) { in dwc3_glue_probe()
428 dr_mode = usb_get_dr_mode(child->node); in dwc3_glue_probe()
430 if (ops && ops->select_dr_mode) in dwc3_glue_probe()
431 ops->select_dr_mode(dev, index, dr_mode); in dwc3_glue_probe()
442 reset_release_bulk(&glue->resets); in dwc3_glue_remove()
444 clk_release_bulk(&glue->clks); in dwc3_glue_remove()
450 { .compatible = "xlnx,zynqmp-dwc3" },
451 { .compatible = "ti,keystone-dwc3"},
452 { .compatible = "ti,dwc3", .data = (ulong)&ti_ops },
453 { .compatible = "ti,am437x-dwc3", .data = (ulong)&ti_ops },
454 { .compatible = "rockchip,rk3328-dwc3" },
455 { .compatible = "rockchip,rk3399-dwc3" },
460 .name = "dwc3-generic-wrapper",