2 * Copyright (C) 2015 Alexey Brodkin <abrodkin@synopsys.com>
4 * SPDX-License-Identifier: GPL-2.0+
14 * Even though here we don't explicitly use "struct ehci_ctrl"
15 * ehci_register() expects it to be the first thing that resides in
16 * device's private data.
19 struct ehci_ctrl ctrl;
22 static int ehci_usb_probe(struct udevice *dev)
24 struct ehci_hccr *hccr;
25 struct ehci_hcor *hcor;
29 struct udevice *clk_dev;
32 clk_id = clk_get_by_index(dev, i, &clk_dev);
35 if (clk_enable(clk_dev, clk_id))
36 printf("failed to enable clock (dev=%s, id=%d)\n",
37 clk_dev->name, clk_id);
40 hccr = map_physmem(dev_get_addr(dev), 0x100, MAP_NOCACHE);
41 hcor = (struct ehci_hcor *)((uintptr_t)hccr +
42 HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
44 return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST);
47 static int ehci_usb_remove(struct udevice *dev)
49 return ehci_deregister(dev);
52 static const struct udevice_id ehci_usb_ids[] = {
53 { .compatible = "generic-ehci" },
57 U_BOOT_DRIVER(ehci_generic) = {
58 .name = "ehci_generic",
60 .of_match = ehci_usb_ids,
61 .probe = ehci_usb_probe,
62 .remove = ehci_usb_remove,
64 .priv_auto_alloc_size = sizeof(struct generic_ehci),
65 .flags = DM_FLAG_ALLOC_PRIV_DMA,