EC: Add Lenovo H8
Move the EC support code from the X60 mainboard to a generic driver, as this EC is used in many thinkpads. Also move the ACPI code to this directory for this reason. This patch also adds a chip config, so that the initial setting for basic register can be specified in devicetree.cb Signed-off-by: Sven Schnelle <svens@stackframe.org> Acked-by: Peter Stuge <peter@stuge.se> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6485 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
@@ -1 +1,2 @@
|
||||
source src/ec/lenovo/h8/Kconfig
|
||||
source src/ec/lenovo/pmh7/Kconfig
|
||||
|
@@ -1 +1,2 @@
|
||||
subdirs-$(CONFIG_EC_LENOVO_H8) += h8
|
||||
subdirs-$(CONFIG_EC_LENOVO_PMH7) += pmh7
|
||||
|
3
src/ec/lenovo/h8/Kconfig
Normal file
3
src/ec/lenovo/h8/Kconfig
Normal file
@@ -0,0 +1,3 @@
|
||||
config EC_LENOVO_H8
|
||||
select EC_ACPI
|
||||
bool
|
1
src/ec/lenovo/h8/Makefile.inc
Normal file
1
src/ec/lenovo/h8/Makefile.inc
Normal file
@@ -0,0 +1 @@
|
||||
driver-y += h8.c
|
44
src/ec/lenovo/h8/acpi/ac.asl
Normal file
44
src/ec/lenovo/h8/acpi/ac.asl
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
Field(ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x46),
|
||||
, 4,
|
||||
HPAC, 1
|
||||
}
|
||||
|
||||
Device(AC)
|
||||
{
|
||||
Name(_HID, "ACPI0003")
|
||||
Name(_UID, 0x00)
|
||||
Name(_PCL, Package() { \_SB } )
|
||||
|
||||
Method(_PSR, 0, NotSerialized)
|
||||
{
|
||||
return (HPAC)
|
||||
}
|
||||
|
||||
Method(_STA, 0, NotSerialized)
|
||||
{
|
||||
Return (0x0f)
|
||||
}
|
||||
}
|
296
src/ec/lenovo/h8/acpi/battery.asl
Normal file
296
src/ec/lenovo/h8/acpi/battery.asl
Normal file
@@ -0,0 +1,296 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
Field(ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x38),
|
||||
B0ST, 4, /* Battery 0 state */
|
||||
, 1,
|
||||
B0CH, 1, /* Battery 0 charging */
|
||||
B0DI, 1, /* Battery 0 discharging */
|
||||
B0PR, 1, /* Battery 0 present */
|
||||
Offset (0x39),
|
||||
B1ST, 4, /* Battery 1 state */
|
||||
, 1,
|
||||
B1CH, 1, /* Battery 1 charging, */
|
||||
B1DI, 1, /* Battery 1 discharging,*/
|
||||
B1PR, 1 /* Battery 1 present */
|
||||
}
|
||||
|
||||
/* EC Registers */
|
||||
/* PAGE == 0x00 */
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset(0xa0),
|
||||
BARC, 16, /* Battery remaining capacity */
|
||||
BAFC, 16, /* Battery full charge capacity */
|
||||
Offset(0xa8),
|
||||
BAPR, 16, /* Battery present rate */
|
||||
BAVO, 16, /* Battery Voltage */
|
||||
}
|
||||
|
||||
/* PAGE == 0x01 */
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset(0xa0),
|
||||
, 15,
|
||||
BAMA, 1,
|
||||
}
|
||||
|
||||
/* PAGE == 0x02 */
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset(0xa0),
|
||||
BADC, 16, /* Design Capacity */
|
||||
BADV, 16, /* Design voltage */
|
||||
, 16,
|
||||
, 16,
|
||||
, 16,
|
||||
BASN, 16,
|
||||
}
|
||||
|
||||
/* PAGE == 0x04: Battery type */
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset(0xa0),
|
||||
BATY, 32
|
||||
}
|
||||
|
||||
|
||||
/* PAGE == 0x05: Battery OEM information */
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset(0xa0),
|
||||
BAOE, 128
|
||||
}
|
||||
|
||||
/* PAGE == 0x06: Battery name */
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset(0xa0),
|
||||
BANA, 128
|
||||
}
|
||||
|
||||
/* Arg0: Battery
|
||||
* Arg1: Battery Status Package
|
||||
* Arg2: charging
|
||||
* Arg3: discharging
|
||||
*/
|
||||
Method(BSTA, 4, NotSerialized)
|
||||
{
|
||||
Acquire(ECLK, 0xffff)
|
||||
Store(0, Local0)
|
||||
Or(1, Arg0, PAGE)
|
||||
Store(BAMA, Local1)
|
||||
Store(Arg0, PAGE) /* Battery dynamic information */
|
||||
|
||||
Store(BAPR, Local2)
|
||||
|
||||
if (Arg2) // charging
|
||||
{
|
||||
Or(2, Local0, Local0)
|
||||
|
||||
If (LGreaterEqual (Local2, 0x8000)) {
|
||||
Store(0, Local2)
|
||||
}
|
||||
}
|
||||
|
||||
if (Arg3) // discharging
|
||||
{
|
||||
Or(1, Local0, Local0)
|
||||
Subtract(0x10000, Local2, Local2)
|
||||
}
|
||||
|
||||
Store(Local0, Index(Arg1, 0x00))
|
||||
|
||||
if (Local1) {
|
||||
Multiply (BARC, 10, Index(Arg1, 2))
|
||||
Multiply (Local2, BAVO, Local2)
|
||||
Divide (Local2, 1000, Local3, Index(Arg1, 1))
|
||||
} else {
|
||||
Store(BARC, Index(Arg1, 2))
|
||||
Store(Local2, Index(Arg1, 1))
|
||||
}
|
||||
Store(BAVO, Index(Arg1, 3))
|
||||
Release(ECLK)
|
||||
Return (Arg1)
|
||||
}
|
||||
|
||||
Method(BINF, 2, NotSerialized)
|
||||
{
|
||||
Acquire(ECLK, 0xffff)
|
||||
Or(1, Arg1, PAGE) /* Battery 0 static information */
|
||||
Xor(BAMA, 1, Index(Arg0, 0))
|
||||
Store(BAMA, Local0)
|
||||
Store(Arg1, PAGE)
|
||||
Store(BAFC, Local2)
|
||||
Or(2, Arg1, PAGE)
|
||||
Store(BADC, Local1)
|
||||
|
||||
if (Local0)
|
||||
{
|
||||
Multiply (Local1, 10, Local1)
|
||||
Multiply (Local2, 10, Local2)
|
||||
}
|
||||
|
||||
Store(Local1, Index(Arg0, 1)) // Design Capacity
|
||||
Store(Local2, Index(Arg0, 2)) // Last full charge capacity
|
||||
Store(BADV, Index(Arg0, 4)) // Design Voltage
|
||||
Divide (Local2, 20, Local0, Index(Arg0, 5)) // Warning capacity
|
||||
|
||||
Store (BASN, Local0)
|
||||
Name (SERN, Buffer (0x06) { " " })
|
||||
Store (4, Local1)
|
||||
While (Local0)
|
||||
{
|
||||
Divide (Local0, 0x0A, Local2, Local0)
|
||||
Add (Local2, 48, Index (SERN, Local1))
|
||||
Decrement (Local1)
|
||||
}
|
||||
Store (SERN, Index (Arg0, 10)) // Serial Number
|
||||
|
||||
Or(4, Arg1, PAGE)
|
||||
Name (TYPE, Buffer() { 0, 0, 0, 0, 0 })
|
||||
Store(BATY, TYPE)
|
||||
Store(TYPE, Index (Arg0, 11)) // Battery type
|
||||
Or(5, Arg1, PAGE)
|
||||
Store(BAOE, Index (Arg0, 12)) // OEM information
|
||||
Or(6, Arg1, PAGE)
|
||||
Store(BANA, Index (Arg0, 9)) // Model number
|
||||
Release(ECLK)
|
||||
Return (Arg0)
|
||||
}
|
||||
|
||||
Device (BAT0)
|
||||
{
|
||||
Name (_HID, EisaId ("PNP0C0A"))
|
||||
Name (_UID, 0x00)
|
||||
Name (_PCL, Package () { \_SB })
|
||||
|
||||
Name (BATS, Package ()
|
||||
{
|
||||
0x00, // 0: PowerUnit: Report in mWh
|
||||
0xFFFFFFFF, // 1: Design cap
|
||||
0xFFFFFFFF, // 2: Last full charge cap
|
||||
0x01, // 3: Battery Technology
|
||||
10800, // 4: Design Voltage (mV)
|
||||
0x00, // 5: Warning design capacity
|
||||
200, // 6: Low design capacity
|
||||
1, // 7: granularity1
|
||||
1, // 8: granularity2
|
||||
"", // 9: Model number
|
||||
"", // A: Serial number
|
||||
"", // B: Battery Type
|
||||
"" // C: OEM information
|
||||
})
|
||||
|
||||
Method (_BIF, 0, NotSerialized)
|
||||
{
|
||||
Return (BINF(BATS, 0))
|
||||
}
|
||||
|
||||
Name (BATI, Package ()
|
||||
{
|
||||
0, // Battery State
|
||||
// Bit 0 - discharge
|
||||
// Bit 1 - charge
|
||||
// Bit 2 - critical state
|
||||
0, // Battery present Rate
|
||||
0, // Battery remaining capacity
|
||||
0 // Battery present voltage
|
||||
})
|
||||
|
||||
Method (_BST, 0, NotSerialized)
|
||||
{
|
||||
if (B0PR) {
|
||||
Return (BSTA(0, BATI, B0CH, B0DI))
|
||||
} else {
|
||||
Return (BATS)
|
||||
}
|
||||
}
|
||||
|
||||
Method (_STA, 0, NotSerialized)
|
||||
{
|
||||
if (B0PR) {
|
||||
Return (0x1f)
|
||||
} else {
|
||||
Return (0x0f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Device (BAT1)
|
||||
{
|
||||
Name (_HID, EisaId ("PNP0C0A"))
|
||||
Name (_UID, 0x00)
|
||||
Name (_PCL, Package () { \_SB })
|
||||
|
||||
Name (BATS, Package ()
|
||||
{
|
||||
0x00, // 0: PowerUnit: Report in mWh
|
||||
0xFFFFFFFF, // 1: Design cap
|
||||
0xFFFFFFFF, // 2: Last full charge cap
|
||||
0x01, // 3: Battery Technology
|
||||
10800, // 4: Design Voltage (mV)
|
||||
0x00, // 5: Warning design capacity
|
||||
200, // 6: Low design capacity
|
||||
1, // 7: granularity1
|
||||
1, // 8: granularity2
|
||||
"", // 9: Model number
|
||||
"", // A: Serial number
|
||||
"", // B: Battery Type
|
||||
"" // C: OEM information
|
||||
})
|
||||
|
||||
Method (_BIF, 0, NotSerialized)
|
||||
{
|
||||
Return (BINF(BATS, 0x10))
|
||||
}
|
||||
|
||||
Name (BATI, Package ()
|
||||
{
|
||||
0, // Battery State
|
||||
// Bit 0 - discharge
|
||||
// Bit 1 - charge
|
||||
// Bit 2 - critical state
|
||||
0, // Battery present Rate
|
||||
0, // Battery remaining capacity
|
||||
0 // Battery present voltage
|
||||
})
|
||||
|
||||
Method (_BST, 0, NotSerialized)
|
||||
{
|
||||
if (B1PR) {
|
||||
Return (BSTA(0x10, BATI, B1CH, B1DI))
|
||||
} else {
|
||||
Return (BATS)
|
||||
}
|
||||
}
|
||||
|
||||
Method (_STA, 0, NotSerialized)
|
||||
{
|
||||
if (B1PR) {
|
||||
Return (0x1f)
|
||||
} else {
|
||||
Return (0x0f)
|
||||
}
|
||||
}
|
||||
}
|
32
src/ec/lenovo/h8/acpi/beep.asl
Normal file
32
src/ec/lenovo/h8/acpi/beep.asl
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
Field(ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x06),
|
||||
SNDS, 8 /* Write to this register to generate sound */
|
||||
|
||||
}
|
||||
|
||||
Method(BEEP, 1, NotSerialized)
|
||||
{
|
||||
Store (Arg0, SNDS)
|
||||
}
|
122
src/ec/lenovo/h8/acpi/ec.asl
Normal file
122
src/ec/lenovo/h8/acpi/ec.asl
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "smi.h"
|
||||
Device(EC)
|
||||
{
|
||||
Name (_HID, EISAID("PNP0C09"))
|
||||
Name (_UID, 0)
|
||||
|
||||
Name (_GPE, 28)
|
||||
Mutex (ECLK, 0)
|
||||
|
||||
OperationRegion(ERAM, EmbeddedControl, 0x00, 0x100)
|
||||
Field (ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x05),
|
||||
HSPA, 1,
|
||||
Offset (0x0C),
|
||||
LEDS, 8, /* LED state */
|
||||
Offset (0x3a),
|
||||
AMUT, 1, /* Audio Mute */
|
||||
Offset (0x3B),
|
||||
, 1,
|
||||
KBLT, 1, /* Keyboard Light */
|
||||
Offset (0x4e),
|
||||
WAKE, 16,
|
||||
Offset (0x78),
|
||||
TMP0, 8, /* Thermal Zone 0 temperature */
|
||||
TMP1, 8, /* Thermal Zone 1 temperature */
|
||||
Offset (0x81),
|
||||
PAGE, 8 /* Information Page Selector */
|
||||
}
|
||||
|
||||
Method (_CRS, 0)
|
||||
{
|
||||
Name (ECMD, ResourceTemplate()
|
||||
{
|
||||
IO (Decode16, 0x62, 0x62, 1, 1)
|
||||
IO (Decode16, 0x66, 0x66, 1, 1)
|
||||
})
|
||||
Return (ECMD)
|
||||
}
|
||||
|
||||
Method (LED, 1, NotSerialized)
|
||||
{
|
||||
Store(Arg0, LEDS)
|
||||
}
|
||||
|
||||
Method (_INI, 0, NotSerialized)
|
||||
{
|
||||
}
|
||||
|
||||
Method (MUTE, 1, NotSerialized)
|
||||
{
|
||||
Store(Arg0, AMUT)
|
||||
}
|
||||
|
||||
/* Sleep Button pressed */
|
||||
Method(_Q13, 0, NotSerialized)
|
||||
{
|
||||
Notify(\_SB.PCI0.LPCB.EC.SLPB, 0x80)
|
||||
}
|
||||
|
||||
/* Brightness up GPE */
|
||||
Method(_Q14, 0, NotSerialized)
|
||||
{
|
||||
\DSPC.BRTU ()
|
||||
}
|
||||
|
||||
/* Brightness down GPE */
|
||||
Method(_Q15, 0, NotSerialized)
|
||||
{
|
||||
\DSPC.BRTD()
|
||||
}
|
||||
|
||||
/* AC status change: present */
|
||||
Method(_Q26, 0, NotSerialized)
|
||||
{
|
||||
Notify (AC, 0x80)
|
||||
}
|
||||
|
||||
/* AC status change: not present */
|
||||
Method(_Q27, 0, NotSerialized)
|
||||
{
|
||||
Notify (AC, 0x80)
|
||||
}
|
||||
|
||||
Method(_Q2A, 0, NotSerialized)
|
||||
{
|
||||
Notify(\_SB.PCI0.LPCB.EC.LID, 0x80)
|
||||
}
|
||||
|
||||
Method(_Q2B, 0, NotSerialized)
|
||||
{
|
||||
Notify(\_SB.PCI0.LPCB.EC.LID, 0x80)
|
||||
}
|
||||
|
||||
|
||||
#include "ac.asl"
|
||||
#include "battery.asl"
|
||||
#include "sleepbutton.asl"
|
||||
#include "lid.asl"
|
||||
#include "beep.asl"
|
||||
}
|
54
src/ec/lenovo/h8/acpi/lid.asl
Normal file
54
src/ec/lenovo/h8/acpi/lid.asl
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
Field(ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x32),
|
||||
, 2,
|
||||
WKLD, 1,
|
||||
Offset (0x46),
|
||||
, 2,
|
||||
LIDS, 1
|
||||
}
|
||||
|
||||
Device(LID)
|
||||
{
|
||||
Name(_HID, "PNP0C0D")
|
||||
|
||||
Method(_LId, 0, NotSerialized)
|
||||
{
|
||||
return (LIDS)
|
||||
}
|
||||
|
||||
Method(_PRW, 0, NotSerialized)
|
||||
{
|
||||
Return (Package() { 0x18, 0x03 })
|
||||
}
|
||||
|
||||
Method(_PSW, 1, NotSerialized)
|
||||
{
|
||||
if (Arg0) {
|
||||
Store(1, WKLD)
|
||||
} else {
|
||||
Store(0, WKLD)
|
||||
}
|
||||
}
|
||||
}
|
49
src/ec/lenovo/h8/acpi/sleepbutton.asl
Normal file
49
src/ec/lenovo/h8/acpi/sleepbutton.asl
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
Field(ERAM, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x32),
|
||||
, 4,
|
||||
WKFN, 1,
|
||||
Offset(0x83),
|
||||
FNKY, 8
|
||||
}
|
||||
|
||||
Device(SLPB)
|
||||
{
|
||||
Name (_HID, EisaId ("PNP0C0E"))
|
||||
Method(_PRW, 0, NotSerialized)
|
||||
{
|
||||
Return (Package() { 0x18, 0x03 })
|
||||
}
|
||||
|
||||
Method(_PSW, 1, NotSerialized)
|
||||
{
|
||||
if (Arg0) {
|
||||
Store(6, FNKY) /* Fn key acts as wake button */
|
||||
Store(1, WKFN)
|
||||
} else {
|
||||
Store(0, FNKY) /* Fn key normal operation */
|
||||
Store(0, WKFN)
|
||||
}
|
||||
}
|
||||
}
|
63
src/ec/lenovo/h8/acpi/systemstatus.asl
Normal file
63
src/ec/lenovo/h8/acpi/systemstatus.asl
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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 (\_SI)
|
||||
{
|
||||
Method(_SST, 1, NotSerialized)
|
||||
{
|
||||
If (LEqual (Arg0, 0)) {
|
||||
/* Indicator off */
|
||||
|
||||
/* power LED off */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x00)
|
||||
/* suspend LED off */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x07)
|
||||
}
|
||||
|
||||
If (LEqual (Arg0, 1)) {
|
||||
/* working state */
|
||||
|
||||
/* power LED on */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x80)
|
||||
/* suspend LED off */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x07)
|
||||
}
|
||||
|
||||
If (LEqual (Arg0, 2)) {
|
||||
/* waking state */
|
||||
|
||||
/* power LED om */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x80)
|
||||
/* suspend LED blinking */
|
||||
\_SB.PCI0.LPCB.EC.LED(0xc7)
|
||||
}
|
||||
|
||||
If (LEqual (Arg0, 3)) {
|
||||
/* sleep state */
|
||||
|
||||
/* power LED off */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x00)
|
||||
/* suspend LED on */
|
||||
\_SB.PCI0.LPCB.EC.LED(0x87)
|
||||
}
|
||||
}
|
||||
}
|
41
src/ec/lenovo/h8/acpi/thermal.asl
Normal file
41
src/ec/lenovo/h8/acpi/thermal.asl
Normal file
@@ -0,0 +1,41 @@
|
||||
Scope(\_TZ)
|
||||
{
|
||||
Method(C2K, 1, NotSerialized)
|
||||
{
|
||||
Multiply(Arg0, 10, Local0)
|
||||
Add (Local0, 2732, Local0)
|
||||
if (LLessEqual(Local0, 2732)) {
|
||||
Return (3000)
|
||||
}
|
||||
|
||||
if (LGreater(Local0, 4012)) {
|
||||
Return (3000)
|
||||
}
|
||||
Return (Local0)
|
||||
}
|
||||
|
||||
ThermalZone(THM0)
|
||||
{
|
||||
Method(_CRT, 0, NotSerialized) {
|
||||
Return (C2K(127))
|
||||
}
|
||||
Method(_TMP) {
|
||||
Return (C2K(\_SB.PCI0.LPCB.EC.TMP0))
|
||||
}
|
||||
}
|
||||
|
||||
ThermalZone(THM1)
|
||||
{
|
||||
Method(_CRT, 0, NotSerialized) {
|
||||
Return (C2K(99))
|
||||
}
|
||||
|
||||
Method(_PSV, 0, NotSerialized) {
|
||||
Return (C2K(94))
|
||||
}
|
||||
|
||||
Method(_TMP) {
|
||||
Return (C2K(\_SB.PCI0.LPCB.EC.TMP1))
|
||||
}
|
||||
}
|
||||
}
|
36
src/ec/lenovo/h8/chip.h
Normal file
36
src/ec/lenovo/h8/chip.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef EC_LENOVO_H8EC_CHIP_H
|
||||
#define EC_LENOVO_H8EC_CHIP_H
|
||||
|
||||
extern struct chip_operations ec_lenovo_h8_ops;
|
||||
struct ec_lenovo_h8_config {
|
||||
|
||||
u8 config0;
|
||||
u8 config1;
|
||||
u8 config2;
|
||||
u8 config3;
|
||||
|
||||
u8 beepmask0;
|
||||
u8 beepmask1;
|
||||
|
||||
u8 event0_enable;
|
||||
u8 event1_enable;
|
||||
u8 event2_enable;
|
||||
u8 event3_enable;
|
||||
u8 event4_enable;
|
||||
u8 event5_enable;
|
||||
u8 event6_enable;
|
||||
u8 event7_enable;
|
||||
u8 event8_enable;
|
||||
u8 event9_enable;
|
||||
u8 eventa_enable;
|
||||
u8 eventb_enable;
|
||||
u8 eventc_enable;
|
||||
u8 eventd_enable;
|
||||
u8 evente_enable;
|
||||
u8 eventf_enable;
|
||||
|
||||
u8 trackpoint_enable;
|
||||
u8 wlan_enable;
|
||||
u8 wwan_enable;
|
||||
};
|
||||
#endif
|
129
src/ec/lenovo/h8/h8.c
Normal file
129
src/ec/lenovo/h8/h8.c
Normal file
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <arch/io.h>
|
||||
#include <console/console.h>
|
||||
#include <device/device.h>
|
||||
#include <ec/acpi/ec.h>
|
||||
#include <device/pnp.h>
|
||||
#include <stdlib.h>
|
||||
#include "h8.h"
|
||||
#include "chip.h"
|
||||
|
||||
void h8_trackpoint_enable(int on)
|
||||
{
|
||||
ec_write(H8_TRACKPOINT_CTRL,
|
||||
on ? H8_TRACKPOINT_ON : H8_TRACKPOINT_OFF);
|
||||
|
||||
}
|
||||
|
||||
void h8_wlan_enable(int on)
|
||||
{
|
||||
if (on)
|
||||
ec_set_bit(0x3a, 5);
|
||||
else
|
||||
ec_clr_bit(0x3a, 5);
|
||||
}
|
||||
|
||||
static void h8_log_ec_version(void)
|
||||
{
|
||||
unsigned char ecfw[9], c;
|
||||
u16 fwvh, fwvl;
|
||||
int i;
|
||||
|
||||
for(i = 0; i < 8; i++) {
|
||||
c = ec_read(0xf0 + i);
|
||||
if (c < 0x20 || c > 0x7f)
|
||||
break;
|
||||
ecfw[i] = c;
|
||||
}
|
||||
ecfw[i] = '\0';
|
||||
|
||||
fwvh = ec_read(0xe9);
|
||||
fwvl = ec_read(0xe8);
|
||||
|
||||
printk(BIOS_INFO, "EC Firmware ID %s, Version %d.%d%d%c\n", ecfw,
|
||||
fwvh >> 4, fwvh & 0x0f, fwvl >> 4, 0x41 + (fwvl & 0xf));
|
||||
}
|
||||
|
||||
void h8_set_audio_mute(int on)
|
||||
{
|
||||
if (on)
|
||||
ec_clr_bit(0x3a, 0);
|
||||
else
|
||||
ec_set_bit(0x3a, 1);
|
||||
}
|
||||
|
||||
void h8_enable_event(int event)
|
||||
{
|
||||
if (event < 0 || event > 127)
|
||||
return;
|
||||
|
||||
ec_set_bit(0x10 + (event >> 3), event & 7);
|
||||
}
|
||||
|
||||
void h8_disable_event(int event)
|
||||
{
|
||||
if (event < 0 || event > 127)
|
||||
return;
|
||||
|
||||
ec_clr_bit(0x10 + (event >> 3), event & 7);
|
||||
|
||||
}
|
||||
|
||||
static void h8_enable(device_t dev)
|
||||
{
|
||||
struct ec_lenovo_h8_config *conf = dev->chip_info;
|
||||
h8_log_ec_version();
|
||||
|
||||
ec_write(H8_CONFIG0, conf->config0);
|
||||
ec_write(H8_CONFIG1, conf->config1);
|
||||
ec_write(H8_CONFIG2, conf->config2);
|
||||
ec_write(H8_CONFIG3, conf->config3);
|
||||
|
||||
ec_write(H8_SOUND_ENABLE0, conf->beepmask0);
|
||||
ec_write(H8_SOUND_ENABLE1, conf->beepmask1);
|
||||
ec_write(H8_SOUND_REPEAT, 0x00);
|
||||
|
||||
ec_write(0x10, conf->event0_enable);
|
||||
ec_write(0x11, conf->event1_enable);
|
||||
ec_write(0x12, conf->event2_enable);
|
||||
ec_write(0x13, conf->event3_enable);
|
||||
ec_write(0x14, conf->event4_enable);
|
||||
ec_write(0x15, conf->event5_enable);
|
||||
ec_write(0x16, conf->event6_enable);
|
||||
ec_write(0x17, conf->event7_enable);
|
||||
ec_write(0x18, conf->event8_enable);
|
||||
ec_write(0x19, conf->event9_enable);
|
||||
ec_write(0x1a, conf->eventa_enable);
|
||||
ec_write(0x1b, conf->eventb_enable);
|
||||
ec_write(0x1c, conf->eventc_enable);
|
||||
ec_write(0x1d, conf->eventd_enable);
|
||||
ec_write(0x1e, conf->evente_enable);
|
||||
ec_write(0x1f, conf->eventf_enable);
|
||||
|
||||
h8_wlan_enable(conf->wlan_enable);
|
||||
h8_trackpoint_enable(conf->trackpoint_enable);
|
||||
|
||||
}
|
||||
|
||||
struct chip_operations ec_lenovo_h8_ops = {
|
||||
CHIP_NAME("Lenovo H8 EC")
|
||||
.enable_dev = h8_enable
|
||||
};
|
111
src/ec/lenovo/h8/h8.h
Normal file
111
src/ec/lenovo/h8/h8.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2011 Sven Schnelle <svens@stackframe.org>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef EC_LENOVO_H8_H
|
||||
#define EC_LENOVO_H8_H
|
||||
|
||||
void h8_trackpoint_enable(int on);
|
||||
void h8_wlan_enable(int on);
|
||||
void h8_set_audio_mute(int on);
|
||||
void h8_enable_event(int event);
|
||||
void h8_disable_event(int event);
|
||||
|
||||
/* EC registers */
|
||||
#define H8_CONFIG0 0x00
|
||||
#define H8_CONFIG0_EVENTS_ENABLE 0x02
|
||||
#define H8_CONFIG0_HOTKEY_ENABLE 0x04
|
||||
#define H8_CONFIG0_SMM_H8_ENABLE 0x20
|
||||
#define H8_CONFIG0_TC_ENABLE 0x80
|
||||
|
||||
#define H8_CONFIG1 0x01
|
||||
#define H8_CONFIG1_BKLT_LID 0x01
|
||||
#define H8_CONFIG1_UBAY_PWR 0x20
|
||||
|
||||
#define H8_CONFIG2 0x02
|
||||
#define H8_CONFIG2_USB_DOCK 0x01
|
||||
#define H8_CONFIG2_DOCK_SPEAKER_MUTE 0x02
|
||||
#define H8_CONFIG2_DOCK_SPEAKER_MUTE_POL 0x04
|
||||
|
||||
#define H8_CONFIG3 0x03
|
||||
|
||||
#define H8_SOUND_ENABLE0 0x04
|
||||
#define H8_SOUND_ENABLE1 0x05
|
||||
#define H8_SOUND_REG 0x06
|
||||
#define H8_SOUND_REPEAT 0x07
|
||||
|
||||
#define H8_TRACKPOINT_CTRL 0x0B
|
||||
#define H8_TRACKPOINT_AUTO 0x01
|
||||
#define H8_TRACKPOINT_OFF 0x02
|
||||
#define H8_TRACKPOINT_ON 0x03
|
||||
|
||||
#define H8_LED_CONTROL 0x0c
|
||||
#define H8_LED_CONTROL_OFF 0x00
|
||||
#define H8_LED_CONTROL_ON 0x80
|
||||
#define H8_LED_CONTROL_BLINK 0xc0
|
||||
|
||||
#define H8_LED_CONTROL_POWER_LED 0x00
|
||||
#define H8_LED_CONTROL_BAT0_LED 0x01
|
||||
#define H8_LED_CONTROL_BAT1_LED 0x02
|
||||
#define H8_LED_CONTROL_UBAY_LED 0x04
|
||||
#define H8_LED_CONTROL_SUSPEND_LED 0x07
|
||||
#define H8_LED_CONTROL_DOCK_LED1 0x08
|
||||
#define H8_LED_CONTROL_DOCK_LED2 0x09
|
||||
|
||||
/* Embedded controller events */
|
||||
#define H8_EVENT_FN_F1 0x10
|
||||
#define H8_EVENT_FN_F2 0x11
|
||||
#define H8_EVENT_FN_F3 0x12
|
||||
#define H8_EVENT_FN_F4 0x13
|
||||
#define H8_EVENT_FN_HOME 0x14
|
||||
#define H8_EVENT_FN_END 0x15
|
||||
#define H8_EVENT_FN_F7 0x16
|
||||
#define H8_EVENT_FN_F8 0x17
|
||||
#define H8_EVENT_FN_F9 0x18
|
||||
#define H8_EVENT_FN_THINKVANTAGE 0x19
|
||||
#define H8_EVENT_FN_F11 0x1a
|
||||
#define H8_EVENT_FN_F12 0x1b
|
||||
#define H8_EVENT_FN_1 0x1c
|
||||
#define H8_EVENT_FN_2 0x1d
|
||||
#define H8_EVENT_FN_PGUP 0x1f
|
||||
|
||||
#define H8_EVENT_AC_ON 0x26
|
||||
#define H8_EVENT_AC_OFF 0x27
|
||||
|
||||
#define H8_EVENT_PWRSW_PRESS 0x28
|
||||
#define H8_EVENT_PWRSW_RELEASE 0x29
|
||||
|
||||
#define H8_EVENT_LIDSW_CLOSE 0x2a
|
||||
#define H8_EVENT_LIDSW_PUSH 0x2b
|
||||
|
||||
#define H8_EVENT_UBAY_UNLOCK 0x2c
|
||||
#define H8_EVENT_UBAY_LOCK 0x2d
|
||||
|
||||
#define H8_EVENT_KEYPRESS 0x33
|
||||
|
||||
#define H8_EVENT_FN_PRESS 0x39
|
||||
|
||||
#define H8_EVENT_BAT0 0x4a
|
||||
#define H8_EVENT_BAT0_STATE 0x4b
|
||||
|
||||
#define H8_EVENT_BAT1 0x4c
|
||||
#define H8_EVENT_BAT1_STATE 0x4d
|
||||
|
||||
#define H8_EVENT_FN_F5 0x64
|
||||
#define H8_EVENT_FN_F6 0x65
|
||||
#endif
|
Reference in New Issue
Block a user