blob: 8a69a8815b5135bdef29c3a05bfd6f56fc47efb7 [file] [log] [blame]
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2009 coresystems GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; version 2 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
Scope(\_SB) {
Name(NIMH, "NiMH")
Name(LION, "Lion")
Device (BAT0)
{
Name(_HID, EisaId("PNP0C0A"))
Name(_UID, 1)
Name(_PCL, Package(){ \_SB })
Name(PBST, Package() { 0x00, 0x04b0, 0x0bb8, 0x03e8 })
/* Status */
Method(_STA, 0)
{
Sleep(120)
If(\_SB.PCI0.LPCB.EC0.BAT) {
Return(0x1f)
} Else {
Return(0x0f)
}
}
/* Battery Info */
Method(_BIF, 0)
{
Name(PBIF, Package() {
0x01,
0x0fa0,
0x0fa0,
0x01,
0x2ee0, // Capacity?
0x012c,
0x96,
0x01,
0x01,
"Battery", // Name
"", // Number
"LIon", // Type
"Generic" // Vendor
})
// Is battery there?
Store(_STA(), Local0)
And(Local0, 0x10, Local0)
If(LNot(Local0)) {
Return (PBIF)
}
Store(\_SB.PCI0.LPCB.EC0.BDC0, Index(PBIF, 1))
Store(\_SB.PCI0.LPCB.EC0.BDV0, Index(PBIF, 4))
Store(\_SB.PCI0.LPCB.EC0.BFC0, Local0)
Store(Local0, Index(PBIF, 2))
Divide(Local0, 10, Local1, Local2)
Store(Local2, Index(PBIF, 5))
Divide(Local0, 20, Local1, Local2)
Store(Local2, Index(PBIF, 6))
If(\_SB.PCI0.LPCB.EC0.BTYP) {
Store(NIMH, Index(PBIF, 11))
} Else {
Store(LION, Index(PBIF, 11))
}
Return(PBIF)
}
/* Battery Status */
Method(_BST, 0)
{
If(\_SB.PCI0.LPCB.EC0.BAT) {
Store(\_SB.PCI0.LPCB.EC0.BPV0, Index(PBST, 3))
Multiply(\_SB.PCI0.LPCB.EC0.BRC0, 100, Local3)
Divide(Local3, \_SB.PCI0.LPCB.EC0.BFC0, Local3, Local0)
Multiply(\_SB.PCI0.LPCB.EC0.BFC0, Local0, Local3)
Divide(Local3, 0x64, Local3, Local0)
Increment(Local0)
Store(Local0, Index(PBST, 2))
Store (\_SB.PCI0.LPCB.EC0.BRC0, Local3)
Store (\_SB.PCI0.LPCB.EC0.BPR0, Local0)
And (Not (Local0), 0xFFFF, Local0)
Store (Local0, Index(PBST,1))
// AC Power connected?
If(\_SB.PCI0.LPCB.EC0.ADP) {
If(\_SB.PCI0.LPCB.EC0.CHRG) {
Store(2, Index(PBST, 0))
} Else {
Store(0, Index(PBST, 0))
}
} Else {
If(LLess(Local3, 25)) {
Store(5, Index(PBST, 0))
} Else {
Store(1, Index(PBST, 0))
}
}
}
Return(PBST)
}
}
Device (BAT1)
{
Name(_HID, EisaId("PNP0C0A"))
Name(_UID, 1)
Name(_PCL, Package(){ \_SB })
Name(PBST, Package() { 0x00, 0x04b0, 0x0bb8, 0x03e8 })
/* Status */
Method(_STA, 0)
{
Sleep(120)
If(\_SB.PCI0.LPCB.EC0.BAT2) {
Return(0x1f)
} Else {
Return(0x0f)
}
}
/* Battery Info */
Method(_BIF, 0)
{
Name(PBIF, Package() {
0x01,
0x0fa0,
0x0fa0,
0x01,
0x2ee0, // Capacity?
0x012c,
0x96,
0x01,
0x01,
"Battery", // Name
"", // Number
"LIon", // Type
"Generic" // Vendor
})
// Is battery there?
Store(_STA(), Local0)
And(Local0, 0x10, Local0)
If(LNot(Local0)) {
Return (PBIF)
}
Store(\_SB.PCI0.LPCB.EC0.BDC2, Index(PBIF, 1))
Store(\_SB.PCI0.LPCB.EC0.BDV2, Index(PBIF, 4))
Store(\_SB.PCI0.LPCB.EC0.BFC2, Local0)
Store(Local0, Index(PBIF, 2))
Divide(Local0, 10, Local1, Local2)
Store(Local2, Index(PBIF, 5))
Divide(Local0, 20, Local1, Local2)
Store(Local2, Index(PBIF, 6))
If(\_SB.PCI0.LPCB.EC0.BTY2) {
Store(NIMH, Index(PBIF, 11))
} Else {
Store(LION, Index(PBIF, 11))
}
Return(PBIF)
}
/* Battery Status */
Method(_BST, 0)
{
If(\_SB.PCI0.LPCB.EC0.BAT2) {
Store(\_SB.PCI0.LPCB.EC0.BPV2, Index(PBST, 3))
Multiply(\_SB.PCI0.LPCB.EC0.BRC2, 100, Local3)
Divide(Local3, \_SB.PCI0.LPCB.EC0.BFC2, Local3, Local0)
Multiply(\_SB.PCI0.LPCB.EC0.BFC2, Local0, Local3)
Divide(Local3, 0x64, Local3, Local0)
Increment(Local0)
Store(Local0, Index(PBST, 2))
Store (\_SB.PCI0.LPCB.EC0.BRC2, Local3)
Store (\_SB.PCI0.LPCB.EC0.BPR2, Local0)
And (Not (Local0), 0xFFFF, Local0)
Store (Local0, Index(PBST,1))
// AC Power connected?
If(\_SB.PCI0.LPCB.EC0.ADP) {
If(\_SB.PCI0.LPCB.EC0.CRG2) {
Store(2, Index(PBST, 0))
} Else {
Store(0, Index(PBST, 0))
}
} Else {
If(LLess(Local3, 25)) {
Store(5, Index(PBST, 0))
} Else {
Store(1, Index(PBST, 0))
}
}
}
Return(PBST)
}
}
Name (PWRS, 0)
Name (ACFG, 0)
Device (AC)
{
Name (_HID, "ACPI0003")
Name (ACST, 0x00)
Method (_PSR, 0)
{
If(ACFG) {
Store(ACST, Local0)
} Else {
Store(\_SB.PCI0.LPCB.EC0.ADP, Local0)
Store(Local0, ACST)
Store(1, ACFG)
}
Sleep(120)
Return (Local0)
}
Name(_PCL, Package(){
\_SB,
BAT0,
BAT1
})
}
}