[openfirmware] r1465 - cpu/x86/pc/olpc/via

svn at openfirmware.info svn at openfirmware.info
Mon Nov 9 22:04:45 CET 2009


Author: wmb
Date: 2009-11-09 21:04:45 +0000 (Mon, 09 Nov 2009)
New Revision: 1465

Added:
   cpu/x86/pc/olpc/via/clkgen.fth
Modified:
   cpu/x86/pc/olpc/via/devices.fth
   cpu/x86/pc/olpc/via/smbus.fth
Log:
OLPC trac 9481 - turn off unused clock generator outputs to save power.
New commands "enable-unused-clocks" and "disable-unused-clocks" for power testing.


Added: cpu/x86/pc/olpc/via/clkgen.fth
===================================================================
--- cpu/x86/pc/olpc/via/clkgen.fth	                        (rev 0)
+++ cpu/x86/pc/olpc/via/clkgen.fth	2009-11-09 21:04:45 UTC (rev 1465)
@@ -0,0 +1,56 @@
+\ See license at end of file
+purpose: Driver for the clock generator chip connected to the SMBus
+
+h# d2 2/ constant clkgen-smbus-id
+h# 15 constant /clkgen-buf
+d# 32 buffer: clkgen-buf  \ Extra large in case the clock generator changes
+
+: clkgen-read  ( -- )
+   enable-smbus                          ( )
+   clkgen-smbus-id smbus-acquire         ( )
+   clkgen-buf /clkgen-buf 0  smbus-read  ( #read )
+   /clkgen-buf <> abort" clkgen-read: smbus-read returned wrong byte count"
+   smbus-release                         ( )
+;
+
+: clkgen-b@  ( reg# -- value )  clkgen-read  clkgen-buf + c@  ;
+
+: clkgen-b!  ( value reg# -- )
+   enable-smbus                     ( value reg# )
+   clkgen-smbus-id smbus-acquire    ( value reg# )
+   swap clkgen-buf c!               ( reg# )
+   clkgen-buf 1  rot  smbus-write   ( )
+   smbus-release                    ( )
+;
+
+: disable-unused-clocks  ( -- )   h# 02 5 clkgen-b!  ;
+: enable-unused-clocks   ( -- )   h# de 5 clkgen-b!  ;
+
+stand-init: Clock generator
+   disable-unused-clocks
+;
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 FirmWorks
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END

Modified: cpu/x86/pc/olpc/via/devices.fth
===================================================================
--- cpu/x86/pc/olpc/via/devices.fth	2009-11-09 08:40:32 UTC (rev 1464)
+++ cpu/x86/pc/olpc/via/devices.fth	2009-11-09 21:04:45 UTC (rev 1465)
@@ -18,6 +18,7 @@
 fload ${BP}/cpu/x86/acpitimer.fth
 
 fload ${BP}/cpu/x86/pc/olpc/via/smbus.fth	\ SMBUS driver
+fload ${BP}/cpu/x86/pc/olpc/via/clkgen.fth	\ SMBus-connected clock generator driver
 fload ${BP}/cpu/x86/apic.fth			\ APIC driver
 
 stand-init: APIC

Modified: cpu/x86/pc/olpc/via/smbus.fth
===================================================================
--- cpu/x86/pc/olpc/via/smbus.fth	2009-11-09 08:40:32 UTC (rev 1464)
+++ cpu/x86/pc/olpc/via/smbus.fth	2009-11-09 21:04:45 UTC (rev 1465)
@@ -34,6 +34,7 @@
    h# 40 or smb-hostctl!  ( )  \ 40 is go bit
    smbus-wait             ( )
    smb-hoststat@          ( stat )
+   h# 9e smb-hoststat!    ( )  \ Clear all status bits
    dup h# 9c and  if      ( stat )
       dup h# 80 and  abort" SMBUS error: PEC"                   
       dup h# 10 and  abort" SMBUS error: FailedBusTransaction"
@@ -42,7 +43,6 @@
       drop
    then                   ( stat )
    drop                   ( )
-   h# 9e smb-hoststat!    ( )  \ Clear all status bits
 ;
 
 \ Bracket groups of SMBUS usage with  smbus-acquire ... smbus-release
@@ -57,23 +57,40 @@
 \ Release semaphore so it will read back as 0 the next time someone looks
 : smbus-release  ( -- )  h# 40 smb-hoststat!  ;
 
-: smbus-write  ( adr len offset -- )  \ Up to 32 bytes
+: i2c-write  ( adr len offset -- )  \ Up to 32 bytes
    smbus-target smb-xmitadr!      ( adr len offset )
    smb-hostcmd!                   ( adr len )      \ Starting offset
    dup smb-hostdata0!             ( adr len )      \ Length
-   smb-hoststat@ drop             ( adr len )      \ Reset block transfer counter
+   smb-hostcmd@ drop              ( adr len )      \ Reset block transfer counter
    bounds  ?do  i c@ smb-blockdata!  loop  ( )     \ Copy data to chip
    h# 34 smbus-cmd                ( )              \ I2C block command
 ;
-: smbus-read  ( adr maxlen offset -- actlen )  \ Up to 32 bytes
+: i2c-read  ( adr maxlen offset -- actlen )  \ Up to 32 bytes
    smbus-target 1 or smb-xmitadr! ( adr maxlen offset )
    smb-hostcmd!                   ( adr maxlen )   \ Starting offset
    h# 34 smbus-cmd                ( adr maxlen )   \ I2C block command
    smb-hostdata0@ min             ( adr actlen )   \ Number of bytes returned
-   smb-hoststat@ drop             ( adr actlen )   \ Reset block transfer counter
+   smb-hostcmd@ drop              ( adr actlen )   \ Reset block transfer counter
    tuck  bounds  ?do  smb-blockdata@  i c!   loop  ( actlen )  \ Copy data from chip
 ;
 
+: smbus-write  ( adr len offset -- )  \ Up to 32 bytes
+   smbus-target smb-xmitadr!      ( adr len offset )
+   smb-hostcmd!                   ( adr len )      \ Starting offset
+   dup smb-hostdata0!             ( adr len )      \ Length
+   smb-hostcmd@ drop              ( adr len )      \ Reset block transfer counter
+   bounds  ?do  i c@ smb-blockdata!  loop  ( )     \ Copy data to chip
+   h# 14 smbus-cmd                ( )              \ SMBus block command
+;
+: smbus-read  ( adr maxlen offset -- actlen )  \ Up to 32 bytes
+   smbus-target 1 or smb-xmitadr! ( adr maxlen offset )
+   smb-hostcmd!                   ( adr maxlen )   \ Starting offset
+   h# 14 smbus-cmd                ( adr maxlen )   \ SMBus block command
+   smb-hostdata0@ min             ( adr actlen )   \ Number of bytes returned
+   smb-hostcmd@ drop              ( adr actlen )   \ Reset block transfer counter
+   tuck  bounds  ?do  smb-blockdata@  i c!   loop  ( actlen )  \ Copy data from chip
+;
+
 : smbus-b!  ( byte offset -- )
    smbus-target smb-xmitadr!  ( byte offset )
    smb-hostcmd!               ( byte )




More information about the openfirmware mailing list