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