value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value |= XPCS_WRAP_UPHY_RX_CONTROL_RX_SW_OVRD;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value &= ~XPCS_WRAP_UPHY_RX_CONTROL_RX_IDDQ;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value &= ~XPCS_WRAP_UPHY_RX_CONTROL_AUX_RX_IDDQ;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
usleep_range(10, 20); /* 50ns min delay needed as per HW design */
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value &= ~XPCS_WRAP_UPHY_RX_CONTROL_RX_SLEEP;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
usleep_range(10, 20); /* 500ns min delay needed as per HW design */
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value |= XPCS_WRAP_UPHY_RX_CONTROL_RX_CAL_EN;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
err = readl_poll_timeout(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL, value,
(value & XPCS_WRAP_UPHY_RX_CONTROL_RX_CAL_EN) == 0,
1000, 1000 * 2000); if (err < 0) {
dev_err(mgbe->dev, "timeout waiting for RX calibration to become enabled\n"); return err;
}
usleep_range(10, 20); /* 50ns min delay needed as per HW design */
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value |= XPCS_WRAP_UPHY_RX_CONTROL_RX_DATA_EN;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value &= ~XPCS_WRAP_UPHY_RX_CONTROL_RX_PCS_PHY_RDY;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
usleep_range(10, 20); /* 50ns min delay needed as per HW design */
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value |= XPCS_WRAP_UPHY_RX_CONTROL_RX_CDR_RESET;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
usleep_range(10, 20); /* 50ns min delay needed as per HW design */
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value |= XPCS_WRAP_UPHY_RX_CONTROL_RX_PCS_PHY_RDY;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
msleep(30); /* 30ms delay needed as per HW design */
value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
value &= ~XPCS_WRAP_UPHY_RX_CONTROL_RX_CDR_RESET;
writel(value, mgbe->xpcs + XPCS_WRAP_UPHY_RX_CONTROL);
err = readl_poll_timeout(mgbe->xpcs + XPCS_WRAP_IRQ_STATUS, value,
value & XPCS_WRAP_IRQ_STATUS_PCS_LINK_STS,
500, 500 * 2000); if (err < 0) {
dev_err(mgbe->dev, "timeout waiting for link to become ready\n"); return err;
}
/* clear status */
writel(value, mgbe->xpcs + XPCS_WRAP_IRQ_STATUS);
mgbe = devm_kzalloc(&pdev->dev, sizeof(*mgbe), GFP_KERNEL); if (!mgbe) return -ENOMEM;
mgbe->dev = &pdev->dev;
memset(&res, 0, sizeof(res));
irq = platform_get_irq(pdev, 0); if (irq < 0) return irq;
mgbe->hv = devm_platform_ioremap_resource_byname(pdev, "hypervisor"); if (IS_ERR(mgbe->hv)) return PTR_ERR(mgbe->hv);
mgbe->regs = devm_platform_ioremap_resource_byname(pdev, "mac"); if (IS_ERR(mgbe->regs)) return PTR_ERR(mgbe->regs);
mgbe->xpcs = devm_platform_ioremap_resource_byname(pdev, "xpcs"); if (IS_ERR(mgbe->xpcs)) return PTR_ERR(mgbe->xpcs);
/* get controller's stream id from iommu property in device tree */ if (!tegra_dev_iommu_get_stream_id(mgbe->dev, &mgbe->iommu_sid)) {
dev_err(mgbe->dev, "failed to get iommu stream id\n"); return -EINVAL;
}
res.addr = mgbe->regs;
res.irq = irq;
mgbe->clks = devm_kcalloc(&pdev->dev, ARRAY_SIZE(mgbe_clks), sizeof(*mgbe->clks), GFP_KERNEL); if (!mgbe->clks) return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(mgbe_clks); i++)
mgbe->clks[i].id = mgbe_clks[i];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.