for (i = 0; i < ROCKCHIP_NUM_PM_RSTS; i++)
rockchip->pm_rsts[i].id = rockchip_pci_pm_rsts[i];
err = devm_reset_control_bulk_get_exclusive(dev,
ROCKCHIP_NUM_PM_RSTS,
rockchip->pm_rsts); if (err) return dev_err_probe(dev, err, "Cannot get the PM reset\n");
for (i = 0; i < ROCKCHIP_NUM_CORE_RSTS; i++)
rockchip->core_rsts[i].id = rockchip_pci_core_rsts[i];
err = devm_reset_control_bulk_get_exclusive(dev,
ROCKCHIP_NUM_CORE_RSTS,
rockchip->core_rsts); if (err) return dev_err_probe(dev, err, "Cannot get the Core resets\n");
if (rockchip->is_rc)
rockchip->perst_gpio = devm_gpiod_get_optional(dev, "ep",
GPIOD_OUT_LOW); else
rockchip->perst_gpio = devm_gpiod_get_optional(dev, "reset",
GPIOD_IN); if (IS_ERR(rockchip->perst_gpio)) return dev_err_probe(dev, PTR_ERR(rockchip->perst_gpio), "failed to get PERST# GPIO\n");
rockchip->num_clks = devm_clk_bulk_get_all(dev, &rockchip->clks); if (rockchip->num_clks < 0) return dev_err_probe(dev, rockchip->num_clks, "failed to get clocks\n");
#define rockchip_pcie_read_addr(addr) rockchip_pcie_read(rockchip, addr) /* 100 ms max wait time for PHY PLLs to lock */ #define RK_PHY_PLL_LOCK_TIMEOUT_US 100000 /* Sleep should be less than 20ms */ #define RK_PHY_PLL_LOCK_SLEEP_US 1000
int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
{ struct device *dev = rockchip->dev; int err, i;
u32 regs;
for (i = 0; i < MAX_LANE_NUM; i++) {
err = phy_power_on(rockchip->phys[i]); if (err) {
dev_err(dev, "power on phy%d err %d\n", i, err); goto err_power_off_phy;
}
}
err = readx_poll_timeout(rockchip_pcie_read_addr,
PCIE_CLIENT_SIDE_BAND_STATUS,
regs, !(regs & PCIE_CLIENT_PHY_ST),
RK_PHY_PLL_LOCK_SLEEP_US,
RK_PHY_PLL_LOCK_TIMEOUT_US); if (err) {
dev_err(dev, "PHY PLLs could not lock, %d\n", err); goto err_power_off_phy;
}
void rockchip_pcie_deinit_phys(struct rockchip_pcie *rockchip)
{ int i;
for (i = 0; i < MAX_LANE_NUM; i++) { /* inactive lanes are already powered off */ if (rockchip->lanes_map & BIT(i))
phy_power_off(rockchip->phys[i]);
phy_exit(rockchip->phys[i]);
}
}
EXPORT_SYMBOL_GPL(rockchip_pcie_deinit_phys);
int rockchip_pcie_enable_clocks(struct rockchip_pcie *rockchip)
{ struct device *dev = rockchip->dev; int err;
err = clk_bulk_prepare_enable(rockchip->num_clks, rockchip->clks); if (err) return dev_err_probe(dev, err, "failed to enable clocks\n");
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.