| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| Device (EC0) |
| { |
| Name (_HID, EisaId ("PNP0C09")) |
| Name (_UID, 1) |
| Name (_GPE, EC_SCI_GPI) |
| Name (_STA, 0xf) |
| Name (DBUG, 0) |
| Name (ISSX, 0) /* Is the EC in S0ix mode? */ |
| Name (UCEP, 0) /* Is there a pending UCSI event? */ |
| |
| Name (_CRS, ResourceTemplate() { |
| IO (Decode16, |
| CONFIG_EC_BASE_ACPI_DATA, |
| CONFIG_EC_BASE_ACPI_DATA, |
| 4, 4) |
| IO (Decode16, |
| CONFIG_EC_BASE_ACPI_COMMAND, |
| CONFIG_EC_BASE_ACPI_COMMAND, |
| 4, 4) |
| }) |
| |
| /* Handle registration of EmbeddedControl region */ |
| Name (EREG, 0) |
| OperationRegion (ERAM, EmbeddedControl, 0, 0xff) |
| Method (_REG, 2) |
| { |
| /* Indicate region is registered */ |
| EREG = Arg1 |
| |
| /* Store initial value for power status */ |
| ECPR = R (PWSR) |
| |
| /* Indicate to EC that OS is ready for queries */ |
| W (ERDY, Arg1) |
| |
| /* Indicate that the OS supports S0ix */ |
| W (CSOS, 1) |
| |
| /* Tell EC to stop emulating PS/2 mouse */ |
| W (PS2M, 0) |
| |
| /* Enable DPTF support if enabled in devicetree */ |
| If (\DPTE == 1) { |
| W (DWST, Arg1) |
| } |
| |
| /* Initialize UCSI */ |
| ^UCSI.INIT () |
| |
| // Initialize LID switch state |
| \LIDS = R (P1LC) |
| } |
| |
| /* |
| * Find bitmask for field |
| * Arg0 = EC field structure |
| * Arg1 = Value |
| */ |
| Method (EBIT, 2, NotSerialized) |
| { |
| Local0 = DeRefOf (Arg0[1]) /* Mask */ |
| Local1 = Arg1 & Local0 |
| FindSetRightBit (Local0, Local2) |
| If (Local2) { |
| Local1 >>= Local2 - 1 |
| } |
| Return (Local1) |
| } |
| |
| /* |
| * READ or WRITE from EC region |
| * Arg0 = EC field structure |
| * Arg1 = Value to write |
| */ |
| Method (ECRW, 2, Serialized, 2) |
| { |
| If (!EREG) { |
| Return (0) |
| } |
| |
| Local0 = DeRefOf (Arg0[0]) /* Byte offset */ |
| Local1 = DeRefOf (Arg0[1]) /* Mask */ |
| Local2 = DeRefOf (Arg0[2]) /* Read/Write */ |
| |
| OperationRegion (ERAM, EmbeddedControl, Local0, 2) |
| Field (ERAM, ByteAcc, Lock, WriteAsZeros) |
| { |
| BYT1, 8, |
| BYT2, 8, |
| } |
| |
| If (Local2 == RD) { |
| /* Read first byte */ |
| Local3 = BYT1 |
| |
| /* Read second byte if needed */ |
| FindSetLeftBit (Local1, Local4) |
| If (Local4 > 8) { |
| Local4 = BYT2 |
| Local4 <<= 8 |
| Local3 |= Local4 |
| } |
| |
| Local5 = EBIT (Arg0, Local3) |
| If (DBUG) { |
| Printf ("ECRD %o = %o", Local0, Local5) |
| } |
| Return (Local5) |
| } ElseIf (Local2 == WR) { |
| /* Write byte */ |
| If (DBUG) { |
| Printf ("ECWR %o = %o", Local0, Arg1) |
| } |
| BYT1 = Arg1 |
| } |
| Return (0) |
| } |
| |
| /* |
| * Read a field from EC |
| * Arg0 = EC field structure |
| */ |
| Method (R, 1, Serialized, 2) |
| { |
| Return (ECRW (Arg0, 0)) |
| } |
| |
| /* |
| * Write value to a field from EC |
| * Arg0 = EC field structure |
| * Arg1 = Value to write |
| */ |
| Method (W, 2, Serialized, 2) |
| { |
| Return (ECRW (Arg0, Arg1)) |
| } |
| |
| /* |
| * Tell EC that the OS is entering or exiting S0ix |
| */ |
| Method (S0IX, 1, Serialized) |
| { |
| ^ISSX = Arg0 /* Update S0ix state. */ |
| |
| If (Arg0) { |
| Printf ("EC Enter S0ix") |
| W (CSEX, 1) |
| |
| /* |
| * Read back from EC RAM after enabling S0ix |
| * to prevent EC from aborting S0ix entry. |
| */ |
| R (EVT1) |
| } Else { |
| Printf ("EC Exit S0ix") |
| W (CSEX, 0) |
| |
| /* If UCSI event happened during S0ix send it now. */ |
| If (^UCEP == 1) { |
| ^_Q79 () |
| } |
| } |
| } |
| |
| #include "ec_dev.asl" |
| #include "ec_ram.asl" |
| #include "ac.asl" |
| #include "battery.asl" |
| #include "event.asl" |
| #include "lid.asl" |
| #include "platform.asl" |
| #include "vbtn.asl" |
| #include "ucsi.asl" |
| #ifdef EC_ENABLE_DPTF |
| #include "dptf.asl" |
| #endif |
| #ifdef EC_ENABLE_PRIVACY |
| #include "privacy.asl" |
| #endif |
| } |