2019-05-27 08:55:08 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2015-05-12 15:31:03 +02:00
/ *
* Copyright ( C ) 2 0 0 8 - 2 0 1 1 F r e e s c a l e S e m i c o n d u c t o r , I n c .
* /
/ *
* /
# include < l i n u x / l i n k a g e . h >
# define M 4 I F _ M C R 0 _ O F F S E T ( 0 x00 8 C )
# define M 4 I F _ M C R 0 _ F D V F S ( 0 x1 < < 1 1 )
# define M 4 I F _ M C R 0 _ F D V A C K ( 0 x1 < < 2 7 )
.align 3
/ *
* = = = = = = = = = = = = = = = = = = = = low l e v e l s u s p e n d = = = = = = = = = = = = = = = = = = = =
*
* On e n t r y
* r0 : pm_ i n f o s t r u c t u r e a d d r e s s ;
*
* suspend o c r a m s p a c e l a y o u t :
* = = = = = = = = = = = = = = = = = = = = = = = = high a d d r e s s = = = = = = = = = = = = = = = = = = = = = =
* .
* .
* .
* ^
* ^
* ^
* imx5 3 _ s u s p e n d c o d e
* PM_ I N F O s t r u c t u r e ( i m x53 _ s u s p e n d _ i n f o )
* = = = = = = = = = = = = = = = = = = = = = = = = low a d d r e s s = = = = = = = = = = = = = = = = = = = = = = =
* /
/* Offsets of members of struct imx53_suspend_info */
# define S U S P E N D _ I N F O _ M X 5 3 _ M 4 I F _ V _ O F F S E T 0 x0
# define S U S P E N D _ I N F O _ M X 5 3 _ I O M U X C _ V _ O F F S E T 0 x4
# define S U S P E N D _ I N F O _ M X 5 3 _ I O _ C O U N T _ O F F S E T 0 x8
# define S U S P E N D _ I N F O _ M X 5 3 _ I O _ S T A T E _ O F F S E T 0 x c
ENTRY( i m x53 _ s u s p e n d )
stmfd s p ! , { r4 ,r5 ,r6 ,r7 }
/* Save pad config */
ldr r1 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ I O _ C O U N T _ O F F S E T ]
cmp r1 , #0
beq s k i p _ p a d _ c o n f _ 1
add r2 , r0 , #S U S P E N D _ I N F O _ M X 53 _ I O _ S T A T E _ O F F S E T
ldr r3 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ I O M U X C _ V _ O F F S E T ]
1 :
ldr r5 , [ r2 ] , #12 / * I O M U X C r e g i s t e r o f f s e t * /
ldr r6 , [ r3 , r5 ] / * c u r r e n t v a l u e * /
str r6 , [ r2 ] , #4 / * s a v e a r e a * /
subs r1 , r1 , #1
bne 1 b
skip_pad_conf_1 :
/* Set FDVFS bit of M4IF_MCR0 to request DDR to enter self-refresh */
ldr r1 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ M 4 I F _ V _ O F F S E T ]
ldr r2 ,[ r1 , #M 4 I F _ M C R 0 _ O F F S E T ]
orr r2 , r2 , #M 4 I F _ M C R 0 _ F D V F S
str r2 ,[ r1 , #M 4 I F _ M C R 0 _ O F F S E T ]
/* Poll FDVACK bit of M4IF_MCR to wait for DDR to enter self-refresh */
wait_sr_ack :
ldr r2 ,[ r1 , #M 4 I F _ M C R 0 _ O F F S E T ]
ands r2 , r2 , #M 4 I F _ M C R 0 _ F D V A C K
beq w a i t _ s r _ a c k
/* Set pad config */
ldr r1 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ I O _ C O U N T _ O F F S E T ]
cmp r1 , #0
beq s k i p _ p a d _ c o n f _ 2
add r2 , r0 , #S U S P E N D _ I N F O _ M X 53 _ I O _ S T A T E _ O F F S E T
ldr r3 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ I O M U X C _ V _ O F F S E T ]
2 :
ldr r5 , [ r2 ] , #4 / * I O M U X C r e g i s t e r o f f s e t * /
ldr r6 , [ r2 ] , #4 / * c l e a r * /
ldr r7 , [ r3 , r5 ]
bic r7 , r7 , r6
ldr r6 , [ r2 ] , #8 / * s e t * /
orr r7 , r7 , r6
str r7 , [ r3 , r5 ]
subs r1 , r1 , #1
bne 2 b
skip_pad_conf_2 :
/* Zzz, enter stop mode */
wfi
nop
nop
nop
nop
/* Restore pad config */
ldr r1 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ I O _ C O U N T _ O F F S E T ]
cmp r1 , #0
beq s k i p _ p a d _ c o n f _ 3
add r2 , r0 , #S U S P E N D _ I N F O _ M X 53 _ I O _ S T A T E _ O F F S E T
ldr r3 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ I O M U X C _ V _ O F F S E T ]
3 :
ldr r5 , [ r2 ] , #12 / * I O M U X C r e g i s t e r o f f s e t * /
ldr r6 , [ r2 ] , #4 / * s a v e d v a l u e * /
str r6 , [ r3 , r5 ]
subs r1 , r1 , #1
bne 3 b
skip_pad_conf_3 :
/* Clear FDVFS bit of M4IF_MCR0 to request DDR to exit self-refresh */
ldr r1 , [ r0 , #S U S P E N D _ I N F O _ M X 53 _ M 4 I F _ V _ O F F S E T ]
ldr r2 ,[ r1 , #M 4 I F _ M C R 0 _ O F F S E T ]
bic r2 , r2 , #M 4 I F _ M C R 0 _ F D V F S
str r2 ,[ r1 , #M 4 I F _ M C R 0 _ O F F S E T ]
/* Poll FDVACK bit of M4IF_MCR to wait for DDR to exit self-refresh */
wait_ar_ack :
ldr r2 ,[ r1 , #M 4 I F _ M C R 0 _ O F F S E T ]
ands r2 , r2 , #M 4 I F _ M C R 0 _ F D V A C K
bne w a i t _ a r _ a c k
/* Restore registers */
ldmfd s p ! , { r4 ,r5 ,r6 ,r7 }
mov p c , l r
ENDPROC( i m x53 _ s u s p e n d )
ENTRY( i m x53 _ s u s p e n d _ s z )
.word . - imx5 3 _ s u s p e n d