2012-08-16 13:31:51 +04:00
/ *
* Copyright ( c ) 2 0 1 2 , N V I D I A C o r p o r a t i o n . A l l r i g h t s r e s e r v e d .
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or modify it
* under t h e t e r m s a n d c o n d i t i o n s o f t h e G N U G e n e r a l P u b l i c L i c e n s e ,
* version 2 , a s p u b l i s h e d b y t h e F r e e S o f t w a r e F o u n d a t i o n .
*
* This p r o g r a m i s d i s t r i b u t e d i n t h e h o p e i t w i l l b e u s e f u l , b u t W I T H O U T
* ANY W A R R A N T Y ; without even the implied warranty of MERCHANTABILITY or
* FITNESS F O R A P A R T I C U L A R P U R P O S E . S e e t h e G N U G e n e r a l P u b l i c L i c e n s e f o r
* more d e t a i l s .
*
* You s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* along w i t h t h i s p r o g r a m . I f n o t , s e e < h t t p : / / w w w . g n u . o r g / l i c e n s e s / > .
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / a s s e m b l e r . h >
2012-10-31 13:41:17 +04:00
# include < a s m / a s m - o f f s e t s . h >
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
# include < a s m / c a c h e . h >
2012-08-16 13:31:51 +04:00
2013-08-21 02:19:15 +04:00
# include " i r a m m a p . h "
2013-05-20 14:39:29 +04:00
# include " f u s e . h "
2012-08-16 13:31:51 +04:00
# include " s l e e p . h "
# include " f l o w c t r l . h "
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
# define E M C _ C F G 0 x c
# define E M C _ A D R _ C F G 0 x10
# define E M C _ T I M I N G _ C O N T R O L 0 x28
# define E M C _ R E F R E S H 0 x70
# define E M C _ N O P 0 x d c
# define E M C _ S E L F _ R E F 0 x e 0
# define E M C _ M R W 0 x e 8
# define E M C _ F B I O _ C F G 5 0 x10 4
# define E M C _ A U T O _ C A L _ C O N F I G 0 x2 a4
# define E M C _ A U T O _ C A L _ I N T E R V A L 0 x2 a8
# define E M C _ A U T O _ C A L _ S T A T U S 0 x2 a c
# define E M C _ R E Q _ C T R L 0 x2 b0
# define E M C _ C F G _ D I G _ D L L 0 x2 b c
# define E M C _ E M C _ S T A T U S 0 x2 b4
# define E M C _ Z C A L _ I N T E R V A L 0 x2 e 0
# define E M C _ Z Q _ C A L 0 x2 e c
# define E M C _ X M 2 V T T G E N P A D C T R L 0 x31 0
# define E M C _ X M 2 V T T G E N P A D C T R L 2 0 x31 4
# define P M C _ C T R L 0 x0
# define P M C _ C T R L _ S I D E _ E F F E C T _ L P 0 ( 1 < < 1 4 ) / * e n t e r L P 0 w h e n C P U p w r g a t e d * /
# define P M C _ P L L P _ W B 0 _ O V E R R I D E 0 x f8
# define P M C _ I O _ D P D _ R E Q 0 x1 b8
# define P M C _ I O _ D P D _ S T A T U S 0 x1 b c
# define C L K _ R E S E T _ C C L K _ B U R S T 0 x20
# define C L K _ R E S E T _ C C L K _ D I V I D E R 0 x24
# define C L K _ R E S E T _ S C L K _ B U R S T 0 x28
# define C L K _ R E S E T _ S C L K _ D I V I D E R 0 x2 c
# define C L K _ R E S E T _ P L L C _ B A S E 0 x80
# define C L K _ R E S E T _ P L L C _ M I S C 0 x8 c
# define C L K _ R E S E T _ P L L M _ B A S E 0 x90
# define C L K _ R E S E T _ P L L M _ M I S C 0 x9 c
# define C L K _ R E S E T _ P L L P _ B A S E 0 x a0
# define C L K _ R E S E T _ P L L P _ M I S C 0 x a c
# define C L K _ R E S E T _ P L L A _ B A S E 0 x b0
# define C L K _ R E S E T _ P L L A _ M I S C 0 x b c
# define C L K _ R E S E T _ P L L X _ B A S E 0 x e 0
# define C L K _ R E S E T _ P L L X _ M I S C 0 x e 4
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
# define C L K _ R E S E T _ P L L X _ M I S C 3 0 x51 8
# define C L K _ R E S E T _ P L L X _ M I S C 3 _ I D D Q 3
# define C L K _ R E S E T _ P L L M _ M I S C _ I D D Q 5
# define C L K _ R E S E T _ P L L C _ M I S C _ I D D Q 2 6
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
# define C L K _ R E S E T _ C L K _ S O U R C E _ M S E L E C T 0 x3 b4
# define M S E L E C T _ C L K M ( 0 x3 < < 3 0 )
# define L O C K _ D E L A Y 5 0 / * s a f e t y d e l a y a f t e r l o c k i s d e t e c t e d * /
2012-08-16 13:31:51 +04:00
# define T E G R A 3 0 _ P O W E R _ H O T P L U G _ S H U T D O W N ( 1 < < 2 7 ) / * H o t p l u g s h u t d o w n * /
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
.macro emc_ d e v i c e _ m a s k , r d , b a s e
ldr \ r d , [ \ b a s e , #E M C _ A D R _ C F G ]
tst \ r d , #0x1
moveq \ r d , #( 0x1 < < 8 ) @ just 1 device
movne \ r d , #( 0x3 < < 8 ) @ 2 devices
.endm
.macro emc_ t i m i n g _ u p d a t e , r d , b a s e
mov \ r d , #1
str \ r d , [ \ b a s e , #E M C _ T I M I N G _ C O N T R O L ]
1001 :
ldr \ r d , [ \ b a s e , #E M C _ E M C _ S T A T U S ]
tst \ r d , #( 0x1 < < 2 3 ) @ wait EMC_STATUS_TIMING_UPDATE_STALLED is clear
bne 1 0 0 1 b
.endm
.macro pll_ e n a b l e , r d , r _ c a r _ b a s e , p l l _ b a s e , p l l _ m i s c
ldr \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ b a s e ]
tst \ r d , #( 1 < < 3 0 )
orreq \ r d , \ r d , #( 1 < < 3 0 )
streq \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ b a s e ]
/* Enable lock detector */
.if \ pll_ m i s c
ldr \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ m i s c ]
bic \ r d , \ r d , #( 1 < < 1 8 )
str \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ m i s c ]
ldr \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ m i s c ]
ldr \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ m i s c ]
orr \ r d , \ r d , #( 1 < < 1 8 )
str \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ m i s c ]
.endif
.endm
.macro pll_ l o c k e d , r d , r _ c a r _ b a s e , p l l _ b a s e
1 :
ldr \ r d , [ \ r _ c a r _ b a s e , #\ p l l _ b a s e ]
tst \ r d , #( 1 < < 2 7 )
beq 1 b
.endm
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
.macro pll_ i d d q _ e x i t , r d , c a r , i d d q , i d d q _ b i t
ldr \ r d , [ \ c a r , #\ i d d q ]
bic \ r d , \ r d , #( 1 < < \ i d d q _ b i t )
str \ r d , [ \ c a r , #\ i d d q ]
.endm
.macro pll_ i d d q _ e n t r y , r d , c a r , i d d q , i d d q _ b i t
ldr \ r d , [ \ c a r , #\ i d d q ]
orr \ r d , \ r d , #( 1 < < \ i d d q _ b i t )
str \ r d , [ \ c a r , #\ i d d q ]
.endm
2012-08-16 13:31:51 +04:00
# if d e f i n e d ( C O N F I G _ H O T P L U G _ C P U ) | | d e f i n e d ( C O N F I G _ P M _ S L E E P )
/ *
* tegra3 0 _ h o t p l u g _ s h u t d o w n ( v o i d )
*
* Powergates t h e c u r r e n t C P U .
* Should n e v e r r e t u r n .
* /
ENTRY( t e g r a30 _ h o t p l u g _ s h u t d o w n )
/* Powergate this CPU */
mov r0 , #T E G R A 30 _ P O W E R _ H O T P L U G _ S H U T D O W N
bl t e g r a30 _ c p u _ s h u t d o w n
mov p c , l r @ should never get here
ENDPROC( t e g r a30 _ h o t p l u g _ s h u t d o w n )
/ *
* tegra3 0 _ c p u _ s h u t d o w n ( u n s i g n e d l o n g f l a g s )
*
* Puts t h e c u r r e n t C P U i n w a i t - f o r - e v e n t m o d e o n t h e f l o w c o n t r o l l e r
* and p o w e r g a t e s i t - - f l a g s ( i n R 0 ) i n d i c a t e t h e r e q u e s t t y p e .
*
2013-05-20 14:39:29 +04:00
* r1 0 = S o C I D
* corrupts r0 - r4 , r10 - r12
2012-08-16 13:31:51 +04:00
* /
ENTRY( t e g r a30 _ c p u _ s h u t d o w n )
cpu_ i d r3
2013-05-20 14:39:29 +04:00
tegra_ g e t _ s o c _ i d T E G R A _ A P B _ M I S C _ V I R T , r10
cmp r10 , #T E G R A 30
bne _ n o _ c p u 0 _ c h k @ It's not Tegra30
2012-08-16 13:31:51 +04:00
cmp r3 , #0
moveq p c , l r @ Must never be called for CPU 0
2013-05-20 14:39:29 +04:00
_no_cpu0_chk :
2012-08-16 13:31:51 +04:00
ldr r12 , =TEGRA_FLOW_CTRL_VIRT
cpu_ t o _ c s r _ r e g r1 , r3
add r1 , r1 , r12 @ virtual CSR address for this CPU
cpu_ t o _ h a l t _ r e g r2 , r3
add r2 , r2 , r12 @ virtual HALT_EVENTS address for this CPU
/ *
* Clear t h i s C P U ' s " e v e n t " a n d " i n t e r r u p t " f l a g s a n d p o w e r g a t e
* it w h e n h a l t i n g b u t n o t b e f o r e i t i s i n t h e " W F E " s t a t e .
* /
movw r12 , \
FLOW_ C T R L _ C S R _ I N T R _ F L A G | F L O W _ C T R L _ C S R _ E V E N T _ F L A G | \
FLOW_ C T R L _ C S R _ E N A B L E
2013-05-20 14:39:29 +04:00
cmp r10 , #T E G R A 30
moveq r4 , #( 1 < < 4 ) @ wfe bitmap
movne r4 , #( 1 < < 8 ) @ wfi bitmap
2013-04-16 02:50:53 +04:00
ARM( o r r r12 , r12 , r4 , l s l r3 )
THUMB( l s l r4 , r4 , r3 )
THUMB( o r r r12 , r12 , r4 )
2012-08-16 13:31:51 +04:00
str r12 , [ r1 ]
/* Halt this CPU. */
mov r3 , #0x400
delay_1 :
subs r3 , r3 , #1 @ delay as a part of wfe war.
bge d e l a y _ 1 ;
cpsid a @ disable imprecise aborts.
ldr r3 , [ r1 ] @ read CSR
str r3 , [ r1 ] @ clear CSR
2013-05-20 14:39:29 +04:00
2012-08-16 13:31:51 +04:00
tst r0 , #T E G R A 30 _ P O W E R _ H O T P L U G _ S H U T D O W N
2013-05-20 14:39:29 +04:00
beq f l o w _ c t r l _ s e t t i n g _ f o r _ l p2
/* flow controller set up for hotplug */
mov r3 , #F L O W _ C T R L _ W A I T E V E N T @ F o r h o t p l u g
b f l o w _ c t r l _ d o n e
flow_ctrl_setting_for_lp2 :
/* flow controller set up for LP2 */
cmp r10 , #T E G R A 30
2012-10-31 13:41:17 +04:00
moveq r3 , #F L O W _ C T R L _ W A I T _ F O R _ I N T E R R U P T @ F o r L P 2
2013-05-20 14:39:29 +04:00
movne r3 , #F L O W _ C T R L _ W A I T E V E N T
2013-07-19 13:25:25 +04:00
orrne r3 , r3 , #F L O W _ C T R L _ H A L T _ G I C _ I R Q
orrne r3 , r3 , #F L O W _ C T R L _ H A L T _ G I C _ F I Q
2013-05-20 14:39:29 +04:00
flow_ctrl_done :
cmp r10 , #T E G R A 30
2012-08-16 13:31:51 +04:00
str r3 , [ r2 ]
ldr r0 , [ r2 ]
b w f e _ w a r
__cpu_reset_again :
dsb
.align 5
2013-05-20 14:39:29 +04:00
wfeeq @ CPU should be power gated here
wfine
2012-08-16 13:31:51 +04:00
wfe_war :
b _ _ c p u _ r e s e t _ a g a i n
/ *
* 3 8 nop' s , w h i c h f i l l s r e s e t o f w f e c a c h e l i n e a n d
* 4 more c a c h e l i n e s w i t h n o p
* /
.rept 38
nop
.endr
b . @ should never get here
ENDPROC( t e g r a30 _ c p u _ s h u t d o w n )
# endif
2012-10-31 13:41:17 +04:00
# ifdef C O N F I G _ P M _ S L E E P
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
/ *
* tegra3 0 _ s l e e p _ c o r e _ f i n i s h ( u n s i g n e d l o n g v2 p )
*
* Enters s u s p e n d i n L P 0 o r L P 1 b y t u r n i n g o f f t h e M M U a n d j u m p i n g t o
* tegra3 0 _ t e a r _ d o w n _ c o r e i n I R A M
* /
ENTRY( t e g r a30 _ s l e e p _ c o r e _ f i n i s h )
/* Flush, disable the L1 data cache and exit SMP */
bl t e g r a _ d i s a b l e _ c l e a n _ i n v _ d c a c h e
/ *
* Preload a l l t h e a d d r e s s l i t e r a l s t h a t a r e n e e d e d f o r t h e
* CPU p o w e r - g a t i n g p r o c e s s , t o a v o i d l o a d i n g f r o m S D R A M w h i c h
* are n o t s u p p o r t e d o n c e S D R A M i s p u t i n t o s e l f - r e f r e s h .
* LP0 / L P 1 u s e p h y s i c a l a d d r e s s , s i n c e t h e M M U n e e d s t o b e
* disabled b e f o r e p u t t i n g S D R A M i n t o s e l f - r e f r e s h t o a v o i d
* memory a c c e s s d u e t o p a g e t a b l e w a l k s .
* /
mov3 2 r4 , T E G R A _ P M C _ B A S E
mov3 2 r5 , T E G R A _ C L K _ R E S E T _ B A S E
mov3 2 r6 , T E G R A _ F L O W _ C T R L _ B A S E
mov3 2 r7 , T E G R A _ T M R U S _ B A S E
mov3 2 r3 , t e g r a _ s h u t _ o f f _ m m u
add r3 , r3 , r0
mov3 2 r0 , t e g r a30 _ t e a r _ d o w n _ c o r e
mov3 2 r1 , t e g r a30 _ i r a m _ s t a r t
sub r0 , r0 , r1
2013-08-21 02:19:15 +04:00
mov3 2 r1 , T E G R A _ I R A M _ L P x _ R E S U M E _ A R E A
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
add r0 , r0 , r1
mov p c , r3
ENDPROC( t e g r a30 _ s l e e p _ c o r e _ f i n i s h )
2012-10-31 13:41:17 +04:00
/ *
* tegra3 0 _ s l e e p _ c p u _ s e c o n d a r y _ f i n i s h ( u n s i g n e d l o n g v2 p )
*
* Enters L P 2 o n s e c o n d a r y C P U b y e x i t i n g c o h e r e n c y a n d p o w e r g a t i n g t h e C P U .
* /
ENTRY( t e g r a30 _ s l e e p _ c p u _ s e c o n d a r y _ f i n i s h )
mov r7 , l r
/* Flush and disable the L1 data cache */
2013-07-03 13:50:38 +04:00
mov r0 , #T E G R A _ F L U S H _ C A C H E _ L O U I S
2012-10-31 13:41:17 +04:00
bl t e g r a _ d i s a b l e _ c l e a n _ i n v _ d c a c h e
/* Powergate this CPU. */
mov r0 , #0 @ power mode flags (!hotplug)
bl t e g r a30 _ c p u _ s h u t d o w n
mov r0 , #1 @ never return here
mov p c , r7
ENDPROC( t e g r a30 _ s l e e p _ c p u _ s e c o n d a r y _ f i n i s h )
2012-10-31 13:41:21 +04:00
/ *
* tegra3 0 _ t e a r _ d o w n _ c p u
*
* Switches t h e C P U t o e n t e r s l e e p .
* /
ENTRY( t e g r a30 _ t e a r _ d o w n _ c p u )
mov3 2 r6 , T E G R A _ F L O W _ C T R L _ B A S E
b t e g r a30 _ e n t e r _ s l e e p
ENDPROC( t e g r a30 _ t e a r _ d o w n _ c p u )
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
/* START OF ROUTINES COPIED TO IRAM */
.align L1_CACHE_SHIFT
.globl tegra30_iram_start
tegra30_iram_start :
/ *
* tegra3 0 _ l p1 _ r e s e t
*
* reset v e c t o r f o r L P 1 r e s t o r e ; copied into IRAM during suspend.
* Brings t h e s y s t e m b a c k u p t o a s a f e s t a r i n g p o i n t ( S D R A M o u t o f
* self- r e f r e s h , P L L C , P L L M a n d P L L P r e e n a b l e d , C P U r u n n i n g o n P L L X ,
* system c l o c k r u n n i n g o n t h e s a m e P L L t h a t i t s u s p e n d e d a t ) , a n d
* jumps t o t e g r a _ r e s u m e t o r e s t o r e v i r t u a l a d d r e s s i n g .
* The p h y s i c a l a d d r e s s o f t e g r a _ r e s u m e e x p e c t e d t o b e s t o r e d i n
* PMC_ S C R A T C H 4 1 .
*
2013-08-21 02:19:15 +04:00
* NOTE : THIS * M U S T * B E R E L O C A T E D T O T E G R A _ I R A M _ L P x _ R E S U M E _ A R E A .
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
* /
ENTRY( t e g r a30 _ l p1 _ r e s e t )
/ *
* The C P U a n d s y s t e m b u s a r e r u n n i n g a t 3 2 K H z a n d e x e c u t i n g f r o m
* IRAM w h e n t h i s c o d e i s e x e c u t e d ; immediately switch to CLKM and
* enable P L L P , P L L M , P L L C , P L L A a n d P L L X .
* /
mov3 2 r0 , T E G R A _ C L K _ R E S E T _ B A S E
mov r1 , #( 1 < < 2 8 )
str r1 , [ r0 , #C L K _ R E S E T _ S C L K _ B U R S T ]
str r1 , [ r0 , #C L K _ R E S E T _ C C L K _ B U R S T ]
mov r1 , #0
str r1 , [ r0 , #C L K _ R E S E T _ C C L K _ D I V I D E R ]
str r1 , [ r0 , #C L K _ R E S E T _ S C L K _ D I V I D E R ]
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
tegra_ g e t _ s o c _ i d T E G R A _ A P B _ M I S C _ B A S E , r10
cmp r10 , #T E G R A 30
beq _ n o _ p l l _ i d d q _ e x i t
pll_ i d d q _ e x i t r1 , r0 , C L K _ R E S E T _ P L L M _ M I S C , C L K _ R E S E T _ P L L M _ M I S C _ I D D Q
pll_ i d d q _ e x i t r1 , r0 , C L K _ R E S E T _ P L L C _ M I S C , C L K _ R E S E T _ P L L C _ M I S C _ I D D Q
pll_ i d d q _ e x i t r1 , r0 , C L K _ R E S E T _ P L L X _ M I S C 3 , C L K _ R E S E T _ P L L X _ M I S C 3 _ I D D Q
mov3 2 r7 , T E G R A _ T M R U S _ B A S E
ldr r1 , [ r7 ]
add r1 , r1 , #2
wait_ u n t i l r1 , r7 , r3
/* enable PLLM via PMC */
mov3 2 r2 , T E G R A _ P M C _ B A S E
ldr r1 , [ r2 , #P M C _ P L L P _ W B 0 _ O V E R R I D E ]
orr r1 , r1 , #( 1 < < 1 2 )
str r1 , [ r2 , #P M C _ P L L P _ W B 0 _ O V E R R I D E ]
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L M _ B A S E , 0
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L C _ B A S E , 0
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L X _ B A S E , 0
b _ p l l _ m _ c _ x _ d o n e
_no_pll_iddq_exit :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
/* enable PLLM via PMC */
mov3 2 r2 , T E G R A _ P M C _ B A S E
ldr r1 , [ r2 , #P M C _ P L L P _ W B 0 _ O V E R R I D E ]
orr r1 , r1 , #( 1 < < 1 2 )
str r1 , [ r2 , #P M C _ P L L P _ W B 0 _ O V E R R I D E ]
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L M _ B A S E , C L K _ R E S E T _ P L L M _ M I S C
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L C _ B A S E , C L K _ R E S E T _ P L L C _ M I S C
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L X _ B A S E , C L K _ R E S E T _ P L L X _ M I S C
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
_pll_m_c_x_done :
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L P _ B A S E , C L K _ R E S E T _ P L L P _ M I S C
pll_ e n a b l e r1 , r0 , C L K _ R E S E T _ P L L A _ B A S E , C L K _ R E S E T _ P L L A _ M I S C
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
pll_ l o c k e d r1 , r0 , C L K _ R E S E T _ P L L M _ B A S E
pll_ l o c k e d r1 , r0 , C L K _ R E S E T _ P L L P _ B A S E
pll_ l o c k e d r1 , r0 , C L K _ R E S E T _ P L L A _ B A S E
pll_ l o c k e d r1 , r0 , C L K _ R E S E T _ P L L C _ B A S E
pll_ l o c k e d r1 , r0 , C L K _ R E S E T _ P L L X _ B A S E
mov3 2 r7 , T E G R A _ T M R U S _ B A S E
ldr r1 , [ r7 ]
add r1 , r1 , #L O C K _ D E L A Y
wait_ u n t i l r1 , r7 , r3
2013-10-11 13:58:37 +04:00
adr r5 , t e g r a _ s d r a m _ p a d _ s a v e
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ldr r4 , [ r5 , #0x18 ] @ restore CLK_SOURCE_MSELECT
str r4 , [ r0 , #C L K _ R E S E T _ C L K _ S O U R C E _ M S E L E C T ]
ldr r4 , [ r5 , #0x1C ] @ restore SCLK_BURST
str r4 , [ r0 , #C L K _ R E S E T _ S C L K _ B U R S T ]
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 30
movweq r4 , #: l o w e r 16 : ( ( 1 < < 2 8 ) | ( 0 x8 ) ) @ burst policy is PLLX
movteq r4 , #: u p p e r 16 : ( ( 1 < < 2 8 ) | ( 0 x8 ) )
movwne r4 , #: l o w e r 16 : ( ( 1 < < 2 8 ) | ( 0 x e ) )
movtne r4 , #: u p p e r 16 : ( ( 1 < < 2 8 ) | ( 0 x e ) )
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
str r4 , [ r0 , #C L K _ R E S E T _ C C L K _ B U R S T ]
/* Restore pad power state to normal */
ldr r1 , [ r5 , #0x14 ] @ PMC_IO_DPD_STATUS
mvn r1 , r1
bic r1 , r1 , #( 1 < < 3 1 )
orr r1 , r1 , #( 1 < < 3 0 )
str r1 , [ r2 , #P M C _ I O _ D P D _ R E Q ] @ D P D _ O F F
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 30
movweq r0 , #: l o w e r 16 : T E G R A _ E M C _ B A S E @ r0 reserved for emc base
movteq r0 , #: u p p e r 16 : T E G R A _ E M C _ B A S E
2013-10-11 13:58:38 +04:00
cmp r10 , #T E G R A 114
movweq r0 , #: l o w e r 16 : T E G R A _ E M C 0 _ B A S E
movteq r0 , #: u p p e r 16 : T E G R A _ E M C 0 _ B A S E
cmp r10 , #T E G R A 124
movweq r0 , #: l o w e r 16 : T E G R A 1 2 4 _ E M C _ B A S E
movteq r0 , #: u p p e r 16 : T E G R A 1 2 4 _ E M C _ B A S E
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
exit_self_refresh :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ldr r1 , [ r5 , #0xC ] @ restore EMC_XM2VTTGENPADCTRL
str r1 , [ r0 , #E M C _ X M 2 V T T G E N P A D C T R L ]
ldr r1 , [ r5 , #0x10 ] @ restore EMC_XM2VTTGENPADCTRL2
str r1 , [ r0 , #E M C _ X M 2 V T T G E N P A D C T R L 2 ]
ldr r1 , [ r5 , #0x8 ] @ restore EMC_AUTO_CAL_INTERVAL
str r1 , [ r0 , #E M C _ A U T O _ C A L _ I N T E R V A L ]
/* Relock DLL */
ldr r1 , [ r0 , #E M C _ C F G _ D I G _ D L L ]
orr r1 , r1 , #( 1 < < 3 0 ) @ set DLL_RESET
str r1 , [ r0 , #E M C _ C F G _ D I G _ D L L ]
emc_ t i m i n g _ u p d a t e r1 , r0
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 114
movweq r1 , #: l o w e r 16 : T E G R A _ E M C 1 _ B A S E
movteq r1 , #: u p p e r 16 : T E G R A _ E M C 1 _ B A S E
cmpeq r0 , r1
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ldr r1 , [ r0 , #E M C _ A U T O _ C A L _ C O N F I G ]
orr r1 , r1 , #( 1 < < 3 1 ) @ set AUTO_CAL_ACTIVE
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
orreq r1 , r1 , #( 1 < < 2 7 ) @ set slave mode for channel 1
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
str r1 , [ r0 , #E M C _ A U T O _ C A L _ C O N F I G ]
emc_wait_auto_cal_onetime :
ldr r1 , [ r0 , #E M C _ A U T O _ C A L _ S T A T U S ]
tst r1 , #( 1 < < 3 1 ) @ wait until AUTO_CAL_ACTIVE is cleared
bne e m c _ w a i t _ a u t o _ c a l _ o n e t i m e
ldr r1 , [ r0 , #E M C _ C F G ]
bic r1 , r1 , #( 1 < < 3 1 ) @ disable DRAM_CLK_STOP_PD
str r1 , [ r0 , #E M C _ C F G ]
mov r1 , #0
str r1 , [ r0 , #E M C _ S E L F _ R E F ] @ t a k e D R A M o u t o f s e l f r e f r e s h
mov r1 , #1
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 30
streq r1 , [ r0 , #E M C _ N O P ]
streq r1 , [ r0 , #E M C _ N O P ]
streq r1 , [ r0 , #E M C _ R E F R E S H ]
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
emc_ d e v i c e _ m a s k r1 , r0
exit_selfrefresh_loop :
ldr r2 , [ r0 , #E M C _ E M C _ S T A T U S ]
ands r2 , r2 , r1
bne e x i t _ s e l f r e f r e s h _ l o o p
lsr r1 , r1 , #8 @ devSel, bit0:dev0, bit1:dev1
mov3 2 r7 , T E G R A _ T M R U S _ B A S E
ldr r2 , [ r0 , #E M C _ F B I O _ C F G 5 ]
and r2 , r2 , #3 @ check DRAM_TYPE
cmp r2 , #2
beq e m c _ l p d d r2
/* Issue a ZQ_CAL for dev0 - DDR3 */
mov3 2 r2 , 0 x80 0 0 0 0 1 1 @ DEV_SELECTION=2, LENGTH=LONG, CMD=1
str r2 , [ r0 , #E M C _ Z Q _ C A L ]
ldr r2 , [ r7 ]
add r2 , r2 , #10
wait_ u n t i l r2 , r7 , r3
tst r1 , #2
beq z c a l _ d o n e
/* Issue a ZQ_CAL for dev1 - DDR3 */
mov3 2 r2 , 0 x40 0 0 0 0 1 1 @ DEV_SELECTION=1, LENGTH=LONG, CMD=1
str r2 , [ r0 , #E M C _ Z Q _ C A L ]
ldr r2 , [ r7 ]
add r2 , r2 , #10
wait_ u n t i l r2 , r7 , r3
b z c a l _ d o n e
emc_lpddr2 :
/* Issue a ZQ_CAL for dev0 - LPDDR2 */
mov3 2 r2 , 0 x80 0 A 0 0 A B @ DEV_SELECTION=2, MA=10, OP=0xAB
str r2 , [ r0 , #E M C _ M R W ]
ldr r2 , [ r7 ]
add r2 , r2 , #1
wait_ u n t i l r2 , r7 , r3
tst r1 , #2
beq z c a l _ d o n e
/* Issue a ZQ_CAL for dev0 - LPDDR2 */
mov3 2 r2 , 0 x40 0 A 0 0 A B @ DEV_SELECTION=1, MA=10, OP=0xAB
str r2 , [ r0 , #E M C _ M R W ]
ldr r2 , [ r7 ]
add r2 , r2 , #1
wait_ u n t i l r2 , r7 , r3
zcal_done :
mov r1 , #0 @ unstall all transactions
str r1 , [ r0 , #E M C _ R E Q _ C T R L ]
ldr r1 , [ r5 , #0x4 ] @ restore EMC_ZCAL_INTERVAL
str r1 , [ r0 , #E M C _ Z C A L _ I N T E R V A L ]
ldr r1 , [ r5 , #0x0 ] @ restore EMC_CFG
str r1 , [ r0 , #E M C _ C F G ]
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
/* Tegra114 had dual EMC channel, now config the other one */
cmp r10 , #T E G R A 114
bne _ _ n o _ d u a l _ e m c _ c h a n l
mov3 2 r1 , T E G R A _ E M C 1 _ B A S E
cmp r0 , r1
movne r0 , r1
addne r5 , r5 , #0x20
bne e x i t _ s e l f _ r e f r e s h
__no_dual_emc_chanl :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
mov3 2 r0 , T E G R A _ P M C _ B A S E
ldr r0 , [ r0 , #P M C _ S C R A T C H 41 ]
mov p c , r0 @ jump to tegra_resume
ENDPROC( t e g r a30 _ l p1 _ r e s e t )
.align L1_CACHE_SHIFT
tegra30_sdram_pad_address :
.word TEGRA_EMC_BASE + EMC_ C F G @0x0
.word TEGRA_EMC_BASE + EMC_ Z C A L _ I N T E R V A L @0x4
.word TEGRA_EMC_BASE + EMC_ A U T O _ C A L _ I N T E R V A L @0x8
.word TEGRA_EMC_BASE + EMC_ X M 2 V T T G E N P A D C T R L @0xc
.word TEGRA_EMC_BASE + EMC_ X M 2 V T T G E N P A D C T R L 2 @0x10
.word TEGRA_PMC_BASE + PMC_ I O _ D P D _ S T A T U S @0x14
.word TEGRA_CLK_RESET_BASE + CLK_ R E S E T _ C L K _ S O U R C E _ M S E L E C T @0x18
.word TEGRA_CLK_RESET_BASE + CLK_ R E S E T _ S C L K _ B U R S T @0x1c
2013-10-11 13:58:37 +04:00
tegra30_sdram_pad_address_end :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
tegra114_sdram_pad_address :
.word TEGRA_EMC0_BASE + EMC_ C F G @0x0
.word TEGRA_EMC0_BASE + EMC_ Z C A L _ I N T E R V A L @0x4
.word TEGRA_EMC0_BASE + EMC_ A U T O _ C A L _ I N T E R V A L @0x8
.word TEGRA_EMC0_BASE + EMC_ X M 2 V T T G E N P A D C T R L @0xc
.word TEGRA_EMC0_BASE + EMC_ X M 2 V T T G E N P A D C T R L 2 @0x10
.word TEGRA_PMC_BASE + PMC_ I O _ D P D _ S T A T U S @0x14
.word TEGRA_CLK_RESET_BASE + CLK_ R E S E T _ C L K _ S O U R C E _ M S E L E C T @0x18
.word TEGRA_CLK_RESET_BASE + CLK_ R E S E T _ S C L K _ B U R S T @0x1c
.word TEGRA_EMC1_BASE + EMC_ C F G @0x20
.word TEGRA_EMC1_BASE + EMC_ Z C A L _ I N T E R V A L @0x24
.word TEGRA_EMC1_BASE + EMC_ A U T O _ C A L _ I N T E R V A L @0x28
.word TEGRA_EMC1_BASE + EMC_ X M 2 V T T G E N P A D C T R L @0x2c
.word TEGRA_EMC1_BASE + EMC_ X M 2 V T T G E N P A D C T R L 2 @0x30
2013-10-11 13:58:37 +04:00
tegra114_sdram_pad_adress_end :
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
2013-10-11 13:58:38 +04:00
tegra124_sdram_pad_address :
.word TEGRA124_EMC_BASE + EMC_ C F G @0x0
.word TEGRA124_EMC_BASE + EMC_ Z C A L _ I N T E R V A L @0x4
.word TEGRA124_EMC_BASE + EMC_ A U T O _ C A L _ I N T E R V A L @0x8
.word TEGRA124_EMC_BASE + EMC_ X M 2 V T T G E N P A D C T R L @0xc
.word TEGRA124_EMC_BASE + EMC_ X M 2 V T T G E N P A D C T R L 2 @0x10
.word TEGRA_PMC_BASE + PMC_ I O _ D P D _ S T A T U S @0x14
.word TEGRA_CLK_RESET_BASE + CLK_ R E S E T _ C L K _ S O U R C E _ M S E L E C T @0x18
.word TEGRA_CLK_RESET_BASE + CLK_ R E S E T _ S C L K _ B U R S T @0x1c
tegra124_sdram_pad_address_end :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
tegra30_sdram_pad_size :
2013-10-11 13:58:37 +04:00
.word tegra30_sdram_pad_address_end - tegra3 0 _ s d r a m _ p a d _ a d d r e s s
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
tegra114_sdram_pad_size :
2013-10-11 13:58:37 +04:00
.word tegra114_sdram_pad_adress_end - tegra1 1 4 _ s d r a m _ p a d _ a d d r e s s
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
2013-10-11 13:58:37 +04:00
.type tegra_ s d r a m _ p a d _ s a v e , % o b j e c t
tegra_sdram_pad_save :
.rept ( tegra1 1 4 _ s d r a m _ p a d _ a d r e s s _ e n d - t e g r a11 4 _ s d r a m _ p a d _ a d d r e s s ) / 4
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
.long 0
.endr
/ *
* tegra3 0 _ t e a r _ d o w n _ c o r e
*
* copied i n t o a n d e x e c u t e d f r o m I R A M
* puts m e m o r y i n s e l f - r e f r e s h f o r L P 0 a n d L P 1
* /
tegra30_tear_down_core :
bl t e g r a30 _ s d r a m _ s e l f _ r e f r e s h
bl t e g r a30 _ s w i t c h _ c p u _ t o _ c l k 3 2 k
b t e g r a30 _ e n t e r _ s l e e p
/ *
* tegra3 0 _ s w i t c h _ c p u _ t o _ c l k 3 2 k
*
* In L P 0 a n d L P 1 a l l P L L s w i l l b e t u r n e d o f f . S w i t c h i n g t h e C P U a n d S y s t e m C L K
* to t h e 3 2 K H z c l o c k .
* r4 = T E G R A _ P M C _ B A S E
* r5 = T E G R A _ C L K _ R E S E T _ B A S E
* r6 = T E G R A _ F L O W _ C T R L _ B A S E
* r7 = T E G R A _ T M R U S _ B A S E
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
* r1 0 = S o C I D
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
* /
tegra30_switch_cpu_to_clk32k :
/ *
* start b y j u m p i n g t o C L K M t o s a f e l y d i s a b l e P L L s , t h e n j u m p t o
* CLKS.
* /
mov r0 , #( 1 < < 2 8 )
str r0 , [ r5 , #C L K _ R E S E T _ S C L K _ B U R S T ]
/* 2uS delay delay between changing SCLK and CCLK */
ldr r1 , [ r7 ]
add r1 , r1 , #2
wait_ u n t i l r1 , r7 , r9
str r0 , [ r5 , #C L K _ R E S E T _ C C L K _ B U R S T ]
mov r0 , #0
str r0 , [ r5 , #C L K _ R E S E T _ C C L K _ D I V I D E R ]
str r0 , [ r5 , #C L K _ R E S E T _ S C L K _ D I V I D E R ]
/* switch the clock source of mselect to be CLK_M */
ldr r0 , [ r5 , #C L K _ R E S E T _ C L K _ S O U R C E _ M S E L E C T ]
orr r0 , r0 , #M S E L E C T _ C L K M
str r0 , [ r5 , #C L K _ R E S E T _ C L K _ S O U R C E _ M S E L E C T ]
/* 2uS delay delay between changing SCLK and disabling PLLs */
ldr r1 , [ r7 ]
add r1 , r1 , #2
wait_ u n t i l r1 , r7 , r9
/* disable PLLM via PMC in LP1 */
ldr r0 , [ r4 , #P M C _ P L L P _ W B 0 _ O V E R R I D E ]
bic r0 , r0 , #( 1 < < 1 2 )
str r0 , [ r4 , #P M C _ P L L P _ W B 0 _ O V E R R I D E ]
/* disable PLLP, PLLA, PLLC and PLLX */
ldr r0 , [ r5 , #C L K _ R E S E T _ P L L P _ B A S E ]
bic r0 , r0 , #( 1 < < 3 0 )
str r0 , [ r5 , #C L K _ R E S E T _ P L L P _ B A S E ]
ldr r0 , [ r5 , #C L K _ R E S E T _ P L L A _ B A S E ]
bic r0 , r0 , #( 1 < < 3 0 )
str r0 , [ r5 , #C L K _ R E S E T _ P L L A _ B A S E ]
ldr r0 , [ r5 , #C L K _ R E S E T _ P L L C _ B A S E ]
bic r0 , r0 , #( 1 < < 3 0 )
str r0 , [ r5 , #C L K _ R E S E T _ P L L C _ B A S E ]
ldr r0 , [ r5 , #C L K _ R E S E T _ P L L X _ B A S E ]
bic r0 , r0 , #( 1 < < 3 0 )
str r0 , [ r5 , #C L K _ R E S E T _ P L L X _ B A S E ]
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 30
beq _ n o _ p l l _ i n _ i d d q
pll_ i d d q _ e n t r y r1 , r5 , C L K _ R E S E T _ P L L X _ M I S C 3 , C L K _ R E S E T _ P L L X _ M I S C 3 _ I D D Q
_no_pll_in_iddq :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
/* switch to CLKS */
mov r0 , #0 / * b r u s t p o l i c y = 3 2 K H z * /
str r0 , [ r5 , #C L K _ R E S E T _ S C L K _ B U R S T ]
mov p c , l r
2012-10-31 13:41:21 +04:00
/ *
* tegra3 0 _ e n t e r _ s l e e p
*
* uses f l o w c o n t r o l l e r t o e n t e r s l e e p s t a t e
* executes f r o m I R A M w i t h S D R A M i n s e l f r e f r e s h w h e n t a r g e t s t a t e i s L P 0 o r L P 1
* executes f r o m S D R A M w i t h t a r g e t s t a t e i s L P 2
* r6 = T E G R A _ F L O W _ C T R L _ B A S E
* /
tegra30_enter_sleep :
cpu_ i d r1
cpu_ t o _ c s r _ r e g r2 , r1
ldr r0 , [ r6 , r2 ]
orr r0 , r0 , #F L O W _ C T R L _ C S R _ I N T R _ F L A G | F L O W _ C T R L _ C S R _ E V E N T _ F L A G
orr r0 , r0 , #F L O W _ C T R L _ C S R _ E N A B L E
str r0 , [ r6 , r2 ]
2013-07-03 13:50:40 +04:00
tegra_ g e t _ s o c _ i d T E G R A _ A P B _ M I S C _ B A S E , r10
cmp r10 , #T E G R A 30
2012-10-31 13:41:21 +04:00
mov r0 , #F L O W _ C T R L _ W A I T _ F O R _ I N T E R R U P T
2013-07-03 13:50:40 +04:00
orreq r0 , r0 , #F L O W _ C T R L _ H A L T _ C P U _ I R Q | F L O W _ C T R L _ H A L T _ C P U _ F I Q
orrne r0 , r0 , #F L O W _ C T R L _ H A L T _ L I C _ I R Q | F L O W _ C T R L _ H A L T _ L I C _ F I Q
2012-10-31 13:41:21 +04:00
cpu_ t o _ h a l t _ r e g r2 , r1
str r0 , [ r6 , r2 ]
dsb
ldr r0 , [ r6 , r2 ] / * m e m o r y b a r r i e r * /
halted :
isb
dsb
wfi / * C P U s h o u l d b e p o w e r g a t e d h e r e * /
/* !!!FIXME!!! Implement halt failure handler */
b h a l t e d
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
/ *
* tegra3 0 _ s d r a m _ s e l f _ r e f r e s h
*
* called w i t h M M U o f f a n d c a c h e s d i s a b l e d
* must b e e x e c u t e d f r o m I R A M
* r4 = T E G R A _ P M C _ B A S E
* r5 = T E G R A _ C L K _ R E S E T _ B A S E
* r6 = T E G R A _ F L O W _ C T R L _ B A S E
* r7 = T E G R A _ T M R U S _ B A S E
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
* r1 0 = S o C I D
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
* /
tegra30_sdram_self_refresh :
2013-10-11 13:58:37 +04:00
adr r8 , t e g r a _ s d r a m _ p a d _ s a v e
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
tegra_ g e t _ s o c _ i d T E G R A _ A P B _ M I S C _ B A S E , r10
cmp r10 , #T E G R A 30
adreq r2 , t e g r a30 _ s d r a m _ p a d _ a d d r e s s
ldreq r3 , t e g r a30 _ s d r a m _ p a d _ s i z e
2013-10-11 13:58:38 +04:00
cmp r10 , #T E G R A 114
adreq r2 , t e g r a11 4 _ s d r a m _ p a d _ a d d r e s s
ldreq r3 , t e g r a11 4 _ s d r a m _ p a d _ s i z e
cmp r10 , #T E G R A 124
adreq r2 , t e g r a12 4 _ s d r a m _ p a d _ a d d r e s s
ldreq r3 , t e g r a30 _ s d r a m _ p a d _ s i z e
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
mov r9 , #0
padsave :
ldr r0 , [ r2 , r9 ] @ r0 is the addr in the pad_address
ldr r1 , [ r0 ]
str r1 , [ r8 , r9 ] @ save the content of the addr
add r9 , r9 , #4
cmp r3 , r9
bne p a d s a v e
padsave_done :
dsb
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 30
ldreq r0 , =TEGRA_EMC_BASE @ r0 reserved for emc base addr
2013-10-11 13:58:38 +04:00
cmp r10 , #T E G R A 114
ldreq r0 , =TEGRA_EMC0_BASE
cmp r10 , #T E G R A 124
ldreq r0 , =TEGRA124_EMC_BASE
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
enter_self_refresh :
cmp r10 , #T E G R A 30
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
mov r1 , #0
str r1 , [ r0 , #E M C _ Z C A L _ I N T E R V A L ]
str r1 , [ r0 , #E M C _ A U T O _ C A L _ I N T E R V A L ]
ldr r1 , [ r0 , #E M C _ C F G ]
bic r1 , r1 , #( 1 < < 2 8 )
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
bicne r1 , r1 , #( 1 < < 2 9 )
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
str r1 , [ r0 , #E M C _ C F G ] @ d i s a b l e D Y N _ S E L F _ R E F
emc_ t i m i n g _ u p d a t e r1 , r0
ldr r1 , [ r7 ]
add r1 , r1 , #5
wait_ u n t i l r1 , r7 , r2
emc_wait_auto_cal :
ldr r1 , [ r0 , #E M C _ A U T O _ C A L _ S T A T U S ]
tst r1 , #( 1 < < 3 1 ) @ wait until AUTO_CAL_ACTIVE is cleared
bne e m c _ w a i t _ a u t o _ c a l
mov r1 , #3
str r1 , [ r0 , #E M C _ R E Q _ C T R L ] @ s t a l l i n c o m i n g D R A M r e q u e s t s
emcidle :
ldr r1 , [ r0 , #E M C _ E M C _ S T A T U S ]
tst r1 , #4
beq e m c i d l e
mov r1 , #1
str r1 , [ r0 , #E M C _ S E L F _ R E F ]
emc_ d e v i c e _ m a s k r1 , r0
emcself :
ldr r2 , [ r0 , #E M C _ E M C _ S T A T U S ]
and r2 , r2 , r1
cmp r2 , r1
bne e m c s e l f @ loop until DDR in self-refresh
/* Put VTTGEN in the lowest power mode */
ldr r1 , [ r0 , #E M C _ X M 2 V T T G E N P A D C T R L ]
mov3 2 r2 , 0 x F 8 F 8 F F F F @ clear XM2VTTGEN_DRVUP and XM2VTTGEN_DRVDN
and r1 , r1 , r2
str r1 , [ r0 , #E M C _ X M 2 V T T G E N P A D C T R L ]
ldr r1 , [ r0 , #E M C _ X M 2 V T T G E N P A D C T R L 2 ]
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
cmp r10 , #T E G R A 30
orreq r1 , r1 , #7 @ set E_NO_VTTGEN
orrne r1 , r1 , #0x3f
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
str r1 , [ r0 , #E M C _ X M 2 V T T G E N P A D C T R L 2 ]
emc_ t i m i n g _ u p d a t e r1 , r0
ARM: tegra: add LP1 suspend support for Tegra114
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored. Then jumping to "tegra_resume" that was expected to be stored
in PMC_SCRATCH41 to restore CPU context and back to kernel.
Based on the work by: Bo Yan <byan@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:06 +04:00
/* Tegra114 had dual EMC channel, now config the other one */
cmp r10 , #T E G R A 114
bne n o _ d u a l _ e m c _ c h a n l
mov3 2 r1 , T E G R A _ E M C 1 _ B A S E
cmp r0 , r1
movne r0 , r1
bne e n t e r _ s e l f _ r e f r e s h
no_dual_emc_chanl :
ARM: tegra: add LP1 suspend support for Tegra30
The LP1 suspend mode will power off the CPU, clock gated the PLLs and put
SDRAM to self-refresh mode. Any interrupt can wake up device from LP1. The
sequence when LP1 suspending:
* tunning off L1 data cache and the MMU
* storing some EMC registers, DPD (deep power down) status, clk source of
mselect and SCLK burst policy
* putting SDRAM into self-refresh
* switching CPU to CLK_M (12MHz OSC)
* tunning off PLLM, PLLP, PLLA, PLLC and PLLX
* switching SCLK to CLK_S (32KHz OSC)
* shutting off the CPU rail
The sequence of LP1 resuming:
* re-enabling PLLM, PLLP, PLLA, PLLC and PLLX
* restoring the clk source of mselect and SCLK burst policy
* setting up CCLK burst policy to PLLX
* restoring DPD status and some EMC registers
* resuming SDRAM to normal mode
* jumping to the "tegra_resume" from PMC_SCRATCH41
Due to the SDRAM will be put into self-refresh mode, the low level
procedures of LP1 suspending and resuming should be copied to
TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K) when suspending. Before
restoring the CPU context when resuming, the SDRAM needs to be switched
back to normal mode. And the PLLs need to be re-enabled, SCLK burst policy
be restored, CCLK burst policy be set in PLLX. Then jumping to
"tegra_resume" that was expected to be stored in PMC_SCRATCH41 to restore
CPU context and back to kernel.
Based on the work by: Scott Williams <scwilliams@nvidia.com>
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
2013-08-12 13:40:04 +04:00
ldr r1 , [ r4 , #P M C _ C T R L ]
tst r1 , #P M C _ C T R L _ S I D E _ E F F E C T _ L P 0
bne p m c _ i o _ d p d _ s k i p
/ *
* Put D D R _ D A T A , D I S C _ A D D R _ C M D , D D R _ A D D R _ C M D , P O P _ A D D R _ C M D , P O P _ C L K
* and C O M P i n t h e l o w e s t p o w e r m o d e w h e n L P 1 .
* /
mov3 2 r1 , 0 x8 E C 0 0 0 0 0
str r1 , [ r4 , #P M C _ I O _ D P D _ R E Q ]
pmc_io_dpd_skip :
dsb
mov p c , l r
.ltorg
/* dummy symbol for end of IRAM */
.align L1_CACHE_SHIFT
.global tegra30_iram_end
tegra30_iram_end :
b .
2012-10-31 13:41:17 +04:00
# endif