[openfirmware] [commit] r3236 - cpu/arm/mmp2

repository service svn at openfirmware.info
Wed Aug 29 02:48:21 CEST 2012


Author: wmb
Date: Wed Aug 29 02:48:20 2012
New Revision: 3236
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3236

Log:
OLPC ARM - implemented a generic mechanism for enabling and disabling device clocks based on the "clocks" property.  Important new words are "my-clock-on" and "my-clock-off", which can be called from a device instance in a node that has a "clocks" property.

Modified:
   cpu/arm/mmp2/apbc.fth
   cpu/arm/mmp2/pmua.fth

Modified: cpu/arm/mmp2/apbc.fth
==============================================================================
--- cpu/arm/mmp2/apbc.fth	Wed Aug 29 02:12:35 2012	(r3235)
+++ cpu/arm/mmp2/apbc.fth	Wed Aug 29 02:48:20 2012	(r3236)
@@ -89,4 +89,11 @@
 h# 94 +int  h#  7 +int  h#  3 +int  d# 26,000,000 +int  \ 35 CORESIGHT
 " clock-enable-registers" property
 
+: on/off  ( on? clock# -- )
+   get-reg&masks  if  drop exit  then  ( on? set-mask clr-mask reg )
+   >r  r@ apbc@  and                   ( on? set-mask regval   r: reg )
+   rot  if  or  else  nip  then        ( regval'  r: reg )
+   r> apbc!
+;
+
 end-package

Modified: cpu/arm/mmp2/pmua.fth
==============================================================================
--- cpu/arm/mmp2/pmua.fth	Wed Aug 29 02:12:35 2012	(r3235)
+++ cpu/arm/mmp2/pmua.fth	Wed Aug 29 02:48:20 2012	(r3236)
@@ -2,6 +2,31 @@
 : clocks 2 ;
 previous definitions
 
+\ Given a clock index, retrieve the register offset and set/clear masks
+\ from the clock-enable-registers property in the device node from which
+\ this is called.  The format and usage of clock-enable-registers is
+\ specific to PXA/MMP SoCs, but might be useful for any hardware whose
+\ clock enabling can be expressed by clearing some register bits and
+\ setting others.
+
+: get-reg&masks  ( clock# -- set-mask ~clr-mask reg false | true )
+   " clock-enable-registers" get-property  if  ( clock# )
+      drop true exit      ( true -- )
+   then                   ( clock# propval$ )
+
+   \ Offset into clock-enable-registers array
+   rot  h# 10 *           ( propval$ offset )
+   2dup  <=  if           ( propval$ offset )
+      3drop true exit     ( true -- )
+   then                   ( propval-adr$ offset )
+   /string                ( propval-adr$' )
+
+   decode-int >r          ( propval-adr$'  r: reg )
+   decode-int invert >r   ( propval-adr$'  r: reg ~clr-mask )
+   get-encoded-int r> r>  ( set-mask ~clr-mask reg )
+   false                  ( set-mask ~clr-mask reg false )
+;
+
 0 0  " "  " /" begin-package
 " pmua" name
 " mrvl,pxa-apmu" +compatible
@@ -96,4 +121,132 @@
 [then]
 " clock-enable-registers" property
 
+[ifdef] notdef
+   " clock-enable-registers" get-property  if  ( on? clock# )
+      2drop exit          ( -- )
+   then                   ( on? clock# propval$ )
+
+   \ Offset into clock-enable-registers array
+   rot  h# 10 *           ( on? propval$ offset )
+   2dup  <=  if           ( on? propval$ offset )
+      4drop exit          ( -- )
+   then                   ( on? propval-adr$ offset )
+   /string                ( on? propval-adr$' )
+   
+   \ Get register offset
+   decode-int >r          ( on? propval-adr$'           r: reg-offset )
+
+   \ Apply the clear mask to the register value
+   decode-int invert      ( on? propval-adr$' clr-mask  r: reg-offset )
+   r@ pmua@ and           ( on? propval-adr$' regval    r: reg-offset )
+   -rot                   ( on? regval propval-adr$     r: reg-offset )
+
+   \ Apply the set mask if the clock is being turned on
+   3 roll  if             ( regval propval-adr$         r: reg-offset )
+      get-encoded-int or  ( regval'                     r: reg-offset )
+   else                   ( regval propval-adr$         r: reg-offset )
+      2drop               ( regval                      r: reg-offset )
+   then                   ( regval                      r: reg-offset )
+
+   \ Write back the modified register value
+   r> pmua!               ( )
+[then]
+
+: generic-on/off  ( on? clock# -- )
+   get-reg&masks  if  drop exit  then  ( on? set-mask clr-mask reg )
+   >r  r@ pmua@  and                   ( on? set-mask regval   r: reg )
+   rot  if  or  else  nip  then        ( regval'  r: reg )
+   r> pmua!
+;
+
+[ifdef] mmp3
+: ccic-isp-island-off  ( -- )
+   h# 600 h# 1fc pmua!  \ Isolation enabled
+   \ Fiddle with ISP_CLK_RES_CTRL here to turn off ISP engine
+   h# 000 h# 1fc pmua!  \ Power off
+;
+
+: ccic-isp-island-on   ( -- )
+   \ set ISP regs to the default value
+   0 h#  50 pmua!
+   0 h# 1fc pmua!
+
+   \ Turn on the CCIC/ISP power switch
+   h# 200 h# 1fc pmua!  \ Partially powered
+   d# 10 ms
+   h# 600 h# 1fc pmua!  \ Fully powered
+   d# 10 ms
+   h# 700 h# 1fc pmua!  \ Isolation disabled
+
+[ifdef] notdef
+   \ Empirically, the memory redundancy and SRAMs are unnecessary
+   \ for camera-only (no ISP) operation.
+
+   \ Start memory redundacy repair
+   4 h# 224 pmua-set   \ PMUA_ISP_CLK_RES_CTRL
+   begin  d# 10 ms h# 224 pmua@  4 and  0=  until
+	
+   \ Enable dummy clocks to the SRAMS
+   h# 10 h# 1e0 pmua-set   \ PMUA_ISLD_CI_PDWN_CTRL
+   d# 200 ms
+   h# 10 h# 1e0 pmua-clr
+[then]
+
+   \ Enable ISP clocks here if you want to use the ISP
+   \ 8 h# 224 pmua-set  \ Enable AXI clock in PMUA_ISP_CLK_RES_CTRL
+   \ h# f00 h# 200 h# 224 pmua-fld \ Clock divider
+   \ h#  c0 h#  40 h# 224 pmua-fld \ CLock source
+   \ h# 10 h# 224 pmua-set
+
+   \ enable CCIC clocks
+   h# 8238 h# 50 pmua-set
+
+   \ Deassert ISP clocks here if you want to use the ISP
+   \ XXX should these be pmua-clr ?
+   \ 1 h# 224 pmua-set  \ AXI reset
+   \ 2 h# 224 pmua-set  \ ISP SW reset
+   \ h# 10000 h# 50 pmua-set  \ CCIC1 AXI Arbiter reset
+
+   \ De-assert CCIC Resets
+   h# 10107 h# 50 pmua-set \ XXX change to 107
+;
+[then]
+
+: ccic-on/off  ( on? -- )
+   if
+      [ifdef] mmp3  ccic-isp-island-on  [then]
+
+      \ Enable clocks
+      h#        3f h# 28 pmua!  \ Clock gating - AHB, Internal PIXCLK, AXI clock always on
+      h# 0003.805b h# 50 pmua!  \ PMUA clock config for CCIC - /1, PLL1/16, AXI arb, AXI, perip on
+   else
+      h# 3f h# 50 pmua-clr
+      [ifdef] mmp3  ccic-isp-island-off  [then]
+   then
+;
+
+: on/off  ( on? clock# -- )
+   \ Special-case devices that need more elaborate on/off procedures
+   dup 2  =  if     \ CCIC         ( on? clock# )
+      drop  ccic-on/off  exit      ( -- )
+   then                            ( on? clock# )
+
+   generic-on/off
+;
+
 end-package
+
+\ This is a general-purpose mechanism for enabling/disabling a clock
+\ that is described by a "clocks" property in the device node.  The
+\ property value is a phandle and an index, as used in Linux.
+
+: my-clock-on/off  ( on? -- )
+   " clocks" get-my-property  abort" No clocks property"  ( on? propval$ )
+   decode-int  >r                  ( on? propval$  r: phandle )
+   get-encoded-int                 ( on? clock#  r: phandle )
+   r> push-package                 ( on? clock#  )
+   " on/off" package-execute       ( )
+   pop-package                     ( )
+;
+: my-clock-off  ( -- )  false  my-clock-on/off  ;
+: my-clock-on  ( -- )  true  my-clock-on/off  ;



More information about the openfirmware mailing list