X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fusb%2Fhost%2Fehci-generic.c;h=2190adba6777d849525efdf165ffed882cfd001a;hb=57ca63b86e5987029cd4970890aa28602ba50856;hp=1292caae4d722dc7cb15f738a02e81fe36c5a1bb;hpb=25ef4bea59dadbd25dec1dbb376ed84dfc735f02;p=u-boot diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index 1292caae4d..2190adba67 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -5,6 +5,9 @@ */ #include +#include +#include +#include #include #include "ehci.h" @@ -19,20 +22,41 @@ struct generic_ehci { static int ehci_usb_probe(struct udevice *dev) { - struct ehci_hccr *hccr = (struct ehci_hccr *)dev_get_addr(dev); + struct ehci_hccr *hccr; struct ehci_hcor *hcor; + int i; + for (i = 0; ; i++) { + struct clk clk; + int ret; + + ret = clk_get_by_index(dev, i, &clk); + if (ret < 0) + break; + if (clk_enable(&clk)) + printf("failed to enable clock %d\n", i); + clk_free(&clk); + } + + for (i = 0; ; i++) { + struct reset_ctl reset; + int ret; + + ret = reset_get_by_index(dev, i, &reset); + if (ret < 0) + break; + if (reset_deassert(&reset)) + printf("failed to deassert reset %d\n", i); + reset_free(&reset); + } + + hccr = map_physmem(dev_get_addr(dev), 0x100, MAP_NOCACHE); hcor = (struct ehci_hcor *)((uintptr_t)hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST); } -static int ehci_usb_remove(struct udevice *dev) -{ - return ehci_deregister(dev); -} - static const struct udevice_id ehci_usb_ids[] = { { .compatible = "generic-ehci" }, { } @@ -43,7 +67,7 @@ U_BOOT_DRIVER(ehci_generic) = { .id = UCLASS_USB, .of_match = ehci_usb_ids, .probe = ehci_usb_probe, - .remove = ehci_usb_remove, + .remove = ehci_deregister, .ops = &ehci_usb_ops, .priv_auto_alloc_size = sizeof(struct generic_ehci), .flags = DM_FLAG_ALLOC_PRIV_DMA,