/* SPDX-License-Identifier: GPL-2.0-only */

/*
 * The mainboard must define a PNOT method to handle power
 * state notifications and Notify CPU device objects to
 * re-evaluate their _PPC and _CST tables.
 */

Device (EC0)
{
	Name (_HID, EISAID ("PNP0C09"))
	Name (_UID, 1)
	Name (_GPE, EC_SCI_GPI + 16) // GPE for Runtime SCI

	// EC RAM fields
	OperationRegion(ERAM, EmbeddedControl, 0, 0xFF)
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
				//   [Configuration Space 0]
		    , 1,        //   Reserved bit[0]
		ENGA, 1,        //   Enable Global attention
		ENHY, 1,        //   Enable Hotkey function
		HFNE, 1,        //   Enable Sticky Fn Key
		DSEM, 1,        //   Disable embedded NumPad Emulation
		EN3R, 1,        //   Enable 3rd Host interface and TWR registers
		    , 1,        //   Reserved bit[6]
		ENTM, 1,        //   Enable Thermal monitoring

		Offset(0x01),   // [Configuration Space 1]
		ENBK, 1,        //   Enable Panel backlight on/ off synchronized with LID state
		    , 3,        //   Reserved bits[1:3]
		WPSW, 1,        //   Warning if the power switch is depressed
		    , 2,        //   Reserved bits[5:6]
		NTKY, 1,        //   do not ignore any key while Fn key is held down

		Offset(0x02),   // [Configuration Space 2]
		    , 5,        //   Reserved bits[0:4]
		SNLC, 1,        //   Smart NumLock Enable. 1:Enable 0:Disable
		    , 1,        //   Reserved bit[6]
		TNKB, 1,        //   ThinkVantage button function bit
		                //	   0: Scan code (Enter key)
		                //	   1: SMI/SCI attention

		Offset(0x03),   // [Configuration Space 3]
		DSHP, 1,        //   Disable to synchronize headphone state with the speaker mute
		IGPK, 1,        //   Ignore phantom keys
		    , 2,        //   Reserved bits[2:3]
		CBAT, 1,        //   Change discharge/charge preference to discharge primary battery first and charge secondary battery first if possible
		ADO0, 1,        //   Audio button behavior mode 0
		ADO1, 1,        //   Audio button behavior mode 1
		    , 1,        //   Enable to use PMH fan functions to get the fan speed

		Offset(0x04),   // [Sound Mask 0]
		    , 1,        //   reserved
		CLBA, 1,        //   critical low battery alarm
		LWBA, 1,        //   low battery alarm (YELLOW -> RED)
		SUBE, 1,        //   suspend beep
		PUBE, 1,        //   vm_suspend beep
		RSBE, 1,        //   resume beep
		DCBE, 1,        //   DC in/out beep
		PFBE, 1,        //   power off beep

		Offset(0x05),   // [Sound Mask 1]
		HSPA, 1,        //   power off alarm
		NHDD, 1,        //   no HDD alarm
		DEAD, 1,        //   dead
		B440, 1,        //   440 hz beep
		B315, 1,        //   315 hz beep
		T315, 1,        //   two 315 hz beep
		R315, 1,        //   three 315 hz beep
		BYAM, 1,        //   inhibit swap

		Offset(0x06),   // [Sound ID (Write only)]
		HSUN, 8,        //   Sound ID (Write Only)

		Offset(0x07),   // [Sound Repeat Interval (unit time 125ms)]
		HSRP, 8,        //   Sound Repeat Interval (Unit time : 125ms )

		Offset(0x08),   // [Sound Mask 2]
		Offset(0x09),   // [KBD ID]
		Offset(0x0A),   // [KMC command control]
		                // Offset 0xOB : reserved

		Offset(0x0C),   // [LED On/Off/ Blinking Control (Write only)]
		HLCL, 4,        //   0: power LED
		                //   1: battery status 0
		                //   2: battery status 1
		                //   3: additional Bay LED (Venice) / reserved (Toronto-4) / Slicer LED (Tokyo)
		                //   4-6: reserved
		                //   7: suspend LED
		                //   8: dock LED 1
		                //   9: dock LED 2
		                //   10-13: reserved
		                //   14: microphone mute
		                //   15: reserved
		    , 1,        //   Reserved bit[4]
		    , 1,        //   Blink gradually
		BLIK, 1,        //   Blinking
		TONF, 1,        //   Turn on/off

		Offset(0x0D),   // [Peripheral control 3]
		UONE, 1,        //   Bit0   - Enable to supply power through USB in S3, S4 and S5 state.
		    , 1,        //   Reserved bit[1]
		    , 1,        //   set USB_AO_SEL0 signal in S3, S4, and S5 state
		    , 1,        //   set USB_AO_SEL1 signal in S3, S4, and S5 state
		    , 4,        //   Reserved bits[4:7]

		Offset(0x0E),   // [Peripheral Status 4]
		HFNS, 2,        //   Bit[1, 0] : Fn Key Status
		                //      [0, 0] ... Unlock
		                //      [0, 1] ... Sticky
		                //      [1, 0] ... Lock
		                //      [1, 1] ... Reserved
		GSER, 1,        //   G-Sensor Diag Error. 1:Error / 0: No error
		PSCS, 1,        //   Inhibit charging
		    , 1,        //   External power saving mode
		GSUD, 1,        //   G-Sensor under Diag. 1: Diag is running/0: Diag comp(not running)
		GSID, 2,        //   Bit[7,6] G-Sensor type ID
		                //      [0,0] ... None
		                //      [0,1] ... STMicro
		                //      [1,0] ... Memsic
		                //      [1,1] ... ADI

		Offset(0x0F),   // [Peripheral status 5 (read only)]
		    , 4,        //   Reserved bits[0:3]
		HDSU, 1,        //   HDD was detached in suspend (this bit is cleared when the system enters into suspend)
		BYSU, 1,        //   Bay HDD was detached in suspend (this bit is cleared when the system enters into suspend)
		    , 1,        //   NumLock state of the embedded keyboard
		TMOD, 1,        //   Tablet mode switch

		Offset(0x10),   // [Attention Mask (00-127)]
		HAM0, 8,        // 10 : Attention Mask (00-07)
		HAM1, 8,        // 11 : Attention Mask (08-0F)
		HAM2, 8,        // 12 : Attention Mask (10-17)
		HAM3, 8,        // 13 : Attention Mask (18-1F)
		HAM4, 8,        // 14 : Attention Mask (20-27)
		HAM5, 8,        // 15 : Attention Mask (28-2F)
		HAM6, 8,        // 16 : Attention Mask (30-37)
		HAM7, 8,        // 17 : Attention Mask (38-3F)
		HAM8, 8,        // 18 : Attention Mask (40-47)
		HAM9, 8,        // 19 : Attention Mask (48-4F)
		HAMA, 8,        // 1A : Attention Mask (50-57)
		HAMB, 8,        // 1B : Attention Mask (58-5F)
		HAMC, 8,        // 1C : Attention Mask (60-67)
		HAMD, 8,        // 1D : Attention Mask (68-6F)
		HAME, 8,        // 1E : Attention Mask (70-77)
		HAMF, 8,        // 1F : Attention Mask (78-7F)

		                // Offset 0x20 : reserved
		Offset(0x21),   // [Inhibit Charge timer byte High (00h)] (timer is kicked when high byte is written)

		Offset(0x23),   // [Misc. control]
		                //   01h Reset charge inhibit
		                //   02h Inhibit to charge
		                //   03h Reset external power saving mode
		                //   04h Set to external power saving mode
		                //   09h Emulate pressing an eject button of optical device in the bay
		                //   0Ah Reset thermal state to control the fan
		                //   10h Start gravity sensor diagnostic program

		                // Offset 24-26 : reserved
		Offset(0x27),   // [Passward Scan Code]
		                // Offset 28-29 : reserved

		Offset(0x2A),   // [Attention Request]
		HATR, 8,        // 2A : Attention request

		Offset(0x2B),   // [Trip point of battery capacity]
		HT0H, 8,        // 2B : MSB of Trip Point Capacity for Battery 0
		HT0L, 8,        // 2C : LSB of Trip Point Capacity for Battery 0
		HT1H, 8,        // 2D : MSB of Trip Point Capacity for Battery 1
		HT1L, 8,        // 2E : LSB of Trip Point Capacity for Battery 1

		Offset(0x2F),   // [Fan Speed Control]
		HFSP, 8,        //  bit 2-0: speed (0: stop, 7:highest speed)
		                //  bit 5-3: reserved (should be 0)
		                //  bit 6: max. speed
		                //  bit 7: Automatic mode (fan speed controlled by thermal level)

		Offset(0x30),   // [Audio mute control]
		    , 7,        //  Reserved bits[0:6]
		SMUT, 1,        //  Mute

		Offset(0x31),   // [Peripheral Control 2]
		FANS, 2,        //   bit 0,1 Fan selector
		                //	   00: Fan 1, 01: Fan 2
		HUWB, 1,        //   UWB on
		ENS4, 1,        //   Reserved bit[3]
		DSEX, 1,        //   Disable Express Card
		AYID, 1,        //   Always-on Card identified
		    , 1,        //   Select USB to Always On card
		    , 1,        //   Assert the express card slot power control standby signal

		Offset(0x32),   // [EC Event Mask 0]
		HWPM, 1,        //   PME : Not used. PME# is connected to GPE directly.
		HWLB, 1,        //   Critical Low Bat
		HWLO, 1,        //   Lid Open
		    , 1,        //   Eject button
		HWFN, 1,        //   FN key
		    , 1,        //   Portfino wake up
		HWRI, 1,        //   Ring Indicator (UART)
		HWBU, 1,        //   Bay Unlock

		Offset(0x33),   // [EC Event Mask 1]

		Offset(0x34),   // [Peripheral status 2 (read only)]
		    , 1,        //   Reserved bit[0]
		    , 1,        //   Beep is being sounded now
		    , 1,        //   SMBus is busy
		    , 1,        //   Reserved bit[3]
		    , 1,        //   Fan exists
		    , 1,        //   Gravity sensors exist
		    , 1,        //   Reserved bit[6]
		HPLO, 1,        //   Power consumption warning

		Offset(0x35),   // [Peripheral status 3 (Read only)]
		    , 1,        //   Input devices (keyboard and mouse) are locked by password
		    , 1,        //   Input devices are frozen (input from devices are inhibited)
		    , 1,        //   Fan power on Reset is done
		    , 1,        //   Attention is disabled temporarily
		    , 1,        //   Fan error
		    , 2,        //   Reserved bit[5:6]
		    , 1,        //   Thermal sensor error

		Offset(0x36),   // [Copy register of EC Event Status (0x32)]
		Offset(0x37),   // [Copy register of EC Event Status (0x33)]

		Offset(0x38),   // [Battery 0 status (read only)]
		HB0S, 7,        //   bit 3-0 level
		                //     F: Unknown
		                //     2-n: battery level
		                //     1: low level
		                //     0: (critical low battery, suspend/ hibernate)
		                //   bit 4 error
		                //   bit 5 charge
		                //   bit 6 discharge
		MBTS, 1,        //   bit 7 battery attached

		Offset(0x39),   // [Battery 1 status (read only)]
		                //    bit definition is the same as offset(0x38)

		Offset(0x3A),   // [Peripheral control 0]
		MUTE, 1,        //   Mute
		I2CS, 1,        //   I2C select ( 0:Dock EEPROM etc, 1:Thermal sensor etc )(Tokyo-2)
		PWRF, 1,        //   Power off
		WANO, 1,        //   H/W Override bit
		                //	(enable to control wireless devices even if the global WAN disable switch is ON)
		DCBD, 1,        //   Bluetooth On
		DCWL, 1,        //   Wireless Lan On
		DCWW, 1,        //   Wireless Wan On
		    , 1,        //   2nd Battery Inhibit (Tokyo)

		Offset(0x3B),   // [Peripheral control 1]
		SPKM, 1,        //   Speaker Mute
		KBLH, 1,        //   Keyboard Light
		    , 1,        //   Reserved bit[2]
		BTDH, 1,        //   Bluetooth detach
		USBN, 1,        //   USB On
		    , 1,        //   Inhibit communication with battery 0
		    , 1,        //   Inhibit communication with battery 1
		S3FG, 1,        //   Reserved bit[7]

		Offset(0x3C),   // [Resume reason (Read only)]
		Offset(0x3D),   // [Password Control byte]
		Offset(0x3E),   // [Password data (8 byte)~ offset:45h]

		Offset(0x46),   // [sense status 0]
		FNKY, 1,        //   Fn key
		    , 1,        //   Reserved bit[1]
		HPLD, 1,        //   LID open
		PROF, 1,        //   Power off
		ACPW, 1,        //   External power (AC status)
		    , 2,        //   Reserved bits[5:6]
		CALR, 1,        //   LP mode (power consumption alert)

		Offset(0x47),   // [sense status 1]
		HPBU, 1,        //   Bay Unlock
		DKEV, 1,        //   Dock event
		BYNO, 1,        //   Bay is not Attached
		HDIB, 1,        //   HDD in the bay
		    , 4,        //   Reserved bits[4:7]

		Offset(0x48),   // [sense status 2]
		HPHI, 1,        //   Head Phone In
		GSTS, 1,        //   Global Wan Enable Switch
		    , 2,        //   Reserved bits[2:3]
		EXGC, 1,        //   External Graphic Chip
		DOKI, 1,        //   Dock attached
		HDDT, 1,        //   HDD detect
		    , 1,        //   Reserved bit[7]

		Offset(0x49),   // [sense status 3]
		                // Offset 0x4A : reserved

		Offset(0x4C),   // [MSB of Event Timer]
		ETHB, 8,        //   bit[14:0]=timer counter, bit[15], 0:ms, 1:sec

		Offset(0x4D),   // [LSB of Event Timer]
		ETLB, 8,        //

		Offset(0x4E),   // [EC Event Status 0]
		Offset(0x4F),   // [EC Event Status 1]

		Offset(0x50),   // [SMB_PRTCL (protocol register)]
		SMPR, 8,        //	00: Controller Not In use
		                //	01: reserved
		                //	02: Write Quick command
		                //	03: Read Quick command
		                //	04: Send Quick command
		                //	05: Receive Byte
		                //	06: Write Byte
		                //	07: Read Byte
		                //	08: Write Word
		                //	09: Read Word
		                //	0A: Write block

		Offset(0x51),   // [SMB_STS (status register)]
		SMST, 8,        //    bits[0:4] Status
		                //    bit[5] Reserved
		                //    bit[6] Alarm Received
		                //    bit[7] Done

		Offset(0x52),   // [SMB_ADDR (address register)]
		SMAD, 8,        //

		Offset(0x53),   // [SMB_CMD (Command register)]
		SMCM, 8,        //

		Offset(0x54),   // [SMB_DATA (Data Register (32 bytes))~ offset:73h]
		SMD0, 100,      //

		Offset(0x74),   // [SMB_BCNT (Block count register)]
		BCNT, 8,        //

		Offset(0x75),   // [SMB_ALRM_ADDR (Alarm address register)]
		SMAA, 8,        //

		Offset(0x76),   // [SMB_ALRM_DATA (Alarm data register (2 bytes))]
		BATD, 16,       //

		Offset(0x78),   // [Temperature of thermal sensor 0 (centigrade)]
		TMP0, 8,        // 78 : Temperature of thermal sensor 0
		TMP1, 8,        // 79 : Temperature of thermal sensor 1
		TMP2, 8,        // 7A : Temperature of thermal sensor 2
		TMP3, 8,        // 7B : Temperature of thermal sensor 3
		TMP4, 8,        // 7C : Temperature of thermal sensor 4
		TMP5, 8,        // 7D : Temperature of thermal sensor 5
		TMP6, 8,        // 7E : Temperature of thermal sensor 6
		TMP7, 8,        // 7F : Temperature of thermal sensor 7

		                // Offset 79-7F : reserved
		Offset(0x80),   // [Attention control byte]

		Offset(0x81),   // [Battery information ID for 0xA0-0xAF]
		HIID, 8,        //   (this byte is depend on the interface, 62&66 and 1600&1604)

		Offset(0x82),   // [Fn Dual function - make time out time (100ms unit)]

		Offset(0x83),   // [Fn Dual function ID]
		HFNI, 8,        //	0: none
		                //	1-3: Reserved
		                //	4: ACPI Power
		                //	5: ACPI Sleep
		                //	6: ACPI Wake
		                //  7: Left Ctrl key

		Offset(0x84),   // [Fan Speed]
		    , 16,       //
		                //	(I/F Offset 3Bh bit5 => 0:Main Fan , 1:Second Fan)

		Offset(0x86),   // [password 0 - 7 status]
		Offset(0x87),   // [password 8 - 15 status]
		Offset(0x88),   // [Thermal Status of Level 0 (low)]
		Offset(0x89),   // [Thermal Status of Level 1 (middle)]
		Offset(0x8A),   // [Thermal Status of Level 2 (middle high)]
		Offset(0x8B),   // [Thermal Status of Level 3 (high)]
		                // Offset 0x8C : reserved

		Offset(0x8D),   // [Interval of polling Always-on cards in half minute]
		HDAA, 3,        //   Warning Delay Period
		HDAB, 3,        //   Stolen Delay Period
		HDAC, 2,        //   Sensitivity

		Offset(0x8E),   // [Key-number assigned to the ThinkVantage button]
		Offset(0x8F),   // [EC Internal Use for Fan Duty Table Creation]
		Offset(0x90),   // [EC internal use]
		Offset(0xA0),   // [Battery Information Area]~ offset:0AFh
		Offset(0xB0),   // [Battery 0 charge start capacity]
		Offset(0xB1),   // [Battery 0 charge stop capacity]
		Offset(0xB2),   // [Battery 1 charge start capacity]
		Offset(0xB3),   // [Battery 1 charge stop capacity]

		Offset(0xB4),   // [Battery 0 control]
		                //    01h Stop refreshing the battery
		                //    02h Refresh the battery
		                //    07h Set long life span mode
		                //    08h Set long run time mode

		Offset(0xB5),   // [Battery 1 control]
		                // Offset B6-C7 : reserved

		Offset(0xC8),   // [Adaptive Thermal Management (ATM)]
		ATMX, 8,        //  bit 7-4 - Thermal Table & bit 3-0 - Fan Speed Table

		Offset(0xC9),   // [Wattage of AC/DC]
		AC65, 8,        //

		Offset(0xCA),   // Reserved - but should be 0

		Offset(0xCB),   // [ATM configuration]
		BFUD, 1,        //   bit 0 - Battery FUD Flag
		    , 7,        //   bit 1~7 - Reserved

		Offset(0xCC),   //
		PWMH, 8,        // CC : AC Power Consumption (MSB)
		PWML, 8,        // CD : AC Power Consumption (LSB) - unit: 100mW

		Offset(0xCE),   // [Configuration Space 4]
		    , 2,        //   Windows key mode
		    , 2,        //   Application key mode
		    , 1,        //   Swap the Fn key and the left Ctrl key
		    , 3,        //   Reserved bits[5:7]

		Offset(0xCF),   // [Configuration Space 5]
		HSID, 8,        //   Hand shaking byte of system information ID

		Offset(0xD0),   // [EC Type]
		                // D1-DF : reserved

		Offset(0xE0),   // @@ Mapping to old EC RAM for battery information
		ECRC, 16,       // BAT1 Sys command [0] RC
		ECAC, 16,       // BAT1 Sys command [0] AV_I
		ECVO, 16,       // BAT1 Sys command [0] Voltage

		                // E1-E7 : reserved
		Offset(0xE8),   // [Version 0]
		Offset(0xE9),   // [Version 1]
		Offset(0xEA),   // [Machine ID]
		Offset(0xEB),   // [Function Specification Minor Version]
		Offset(0xEC),   // [EC capability 0]
		Offset(0xED),   // [EC capability 1]

		Offset(0xEE),   // [Highest battery level]
		MBTH, 4,        //   bit 3-0: battery 0 highest level
		SBTH, 4,        //   bit 7-4: battery 1 highest level
		                //   note: if highest level is 0 or 0xF, it means not defined
		                //         (in this case, use default highest level, it is 6)

		Offset(0xEF),   // [EC Function Specification Major Version]
		Offset(0xF0),   // [Build ID]~ offset:0F7h

		Offset(0xF8),   // [Build Date (F8: MSB, F9:LSB)]
		    , 4,        //   bit 3-0: day(1-31)
		    , 4,        //   bit 7-4: month(1-12)
		    , 8,        //   bit 15-8: year(2000 base)

		Offset(0xFA),   // [Build Time (in 2seconds)]
		                //   ex: when index FAh=5Ah and index FBh=ADh, Build Time is 5AADh .. 12:53:46

		Offset(0xFC),   // [reserved]~ offset:0FFh
	} // End of ERAM

	//
	// Battery Information ID : 00/10
	//
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset(0xA0),
		SBRC, 16,    // Remaining Capacity
		SBFC, 16,    // Fully Charged Capacity
		SBAE, 16,    // Average Time To Empty
		SBRS, 16,    // Relative State Of Charge
		SBAC, 16,    // Average Current
		SBVO, 16,    // Voltage
		SBAF, 16,    // Average Time To Full
		SBBS, 16,    // Battery State
	}

	//
	// Battery Information ID : 01/11
	//
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset(0xA0),
		             // Battery Mode(w)
		    , 15,
		SBCM, 1,     //  bit 15 - CAPACITY_MODE
		             //        0: Report in mA/mAh ; 1: Enabled
		SBMD, 16,    // Manufacture Data
		SBCC, 16,    // Cycle Count
	}

	//
	// Battery Information ID : 02/12
	//
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset(0xA0),
		SBDC, 16,    // Design Capacity
		SBDV, 16,    // Design Voltage
		SBOM, 16,    // Optional Mfg Function 1
		SBSI, 16,    // Specification Info
		SBDT, 16,    // Manufacture Date
		SBSN, 16,    // Serial Number
	}

	//
	// Battery Information ID : 04/14
	//
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset(0xA0),
		SBCH, 32,    // Device Checmistory (string)
	}

	//
	// Battery Information ID : 05/15
	//
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset(0xA0),
		SBMN, 128,   // Manufacture Name (s)
	}

	//
	// Battery Information ID : 06/16
	//
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset(0xA0),
		SBDN, 128,   // Device Name (s)
	}

	Method (_CRS, 0, NotSerialized)
	{
		Name (ECMD, ResourceTemplate()
		{
			IO (Decode16, 0x62, 0x62, 0, 1)
			IO (Decode16, 0x66, 0x66, 0, 1)
		})
		Return (ECMD)
	}

	Method (_REG, 2, NotSerialized)
	{
		// Initialize AC power state
		\PWRS = ACPW

		// Initialize LID switch state
		\LIDS = ~HPLD

		// Enable OS control of fan speed
		// TODO FCOS = 1

		// Force a read of CPU temperature
		// TODO Which temperature corresponds to the CPU?
		Local0 = TMP0
		/* So that we don't get a warning that Local0 is unused.  */
		Local0++
	}

/* Attention Codes
 *  00h     No Event
 *  01h-0Fh Reserved for ACPI Events
 *  10h-1Fh Hotkey Events
 *  22h     Critical Low Battery
 *  23h     Battery Empty
 *  24h     Trip Point Capacity Event for Battery 0
 *  26h     AC Adapter Attached
 *  27h     AC Adapter Detached
 *  28h     Power Off Switch Pressed
 *  29h     Power Off Switch Released
 *  2Ah     LID Open
 *  2Bh     LID Close
 *  3Eh     PME Event
 *  40h     Thermal Event
 *  41h     Global Wireless Enable Switch
 *  43h     Mute State Change
 *  4Ah     Battery 0 Attach/Detach
 *  4Bh     Battery 0 State Change
 *  66h     Mute Button
 */

	// Battery at critical low state
	Method (_Q22)
	{
		If (MBTS)
		{
			Notify (BATX, 0x80)
		}
	}

	// AC Power Connected
	Method (_Q26, 0, NotSerialized)
	{
		\PWRS = 1
		Notify (AC, 0x80)
		Notify (BATX, 0x80)
		\PNOT ()
	}

	// AC Power Removed
	Method (_Q27, 0, NotSerialized)
	{
		\PWRS = 0
		Notify (AC, 0x80)
		\PNOT ()
	}

	// LID Open
	Method (_Q2A)
	{
		\LIDS = 1
		Notify (\_SB.LID0, 0x80)
	}

	// LID Close (Suspend Trigger)
	Method (_Q2B)
	{
		\LIDS = 0
		Notify (\_SB.LID0, 0x80)
	}

	// Battery Attach/Detach Event
	Method (_Q4A)
	{
		Notify (BATX, 0x80)
		Notify (BATX, 0x81)
		\PNOT ()
	}

	// Battery State Change Event
	Method (_Q4B)
	{
		Notify (BATX, 0x80)
	}

	// Global Wireless Disable/Enable Event
	Method (_Q41, 0, NotSerialized)
	{
		IF (DCWL) //if Wlan exist
		{
			//TODO LANE = WLAT
		}
	}

	#include "ac.asl"
	#include "battery.asl"
	// TODO #include "fan.asl"
}
