summaryrefslogtreecommitdiff
path: root/src/mainboard/lenovo
diff options
context:
space:
mode:
authorSven Schnelle <svens@stackframe.org>2011-06-12 14:35:11 +0200
committerSven Schnelle <svens@stackframe.org>2011-06-15 08:51:18 +0200
commit4297a9a101f342ed9699848c8d55f26f78b3816c (patch)
tree4886f6f35e25238a418699d7f5bf4ee5786ccb54 /src/mainboard/lenovo
parentd29e5bb9335a7d185480a8a780b619d3a3151f11 (diff)
downloadcoreboot-4297a9a101f342ed9699848c8d55f26f78b3816c.tar.xz
X60: trigger save cmos on volume/brightness change
Change-Id: I020e06bc311c4e4327c9d3cf2c379dc8fe070a7a Signed-off-by: Sven Schnelle <svens@stackframe.org> Reviewed-on: http://review.coreboot.org/25 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/mainboard/lenovo')
-rw-r--r--src/mainboard/lenovo/x60/acpi/ec.asl23
-rw-r--r--src/mainboard/lenovo/x60/acpi/video.asl4
-rw-r--r--src/mainboard/lenovo/x60/cmos.layout1
-rw-r--r--src/mainboard/lenovo/x60/mainboard_smi.c25
-rw-r--r--src/mainboard/lenovo/x60/smi.h1
5 files changed, 53 insertions, 1 deletions
diff --git a/src/mainboard/lenovo/x60/acpi/ec.asl b/src/mainboard/lenovo/x60/acpi/ec.asl
index c3569e8c41..5c04339725 100644
--- a/src/mainboard/lenovo/x60/acpi/ec.asl
+++ b/src/mainboard/lenovo/x60/acpi/ec.asl
@@ -1 +1,24 @@
#include <ec/lenovo/h8/acpi/ec.asl>
+
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ /* Volume down */
+ Method(_Q1C, 0, NotSerialized)
+ {
+ Trap(SMI_SAVE_CMOS)
+ }
+
+ /* Volume up */
+ Method(_Q1D, 0, NotSerialized)
+ {
+ Trap(SMI_SAVE_CMOS)
+ }
+
+ /* Mute key pressed */
+ Method(_Q1E, 0, NotSerialized)
+ {
+ Trap(SMI_SAVE_CMOS)
+ }
+
+
+}
diff --git a/src/mainboard/lenovo/x60/acpi/video.asl b/src/mainboard/lenovo/x60/acpi/video.asl
index c2f9dfb459..b38d82b6a5 100644
--- a/src/mainboard/lenovo/x60/acpi/video.asl
+++ b/src/mainboard/lenovo/x60/acpi/video.asl
@@ -19,6 +19,8 @@
* MA 02110-1301 USA
*/
+#include "smi.h"
+
Device (DSPC)
{
Name (_ADR, 0x00020001)
@@ -36,6 +38,7 @@ Device (DSPC)
{
Subtract(Local0, 16, Local0)
Store(Local0, BRTC)
+ Trap(SMI_SAVE_CMOS)
}
}
@@ -46,6 +49,7 @@ Device (DSPC)
{
Add (Local0, 16, Local0)
Store(Local0, BRTC)
+ Trap(SMI_SAVE_CMOS)
}
}
}
diff --git a/src/mainboard/lenovo/x60/cmos.layout b/src/mainboard/lenovo/x60/cmos.layout
index 1875e599e6..a1575137c7 100644
--- a/src/mainboard/lenovo/x60/cmos.layout
+++ b/src/mainboard/lenovo/x60/cmos.layout
@@ -108,6 +108,7 @@ entries
1052 4 r 0 C1DRT1
1064 8 h 0 volume
+1072 8 h 0 tft_brightness
# -----------------------------------------------------------------
enumerations
diff --git a/src/mainboard/lenovo/x60/mainboard_smi.c b/src/mainboard/lenovo/x60/mainboard_smi.c
index d13055ee70..769432f618 100644
--- a/src/mainboard/lenovo/x60/mainboard_smi.c
+++ b/src/mainboard/lenovo/x60/mainboard_smi.c
@@ -25,6 +25,8 @@
#include <cpu/x86/smm.h>
#include "southbridge/intel/i82801gx/nvs.h"
#include <ec/acpi/ec.h>
+#include <pc80/mc146818rtc.h>
+#include <ec/lenovo/h8/h8.h>
#include "dock.h"
#include "smi.h"
@@ -38,7 +40,25 @@ static void mainboard_smm_init(void)
printk(BIOS_DEBUG, "initializing SMI\n");
/* Enable 0x1600/0x1600 register pair */
ec_set_bit(0x00, 0x05);
- ec_set_ports(0x1604, 0x1600);
+}
+
+static void mainboard_smi_save_cmos(void)
+{
+ u8 val;
+ u8 tmp70, tmp72, tmpcf8;
+
+ tmp70 = inb(0x70);
+ tmp72 = inb(0x72);
+ tmpcf8 = inl(0xcf8);
+
+ val = pci_read_config8(PCI_DEV(0, 2, 1), 0xf4);
+ set_option("tft_brightness", &val);
+ val = ec_read(H8_VOLUME_CONTROL);
+ set_option("volume", &val);
+
+ outb(tmp70, 0x70);
+ outb(tmp72, 0x72);
+ outb(tmpcf8, 0xcf8);
}
int mainboard_io_trap_handler(int smif)
@@ -67,6 +87,9 @@ int mainboard_io_trap_handler(int smif)
ec_write(0x0c, 0x08);
break;
+ case SMI_SAVE_CMOS:
+ mainboard_smi_save_cmos();
+ break;
default:
return 0;
}
diff --git a/src/mainboard/lenovo/x60/smi.h b/src/mainboard/lenovo/x60/smi.h
index 6eb840256a..ad096b9cb9 100644
--- a/src/mainboard/lenovo/x60/smi.h
+++ b/src/mainboard/lenovo/x60/smi.h
@@ -3,5 +3,6 @@
#define SMI_DOCK_CONNECT 0x01
#define SMI_DOCK_DISCONNECT 0x02
+#define SMI_SAVE_CMOS 0x03
#endif