dev_err(dev, "failed to disable vpcie regulator: %d\n",
                                ret);
        }
+
+       /* Some boards don't have PCIe reset GPIO. */
+       if (gpio_is_valid(imx6_pcie->reset_gpio))
+               gpio_set_value_cansleep(imx6_pcie->reset_gpio,
+                                       imx6_pcie->gpio_active_high);
 }
 
 static unsigned int imx6_pcie_grp_offset(const struct imx6_pcie *imx6_pcie)
        /* 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_cansleep(imx6_pcie->reset_gpio,
-                                       imx6_pcie->gpio_active_high);
-               msleep(100);
-               gpio_set_value_cansleep(imx6_pcie->reset_gpio,
-                                       !imx6_pcie->gpio_active_high);
-       }
-
        switch (imx6_pcie->drvdata->variant) {
        case IMX8MQ:
                reset_control_deassert(imx6_pcie->pciephy_reset);
                break;
        }
 
+       /* Some boards don't have PCIe reset GPIO. */
+       if (gpio_is_valid(imx6_pcie->reset_gpio)) {
+               msleep(100);
+               gpio_set_value_cansleep(imx6_pcie->reset_gpio,
+                                       !imx6_pcie->gpio_active_high);
+               /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */
+               msleep(100);
+       }
+
        return;
 
 err_ref_clk: