]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mach-k3: common.c: Remove dma device in spl exit
authorPrasanth Babu Mantena <p-mantena@ti.com>
Wed, 9 Oct 2024 14:57:00 +0000 (20:27 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 18 Oct 2024 00:21:18 +0000 (18:21 -0600)
While exiting from spl, remove any dma device active through
spl_board_prepare_for_boot(). This is required for cleaning up
any dma channels being used in spl and avoid issues with overlapping
channel allocation in the next stage bootloaders.

Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
arch/arm/mach-k3/common.c

index df48ec8d4791920a564437e808bcb7fb57c9247e..46d3d8819666eb9f399fa6f3d785fa49c0f5369f 100644 (file)
@@ -28,6 +28,8 @@
 #include <env.h>
 #include <elf.h>
 #include <soc.h>
+#include <dm/uclass-internal.h>
+#include <dm/device-internal.h>
 
 #include <asm/arch/k3-qos.h>
 
@@ -246,12 +248,32 @@ void spl_enable_cache(void)
 #endif
 }
 
-#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
+static __maybe_unused void k3_dma_remove(void)
+{
+       struct udevice *dev;
+       int rc;
+
+       rc = uclass_find_device(UCLASS_DMA, 0, &dev);
+       if (!rc && dev) {
+               rc = device_remove(dev, DM_REMOVE_NORMAL);
+               if (rc)
+                       pr_warn("Cannot remove dma device '%s' (err=%d)\n",
+                               dev->name, rc);
+       } else
+               pr_warn("DMA Device not found (err=%d)\n", rc);
+}
+
 void spl_board_prepare_for_boot(void)
 {
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
        dcache_disable();
+#endif
+#if IS_ENABLED(CONFIG_SPL_DMA) && IS_ENABLED(CONFIG_SPL_DM_DEVICE_REMOVE)
+       k3_dma_remove();
+#endif
 }
 
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
 void spl_board_prepare_for_linux(void)
 {
        dcache_disable();