• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <ec/clevo/it5570e/commands.h>
4
5#define EC_DATA_IO	0x62
6#define EC_SC_IO	0x66
7
8Device (EC0)
9{
10	Name (_HID, "PNP0C09")
11	Name (_GPE, EC_GPE_SCI)
12
13	Name (_CRS, ResourceTemplate ()
14	{
15		IO (Decode16, 0x62, 0x62, 0, 1)
16		IO (Decode16, 0x66, 0x66, 0, 1)
17	})
18
19	#include <ec/acpi/ec.asl>
20
21	OperationRegion (PMS0, SystemMemory, 0xfe001b1c, 4)
22	Field (PMS0, DWordAcc, NoLock, Preserve)
23	{
24		    , 15,
25		GS0E,  1, /* Global SLP_S0# enable */
26	}
27
28	#include "ec_ram.asl"
29
30	External (SFCV, MethodObj) /* Generated in SSDT */
31
32	Method (INIT)
33	{
34		Printf ("EC: INIT")
35
36		ECOS  = 2	/* ACPI with driver */
37		BLCT  = 1	/* Enable ACPI brightness control */
38		CAMK  = 1	/* Enable camera hotkey */
39
40		SFCV ()		/* Apply custom fan curve */
41
42		PNOT ()
43	}
44
45	Method (_INI)
46	{
47		Printf ("EC: _INI")
48
49		INIT ()
50	}
51
52	/* Send FCMD */
53	Method (SFCC, 1, Serialized)
54	{
55		FCMD = Arg0
56		SEND_EC_COMMAND(0)
57
58		/* EC sets FCMD = 0x00 on completion (FCMD = 0xfa on some commands) */
59		Local0 = 50
60		While (Local0--)
61		{
62			Stall (1)
63			If (FCMD == 0x00 || FCMD == 0xfa)
64			{
65				Printf("EC: FCMD 0x%o completed after %o ms",
66				       ToHexString(Arg0), ToDecimalString(50 - Local0))
67				Return (1)
68			}
69		}
70		Printf("EC: FCMD 0x%o timed out", ToHexString(Arg0))
71		Return (0)
72	}
73
74	/*
75	 * Method called from _PTS prior to system sleep state entry
76	 */
77	Method (PTS, 1, Serialized)
78	{
79		Printf ("EC: PTS: Arg0=%o", ToDecimalString(Arg0))
80
81		WFNO = 0	/* Clear wake cause */
82	}
83
84	/*
85	 * Method called from _WAK prior to system sleep state wakeup
86	 */
87	Method (WAK, 1, Serialized)
88	{
89		Printf ("EC: WAK: Arg0=%o, WFNO=%o", ToDecimalString(Arg0), ToHexString (WFNO))
90
91		INIT ()
92
93		/* update battery */
94		Notify (\_SB.BAT0, 0x00) /* bus check */
95		Notify (\_SB.BAT0, 0x80) /* state change */
96		Notify (\_SB.BAT0, 0x81) /* information change */
97
98		/* update AC */
99		Notify (\_SB.AC, 0x00) /* bus check */
100		Notify (\_SB.AC, 0x80) /* state change */
101
102		If (Arg0 == 0x03 || Arg0 == 0x04) {
103			Notify (\_SB.PWRB, 0x02) /* Wake */
104		}
105	}
106
107	/*
108	 * Display On/Off Notifications
109	 * Called from \_SB.PEPD._DSM
110	 */
111	Name (KBLV, 0)
112	Method (EDSX, 1, Serialized)
113	{
114		Printf ("EC: PEP display hook, state=%o", ToDecimalString (Arg0))
115
116		If (S5FG)
117		{
118			Return ()
119		}
120
121		/* Display off */
122		If (!Arg0)
123		{
124			/* Store current keyboard backlight level */
125			FDAT = FDAT_KBLED_WHITE_GET_LEVEL
126			SFCC (FCMD_KLED)
127			KBLV = FBUF
128
129			/* Turn off keyboard backlight */
130			FDAT = FDAT_KBLED_WHITE_SET_LEVEL
131			FBUF = 0x00
132			SFCC (FCMD_KLED)
133		}
134
135		/* Display on */
136		Else
137		{
138			/* Restore keyboard backlight level */
139			FDAT = FDAT_KBLED_WHITE_SET_LEVEL
140			FBUF = KBLV
141			SFCC (FCMD_KLED)
142		}
143	}
144
145	/*
146	 * S0ix Entry/Exit Notifications
147	 * Called from \_SB.PEPD._DSM
148	 */
149	Method (S0IX, 1, Serialized)
150	{
151		If (S5FG)
152		{
153			Return ()
154		}
155
156		Printf ("EC: S0ix change, state=%o", ToDecimalString (Arg0))
157
158		/* S0ix entry */
159		If (Arg0)
160		{
161			MSFG = 1	/* Notify EC */
162		}
163
164		/* S0ix exit */
165		Else
166		{
167			GS0E = 0	/* Block SLP_S0# assertion during wakeup */
168			MSFG = 0	/* Notfiy EC */
169			Sleep (150)	/* wait for EC to become ready */
170			SFCV ()		/* Apply custom fan curve */
171			GS0E = 1	/* Unblock SLP_S0# */
172		}
173	}
174
175	#include "ec_queries.asl"
176}
177