mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
e6bb0b6ad9
Removed upstreamed: mvebu/patches-5.4/002-PCI-aardvark-Don-t-rely-on-jiffies-while-holding-spi.patch All other patches automatically rebased. Build system: x86_64 Build-tested: ipq806x/R7800 Run-tested: ipq806x/R7800 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us>
51 lines
1.8 KiB
Diff
51 lines
1.8 KiB
Diff
From f4c7d053d7f77cd5c1a1ba7c7ce085ddba13d1d7 Mon Sep 17 00:00:00 2001
|
|
From: Remi Pommarel <repk@triplefau.lt>
|
|
Date: Wed, 22 May 2019 23:33:50 +0200
|
|
Subject: [PATCH] PCI: aardvark: Wait for endpoint to be ready before training
|
|
link
|
|
|
|
When configuring pcie reset pin from gpio (e.g. initially set by
|
|
u-boot) to pcie function this pin goes low for a brief moment
|
|
asserting the PERST# signal. Thus connected device enters fundamental
|
|
reset process and link configuration can only begin after a minimal
|
|
100ms delay (see [1]).
|
|
|
|
Because the pin configuration comes from the "default" pinctrl it is
|
|
implicitly configured before the probe callback is called:
|
|
|
|
driver_probe_device()
|
|
really_probe()
|
|
...
|
|
pinctrl_bind_pins() /* Here pin goes from gpio to PCIE reset
|
|
function and PERST# is asserted */
|
|
...
|
|
drv->probe()
|
|
|
|
[1] "PCI Express Base Specification", REV. 4.0
|
|
PCI Express, February 19 2014, 6.6.1 Conventional Reset
|
|
|
|
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
|
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
|
Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
|
---
|
|
drivers/pci/controller/pci-aardvark.c | 8 ++++++++
|
|
1 file changed, 8 insertions(+)
|
|
|
|
--- a/drivers/pci/controller/pci-aardvark.c
|
|
+++ b/drivers/pci/controller/pci-aardvark.c
|
|
@@ -338,6 +338,14 @@ static void advk_pcie_setup_hw(struct ad
|
|
reg |= PIO_CTRL_ADDR_WIN_DISABLE;
|
|
advk_writel(pcie, reg, PIO_CTRL);
|
|
|
|
+ /*
|
|
+ * PERST# signal could have been asserted by pinctrl subsystem before
|
|
+ * probe() callback has been called, making the endpoint going into
|
|
+ * fundamental reset. As required by PCI Express spec a delay for at
|
|
+ * least 100ms after such a reset before link training is needed.
|
|
+ */
|
|
+ msleep(PCI_PM_D3COLD_WAIT);
|
|
+
|
|
/* Start link training */
|
|
reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
|
|
reg |= PCIE_CORE_LINK_TRAINING;
|