I hit the same hang with LibreELEC 12.2.1 on a Banana Pi M2 Ultra (R40) and tracked it down with the serial console and FEL. Serial output, then nothing:
The same image boots fine with the U-Boot 2024.01 from 12.0.2.
Cause: U-Boot 2025.07 contains commit 358d1cc232c3 ("spl: Align FDT load address"), so the SPL now puts the device tree at the end of U-Boot proper rounded up to 8 bytes. U-Boot proper (OF_SEPARATE) still looks for it exactly at _end, which 2025.07 doesn't align. In the 12.2.1 build for this board U-Boot is 367164 bytes (4 more than a multiple of 8), so U-Boot proper finds no device tree and hangs before its serial console starts. That's why nothing at all is printed after the SPL. 2024.01 isn't affected (its U-Boot is 359920 bytes and its SPL doesn't round). Whether a board is hit depends on its U-Boot size, so other 32-bit Allwinner boards may or may not be affected.
Verified over FEL: LibreELEC's own 12.2.1 U-Boot boots when the device tree is placed exactly at _end, and hangs with no output when it's placed 4 bytes higher (where the 2025.07 SPL puts it).
Fix: upstream fixed it in commit 8b0ebe054bb3 ("arm: Update linker scripts to ensure appended device tree is aligned", in U-Boot v2026.04 and later). LibreELEC master already uses U-Boot 2026.10, which works on my board. For 12.2 the backport is two lines in the linker scripts (. = ALIGN(8); before _end). With it, a real SD boot of 12.2.1 works. I've opened a GitHub issue with the patch: https://github.com/LibreELEC/LibreELEC.tv/issues/11966
Workaround until then: write the 12.2.1 image to the SD card, then replace its bootloader with the one from the 12.0.2 image (both have the first partition at 4 MiB, the bootloader area is 8 KiB to 4 MiB). On Linux, with the card as /dev/sdX (check with lsblk!):
gunzip -c LibreELEC-R40.arm-12.0.2-bananapi-m2u.img.gz | dd of=uboot-12.0.2.bin bs=1k skip=8 count=4088
sudo dd if=uboot-12.0.2.bin of=/dev/sdX bs=1k seek=8 conv=fsync
That's what my board runs now (12.2.1, from eMMC, with U-Boot 2024.01).