int arch_cpu_init(void)
 {
-#ifndef CONFIG_SPL_BUILD
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_ARMADA_38X)
+       /*
+        * Only with disabled MMU its possible to switch the base
+        * register address on Armada 38x. Without this the SDRAM
+        * located at >= 0x4000.0000 is also not accessible, as its
+        * still locked to cache.
+        */
+       mmu_disable();
+#endif
+
+       /* Linux expects the internal registers to be at 0xf1000000 */
+       writel(SOC_REGS_PHY_BASE, INTREG_BASE_ADDR_REG);
+       set_cbar(SOC_REGS_PHY_BASE + 0xC000);
+
+#if !defined(CONFIG_SPL_BUILD)
+       /*
+        * From this stage on, the SoC detection is working. As we have
+        * configured the internal register base to the value used
+        * in the macros / defines in the U-Boot header (soc.h).
+        */
        if (mvebu_soc_family() == MVEBU_SOC_A38X) {
                struct pl310_regs *const pl310 =
                        (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
 
                /*
-                * Only with disabled MMU its possible to switch the base
-                * register address on Armada 38x. Without this the SDRAM
-                * located at >= 0x4000.0000 is also not accessible, as its
-                * still locked to cache.
-                *
-                * So to fully release / unlock this area from cache, we need
-                * to first flush all caches, then disable the MMU and
-                * disable the L2 cache.
+                * To fully release / unlock this area from cache, we need
+                * to flush all caches and disable the L2 cache.
                 */
                icache_disable();
                dcache_disable();
-               mmu_disable();
                clrbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
        }
 #endif
 
-       /* Linux expects the internal registers to be at 0xf1000000 */
-       writel(SOC_REGS_PHY_BASE, INTREG_BASE_ADDR_REG);
-       set_cbar(SOC_REGS_PHY_BASE + 0xC000);
-
        /*
         * We need to call mvebu_mbus_probe() before calling
         * update_sdram_window_sizes() as it disables all previously