Patch "PCI: imx6: Fix PERST# start-up sequence" has been added to the 5.18-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    PCI: imx6: Fix PERST# start-up sequence

to the 5.18-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     pci-imx6-fix-perst-start-up-sequence.patch
and it can be found in the queue-5.18 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1b5396e1ec914fa14bb609d60fa2dbebeba81240
Author: Francesco Dolcini <francesco.dolcini@xxxxxxxxxxx>
Date:   Mon Apr 4 10:15:09 2022 +0200

    PCI: imx6: Fix PERST# start-up sequence
    
    [ Upstream commit a6809941c1f17f455db2cf4ca19c6d8c8746ec25 ]
    
    According to the PCIe standard the PERST# signal (reset-gpio in
    fsl,imx* compatible dts) should be kept asserted for at least 100 usec
    before the PCIe refclock is stable, should be kept asserted for at
    least 100 msec after the power rails are stable and the host should wait
    at least 100 msec after it is de-asserted before accessing the
    configuration space of any attached device.
    
    From PCIe CEM r2.0, sec 2.6.2
    
      T-PVPERL: Power stable to PERST# inactive - 100 msec
      T-PERST-CLK: REFCLK stable before PERST# inactive - 100 usec.
    
    From PCIe r5.0, sec 6.6.1
    
      With a Downstream Port that does not support Link speeds greater than
      5.0 GT/s, software must wait a minimum of 100 ms before sending a
      Configuration Request to the device immediately below that Port.
    
    Failure to do so could prevent PCIe devices to be working correctly,
    and this was experienced with real devices.
    
    Move reset assert to imx6_pcie_assert_core_reset(), this way we ensure
    that PERST# is asserted before enabling any clock, move de-assert to the
    end of imx6_pcie_deassert_core_reset() after the clock is enabled and
    deemed stable and add a new delay of 100 msec just afterward.
    
    Link: https://lore.kernel.org/all/20220211152550.286821-1-francesco.dolcini@xxxxxxxxxxx
    Link: https://lore.kernel.org/r/20220404081509.94356-1-francesco.dolcini@xxxxxxxxxxx
    Fixes: bb38919ec56e ("PCI: imx6: Add support for i.MX6 PCIe controller")
    Signed-off-by: Francesco Dolcini <francesco.dolcini@xxxxxxxxxxx>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@xxxxxxx>
    Reviewed-by: Lucas Stach <l.stach@xxxxxxxxxxxxxx>
    Acked-by: Richard Zhu <hongxing.zhu@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c
index 6619e3caffe2..7a285fb0f619 100644
--- a/drivers/pci/controller/dwc/pci-imx6.c
+++ b/drivers/pci/controller/dwc/pci-imx6.c
@@ -408,6 +408,11 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
 			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)
@@ -540,15 +545,6 @@ static void imx6_pcie_deassert_core_reset(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);
@@ -595,6 +591,15 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
 		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:



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux