/* Actually We don't care EP/RC mode, but just record it */ switch (submode) { case PHY_MODE_PCIE_RC:
priv->mode = PHY_MODE_PCIE_RC; break; case PHY_MODE_PCIE_EP:
priv->mode = PHY_MODE_PCIE_EP; break; default:
dev_err(&phy->dev, "%s, invalid mode\n", __func__); return -EINVAL;
}
for (int i = 0; i < priv->num_lanes; i++) {
dev_info(&phy->dev, "lane number %d, val %d\n", i, priv->lanes[i]); if (priv->lanes[i] > 1)
bifurcation = true;
}
/* Set bifurcation if needed, and it doesn't care RC/EP */ if (bifurcation) {
dev_info(&phy->dev, "bifurcation enabled\n");
regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON6,
GRF_PCIE30PHY_WR_EN | RK3568_BIFURCATION_LANE_0_1);
regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON1,
GRF_PCIE30PHY_DA_OCM);
} else {
dev_dbg(&phy->dev, "bifurcation disabled\n");
regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON6,
GRF_PCIE30PHY_WR_EN & ~RK3568_BIFURCATION_LANE_0_1);
}
reset_control_deassert(priv->p30phy);
ret = regmap_read_poll_timeout(priv->phy_grf,
GRF_PCIE30PHY_STATUS0,
reg, SRAM_INIT_DONE(reg),
0, 500); if (ret)
dev_err(&priv->phy->dev, "%s: lock failed 0x%x, check input refclk and power supply\n",
__func__, reg); return ret;
}
/* Set bifurcation if needed */ for (int i = 0; i < priv->num_lanes; i++) { if (priv->lanes[i] > 1)
mode &= ~RK3588_LANE_AGGREGATION; if (priv->lanes[i] == 3)
mode |= RK3588_BIFURCATION_LANE_0_1; if (priv->lanes[i] == 4)
mode |= RK3588_BIFURCATION_LANE_2_3;
}
/* if no data-lanes assume aggregation */ if (priv->num_lanes == -EINVAL) {
dev_dbg(dev, "no data-lanes property found\n");
priv->num_lanes = 1;
priv->lanes[0] = 1;
} elseif (priv->num_lanes < 0) {
dev_err(dev, "failed to read data-lanes property %d\n", priv->num_lanes); return priv->num_lanes;
}
ret = of_property_read_variable_u32_array(dev->of_node, "rockchip,rx-common-refclk-mode",
priv->rx_cmn_refclk_mode, 1,
ARRAY_SIZE(priv->rx_cmn_refclk_mode)); /* * if no rockchip,rx-common-refclk-mode, assume enabled for all lanes in * order to be DT backwards compatible. (Since HW reset val is enabled.)
*/ if (ret == -EINVAL) { for (int i = 0; i < ARRAY_SIZE(priv->rx_cmn_refclk_mode); i++)
priv->rx_cmn_refclk_mode[i] = 1;
} elseif (ret < 0) {
dev_err(dev, "failed to read rockchip,rx-common-refclk-mode property %d\n",
ret); return ret;
}
priv->phy = devm_phy_create(dev, NULL, &rockchip_p3phy_ops); if (IS_ERR(priv->phy)) {
dev_err(dev, "failed to create combphy\n"); return PTR_ERR(priv->phy);
}
priv->p30phy = devm_reset_control_get_optional_exclusive(dev, "phy"); if (IS_ERR(priv->p30phy)) { return dev_err_probe(dev, PTR_ERR(priv->p30phy), "failed to get phy reset control\n");
} if (!priv->p30phy)
dev_info(dev, "no phy reset control specified\n");
priv->num_clks = devm_clk_bulk_get_all(dev, &priv->clks); if (priv->num_clks < 1) return -ENODEV;
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.