]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm64: a37xx: pci: Disable link training when unloading driver
authorPali Rohár <pali@kernel.org>
Tue, 22 Sep 2020 11:21:38 +0000 (13:21 +0200)
committerStefan Roese <sr@denx.de>
Thu, 24 Sep 2020 08:14:06 +0000 (10:14 +0200)
As required by PCI Express spec a delay for at least 100ms after
de-asserting PERST# signal is needed before link training is enabled.

Linux kernels prior to 5.8 version do not automatically disable link
training before de-asserting PERST# signal, therefore this requirement is
not fulfilled.

Above requirement is needed for proper detection of some Compex PCIe WiFi
cards. Otherwise Linux kernel cannot detect it.

To allow using those PCIe cards with older Linux kernel versions booted by
U-Boot compiled with U-Boot a37xx pci driver, disable link training in
U-Boot when unloading this pci driver.

Thanks to DM_FLAG_OS_PREPARE flag, U-Boot automatically unload this driver
when booting Linux kernel.

Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Stefan Roese <sr@denx.de>
drivers/pci/pci-aardvark.c

index b2c417701f294ed15cdff8f37022a52156b7cc98..babb84ca937fefec1c9a2a6e3e131364f79c0930 100644 (file)
@@ -647,10 +647,15 @@ static int pcie_advk_probe(struct udevice *dev)
 static int pcie_advk_remove(struct udevice *dev)
 {
        struct pcie_advk *pcie = dev_get_priv(dev);
+       u32 reg;
 
        if (dm_gpio_is_valid(&pcie->reset_gpio))
                dm_gpio_set_value(&pcie->reset_gpio, 1);
 
+       reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+       reg &= ~LINK_TRAINING_EN;
+       advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
        return 0;
 }