/* SPDX-License-Identifier: GPL-2.0-only */ #include #define EC_DATA_IO 0x62 #define EC_SC_IO 0x66 Device (EC0) { Name (_HID, "PNP0C09") Name (_GPE, EC_GPE_SCI) Name (_CRS, ResourceTemplate () { IO (Decode16, 0x62, 0x62, 0, 1) IO (Decode16, 0x66, 0x66, 0, 1) }) #include OperationRegion (PMS0, SystemMemory, 0xfe001b1c, 4) Field (PMS0, DWordAcc, NoLock, Preserve) { , 15, GS0E, 1, /* Global SLP_S0# enable */ } #include "ec_ram.asl" External (SFCV, MethodObj) /* Generated in SSDT */ Method (INIT) { Printf ("EC: INIT") ECOS = 2 /* ACPI with driver */ BLCT = 1 /* Enable ACPI brightness control */ CAMK = 1 /* Enable camera hotkey */ SFCV () /* Apply custom fan curve */ PNOT () } Method (_INI) { Printf ("EC: _INI") INIT () } /* Send FCMD */ Method (SFCC, 1, Serialized) { FCMD = Arg0 SEND_EC_COMMAND(0) /* EC sets FCMD = 0x00 on completion (FCMD = 0xfa on some commands) */ Local0 = 50 While (Local0--) { Stall (1) If (FCMD == 0x00 || FCMD == 0xfa) { Printf("EC: FCMD 0x%o completed after %o ms", ToHexString(Arg0), ToDecimalString(50 - Local0)) Return (1) } } Printf("EC: FCMD 0x%o timed out", ToHexString(Arg0)) Return (0) } /* * Method called from _PTS prior to system sleep state entry */ Method (PTS, 1, Serialized) { Printf ("EC: PTS: Arg0=%o", ToDecimalString(Arg0)) WFNO = 0 /* Clear wake cause */ } /* * Method called from _WAK prior to system sleep state wakeup */ Method (WAK, 1, Serialized) { Printf ("EC: WAK: Arg0=%o, WFNO=%o", ToDecimalString(Arg0), ToHexString (WFNO)) INIT () /* update battery */ Notify (\_SB.BAT0, 0x00) /* bus check */ Notify (\_SB.BAT0, 0x80) /* state change */ Notify (\_SB.BAT0, 0x81) /* information change */ /* update AC */ Notify (\_SB.AC, 0x00) /* bus check */ Notify (\_SB.AC, 0x80) /* state change */ If (Arg0 == 0x03 || Arg0 == 0x04) { Notify (\_SB.PWRB, 0x02) /* Wake */ } } /* * Display On/Off Notifications * Called from \_SB.PEPD._DSM */ Name (KBLV, 0) Method (EDSX, 1, Serialized) { Printf ("EC: PEP display hook, state=%o", ToDecimalString (Arg0)) If (S5FG) { Return () } /* Display off */ If (!Arg0) { /* Store current keyboard backlight level */ FDAT = FDAT_KBLED_WHITE_GET_LEVEL SFCC (FCMD_KLED) KBLV = FBUF /* Turn off keyboard backlight */ FDAT = FDAT_KBLED_WHITE_SET_LEVEL FBUF = 0x00 SFCC (FCMD_KLED) } /* Display on */ Else { /* Restore keyboard backlight level */ FDAT = FDAT_KBLED_WHITE_SET_LEVEL FBUF = KBLV SFCC (FCMD_KLED) } } /* * S0ix Entry/Exit Notifications * Called from \_SB.PEPD._DSM */ Method (S0IX, 1, Serialized) { If (S5FG) { Return () } Printf ("EC: S0ix change, state=%o", ToDecimalString (Arg0)) /* S0ix entry */ If (Arg0) { MSFG = 1 /* Notify EC */ } /* S0ix exit */ Else { GS0E = 0 /* Block SLP_S0# assertion during wakeup */ MSFG = 0 /* Notfiy EC */ Sleep (150) /* wait for EC to become ready */ SFCV () /* Apply custom fan curve */ GS0E = 1 /* Unblock SLP_S0# */ } } #include "ec_queries.asl" }