Merge tag 'for-5.15/parisc' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[linux-2.6-microblaze.git] / arch / arm / mach-at91 / pm_suspend.S
index 8b0b861..cbd61a3 100644 (file)
@@ -83,6 +83,35 @@ tmp3 .req    r6
 
        .endm
 
+/**
+ * Set state for 2.5V low power regulator
+ * @ena: 0 - disable regulator
+ *      1 - enable regulator
+ *
+ * Side effects: overwrites r7, r8, r9, r10
+ */
+       .macro at91_2_5V_reg_set_low_power ena
+#ifdef CONFIG_SOC_SAMA7
+       ldr     r7, .sfrbu
+       mov     r8, #\ena
+       ldr     r9, [r7, #AT91_SFRBU_25LDOCR]
+       orr     r9, r9, #AT91_SFRBU_25LDOCR_LP
+       cmp     r8, #1
+       beq     lp_done_\ena
+       bic     r9, r9, #AT91_SFRBU_25LDOCR_LP
+lp_done_\ena:
+       ldr     r10, =AT91_SFRBU_25LDOCR_LDOANAKEY
+       orr     r9, r9, r10
+       str     r9, [r7, #AT91_SFRBU_25LDOCR]
+#endif
+       .endm
+
+       .macro at91_backup_set_lpm reg
+#ifdef CONFIG_SOC_SAMA7
+       orr     \reg, \reg, #0x200000
+#endif
+       .endm
+
        .text
 
        .arm
@@ -906,6 +935,9 @@ save_mck:
 
        at91_plla_disable
 
+       /* Enable low power mode for 2.5V regulator. */
+       at91_2_5V_reg_set_low_power 1
+
        ldr     tmp3, .pm_mode
        cmp     tmp3, #AT91_PM_ULP1
        beq     ulp1_mode
@@ -918,6 +950,9 @@ ulp1_mode:
        b       ulp_exit
 
 ulp_exit:
+       /* Disable low power mode for 2.5V regulator. */
+       at91_2_5V_reg_set_low_power 0
+
        ldr     pmc, .pmc_base
 
        at91_plla_enable
@@ -951,10 +986,16 @@ ulp_exit:
        mov     tmp1, #0x1
        str     tmp1, [r0, #0x10]
 
+       /* Wait for it. */
+1:     ldr     tmp1, [r0, #0x10]
+       tst     tmp1, #0x1
+       beq     1b
+
        /* Shutdown */
        ldr     r0, .shdwc
        mov     tmp1, #0xA5000000
        add     tmp1, tmp1, #0x1
+       at91_backup_set_lpm tmp1
        str     tmp1, [r0, #0]
 .endm