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:
parent
18b02360b9
commit
ffcd1439f3
|
@ -1 +1,2 @@
|
||||||
|
source src/ec/lenovo/h8/Kconfig
|
||||||
source src/ec/lenovo/pmh7/Kconfig
|
source src/ec/lenovo/pmh7/Kconfig
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
|
subdirs-$(CONFIG_EC_LENOVO_H8) += h8
|
||||||
subdirs-$(CONFIG_EC_LENOVO_PMH7) += pmh7
|
subdirs-$(CONFIG_EC_LENOVO_PMH7) += pmh7
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
config EC_LENOVO_H8
|
||||||
|
select EC_ACPI
|
||||||
|
bool
|
|
@ -0,0 +1 @@
|
||||||
|
driver-y += h8.c
|
|
@ -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"
|
||||||
|
}
|
|
@ -59,8 +59,5 @@ Scope (\_SI)
|
||||||
/* suspend LED on */
|
/* suspend LED on */
|
||||||
\_SB.PCI0.LPCB.EC.LED(0x87)
|
\_SB.PCI0.LPCB.EC.LED(0x87)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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
|
|
@ -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
|
||||||
|
};
|
|
@ -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
|
|
@ -11,7 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
|
||||||
select SUPERIO_NSC_PC87382
|
select SUPERIO_NSC_PC87382
|
||||||
select SUPERIO_NSC_PC87392
|
select SUPERIO_NSC_PC87392
|
||||||
select EC_LENOVO_PMH7
|
select EC_LENOVO_PMH7
|
||||||
select EC_ACPI
|
select EC_LENOVO_H8
|
||||||
select BOARD_HAS_FADT
|
select BOARD_HAS_FADT
|
||||||
select HAVE_OPTION_TABLE
|
select HAVE_OPTION_TABLE
|
||||||
select HAVE_PIRQ_TABLE
|
select HAVE_PIRQ_TABLE
|
||||||
|
|
|
@ -21,35 +21,47 @@
|
||||||
|
|
||||||
#include "smi.h"
|
#include "smi.h"
|
||||||
|
|
||||||
OperationRegion (DLPC, SystemIO, 0x164c, 1)
|
Scope (\_SB)
|
||||||
Field(DLPC, ByteAcc, NoLock, Preserve)
|
|
||||||
{
|
{
|
||||||
, 3,
|
OperationRegion (DLPC, SystemIO, 0x164c, 1)
|
||||||
DSTA, 1,
|
Field(DLPC, ByteAcc, NoLock, Preserve)
|
||||||
}
|
|
||||||
Device(DOCK)
|
|
||||||
{
|
|
||||||
Name(_HID, "ACPI0003")
|
|
||||||
Name(_UID, 0x00)
|
|
||||||
Name(_PCL, Package() { \_SB } )
|
|
||||||
|
|
||||||
Method(_DCK, 1, NotSerialized)
|
|
||||||
{
|
{
|
||||||
if (Arg0) {
|
, 3,
|
||||||
Sleep(250)
|
DSTA, 1,
|
||||||
/* connect dock */
|
}
|
||||||
TRAP(SMI_DOCK_CONNECT)
|
|
||||||
} else {
|
Device(DOCK)
|
||||||
/* 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)
|
Method(_STA, 0, NotSerialized)
|
||||||
Return (Local0)
|
{
|
||||||
}
|
|
||||||
|
|
||||||
Method(_STA, 0, NotSerialized)
|
|
||||||
{
|
|
||||||
Return (DSTA)
|
Return (DSTA)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Scope(\_SB.PCI0.LPCB.EC)
|
||||||
|
{
|
||||||
|
Method(_Q18, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
Notify(\_SB.DOCK, 3)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,128 +1 @@
|
||||||
/*
|
#include <ec/lenovo/h8/acpi/ec.asl>
|
||||||
* 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"
|
|
||||||
}
|
|
||||||
|
|
|
@ -12,10 +12,10 @@ Scope (\_GPE)
|
||||||
{
|
{
|
||||||
if (GP13) {
|
if (GP13) {
|
||||||
Or(GIV1, 0x20, GIV1)
|
Or(GIV1, 0x20, GIV1)
|
||||||
Notify(\_SB.PCI0.LPCB.EC.DOCK, 3)
|
Notify(\_SB.DOCK, 3)
|
||||||
} else {
|
} else {
|
||||||
And(GIV1, 0xdf, GIV1)
|
And(GIV1, 0xdf, GIV1)
|
||||||
Notify(\_SB.PCI0.LPCB.EC.DOCK, 0)
|
Notify(\_SB.DOCK, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,13 +86,29 @@ chip northbridge/intel/i945
|
||||||
device pnp ff.1 on # dummy
|
device pnp ff.1 on # dummy
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
chip ec/acpi
|
chip ec/lenovo/h8
|
||||||
device pnp ff.2 on # dummy
|
device pnp ff.2 on # dummy
|
||||||
io 0x60 = 0x62
|
io 0x60 = 0x62
|
||||||
io 0x62 = 0x66
|
io 0x62 = 0x66
|
||||||
io 0x64 = 0x1600
|
io 0x64 = 0x1600
|
||||||
io 0x66 = 0x1604
|
io 0x66 = 0x1604
|
||||||
end
|
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
|
end
|
||||||
chip superio/nsc/pc87382
|
chip superio/nsc/pc87382
|
||||||
device pnp 164e.2 on # IR
|
device pnp 164e.2 on # IR
|
||||||
|
|
|
@ -40,10 +40,6 @@ DefinitionBlock(
|
||||||
// mainboard specific devices
|
// mainboard specific devices
|
||||||
#include "acpi/mainboard.asl"
|
#include "acpi/mainboard.asl"
|
||||||
|
|
||||||
// Thermal Zone
|
|
||||||
#include "acpi/thermal.asl"
|
|
||||||
// System status indicators
|
|
||||||
#include "acpi/systemstatus.asl"
|
|
||||||
Scope (\_SB) {
|
Scope (\_SB) {
|
||||||
Device (PCI0)
|
Device (PCI0)
|
||||||
{
|
{
|
||||||
|
@ -54,4 +50,7 @@ DefinitionBlock(
|
||||||
|
|
||||||
/* Chipset specific sleep states */
|
/* Chipset specific sleep states */
|
||||||
#include "../../../southbridge/intel/i82801gx/acpi/sleepstates.asl"
|
#include "../../../southbridge/intel/i82801gx/acpi/sleepstates.asl"
|
||||||
|
|
||||||
|
// Dock support code
|
||||||
|
#include "acpi/dock.asl"
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,78 +32,22 @@
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include <ec/lenovo/pmh7/pmh7.h>
|
#include <ec/lenovo/pmh7/pmh7.h>
|
||||||
#include <ec/acpi/ec.h>
|
#include <ec/acpi/ec.h>
|
||||||
|
#include <ec/lenovo/h8/h8.h>
|
||||||
#include <northbridge/intel/i945/i945.h>
|
#include <northbridge/intel/i945/i945.h>
|
||||||
|
|
||||||
static void backlight_enable(void)
|
static void backlight_enable(void)
|
||||||
{
|
{
|
||||||
pmh7_register_set_bit(0x50, 5);
|
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mainboard_enable(device_t dev)
|
static void mainboard_enable(device_t dev)
|
||||||
{
|
{
|
||||||
device_t dev0;
|
device_t dev0;
|
||||||
|
|
||||||
log_ec_version();
|
|
||||||
|
|
||||||
backlight_enable();
|
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 */
|
/* enable Audio */
|
||||||
ec_clr_bit(0x3a, 0);
|
h8_set_audio_mute(0);
|
||||||
|
|
||||||
/* If we're resuming from suspend, blink suspend LED */
|
/* If we're resuming from suspend, blink suspend LED */
|
||||||
dev0 = dev_find_slot(0, PCI_DEVFN(0,0));
|
dev0 = dev_find_slot(0, PCI_DEVFN(0,0));
|
||||||
|
|
Loading…
Reference in New Issue