diff options
-rw-r--r-- | src/ec/google/wilco/acpi/ec.asl | 1 | ||||
-rw-r--r-- | src/ec/google/wilco/acpi/ec_ram.asl | 1 | ||||
-rw-r--r-- | src/ec/google/wilco/acpi/event.asl | 20 | ||||
-rw-r--r-- | src/ec/google/wilco/acpi/vbtn.asl | 94 |
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) + } +} |