-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Sonic Zhang
authored and
Bob Liu
committed
Jul 24, 2012
1 parent
4427a00
commit 5511f6c
Showing
8 changed files
with
198 additions
and
128 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: a5b4d4be6ce7939d1604fae05786833fffae02f9 | ||
refs/heads/master: c7e48e1e3e926de21605f959c31689d56fb639e3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,4 +3,4 @@ | |
# | ||
|
||
obj-y := dma.o clock.o | ||
obj-$(CONFIG_PM) += pm.o hibernate.o | ||
obj-$(CONFIG_PM) += pm.o dpm.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
#include <linux/linkage.h> | ||
#include <asm/blackfin.h> | ||
#include <asm/dpmc.h> | ||
|
||
#include <asm/context.S> | ||
|
||
#define PM_STACK (COREA_L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) | ||
|
||
.section .l1.text | ||
ENTRY(_enter_hibernate) | ||
/* switch stack to L1 scratch, prepare for ddr srfr */ | ||
P0.H = HI(PM_STACK); | ||
P0.L = LO(PM_STACK); | ||
SP = P0; | ||
|
||
call _bf609_ddr_sr; | ||
call _bfin_hibernate_syscontrol; | ||
|
||
P0.H = HI(DPM0_RESTORE4); | ||
P0.L = LO(DPM0_RESTORE4); | ||
P1.H = _bf609_pm_data; | ||
P1.L = _bf609_pm_data; | ||
[P0] = P1; | ||
|
||
P0.H = HI(DPM0_CTL); | ||
P0.L = LO(DPM0_CTL); | ||
R3.H = HI(0x00000010); | ||
R3.L = LO(0x00000010); | ||
|
||
bfin_init_pm_bench_cycles; | ||
|
||
[P0] = R3; | ||
|
||
SSYNC; | ||
ENDPROC(_enter_hibernate) | ||
|
||
/* DPM wake up interrupt won't wake up core on bf60x if its core IMASK | ||
* is disabled. This behavior differ from bf5xx serial processor. | ||
*/ | ||
ENTRY(_dummy_deepsleep) | ||
[--sp] = SYSCFG; | ||
[--sp] = (R7:0,P5:0); | ||
cli r0; | ||
|
||
/* get wake up interrupt ID */ | ||
P0.l = LO(SEC_SCI_BASE + SEC_CSID); | ||
P0.h = HI(SEC_SCI_BASE + SEC_CSID); | ||
R0 = [P0]; | ||
|
||
/* ACK wake up interrupt in SEC */ | ||
P1.l = LO(SEC_END); | ||
P1.h = HI(SEC_END); | ||
|
||
[P1] = R0; | ||
SSYNC; | ||
|
||
/* restore EVT 11 entry */ | ||
p0.h = hi(EVT11); | ||
p0.l = lo(EVT11); | ||
p1.h = _evt_evt11; | ||
p1.l = _evt_evt11; | ||
|
||
[p0] = p1; | ||
SSYNC; | ||
|
||
(R7:0,P5:0) = [sp++]; | ||
SYSCFG = [sp++]; | ||
RTI; | ||
ENDPROC(_dummy_deepsleep) | ||
|
||
ENTRY(_enter_deepsleep) | ||
LINK 0x0; | ||
[--sp] = (R7:0,P5:0); | ||
|
||
/* Change EVT 11 entry to dummy handler for wake up event */ | ||
p0.h = hi(EVT11); | ||
p0.l = lo(EVT11); | ||
p1.h = _dummy_deepsleep; | ||
p1.l = _dummy_deepsleep; | ||
|
||
[p0] = p1; | ||
|
||
P0.H = HI(PM_STACK); | ||
P0.L = LO(PM_STACK); | ||
|
||
EX_SCRATCH_REG = SP; | ||
SP = P0; | ||
|
||
SSYNC; | ||
|
||
/* should put ddr to self refresh mode before sleep */ | ||
call _bf609_ddr_sr; | ||
|
||
/* Set DPM controller to deep sleep mode */ | ||
P0.H = HI(DPM0_CTL); | ||
P0.L = LO(DPM0_CTL); | ||
R3.H = HI(0x00000008); | ||
R3.L = LO(0x00000008); | ||
[P0] = R3; | ||
CSYNC; | ||
|
||
/* Enable evt 11 in IMASK before idle, otherwise core doesn't wake up. */ | ||
r0.l = 0x800; | ||
r0.h = 0; | ||
sti r0; | ||
SSYNC; | ||
|
||
/* Fall into deep sleep in idle*/ | ||
idle; | ||
SSYNC; | ||
|
||
/* Restore PLL after wake up from deep sleep */ | ||
call _bf609_resume_ccbuf; | ||
|
||
/* turn ddr out of self refresh mode */ | ||
call _bf609_ddr_sr_exit; | ||
|
||
SP = EX_SCRATCH_REG; | ||
|
||
(R7:0,P5:0) = [SP++]; | ||
UNLINK; | ||
RTS; | ||
ENDPROC(_enter_deepsleep) | ||
|
||
.section .text | ||
ENTRY(_bf609_hibernate) | ||
bfin_cpu_reg_save; | ||
bfin_core_mmr_save; | ||
|
||
P0.H = _bf609_pm_data; | ||
P0.L = _bf609_pm_data; | ||
R1.H = 0xDEAD; | ||
R1.L = 0xBEEF; | ||
R2.H = .Lpm_resume_here; | ||
R2.L = .Lpm_resume_here; | ||
[P0++] = R1; | ||
[P0++] = R2; | ||
[P0++] = SP; | ||
|
||
P1.H = _enter_hibernate; | ||
P1.L = _enter_hibernate; | ||
|
||
call (P1); | ||
.Lpm_resume_here: | ||
|
||
bfin_core_mmr_restore; | ||
bfin_cpu_reg_restore; | ||
|
||
[--sp] = RETI; /* Clear Global Interrupt Disable */ | ||
SP += 4; | ||
|
||
RTS; | ||
|
||
ENDPROC(_bf609_hibernate) | ||
|
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.