blob: a4b282c4cc99099dde85f062d6b95a8519161f9b [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#include <ec/clevo/it5570e/commands.h>
#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 <ec/acpi/ec.asl>
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"
}