0001
0002
0003
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
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
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
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
0054 ldr r6, [r3, r5]
0055 str r6, [r2], #4
0056 subs r1, r1, #1
0057 bne 1b
0058
0059 skip_pad_conf_1:
0060
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
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
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
0082 ldr r6, [r2], #4
0083 ldr r7, [r3, r5]
0084 bic r7, r7, r6
0085 ldr r6, [r2], #8
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
0093 wfi
0094 nop
0095 nop
0096 nop
0097 nop
0098
0099
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
0109 ldr r6, [r2], #4
0110 str r6, [r3, r5]
0111 subs r1, r1, #1
0112 bne 3b
0113
0114 skip_pad_conf_3:
0115
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
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
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