From 5e2954fae6081daf8d65ba28dd0edef3527f5d31 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 14 Jan 2021 17:07:18 +0000 Subject: [PATCH 1/2] usb: xhci-pci: Add DM_FLAG_OS_PREPARE flag The PCIe bus the controller is connected to might need to be removed prior the handover. Make sure xhci-pci is also removed so as to avoid unexpected timeouts or hangs. Signed-off-by: Nicolas Saenz Julienne Signed-off-by: Peter Robinson --- drivers/usb/host/xhci-pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 9fb6d2f763..19f8fb4458 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -61,7 +61,7 @@ U_BOOT_DRIVER(xhci_pci) = { .ops = &xhci_usb_ops, .platdata_auto_alloc_size = sizeof(struct usb_platdata), .priv_auto_alloc_size = sizeof(struct xhci_ctrl), - .flags = DM_FLAG_ALLOC_PRIV_DMA, + .flags = DM_FLAG_OS_PREPARE | DM_FLAG_ALLOC_PRIV_DMA, }; static struct pci_device_id xhci_pci_supported[] = { -- 2.29.2 From 162e817b0196c418bcf5d02cedf2d823f3497321 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 14 Jan 2021 17:09:47 +0000 Subject: [PATCH 2/2] 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 Signed-off-by: Peter Robinson --- drivers/pci/pcie_brcmstb.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/pci/pcie_brcmstb.c b/drivers/pci/pcie_brcmstb.c index f6e8ad0d0a..de824a4d9b 100644 --- a/drivers/pci/pcie_brcmstb.c +++ b/drivers/pci/pcie_brcmstb.c @@ -577,6 +577,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_ofdata_to_platdata(struct udevice *dev) { struct brcm_pcie *pcie = dev_get_priv(dev); @@ -616,6 +634,7 @@ U_BOOT_DRIVER(pcie_brcm_base) = { .ops = &brcm_pcie_ops, .of_match = brcm_pcie_ids, .probe = brcm_pcie_probe, + .remove = brcm_pcie_remove, .ofdata_to_platdata = brcm_pcie_ofdata_to_platdata, .priv_auto_alloc_size = sizeof(struct brcm_pcie), }; -- 2.29.2