/** * struct mvebu_a3700_utmi_caps - PHY capabilities * * @usb32: Flag indicating which PHY is in use (impacts the register map): * - The UTMI PHY wired to the USB3/USB2 controller (otg) * - The UTMI PHY wired to the USB2 controller (host only) * @ops: PHY operations
*/ struct mvebu_a3700_utmi_caps { int usb32; conststruct phy_ops *ops;
};
/* Wait for PLL calibration */
ret = readl_poll_timeout(utmi->regs + USB2_PHY_CAL_CTRL, reg,
reg & PHY_PLLCAL_DONE,
PLL_LOCK_DELAY_US, PLL_LOCK_TIMEOUT_US); if (ret) {
dev_err(dev, "Failed to end USB2 PLL calibration\n"); return ret;
}
/* Wait for impedance calibration */
ret = readl_poll_timeout(utmi->regs + USB2_PHY_CAL_CTRL, reg,
reg & PHY_IMPCAL_DONE,
PLL_LOCK_DELAY_US, PLL_LOCK_TIMEOUT_US); if (ret) {
dev_err(dev, "Failed to end USB2 impedance calibration\n"); return ret;
}
/* Wait for squelch calibration */
ret = readl_poll_timeout(utmi->regs + USB2_RX_CHAN_CTRL1, reg,
reg & USB2PHY_SQCAL_DONE,
PLL_LOCK_DELAY_US, PLL_LOCK_TIMEOUT_US); if (ret) {
dev_err(dev, "Failed to end USB2 unknown calibration\n"); return ret;
}
/* Wait for PLL to be locked */
ret = readl_poll_timeout(utmi->regs + USB2_PHY_PLL_CTRL_REG0, reg,
reg & PLL_READY,
PLL_LOCK_DELAY_US, PLL_LOCK_TIMEOUT_US); if (ret)
dev_err(dev, "Failed to lock USB2 PLL\n");
utmi = devm_kzalloc(dev, sizeof(*utmi), GFP_KERNEL); if (!utmi) return -ENOMEM;
/* Get UTMI memory region */
utmi->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(utmi->regs)) return PTR_ERR(utmi->regs);
/* Get miscellaneous Host/PHY region */
utmi->usb_misc = syscon_regmap_lookup_by_phandle(dev->of_node, "marvell,usb-misc-reg"); if (IS_ERR(utmi->usb_misc)) {
dev_err(dev, "Missing USB misc purpose system controller\n"); return PTR_ERR(utmi->usb_misc);
}
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.