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 --- src/ec/lenovo/Kconfig | 1 + src/ec/lenovo/Makefile.inc | 1 + src/ec/lenovo/h8/Kconfig | 3 + src/ec/lenovo/h8/Makefile.inc | 1 + src/ec/lenovo/h8/acpi/ac.asl | 44 ++++ src/ec/lenovo/h8/acpi/battery.asl | 296 ++++++++++++++++++++++++ src/ec/lenovo/h8/acpi/beep.asl | 32 +++ src/ec/lenovo/h8/acpi/ec.asl | 122 ++++++++++ src/ec/lenovo/h8/acpi/lid.asl | 54 +++++ src/ec/lenovo/h8/acpi/sleepbutton.asl | 49 ++++ src/ec/lenovo/h8/acpi/systemstatus.asl | 63 +++++ src/ec/lenovo/h8/acpi/thermal.asl | 41 ++++ src/ec/lenovo/h8/chip.h | 36 +++ src/ec/lenovo/h8/h8.c | 129 ++++++++++ src/ec/lenovo/h8/h8.h | 111 +++++++++ src/mainboard/lenovo/x60/Kconfig | 2 +- src/mainboard/lenovo/x60/acpi/ac.asl | 44 ---- src/mainboard/lenovo/x60/acpi/battery.asl | 296 ------------------------ src/mainboard/lenovo/x60/acpi/beep.asl | 32 --- src/mainboard/lenovo/x60/acpi/dock.asl | 56 +++-- src/mainboard/lenovo/x60/acpi/ec.asl | 129 +---------- src/mainboard/lenovo/x60/acpi/gpe.asl | 4 +- src/mainboard/lenovo/x60/acpi/lid.asl | 54 ----- src/mainboard/lenovo/x60/acpi/sleepbutton.asl | 49 ---- src/mainboard/lenovo/x60/acpi/systemstatus.asl | 66 ------ src/mainboard/lenovo/x60/acpi/thermal.asl | 41 ---- src/mainboard/lenovo/x60/devicetree.cb | 18 ++- src/mainboard/lenovo/x60/dsdt.asl | 7 +- src/mainboard/lenovo/x60/mainboard.c | 62 +----- 29 files changed, 1044 insertions(+), 799 deletions(-) create mode 100644 src/ec/lenovo/h8/Kconfig create mode 100644 src/ec/lenovo/h8/Makefile.inc create mode 100644 src/ec/lenovo/h8/acpi/ac.asl create mode 100644 src/ec/lenovo/h8/acpi/battery.asl create mode 100644 src/ec/lenovo/h8/acpi/beep.asl create mode 100644 src/ec/lenovo/h8/acpi/ec.asl create mode 100644 src/ec/lenovo/h8/acpi/lid.asl create mode 100644 src/ec/lenovo/h8/acpi/sleepbutton.asl create mode 100644 src/ec/lenovo/h8/acpi/systemstatus.asl create mode 100644 src/ec/lenovo/h8/acpi/thermal.asl create mode 100644 src/ec/lenovo/h8/chip.h create mode 100644 src/ec/lenovo/h8/h8.c create mode 100644 src/ec/lenovo/h8/h8.h delete mode 100644 src/mainboard/lenovo/x60/acpi/ac.asl delete mode 100644 src/mainboard/lenovo/x60/acpi/battery.asl delete mode 100644 src/mainboard/lenovo/x60/acpi/beep.asl delete mode 100644 src/mainboard/lenovo/x60/acpi/lid.asl delete mode 100644 src/mainboard/lenovo/x60/acpi/sleepbutton.asl delete mode 100644 src/mainboard/lenovo/x60/acpi/systemstatus.asl delete mode 100644 src/mainboard/lenovo/x60/acpi/thermal.asl
diff --git a/src/ec/lenovo/Kconfig b/src/ec/lenovo/Kconfig index b564b62..73f11ca 100644 --- a/src/ec/lenovo/Kconfig +++ b/src/ec/lenovo/Kconfig @@ -1 +1,2 @@ +source src/ec/lenovo/h8/Kconfig source src/ec/lenovo/pmh7/Kconfig diff --git a/src/ec/lenovo/Makefile.inc b/src/ec/lenovo/Makefile.inc index f9a3feb..8865030 100644 --- a/src/ec/lenovo/Makefile.inc +++ b/src/ec/lenovo/Makefile.inc @@ -1 +1,2 @@ +subdirs-$(CONFIG_EC_LENOVO_H8) += h8 subdirs-$(CONFIG_EC_LENOVO_PMH7) += pmh7 diff --git a/src/ec/lenovo/h8/Kconfig b/src/ec/lenovo/h8/Kconfig new file mode 100644 index 0000000..07bdb11 --- /dev/null +++ b/src/ec/lenovo/h8/Kconfig @@ -0,0 +1,3 @@ +config EC_LENOVO_H8 + select EC_ACPI + bool diff --git a/src/ec/lenovo/h8/Makefile.inc b/src/ec/lenovo/h8/Makefile.inc new file mode 100644 index 0000000..86bc663 --- /dev/null +++ b/src/ec/lenovo/h8/Makefile.inc @@ -0,0 +1 @@ +driver-y += h8.c diff --git a/src/ec/lenovo/h8/acpi/ac.asl b/src/ec/lenovo/h8/acpi/ac.asl new file mode 100644 index 0000000..cbc84b2 --- /dev/null +++ b/src/ec/lenovo/h8/acpi/ac.asl @@ -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) + } +} diff --git a/src/ec/lenovo/h8/acpi/battery.asl b/src/ec/lenovo/h8/acpi/battery.asl new file mode 100644 index 0000000..7168581 --- /dev/null +++ b/src/ec/lenovo/h8/acpi/battery.asl @@ -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) + } + } +} diff --git a/src/ec/lenovo/h8/acpi/beep.asl b/src/ec/lenovo/h8/acpi/beep.asl new file mode 100644 index 0000000..718f41b --- /dev/null +++ b/src/ec/lenovo/h8/acpi/beep.asl @@ -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) +} diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl new file mode 100644 index 0000000..98abfc1 --- /dev/null +++ b/src/ec/lenovo/h8/acpi/ec.asl @@ -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" +} diff --git a/src/ec/lenovo/h8/acpi/lid.asl b/src/ec/lenovo/h8/acpi/lid.asl new file mode 100644 index 0000000..2dfa8d1 --- /dev/null +++ b/src/ec/lenovo/h8/acpi/lid.asl @@ -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) + } + } +} diff --git a/src/ec/lenovo/h8/acpi/sleepbutton.asl b/src/ec/lenovo/h8/acpi/sleepbutton.asl new file mode 100644 index 0000000..09e88aa --- /dev/null +++ b/src/ec/lenovo/h8/acpi/sleepbutton.asl @@ -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) + } + } +} diff --git a/src/ec/lenovo/h8/acpi/systemstatus.asl b/src/ec/lenovo/h8/acpi/systemstatus.asl new file mode 100644 index 0000000..17e8ba7 --- /dev/null +++ b/src/ec/lenovo/h8/acpi/systemstatus.asl @@ -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) + } + } +} diff --git a/src/ec/lenovo/h8/acpi/thermal.asl b/src/ec/lenovo/h8/acpi/thermal.asl new file mode 100644 index 0000000..35b6f14 --- /dev/null +++ b/src/ec/lenovo/h8/acpi/thermal.asl @@ -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)) + } + } +} diff --git a/src/ec/lenovo/h8/chip.h b/src/ec/lenovo/h8/chip.h new file mode 100644 index 0000000..d504654 --- /dev/null +++ b/src/ec/lenovo/h8/chip.h @@ -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 diff --git a/src/ec/lenovo/h8/h8.c b/src/ec/lenovo/h8/h8.c new file mode 100644 index 0000000..bc0ddde --- /dev/null +++ b/src/ec/lenovo/h8/h8.c @@ -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 +}; diff --git a/src/ec/lenovo/h8/h8.h b/src/ec/lenovo/h8/h8.h new file mode 100644 index 0000000..cdb22ca --- /dev/null +++ b/src/ec/lenovo/h8/h8.h @@ -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 diff --git a/src/mainboard/lenovo/x60/Kconfig b/src/mainboard/lenovo/x60/Kconfig index ebd2c1c..c4b2f63 100644 --- a/src/mainboard/lenovo/x60/Kconfig +++ b/src/mainboard/lenovo/x60/Kconfig @@ -11,7 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy select SUPERIO_NSC_PC87382 select SUPERIO_NSC_PC87392 select EC_LENOVO_PMH7 - select EC_ACPI + select EC_LENOVO_H8 select BOARD_HAS_FADT select HAVE_OPTION_TABLE select HAVE_PIRQ_TABLE diff --git a/src/mainboard/lenovo/x60/acpi/ac.asl b/src/mainboard/lenovo/x60/acpi/ac.asl deleted file mode 100644 index cbc84b2..0000000 --- a/src/mainboard/lenovo/x60/acpi/ac.asl +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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) - } -} diff --git a/src/mainboard/lenovo/x60/acpi/battery.asl b/src/mainboard/lenovo/x60/acpi/battery.asl deleted file mode 100644 index 7168581..0000000 --- a/src/mainboard/lenovo/x60/acpi/battery.asl +++ /dev/null @@ -1,296 +0,0 @@ -/* - * 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) - } - } -} diff --git a/src/mainboard/lenovo/x60/acpi/beep.asl b/src/mainboard/lenovo/x60/acpi/beep.asl deleted file mode 100644 index 718f41b..0000000 --- a/src/mainboard/lenovo/x60/acpi/beep.asl +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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) -} diff --git a/src/mainboard/lenovo/x60/acpi/dock.asl b/src/mainboard/lenovo/x60/acpi/dock.asl index db61e05..d393f44 100644 --- a/src/mainboard/lenovo/x60/acpi/dock.asl +++ b/src/mainboard/lenovo/x60/acpi/dock.asl @@ -21,35 +21,47 @@
#include "smi.h"
-OperationRegion (DLPC, SystemIO, 0x164c, 1) -Field(DLPC, ByteAcc, NoLock, Preserve) +Scope (_SB) { - , 3, - DSTA, 1, -} -Device(DOCK) -{ - Name(_HID, "ACPI0003") - Name(_UID, 0x00) - Name(_PCL, Package() { _SB } ) + OperationRegion (DLPC, SystemIO, 0x164c, 1) + Field(DLPC, ByteAcc, NoLock, Preserve) + { + , 3, + DSTA, 1, + }
- Method(_DCK, 1, NotSerialized) + Device(DOCK) { - if (Arg0) { - Sleep(250) - /* connect dock */ - TRAP(SMI_DOCK_CONNECT) - } else { - /* disconnect dock */ - TRAP(SMI_DOCK_DISCONNECT) + Name(_HID, "ACPI0003") + Name(_UID, 0x00) + Name(_PCL, Package() { _SB } ) + + Method(_DCK, 1, NotSerialized) + { + if (Arg0) { + Sleep(250) + /* connect dock */ + TRAP(SMI_DOCK_CONNECT) + } else { + /* disconnect dock */ + TRAP(SMI_DOCK_DISCONNECT) + } + + Xor(Arg0, DSTA, Local0) + Return (Local0) }
- Xor(Arg0, DSTA, Local0) - Return (Local0) + Method(_STA, 0, NotSerialized) + { + Return (DSTA) + } } +}
- Method(_STA, 0, NotSerialized) +Scope(_SB.PCI0.LPCB.EC) +{ + Method(_Q18, 0, NotSerialized) { - Return (DSTA) + Notify(_SB.DOCK, 3) } } diff --git a/src/mainboard/lenovo/x60/acpi/ec.asl b/src/mainboard/lenovo/x60/acpi/ec.asl index 85ea491..c3569e8 100644 --- a/src/mainboard/lenovo/x60/acpi/ec.asl +++ b/src/mainboard/lenovo/x60/acpi/ec.asl @@ -1,128 +1 @@ -/* - * 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() - } - - Method(_Q18, 0, NotSerialized) - { - Notify(_SB.PCI0.LPCB.EC.DOCK, 3) - } - - /* 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" -#include "dock.asl" -} +#include <ec/lenovo/h8/acpi/ec.asl> diff --git a/src/mainboard/lenovo/x60/acpi/gpe.asl b/src/mainboard/lenovo/x60/acpi/gpe.asl index 64e8e31..3aa9615 100644 --- a/src/mainboard/lenovo/x60/acpi/gpe.asl +++ b/src/mainboard/lenovo/x60/acpi/gpe.asl @@ -12,10 +12,10 @@ Scope (_GPE) { if (GP13) { Or(GIV1, 0x20, GIV1) - Notify(_SB.PCI0.LPCB.EC.DOCK, 3) + Notify(_SB.DOCK, 3) } else { And(GIV1, 0xdf, GIV1) - Notify(_SB.PCI0.LPCB.EC.DOCK, 0) + Notify(_SB.DOCK, 0) } } } diff --git a/src/mainboard/lenovo/x60/acpi/lid.asl b/src/mainboard/lenovo/x60/acpi/lid.asl deleted file mode 100644 index 2dfa8d1..0000000 --- a/src/mainboard/lenovo/x60/acpi/lid.asl +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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) - } - } -} diff --git a/src/mainboard/lenovo/x60/acpi/sleepbutton.asl b/src/mainboard/lenovo/x60/acpi/sleepbutton.asl deleted file mode 100644 index 09e88aa..0000000 --- a/src/mainboard/lenovo/x60/acpi/sleepbutton.asl +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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) - } - } -} diff --git a/src/mainboard/lenovo/x60/acpi/systemstatus.asl b/src/mainboard/lenovo/x60/acpi/systemstatus.asl deleted file mode 100644 index 161be08..0000000 --- a/src/mainboard/lenovo/x60/acpi/systemstatus.asl +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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) - } - - - - } -} diff --git a/src/mainboard/lenovo/x60/acpi/thermal.asl b/src/mainboard/lenovo/x60/acpi/thermal.asl deleted file mode 100644 index 35b6f14..0000000 --- a/src/mainboard/lenovo/x60/acpi/thermal.asl +++ /dev/null @@ -1,41 +0,0 @@ -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)) - } - } -} diff --git a/src/mainboard/lenovo/x60/devicetree.cb b/src/mainboard/lenovo/x60/devicetree.cb index 2817255..f47fdae 100644 --- a/src/mainboard/lenovo/x60/devicetree.cb +++ b/src/mainboard/lenovo/x60/devicetree.cb @@ -86,13 +86,29 @@ chip northbridge/intel/i945 device pnp ff.1 on # dummy end end - chip ec/acpi + chip ec/lenovo/h8 device pnp ff.2 on # dummy io 0x60 = 0x62 io 0x62 = 0x66 io 0x64 = 0x1600 io 0x66 = 0x1604 end + + register "config0" = "0xa6" + register "config1" = "0x05" + register "config2" = "0xa0" + register "config3" = "0x05" + + register "beepmask0" = "0xfe" + register "beepmask1" = "0x96" + + register "event2_enable" = "0xff" + register "event3_enable" = "0xff" + register "event4_enable" = "0xf4" + register "event5_enable" = "0x3c" + + register "wlan_enable" = "0x01" + register "trackpoint_enable" = "0x03" end chip superio/nsc/pc87382 device pnp 164e.2 on # IR diff --git a/src/mainboard/lenovo/x60/dsdt.asl b/src/mainboard/lenovo/x60/dsdt.asl index 3467a8b..905c94a 100644 --- a/src/mainboard/lenovo/x60/dsdt.asl +++ b/src/mainboard/lenovo/x60/dsdt.asl @@ -40,10 +40,6 @@ DefinitionBlock( // mainboard specific devices #include "acpi/mainboard.asl"
- // Thermal Zone - #include "acpi/thermal.asl" - // System status indicators - #include "acpi/systemstatus.asl" Scope (_SB) { Device (PCI0) { @@ -54,4 +50,7 @@ DefinitionBlock(
/* Chipset specific sleep states */ #include "../../../southbridge/intel/i82801gx/acpi/sleepstates.asl" + + // Dock support code + #include "acpi/dock.asl" } diff --git a/src/mainboard/lenovo/x60/mainboard.c b/src/mainboard/lenovo/x60/mainboard.c index c2aaaa9..15ed808 100644 --- a/src/mainboard/lenovo/x60/mainboard.c +++ b/src/mainboard/lenovo/x60/mainboard.c @@ -32,78 +32,22 @@ #include <arch/io.h> #include <ec/lenovo/pmh7/pmh7.h> #include <ec/acpi/ec.h> +#include <ec/lenovo/h8/h8.h> #include <northbridge/intel/i945/i945.h>
static void backlight_enable(void) { - pmh7_register_set_bit(0x50, 5); -} - -static void trackpoint_enable(void) -{ - ec_write(0x0b, 0x03); -} - -static void wlan_enable(void) -{ - ec_write(0x3a, 0x20); -} - -static void 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)); + pmh7_register_set_bit(0x50, 5); }
static void mainboard_enable(device_t dev) { device_t dev0;
- log_ec_version(); - backlight_enable(); - trackpoint_enable(); - - /* FIXME: this should be ACPI's task - * but for now, enable it here */ - wlan_enable(); - - /* enable ACPI events */ - ec_write(0x00, 0xa6); - ec_write(0x01, 0x05); - - ec_write(0x02, 0xa0); - ec_write(0x03, 0x05); - - /* set mask of enabled beeps */ - ec_write(0x04, 0xfe); - ec_write(0x05, 0x96); - - /* Unknown, but required for hotkeys - Maybe a mask for enabled keys? */ - - ec_write(0x12, 0xff); - ec_write(0x13, 0xff); - ec_write(0x14, 0xf4); - ec_write(0x15, 0x3c);
/* enable Audio */ - ec_clr_bit(0x3a, 0); + h8_set_audio_mute(0);
/* If we're resuming from suspend, blink suspend LED */ dev0 = dev_find_slot(0, PCI_DEVFN(0,0));