Changeset 3270


Ignore:
Timestamp:
Sep 1, 2012, 11:57:24 PM (3 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.