int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor) { struct fsl_xhci *ctx = &fsl_xhci; int ret = 0; ctx->hcd = (struct xhci_hccr *)ctr_addr[index]; ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET); ret = board_usb_init(index, USB_INIT_HOST); if (ret != 0) { puts("Failed to initialize board for USB\n"); return ret; } fsl_apply_xhci_errata(); ret = fsl_xhci_core_init(ctx); if (ret < 0) { puts("Failed to initialize xhci\n"); return ret; } *hccr = (struct xhci_hccr *)ctx->hcd; *hcor = (struct xhci_hcor *)((uintptr_t) *hccr + HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase))); debug("fsl-xhci: init hccr %lx and hcor %lx hc_length %lx\n", (uintptr_t)*hccr, (uintptr_t)*hcor, (uintptr_t)HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase))); return ret; }
int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor) { struct fsl_xhci *ctx = &fsl_xhci; int ret = 0; switch (index) { case 0: ctx->hcd = (struct xhci_hccr *)CONFIG_SYS_FSL_XHCI_USB1_ADDR; break; case 1: ctx->hcd = (struct xhci_hccr *)CONFIG_SYS_FSL_XHCI_USB2_ADDR; break; default: printf("ERROR: wrong controller index!!\n"); break; }; ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET); ret = fsl_xhci_core_init(ctx); if (ret < 0) { puts("Failed to initialize xhci\n"); return ret; } *hccr = (ctx->hcd); *hcor = (struct xhci_hcor *)((uintptr_t) *hccr + HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase))); debug("fsl-xhci: init hccr %lu and hcor %lu hc_length %d\n", (uintptr_t)*hccr, (uintptr_t)*hcor, (uint32_t)HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase))); return ret; }
static int xhci_fsl_probe(struct udevice *dev) { struct xhci_fsl_priv *priv = dev_get_priv(dev); struct xhci_hccr *hccr; struct xhci_hcor *hcor; int ret = 0; /* * Get the base address for XHCI controller from the device node */ priv->hcd_base = devfdt_get_addr(dev); if (priv->hcd_base == FDT_ADDR_T_NONE) { debug("Can't get the XHCI register base address\n"); return -ENXIO; } priv->ctx.hcd = (struct xhci_hccr *)priv->hcd_base; priv->ctx.dwc3_reg = (struct dwc3 *)((char *)(priv->hcd_base) + DWC3_REG_OFFSET); fsl_apply_xhci_errata(); ret = fsl_xhci_core_init(&priv->ctx); if (ret < 0) { puts("Failed to initialize xhci\n"); return ret; } hccr = (struct xhci_hccr *)(priv->ctx.hcd); hcor = (struct xhci_hcor *)((uintptr_t) hccr + HC_LENGTH(xhci_readl(&hccr->cr_capbase))); debug("xhci-fsl: init hccr %lx and hcor %lx hc_length %lx\n", (uintptr_t)hccr, (uintptr_t)hcor, (uintptr_t)HC_LENGTH(xhci_readl(&hccr->cr_capbase))); return xhci_register(dev, hccr, hcor); }