summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ec/google/wilco/acpi/ec.asl1
-rw-r--r--src/ec/google/wilco/acpi/ec_ram.asl1
-rw-r--r--src/ec/google/wilco/acpi/event.asl20
-rw-r--r--src/ec/google/wilco/acpi/vbtn.asl94
4 files changed, 116 insertions, 0 deletions
diff --git a/src/ec/google/wilco/acpi/ec.asl b/src/ec/google/wilco/acpi/ec.asl
index be80b2d69e..5aca1878d6 100644
--- a/src/ec/google/wilco/acpi/ec.asl
+++ b/src/ec/google/wilco/acpi/ec.asl
@@ -164,6 +164,7 @@ Device (EC0)
#include "event.asl"
#include "lid.asl"
#include "platform.asl"
+ #include "vbtn.asl"
#ifdef EC_ENABLE_DPTF
#include "dptf.asl"
#endif
diff --git a/src/ec/google/wilco/acpi/ec_ram.asl b/src/ec/google/wilco/acpi/ec_ram.asl
index 1e5d7cb1fc..1c030af06f 100644
--- a/src/ec/google/wilco/acpi/ec_ram.asl
+++ b/src/ec/google/wilco/acpi/ec_ram.asl
@@ -115,6 +115,7 @@ Name (DRHY, Package () { 0x37, 0xff, RD }) /* DPTF: Read Hysteresis */
Name (DRTQ, Package () { 0x38, 0xff, RD }) /* DPTF: Read Trip Query */
Name (ORST, Package () { 0x39, 0xff, RD }) /* Orientation State */
+Name (OTBL, Package () { 0x39, 0x02, RD }) /* Orientation: Tablet mode */
Name (OREV, Package () { 0x3a, 0xff, RD }) /* Orientation Events */
Name (OECH, Package () { 0x3a, 0x01, RD }) /* Event: Orientation */
Name (OERL, Package () { 0x3a, 0x02, RD }) /* Event: Rotation Lock */
diff --git a/src/ec/google/wilco/acpi/event.asl b/src/ec/google/wilco/acpi/event.asl
index d818d22ca2..24cf268636 100644
--- a/src/ec/google/wilco/acpi/event.asl
+++ b/src/ec/google/wilco/acpi/event.asl
@@ -81,6 +81,16 @@ Method (ECQ2, 1, Serialized)
Printf ("QS EVENT")
Notify (^WEVT, 0x90)
}
+
+ If (EBIT (E2OR, Arg0)) {
+ If (R (OTBL)) {
+ Printf ("EC event indicates tablet mode")
+ Notify (^VBTN, ^VTBL)
+ } Else {
+ Printf ("EC event indicates laptop mode")
+ Notify (^VBTN, ^VLAP)
+ }
+ }
}
/* Handle events in PmEv3 */
@@ -88,6 +98,16 @@ Method (ECQ3, 1, Serialized)
{
Printf ("EVT3: %o", Arg0)
+ If (EBIT (E3CP, Arg0)) {
+ If (R (P2PB)) {
+ Printf ("Power button pressed")
+ Notify (^VBTN, ^VPPB)
+ } Else {
+ Printf ("Power button released")
+ Notify (^VBTN, ^VRPB)
+ }
+ }
+
#ifdef EC_ENABLE_DPTF
/* Theraml Events */
If (EBIT (E3TH, Arg0)) {
diff --git a/src/ec/google/wilco/acpi/vbtn.asl b/src/ec/google/wilco/acpi/vbtn.asl
new file mode 100644
index 0000000000..201ab51002
--- /dev/null
+++ b/src/ec/google/wilco/acpi/vbtn.asl
@@ -0,0 +1,94 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2019 Google LLC
+ *
+ * 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.
+ */
+
+/*
+ * Intel Virtual Button driver compatible with the driver found in
+ * the Linux kernel at drivers/platform/x86/intel-vbtn.c
+ *
+ * For tablet/laptop and dock/undock events to work the board must
+ * select SYSTEM_TYPE_CONVERTIBLE for the SMBIOS enclosure type to
+ * indicate the device is a convertible.
+ */
+
+Name (FLAP, 0x40) /* Flag indicating device is in laptop mode */
+
+/* Virtual events */
+Name (VPPB, 0xc0) /* Power Button press */
+Name (VRPB, 0xc1) /* Power Button release */
+Name (VPSP, 0xc2) /* Special key press (LEFTMETA in Linux) */
+Name (VRSP, 0xc3) /* Special key release (LEFTMETA in Linux) */
+Name (VPVU, 0xc4) /* Volume Up press */
+Name (VRVU, 0xc5) /* Volume Up release */
+Name (VPVD, 0xc6) /* Volume Down press */
+Name (VRVD, 0xc7) /* Volume Down release */
+Name (VPRL, 0xc8) /* Rotate Lock press */
+Name (VRRL, 0xc9) /* Rotate Lock release */
+Name (VDOC, 0xca) /* Docked */
+Name (VUND, 0xcb) /* Undocked */
+Name (VTBL, 0xcc) /* Tablet Mode */
+Name (VLAP, 0xcd) /* Laptop Mode */
+
+Device (VBTN)
+{
+ Name (_HID, "INT33D6")
+ Name (_UID, One)
+ Name (_DDN, "Intel Virtual Button Driver")
+
+ /*
+ * This method is called at driver probe time and must exist or
+ * the driver will not load.
+ */
+ Method (VBDL)
+ {
+ }
+
+ /*
+ * This method returns flags indicating tablet and dock modes.
+ * It is called at driver probe time so the OS knows what the
+ * state of the device is at boot.
+ */
+ Method (VGBS)
+ {
+ Local0 = Zero
+
+ /* Check EC orientation for tablet mode flag */
+ If (R (OTBL)) {
+ Printf ("EC reports tablet mode at boot")
+ } Else {
+ Printf ("EC reports laptop mode at boot")
+ Local0 |= ^^FLAP
+ }
+ Return (Local0)
+ }
+
+ Method(_STA, 0)
+ {
+ Return (0xF)
+ }
+}
+
+Device (VBTO)
+{
+ Name (_HID, "INT33D3")
+ Name (_CID, "PNP0C60")
+ Name (_UID, One)
+ Name (_DDN, "Laptop/tablet mode indicator driver")
+
+ Method (_STA, 0)
+ {
+ Return (0xF)
+ }
+}