usb: replace ehci_*_remove() with usb_deregister()
[oweals/u-boot.git] / drivers / usb / host / ehci-generic.c
1 /*
2  * Copyright (C) 2015 Alexey Brodkin <abrodkin@synopsys.com>
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <common.h>
8 #include <clk.h>
9 #include <asm/io.h>
10 #include <dm.h>
11 #include "ehci.h"
12
13 /*
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.
17  */
18 struct generic_ehci {
19         struct ehci_ctrl ctrl;
20 };
21
22 static int ehci_usb_probe(struct udevice *dev)
23 {
24         struct ehci_hccr *hccr;
25         struct ehci_hcor *hcor;
26         int i;
27
28         for (i = 0; ; i++) {
29                 struct clk clk;
30                 int ret;
31
32                 ret = clk_get_by_index(dev, i, &clk);
33                 if (ret < 0)
34                         break;
35                 if (clk_enable(&clk))
36                         printf("failed to enable clock %d\n", i);
37                 clk_free(&clk);
38         }
39
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)));
43
44         return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST);
45 }
46
47 static const struct udevice_id ehci_usb_ids[] = {
48         { .compatible = "generic-ehci" },
49         { }
50 };
51
52 U_BOOT_DRIVER(ehci_generic) = {
53         .name   = "ehci_generic",
54         .id     = UCLASS_USB,
55         .of_match = ehci_usb_ids,
56         .probe = ehci_usb_probe,
57         .remove = ehci_deregister,
58         .ops    = &ehci_usb_ops,
59         .priv_auto_alloc_size = sizeof(struct generic_ehci),
60         .flags  = DM_FLAG_ALLOC_PRIV_DMA,
61 };