Changeset 3270


Ignore:
Timestamp:
Sep 2, 2012, 1:57:24 AM (2 years ago)
Author:
wmb
Message:

OLPC ARM - Implemented suspend/resume for XO-4, in the process refactoring the XO-1.75 suspend/resume code so much of it could be shared.

Location:
cpu/arm
Files:
4 added
3 edited

Legend:

Unmodified
Added
Removed
  • cpu/arm/mmp2/dramrecal.fth

    r3194 r3270  
    11\ See license at end of file 
    2 purpose: Recalibrate DDR3 DRAM 
     2purpose: Recalibrate DDR3 DRAM (SoC-specific low-level power management factors) 
    33 
    44\ DDR3 DRAM requires periodic recalibration to cope with parameter drift from 
     
    190190here ddr-self-refresh - constant /ddr-self-refresh 
    191191 
    192 memctrl-pa constant memctrl-va 
    193  
    194192: ddr-code-to-sram  ( -- ) 
    195    memctrl-pa h# c02 or  memctrl-va map-section  \ Map the memory controller 
    196  
    197 \ sram is already mapped by initmmu.fth 
    198 \  sram-pa    h# c0e or  sram-va    map-section  \ Make the code cacheable 
    199  
    200193   ddr-recal 'ddr-recal /ddr-recal move 
    201194   'ddr-recal /ddr-recal sync-cache 
     
    227220   mov pc,r1 
    228221c; 
    229  
    230 : apbc-clr-rst  ( offset -- )  4  swap +apbc  io-clr  ; 
    231 : apbc-set-rst  ( offset -- )  4  swap +apbc  io-set  ; 
    232  
    233 : disable-apbc-clks  ( -- ) 
    234    \ 3 h# 38 +apbc io-clr   \ GPIO 
    235    3 h# 74 +apbc io-clr   \ MPMU 
    236    3 h# 78 +apbc io-clr   \ IPC 
    237    3 h# 90 +apbc io-clr   \ THSENS1 
    238  
    239    \ h# 38 apbc-set-rst 
    240    \ h# 74 apbc-set-rst   \ MPMU  - resetting this kills TIMER2, used by the SP PS/2 
    241    h# 78 apbc-set-rst   \ IPC 
    242    h# 90 apbc-set-rst   \ THSENS1 
    243 ; 
    244 : enable-apbc-clks  ( -- ) 
    245    \ 3 h# 38 +apbc io-set   \ GPIO 
    246    3 h# 74 +apbc io-set   \ MPMU 
    247    3 h# 78 +apbc io-set   \ IPC 
    248    3 h# 90 +apbc io-set   \ THSENS1 
    249  
    250    \ h# 38 apbc-clr-rst 
    251    h# 74 apbc-clr-rst   \ MPMU 
    252    h# 78 apbc-clr-rst   \ IPC 
    253    h# 90 apbc-clr-rst   \ THSENS1 
    254 ; 
    255 : disable-scu-clks  ( -- ) 
    256    0 h# 64 +scu io!  \ SCU_AXIFAB_CKGT_CTRL0  - Close AXI fabric clock gate 
    257    0 h# 68 +scu io!  \ SCU_AXIFAB_CKGT_CTRL1 
    258    h# f0 h# 1c +scu io-set  \ SCU_MCB_CONF 
    259 ; 
    260 : enable-scu-clks  ( -- ) 
    261    h# 3003003 h# 64 +scu io!  \ SCU_AXIFAB_CKGT_CTRL0  - Open AXI fabric clock gate 
    262    h# 0303030 h# 68 +scu io!  \ SCU_AXIFAB_CKGT_CTRL1 
    263    h# f0 h# 1c +scu io-clr    \ SCU_MCB_CONF 
    264 ; 
    265 : disable-apmu-clks  ( -- ) 
    266    h#    1b h#  54 +pmua io-clr  \ PMUA_SDH0_CLK_RES_CTRL 
    267    h#    1b h#  58 +pmua io-clr  \ PMUA_SDH1_CLK_RES_CTRL 
    268    h#    1b h#  e8 +pmua io-clr  \ PMUA_SDH2_CLK_RES_CTRL 
    269    h#    1b h#  d4 +pmua io-clr  \ PMUA_SMC_CLK_RES_CTRL 
    270    h#    3f h#  60 +pmua io-clr  \ PMUA_NF_CLK_RES_CTRL 
    271    h#    3f h#  d8 +pmua io-clr  \ PMUA_MSPRO_CLK_RES_CTRL - XO does not use MSPRO 
    272    h#    12 h# 10c +pmua io-clr  \ PMUA_AUDIO_CLK_RES_CTRL 
    273    h# 1fffd h#  dc +pmua io-clr  \ PMUA_GLB_CLK_RES_CTRL 
    274 \  0        h#  68 pmua!         \ PMUA_WTM_CLK_RES_CTRL 
    275    h#     9 h#  5c +pmua io-clr  \ PMUA_USB_CLK_RES_CTRL 
    276 ; 
    277 : enable-apmu-clks  ( -- ) 
    278    h#    1b h#  54 +pmua io-set  \ PMUA_SDH0_CLK_RES_CTRL 
    279    h#    1b h#  58 +pmua io-set  \ PMUA_SDH1_CLK_RES_CTRL 
    280    h#    1b h#  e8 +pmua io-set  \ PMUA_SDH2_CLK_RES_CTRL 
    281    h#    1b h#  d4 +pmua io-set  \ PMUA_SMC_CLK_RES_CTRL \ ??? what is this and why is it on? 
    282    h#    3f h#  60 +pmua io-set  \ PMUA_NF_CLK_RES_CTRL \ Should this be on? 
    283 \  h#    3f h#  d8 +pmua io-set  \ PMUA_MSPRO_CLK_RES_CTRL 
    284    h#    12 h# 10c +pmua io-set  \ PMUA_AUDIO_CLK_RES_CTRL 
    285    h# 1fffd h#  dc +pmua io-set  \ PMUA_GLB_CLK_RES_CTRL 
    286 \  h#    1b h#  68 pmua!         \ PMUA_WTM_CLK_RES_CTRL 
    287    h#     9 h#  5c +pmua io-set  \ PMUA_USB_CLK_RES_CTRL 
    288 ; 
    289 : pll2?  ( -- flag )  h# 34 mpmu@ h# 100 and 0<>  ; 
    290 : disable-mpmu-clks  ( -- ) 
    291    pll2?  if  h# e010  else  h# a010  then    ( cgr-value ) 
    292    dup h# 1024 mpmu!                  \ MPMU_CGR_PJ 
    293    h# 0024 mpmu!                      \ MPMU_CGR_SP 
    294  
    295 \  h# 2000.0000 h#  414 +mpmu io-clr  \ MPMU_PLL2_CTRL1 
    296    h# 8000.0000 h# 0040 +mpmu io-clr  \ MPMU_ISCCR1 
    297    h# 8000.0000 h# 0044 +mpmu io-clr  \ MPMU_ISCCR2 
    298 ; 
    299 : enable-mpmu-clks  ( -- ) 
    300    h# dffe.fffe h# 1024 mpmu!         \ MPMU_ACGR 
    301 \  h# 2000.0000 h# 0414 +mpmu io-set  \ MPMU_PLL2_CTRL1 
    302    h# 8000.0000 h# 0040 +mpmu io-set  \ MPMU_ISCCR1 
    303    h# 8000.0000 h# 0044 +mpmu io-set  \ MPMU_ISCCR2 
    304 ; 
    305 : disable-twsi-clks  ( -- ) 
    306    \ set RST in APBC_TWSIx_CLK_RST registers 
    307  
    308 [ifdef] notdef 
    309    \ just disable TWSI1 clk rather than reset it since it's needed to access PMIC onkey 
    310    \ when system is waken up from low power mode */ 
    311    0 4 +apbc io!   \ Disable TWSI1 clock 
    312 [else] 
    313    h# 04 apbc-set-rst  \ TWSI1 
    314 [then] 
    315    h# 08 apbc-set-rst  \ TWSI2 
    316    h# 0c apbc-set-rst  \ TWSI3 
    317    h# 10 apbc-set-rst  \ TWSI4 
    318    h# 7c apbc-set-rst  \ TWSI5 
    319    h# 80 apbc-set-rst  \ TWSI6 
    320 ; 
    321 : enable-twsi-clks  ( -- ) 
    322 [ifdef] notdef 
    323    3 4 +apbc io!   \ Enable TWSI1 clock 
    324 [else] 
    325    h# 04 apbc-clr-rst  \ TWSI1 
    326 [then] 
    327    h# 08 apbc-clr-rst  \ TWSI2 
    328    h# 0c apbc-clr-rst  \ TWSI3 
    329    h# 10 apbc-clr-rst  \ TWSI4 
    330    h# 7c apbc-clr-rst  \ TWSI5 
    331    h# 80 apbc-clr-rst  \ TWSI6 
    332 ; 
    333 : disable-clks  ( -- ) 
    334    disable-twsi-clks 
    335    disable-apbc-clks 
    336    disable-scu-clks 
    337    disable-apmu-clks 
    338    disable-mpmu-clks 
    339 ; 
    340 : enable-clks  ( -- ) 
    341    enable-mpmu-clks 
    342    enable-apmu-clks 
    343    enable-scu-clks 
    344    enable-apbc-clks 
    345    enable-twsi-clks 
    346 ; 
    347222 
    348223\ Wakeup ports - from datasheet page 718 
     
    363238: block-irqs  ( -- )  1 h# 110 +icu io!  ; 
    364239 
    365 \ XXX we might need to set GPIOs 71 and 160 (ps2 clocks), and perhaps the dat lines too, 
    366 \ for non-sleep-mode control - or maybe for sleep mode control as inputs. 
    367 \ We also may need to enable falling edge detects. 
    368 : disable-int40  ( -- ) 
    369    d# 40 disable-interrupt 
    370    1  h# 29.00cc  io-set   \ Unmask the inter-processor communications interrupt 
    371 ; 
    372  
    373 : gpio-wakeup?  ( gpio# -- flag ) 
    374    h# 019800 over 5 rshift la+ l@  ( gpio# mask ) 
    375    swap h# 1f and                  ( mask bit# ) 
    376    1 swap lshift  and  0<>         ( flag ) 
    377 ; 
    378  
    379 : .masked  ( irq# -- ) 
    380    dup /l* h# 10c + icu@  ( irq# masked ) 
    381    1 and  if              ( irq# ) 
    382       ." IRQ" .d ." is masked off" cr 
    383    else                   ( irq# ) 
    384       drop                ( ) 
    385    then                   ( ) 
    386 ; 
    387 : .selected  ( irq# -- ) 
    388    dup /l* h# 100 + icu@  ( irq# n ) 
    389    dup h# 40 and  if      ( irq# n ) 
    390       ." IRQ" swap .d     ( n ) 
    391       ." selected INT" h# 3f and .d  cr  ( ) 
    392    else                   ( irq# n ) 
    393       2drop               ( ) 
    394    then                   ( ) 
    395 ; 
    396 : (.pending)  ( d -- ) 
    397    ." pending INTs: "                      ( d ) 
    398    d# 64 0  do                             ( d ) 
    399       over 1 and  if  i .d  then           ( d ) 
    400       d2/                                  ( d' ) 
    401    loop                                    ( d ) 
    402    2drop                                   ( ) 
    403 ; 
    404 : .pending  ( irq# -- ) 
    405    dup 2* /l* h# 130 +  dup icu@  swap la1+ icu@   ( irq# d ) 
    406    2dup d0=  if                                    ( irq# d ) 
    407       3drop                                        ( ) 
    408    else                                            ( irq# d ) 
    409       ." IRQ " rot .d   (.pending)  cr             ( ) 
    410    then                                            ( ) 
    411 ; 
    412  
    413 : bit?  ( n bit# -- n flag )  1 swap lshift over and  0<>  ; 
    414 : .ifbit  ( n bit# msg$ -- n ) 
    415    2>r  bit?  if       ( n r: msg$ ) 
    416       2r> type  space  ( n ) 
    417    else                ( n r: msg$ ) 
    418       2r> 2drop        ( n ) 
    419    then                ( n ) 
    420 ; 
    421 : .enabled-ints  ( -- ) 
    422    d# 64 0  do                           ( ) 
    423       i /l* icu@  dup h# 70 and  if      ( n ) 
    424          ." INT" i .d ." -> IRQ"         ( n ) 
    425          4 " 0" .ifbit                   ( n ) 
    426          5 " 1" .ifbit                   ( n ) 
    427          6 " 2" .ifbit                   ( n ) 
    428          ."  Pri " h# f and .d  cr       ( ) 
    429       else                               ( n ) 
    430          drop                            ( ) 
    431       then                               ( ) 
    432    loop                                  ( ) 
    433 ; 
    434 : .int4  ( -- ) 
    435    ." INT4 - mask "  h# 168 icu@ .x 
    436    ." status " h# 150 icu@ dup .x 
    437    0   " USB " .ifbit 
    438    1   " PMIC" .ifbit 
    439    drop  cr 
    440 ; 
    441 : .int5  ( -- ) 
    442    ." INT5 - mask "  h# 16c icu@ .x 
    443    ." status " h# 154 icu@  dup .x 
    444    0   " RTC " .ifbit 
    445    1   " RTC_Alarm" .ifbit 
    446    drop cr 
    447 ; 
    448 : .int9  ( -- ) 
    449    ." INT9 - mask "  h# 17c icu@ .x 
    450    ." status " h# 180 icu@  dup .x 
    451    0   " Keypad " .ifbit 
    452    1   " Rotary " .ifbit 
    453    2   " Trackball" .ifbit 
    454    drop cr 
    455 ; 
    456 : .int17  ( -- ) 
    457    ." INT17 - mask " h# 170 icu@ .x 
    458    ." status " h# 158 icu@  dup .x  ( n ) 
    459    7 2 do              ( n ) 
    460       dup 1 and  if    ( n ) 
    461         ." TWSI" i .d  ( n ) 
    462       then             ( n ) 
    463       u2/              ( n' ) 
    464    loop                ( n ) 
    465    drop  cr            ( ) 
    466 ; 
    467 : .int35  ( -- ) 
    468    ." INT35 - mask "  h# 174 icu@ .x 
    469    ." status " h# 15c icu@  dup  .x 
    470    d#  0  " PJ_PerfMon" .ifbit 
    471    d#  1 " L2_PA_ECC"   .ifbit 
    472    d#  2 " L2_ECC"      .ifbit 
    473    d#  3 " L2_UECC"     .ifbit 
    474    d#  4 " DDR"         .ifbit 
    475    d#  5 " Fabric0"     .ifbit 
    476    d#  6 " Fabric1"     .ifbit 
    477    d#  7 " Fabric2"     .ifbit 
    478    d#  9 " Thermal"     .ifbit 
    479    d# 10 " MainPMU"     .ifbit 
    480    d# 11 " WDT2"        .ifbit 
    481    d# 12 " CoreSight"   .ifbit 
    482    d# 13 " PJ_Commtx"   .ifbit 
    483    d# 14 " PJ_Commrx"   .ifbit 
    484    drop 
    485    cr 
    486 ; 
    487 : .int51  ( -- ) 
    488    ." INT51 - mask " h# 178 icu@ .x 
    489    ." status " h# 160 icu@  dup  .x 
    490    0 " HSI_CAWAKE1 "  .ifbit 
    491    1 " MIPI_HSI1"     .ifbit 
    492    drop cr 
    493 ; 
    494 : .int55  ( -- ) 
    495    ." INT55 - mask " h# 184 icu@ .x 
    496    ." status " h# 188 icu@  dup  .x 
    497    0 " HSI_CAWAKE0 "  .ifbit 
    498    1 " MIPI_HSI0"     .ifbit 
    499    drop cr 
    500 ; 
    501  
    502 : .fiq  ( -- ) 
    503    h# 304 icu@  if  ." FIQ is masked off"  cr  then 
    504    h# 300 icu@  dup  h# 40 and  if  ." FIQ selected INT: " h# 3f and .d cr  else  drop  then 
    505    h# 310 icu@  h# 314 icu@  2dup d0=  if  ( d ) 
    506       2drop                                ( ) 
    507    else                                    ( d ) 
    508       ." FIQ " (.pending) cr               ( ) 
    509    then                                    ( ) 
    510 ; 
    511    
    512 : .icu  ( -- ) 
    513    .enabled-ints 
    514    3 0 do  i .masked  i .selected  i .pending  loop 
    515    \ XXX should handle DMA interrupts too 
    516    .fiq 
    517    .int4  .int5  .int9  .int17  .int35  .int51  .int55 
    518 ; 
    519 string-array wakeup-bit-names 
    520    ," WU0 " 
    521    ," WU1 " 
    522    ," WU2 " 
    523    ," WU3 " 
    524    ," WU4 " 
    525    ," WU5 " 
    526    ," WU6 " 
    527    ," WU7 " 
    528    ," TIMER_1_1 " 
    529    ," TIMER_1_2 " 
    530    ," TIMER_1_3 " 
    531    ," MSP_INS " 
    532    ," AUDIO " 
    533    ," WDT1 " 
    534    ," TIMER_2_1 " 
    535    ," TIMER_2_2 " 
    536    ," TIMER_2_3 " 
    537    ," RTC_ALARM " 
    538    ," WDT2 " 
    539    ," ROTARY " 
    540    ," TRACKBALL " 
    541    ," KEYPRESS " 
    542    ," SDH3_CARD " 
    543    ," SDH1_CARD " 
    544    ," FULL_IDLE " 
    545    ," ASYNC_INT " 
    546    ," SSP1_SRDY " 
    547    ," CAWAKE " 
    548    ," resv28 " 
    549    ," SSP3_SRDY " 
    550    ," ALL_WU " 
    551    ," resv31 " 
    552 end-string-array 
    553  
    554 string-array wakeup-mask-names 
    555    ," WU0 " 
    556    ," WU1 " 
    557    ," WU2 " 
    558    ," WU3 " 
    559    ," WU4 " 
    560    ," WU5 " 
    561    ," WU6 " 
    562    ," WU7 " 
    563    ," TIMER_1_1 " 
    564    ," TIMER_1_2 " 
    565    ," TIMER_1_3 " 
    566    ," " 
    567    ," " 
    568    ," " 
    569    ," TIMER_2_1 " 
    570    ," TIMER_2_2 " 
    571    ," TIMER_2_3 " 
    572    ," RTC_ALARM " 
    573    ," WDT2 " 
    574    ," ROTARY " 
    575    ," TRACKBALL " 
    576    ," KEYPRESS " 
    577    ," SDH3_CARD " 
    578    ," SDH1_CARD " 
    579    ," FULL_IDLE " 
    580    ," ASYNC_INT " 
    581    ," WDT1 " 
    582    ," SSP3_SRDY " 
    583    ," SSP1_SRDY " 
    584    ," CAWAKE " 
    585    ," MSP_INS " 
    586    ," resv31 " 
    587 end-string-array 
    588  
    589 : .active-wakeups  ( -- ) 
    590    ." Wakeups: " 
    591    h# 1048 mpmu@    ( n ) 
    592    d# 31 0  do      ( n ) 
    593       dup 1 and  if  i wakeup-bit-names count type  then  ( n ) 
    594       u2/           ( n' ) 
    595    loop             ( n ) 
    596    drop cr          ( ) 
    597 ; 
    598 : .wakeup-mask  ( -- ) 
    599    ." Enabled wakeups: " 
    600    h# 4c mpmu@  h# 104c or   ( n ) 
    601    d# 31 0  do               ( n ) 
    602       dup 1 and  if  i wakeup-mask-names count type  then  ( n ) 
    603       u2/                    ( n' ) 
    604    loop                      ( n ) 
    605    drop cr                   ( ) 
    606 ; 
    607 : .edges  ( -- ) 
    608    ." Wakeup edges: "           ( ) 
    609    d# 6 0  do                   ( ) 
    610       h# 19800 i la+ io@        ( n ) 
    611       d# 32  0  do              ( n ) 
    612          dup 1 and  if          ( n ) 
    613             j d# 32 *  i +  .d  ( n ) 
    614          then                   ( n ) 
    615          u2/                    ( n' ) 
    616       loop                      ( n ) 
    617       drop                      ( ) 
    618    loop                         ( ) 
    619    cr                           ( ) 
    620 ; 
    621 : .edge-enables  ( -- ) 
    622    ." Enabled edges: " 
    623    d# 160  0  do 
    624       i af@ dup  h# 70 and  h# 40 <>   if  ( n ) 
    625          dup h# 10 and  if  ." R"  then    ( n ) 
    626          dup h# 20 and  if  ." F"  then    ( n ) 
    627          dup h# 40 and  if  ." C"  then    ( n ) 
    628          i .d                              ( n ) 
    629       then                                 ( n ) 
    630       drop                                 ( ) 
    631    loop 
    632 ; 
    633 : .wakeup  ( -- )   .active-wakeups  .wakeup-mask  .edges .edge-enables  ; 
    634  
    635 : .irqstat  ( -- )  h# 148 h# 130 do  i icu@ .  4 +loop   ; 
    636 \ !!! The problem right now is that I have woken from keyboard, but the interrupt is still asserted 
    637 \ So perhaps the interrupt handler didn't fire 
    638 : rotate-wakeup? ( -- flag )  d#  15 gpio-wakeup?   ; 
    639 : kbd-wakeup?    ( -- flag )  d#  71 gpio-wakeup?   ; 
    640 : tpd-wakeup?    ( -- flag )  d# 160 gpio-wakeup?   ; 
    641 \ We need to do this in the SP interrupt handler 
    642 : clear-wakeup  ( gpio# -- ) 
    643    dup af@                 ( gpio# value ) 
    644    2dup h# 40 or swap af!  ( gpio# value ) 
    645    swap af! 
    646 ; 
    647 \ How to wakeup from SP: 
    648 : setup-key-wakeup  ( -- ) 
    649    d# 24 d# 15 do  h# b0 i af!  loop  \ Wake SoC on game keys 
    650 [ifdef] soc-kbd-clk-gpio# 
    651    h# 220 soc-kbd-clk-gpio# af!  \ Wake SoC on KBD CLK falling edge 
    652    h# 221 soc-tpd-clk-gpio# af!  \ Wake SoC on TPD CLK falling edge 
    653 [then] 
    654    h# 4  h# 4c +mpmu  io-set  \ Pin edge (GPIO per datasheet) wakes SoC 
    655    ['] disable-int40 d# 40 interrupt-handler! 
    656    d# 40 enable-interrupt  \ SP to PJ4 communications interrupt 
    657    1  h# 29.00cc  io-clr   \ Unmask the inter-processor communications interrupt 
    658 ; 
    659  
    660240: breadcrumb  ( n -- )  h# d000.0110 l!  ; 
    661241 
     
    750330 
    751331   \ end mmp2_pm_enter_lowpower_mode(state) 
    752 ; 
    753  
    754 [ifdef] soc-en-kbd-pwr-gpio# 
    755 : keyboard-power-on   ( -- )  soc-en-kbd-pwr-gpio# gpio-clr  ; 
    756 : keyboard-power-off  ( -- )  soc-en-kbd-pwr-gpio# gpio-set  ; 
    757 [else] 
    758 : keyboard-power-on   ( -- )  ; 
    759 : keyboard-power-off  ( -- )  ; 
    760 [then] 
    761 : wlan-power-on   ( -- )  en-wlan-pwr-gpio# gpio-set  ; 
    762 : wlan-power-off  ( -- )  en-wlan-pwr-gpio# gpio-clr  h# 040 en-wlan-pwr-gpio# af!  h# 040 wlan-pd-gpio# af!  h# 040 wlan-reset-gpio# af!  ; 
    763 : wlan-stay-on  ( -- )  h# 140 en-wlan-pwr-gpio# af!  h# 140 wlan-pd-gpio# af!  h# 140 wlan-reset-gpio# af!  ; 
    764  
    765 0 value sleep-mask 
    766 : screen-sleep 
    767    sleep-mask 1 and  if            \ DCON power down 
    768       dcon-freeze 
    769    else 
    770       " dcon-suspend" $call-dcon 
    771    then 
    772    " sleep" $call-screen 
    773    " set-ack" $call-ec 
    774  
    775    \ 0 h# 54 pmua!  \ Kill the SDIO 0 clocks - insignificant savings 
    776    \ 0 h# 58 pmua!  \ Kill the SDIO 1 clocks - insignificant savings 
    777    sleep-mask 2 and  0=  if  keyboard-power-off  then  \ Should save about 17 mW 
    778    sleep-mask 4 and  if 
    779       wlan-stay-on 
    780    else 
    781       " /wlan" " sleep" execute-device-method drop 
    782       wlan-power-off 
    783    then  \ saves 100 mW 
    784 ; 
    785 : screen-wake  ( -- ) 
    786    sleep-mask 4 and  0=  if 
    787       wlan-power-on 
    788       " /wlan" " wake" execute-device-method drop 
    789    then 
    790    sleep-mask 2 and  0=  if  keyboard-power-on   then  
    791    " clr-ack" $call-ec 
    792    " wake" $call-screen 
    793    sleep-mask 1 and  if            \ DCON power up 
    794       dcon-unfreeze 
    795    else 
    796       " dcon-resume" $call-dcon 
    797    then 
    798 ; 
    799  
    800 : stdin-idle-on   ['] safe-idle to stdin-idle  d# 15 enable-interrupt  ; 
    801 : stdin-idle-off  ['] noop to stdin-idle  ( install-uart-io ) d# 15 disable-interrupt  ; 
    802  
    803 : timers-sleep  ( -- ) 
    804    0 h# 14048 io!    \ Disable interrupts from the tick timer 
    805    7 h# 1407c io!    \ Clear any pending interrupts 
    806    h# f disable-interrupt  \ Block timer interrupt 
    807 ; 
    808 : timers-wake ( -- ) 
    809    1 h# 14048 io!    \ Enable interrupts from the tick timer 
    810    7 h# 1407c io!    \ Clear any pending interrupts 
    811    h# f enable-interrupt  \ Unblock timer interrupt 
    812    reschedule-tick 
     332   h# 000c.0000 h# 8c +pmua io-set  \ Power down CoreSight SRAM 
     333 
     334   block-irqs 
    813335; 
    814336 
    815337: power-islands-off  ( -- ) 
    816    0 h# 10c pmua!   \ Turn off audio power island 
    817 ; 
    818 : power-islands-on  ( -- ) 
    819    h# 712 h# 10c pmua!   \ Turn on audio power island 
    820 ; 
    821  
    822 : str  ( -- ) 
    823 [ifdef] use-gpio 
    824    3 gpio-dir-out 
    825 [then] 
    826  
    827    disable-interrupts 
    828    suspend-usb 
    829    timers-sleep 
    830  
    831    screen-sleep 
    832    stdin-idle-off 
    833    5 h# 38 mpmu!    \ Use 32 kHz clock instead of VCXO for slow clock 
    834  
    835 \ OLPC: Unmask main PMU interrupt - don't know if this is necessary 
    836 \   h# 400 h# 174 +icu io-clr 
    837 \   d# 35 enable-interrupt 
    838  
    839 \ The PMIC_INT line is unconnected on XO-1.75.  Normally it would come from the EC, 
    840 \ presumably for the purpose of waking on a keystroke. 
    841 \  4 enable-interrupt   \ Route PMIC interrupt to PJ4 IRQ 
    842 \  2 h# 168 +icu io-clr \ Enable PMIC interrupt 
    843  
    844    setup-sleep-state 
    845  
    846    h# 000c.0000 h# 8c +pmua io-set  \ Power down CoreSight SRAM 
    847  
    848338   \ TODO - need to power down sram/l2$ 
    849339   \ mmp2_cpu_disable_l2(0); 
    850340   \ outer_cache.flush_range(0, -1ul); 
    851341 
    852    power-islands-off 
    853  
    854    disable-clks 
    855  
    856    \ begin mmp2_cpu_do_idle() 
    857    block-irqs                    ( )  \ Block IRQs - will be cleared by PMU 
    858 [ifdef] use-hw-s3 
     342[ifdef] use-gpio 
     343   3 gpio-dir-out 
     344[then] 
     345   0 h# 10c pmua!   \ Turn off audio power island 
     346; 
     347: power-islands-on  ( -- ) 
     348   h# 712 h# 10c pmua!   \ Turn on audio power island 
     349; 
     350: do-wfi  ( -- ) 
     351   [ifdef] use-hw-s3 
    859352   wfi 
    860353[else] 
    861354   do-self-refresh 
    862355[then] 
    863  
    864    restore-run-state 
    865    \ end mmp2_cpu_do_idle() 
    866  
    867    enable-clks 
    868  
    869    power-islands-on 
    870  
    871    \ mmp2_cpu_enable_l2(0); 
    872  
    873    \ idle_cfg &= (~PMUA_MOH_SRAM_PWRDWN); 
    874    stdin-idle-on 
    875  
    876    screen-wake 
    877    timers-wake 
    878    resume-usb 
    879    enable-interrupts 
    880    init-thermal-sensor 
    881 ; 
    882 : strp  ( -- )  ec-rst-pwr  str  ec-max-pwr .d ." mW " soc .%  space  ; 
     356; 
    883357 
    884358\ LICENSE_BEGIN 
  • cpu/arm/mmp2/socregs.fth

    r3115 r3270  
    2222: mpmu@  ( offset -- l )  +mpmu io@  ; 
    2323: mpmu!  ( l offset -- )  +mpmu io!  ; 
     24 
     25: mpmu-set  ( bits reg# -- )  +mpmu io-set  ; 
     26: mpmu-clr  ( bits reg# -- )  +mpmu io-clr  ; 
    2427 
    2528: pmua@  ( offset -- l )  +pmua io@  ; 
  • cpu/arm/olpc/build-fw.fth

    r3260 r3270  
    563563fload ${BP}/cpu/x86/pc/olpc/plot.fth 
    564564 
     565fload ${BP}/cpu/arm/mmp2/showirqs.fth 
     566fload ${BP}/cpu/arm/mmp2/wakeups.fth 
     567 
     568[ifdef] mmp3 
     569fload ${BP}/cpu/arm/mmp3/dramtable.fth 
     570[then] 
     571[ifdef] mmp2 
    565572fload ${BP}/cpu/arm/mmp2/dramrecal.fth 
     573[then] 
     574fload ${BP}/cpu/arm/olpc/suspend.fth 
    566575 
    567576code halt  ( -- )  wfi   c; 
Note: See TracChangeset for help on using the changeset viewer.