usb: xhci: Load Raspberry Pi 4 VL805's firmware 31/240331/2
authorNicolas Saenz Julienne <nsaenzjulienne@suse.de>
Tue, 5 May 2020 16:26:07 +0000 (18:26 +0200)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 6 Aug 2020 01:59:21 +0000 (01:59 +0000)
When needed, RPi4's co-processor (called VideoCore) has to be instructed
to load VL805's firmware (the chip providing xHCI support). VideCore's
firmware expects the board's PCIe bus to be already configured in order
for it to load the xHCI chip firmware. So we have to make sure this
happens in between the PCIe configuration and xHCI startup.

Introduce a callback in xhci_pci_probe() to run this platform specific
routine.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
[mszyprow: backport of https://patchwork.ozlabs.org/project/uboot/list/?series=174860&state=%2A&archive=both
 the final mainline patch depends on DTS changes not present in vendor tree]
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: I1391806cae261d1ce22137e1a8baf5e261cb865a

board/raspberrypi/rpi/rpi.c
drivers/usb/host/xhci-pci.c
include/usb/xhci.h

index d8f8a97072f508ce467d3bd794c6202f604cf0a6..c3583653d4c950f5431d2c4f610a08b964631c70 100644 (file)
@@ -13,6 +13,7 @@
 #include <lcd.h>
 #include <memalign.h>
 #include <mmc.h>
+#include <usb/xhci.h>
 #include <asm/gpio.h>
 #include <asm/arch/mbox.h>
 #include <asm/arch/msg.h>
@@ -550,6 +551,11 @@ int ft_board_setup(void *blob, bd_t *bd)
        return 0;
 }
 
+void xhci_pci_fixup(struct udevice *dev)
+{
+       bcm2711_notify_vl805_reset();
+}
+
 int checkboard(void)
 {
        return 0;
index c1f60da54168a014b528890e0313f6e6002c5f50..1285dde1ef0031307ab159aae54c8a147c1326ec 100644 (file)
 #include <usb.h>
 #include <usb/xhci.h>
 
+__weak void xhci_pci_fixup(struct udevice *dev)
+{
+}
+
 static void xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr,
                          struct xhci_hcor **ret_hcor)
 {
@@ -40,6 +44,8 @@ static int xhci_pci_probe(struct udevice *dev)
        struct xhci_hccr *hccr;
        struct xhci_hcor *hcor;
 
+       xhci_pci_fixup(dev);
+
        xhci_pci_init(dev, &hccr, &hcor);
 
        return xhci_register(dev, hccr, hcor);
index c16106a2fcfc762c42af6dc9435e84c72b110085..57feed7603de7f6ea5253e9d38cc10eefc39be7d 100644 (file)
@@ -16,6 +16,7 @@
 #ifndef HOST_XHCI_H_
 #define HOST_XHCI_H_
 
+#include <usb.h>
 #include <asm/types.h>
 #include <asm/cache.h>
 #include <asm/io.h>
@@ -1281,4 +1282,6 @@ extern struct dm_usb_ops xhci_usb_ops;
 
 struct xhci_ctrl *xhci_get_ctrl(struct usb_device *udev);
 
+extern void xhci_pci_fixup(struct udevice *dev);
+
 #endif /* HOST_XHCI_H_ */