|
@@ -275,15 +275,22 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
|
|
|
goto err_pcie;
|
|
|
}
|
|
|
|
|
|
- /* allow the clocks to stabilize */
|
|
|
- usleep_range(200, 500);
|
|
|
-
|
|
|
/* power up core phy and enable ref clock */
|
|
|
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
|
|
|
IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
|
|
|
+ /*
|
|
|
+ * the async reset input need ref clock to sync internally,
|
|
|
+ * when the ref clock comes after reset, internal synced
|
|
|
+ * reset time is too short, cannot meet the requirement.
|
|
|
+ * add one ~10us delay here.
|
|
|
+ */
|
|
|
+ udelay(10);
|
|
|
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
|
|
|
IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
|
|
|
|
|
|
+ /* allow the clocks to stabilize */
|
|
|
+ usleep_range(200, 500);
|
|
|
+
|
|
|
/* Some boards don't have PCIe reset GPIO. */
|
|
|
if (gpio_is_valid(imx6_pcie->reset_gpio)) {
|
|
|
gpio_set_value(imx6_pcie->reset_gpio, 0);
|