Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Copyright (C) 2008-2011 Freescale Semiconductor, Inc.
0004  */
0005 /*
0006  */
0007 
0008 #include <linux/linkage.h>
0009 
0010 #define M4IF_MCR0_OFFSET            (0x008C)
0011 #define M4IF_MCR0_FDVFS             (0x1 << 11)
0012 #define M4IF_MCR0_FDVACK            (0x1 << 27)
0013 
0014     .align 3
0015 
0016 /*
0017  * ==================== low level suspend ====================
0018  *
0019  * On entry
0020  * r0: pm_info structure address;
0021  *
0022  * suspend ocram space layout:
0023  * ======================== high address ======================
0024  *                              .
0025  *                              .
0026  *                              .
0027  *                              ^
0028  *                              ^
0029  *                              ^
0030  *                      imx53_suspend code
0031  *              PM_INFO structure(imx5_cpu_suspend_info)
0032  * ======================== low address =======================
0033  */
0034 
0035 /* Offsets of members of struct imx5_cpu_suspend_info */
0036 #define SUSPEND_INFO_MX53_M4IF_V_OFFSET     0x0
0037 #define SUSPEND_INFO_MX53_IOMUXC_V_OFFSET   0x4
0038 #define SUSPEND_INFO_MX53_IO_COUNT_OFFSET   0x8
0039 #define SUSPEND_INFO_MX53_IO_STATE_OFFSET   0xc
0040 
0041 ENTRY(imx53_suspend)
0042     stmfd   sp!, {r4,r5,r6,r7}
0043 
0044     /* Save pad config */
0045     ldr r1, [r0, #SUSPEND_INFO_MX53_IO_COUNT_OFFSET]
0046     cmp r1, #0
0047     beq skip_pad_conf_1
0048 
0049     add r2, r0, #SUSPEND_INFO_MX53_IO_STATE_OFFSET
0050     ldr r3, [r0, #SUSPEND_INFO_MX53_IOMUXC_V_OFFSET]
0051 
0052 1:
0053     ldr r5, [r2], #12   /* IOMUXC register offset */
0054     ldr r6, [r3, r5]    /* current value */
0055     str r6, [r2], #4    /* save area */
0056     subs    r1, r1, #1
0057     bne 1b
0058 
0059 skip_pad_conf_1:
0060     /* Set FDVFS bit of M4IF_MCR0 to request DDR to enter self-refresh */
0061     ldr r1, [r0, #SUSPEND_INFO_MX53_M4IF_V_OFFSET]
0062     ldr r2,[r1, #M4IF_MCR0_OFFSET]
0063     orr r2, r2, #M4IF_MCR0_FDVFS
0064     str r2,[r1, #M4IF_MCR0_OFFSET]
0065 
0066     /* Poll FDVACK bit of M4IF_MCR to wait for DDR to enter self-refresh */
0067 wait_sr_ack:
0068     ldr r2,[r1, #M4IF_MCR0_OFFSET]
0069     ands    r2, r2, #M4IF_MCR0_FDVACK
0070     beq wait_sr_ack
0071 
0072     /* Set pad config */
0073     ldr r1, [r0, #SUSPEND_INFO_MX53_IO_COUNT_OFFSET]
0074     cmp r1, #0
0075     beq skip_pad_conf_2
0076 
0077     add r2, r0, #SUSPEND_INFO_MX53_IO_STATE_OFFSET
0078     ldr r3, [r0, #SUSPEND_INFO_MX53_IOMUXC_V_OFFSET]
0079 
0080 2:
0081     ldr r5, [r2], #4    /* IOMUXC register offset */
0082     ldr r6, [r2], #4    /* clear */
0083     ldr r7, [r3, r5]
0084     bic r7, r7, r6
0085     ldr r6, [r2], #8    /* set */
0086     orr r7, r7, r6
0087     str r7, [r3, r5]
0088     subs    r1, r1, #1
0089     bne 2b
0090 
0091 skip_pad_conf_2:
0092     /* Zzz, enter stop mode */
0093     wfi
0094     nop
0095     nop
0096     nop
0097     nop
0098 
0099     /* Restore pad config */
0100     ldr r1, [r0, #SUSPEND_INFO_MX53_IO_COUNT_OFFSET]
0101     cmp r1, #0
0102     beq skip_pad_conf_3
0103 
0104     add r2, r0, #SUSPEND_INFO_MX53_IO_STATE_OFFSET
0105     ldr r3, [r0, #SUSPEND_INFO_MX53_IOMUXC_V_OFFSET]
0106 
0107 3:
0108     ldr r5, [r2], #12   /* IOMUXC register offset */
0109     ldr r6, [r2], #4    /* saved value */
0110     str r6, [r3, r5]
0111     subs    r1, r1, #1
0112     bne 3b
0113 
0114 skip_pad_conf_3:
0115     /* Clear FDVFS bit of M4IF_MCR0 to request DDR to exit self-refresh */
0116     ldr r1, [r0, #SUSPEND_INFO_MX53_M4IF_V_OFFSET]
0117     ldr r2,[r1, #M4IF_MCR0_OFFSET]
0118     bic r2, r2, #M4IF_MCR0_FDVFS
0119     str r2,[r1, #M4IF_MCR0_OFFSET]
0120 
0121     /* Poll FDVACK bit of M4IF_MCR to wait for DDR to exit self-refresh */
0122 wait_ar_ack:
0123     ldr r2,[r1, #M4IF_MCR0_OFFSET]
0124     ands    r2, r2, #M4IF_MCR0_FDVACK
0125     bne wait_ar_ack
0126 
0127     /* Restore registers */
0128     ldmfd   sp!, {r4,r5,r6,r7}
0129     mov pc, lr
0130 
0131 ENDPROC(imx53_suspend)
0132 
0133 ENTRY(imx53_suspend_sz)
0134         .word   . - imx53_suspend