diff options
author | Nicolas Saenz Julienne <nsaenzjulienne@suse.de> | 2021-01-14 16:49:01 +0100 |
---|---|---|
committer | Matthias Brugger <mbrugger@suse.com> | 2021-02-18 11:56:25 +0100 |
commit | 85f3fddbcc2e8282f1c26dcef4684f59490d47ba (patch) | |
tree | 2aeac4021971847bdafe43eeb9308f9256835f88 /drivers | |
parent | e3bbc1f74e05b194cfd2193f93f5c9310fbd3252 (diff) | |
download | u-boot-85f3fddbcc2e8282f1c26dcef4684f59490d47ba.tar.gz u-boot-85f3fddbcc2e8282f1c26dcef4684f59490d47ba.tar.xz u-boot-85f3fddbcc2e8282f1c26dcef4684f59490d47ba.zip |
pci: brcmstb: Cleanup controller state before handover
Make sure we handover the PCIe controller in a clean state. Some of the
devices hanging from the PCIe bus might need to be properly reset
through #PERST in order for Linux to be able to initialize them.
This is specially important in order to properly initialize Raspberry Pi
4 B and 400's USB chip.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/pcie_brcmstb.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/pci/pcie_brcmstb.c b/drivers/pci/pcie_brcmstb.c index dd2a4ef629..54aa02c809 100644 --- a/drivers/pci/pcie_brcmstb.c +++ b/drivers/pci/pcie_brcmstb.c @@ -579,6 +579,24 @@ static int brcm_pcie_probe(struct udevice *dev) return 0; } +static int brcm_pcie_remove(struct udevice *dev) +{ + struct brcm_pcie *pcie = dev_get_priv(dev); + void __iomem *base = pcie->base; + + /* Assert fundamental reset */ + setbits_le32(base + PCIE_RGR1_SW_INIT_1, RGR1_SW_INIT_1_PERST_MASK); + + /* Turn off SerDes */ + setbits_le32(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG, + PCIE_HARD_DEBUG_SERDES_IDDQ_MASK); + + /* Shutdown bridge */ + setbits_le32(base + PCIE_RGR1_SW_INIT_1, RGR1_SW_INIT_1_INIT_MASK); + + return 0; +} + static int brcm_pcie_of_to_plat(struct udevice *dev) { struct brcm_pcie *pcie = dev_get_priv(dev); @@ -618,6 +636,8 @@ U_BOOT_DRIVER(pcie_brcm_base) = { .ops = &brcm_pcie_ops, .of_match = brcm_pcie_ids, .probe = brcm_pcie_probe, + .remove = brcm_pcie_remove, .of_to_plat = brcm_pcie_of_to_plat, .priv_auto = sizeof(struct brcm_pcie), + .flags = DM_FLAG_OS_PREPARE, }; |