*/
 
 #include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/hardware/cache-l2x0.h>
 #include "smc.h"
 
 #define CPU_MASK       0xff0ffff0
        mov     r0, #SMC_CMD_C15RESUME
        dsb
        smc     #0
+#ifdef CONFIG_CACHE_L2X0
+       adr     r0, 1f
+       ldr     r2, [r0]
+       add     r0, r2, r0
+
+       /* Check that the address has been initialised. */
+       ldr     r1, [r0, #L2X0_R_PHY_BASE]
+       teq     r1, #0
+       beq     skip_l2x0
+
+       /* Check if controller has been enabled. */
+       ldr     r2, [r1, #L2X0_CTRL]
+       tst     r2, #0x1
+       bne     skip_l2x0
+
+       ldr     r1, [r0, #L2X0_R_TAG_LATENCY]
+       ldr     r2, [r0, #L2X0_R_DATA_LATENCY]
+       ldr     r3, [r0, #L2X0_R_PREFETCH_CTRL]
+       mov     r0, #SMC_CMD_L2X0SETUP1
+       smc     #0
+
+       /* Reload saved regs pointer because smc corrupts registers. */
+       adr     r0, 1f
+       ldr     r2, [r0]
+       add     r0, r2, r0
+
+       ldr     r1, [r0, #L2X0_R_PWR_CTRL]
+       ldr     r2, [r0, #L2X0_R_AUX_CTRL]
+       mov     r0, #SMC_CMD_L2X0SETUP2
+       smc     #0
+
+       mov     r0, #SMC_CMD_L2X0INVALL
+       smc     #0
+
+       mov     r1, #1
+       mov     r0, #SMC_CMD_L2X0CTRL
+       smc     #0
+skip_l2x0:
+#endif /* CONFIG_CACHE_L2X0 */
 skip_cp15:
        b       cpu_resume
 ENDPROC(exynos_cpu_resume_ns)
        .globl cp15_save_power
 cp15_save_power:
        .long   0       @ cp15 power control
+
+#ifdef CONFIG_CACHE_L2X0
+       .align
+1:     .long   l2x0_saved_regs - .
+#endif /* CONFIG_CACHE_L2X0 */