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

Device(EC)
{
	Name (_HID, EISAID("PNP0C09"))
	Name (_UID, 0)

	Name (_GPE, THINKPAD_EC_GPE)
	Mutex (ECLK, 0)

	OperationRegion(ERAM, EmbeddedControl, 0x00, 0x100)
	Field (ERAM, ByteAcc, NoLock, Preserve)
	{
		Offset (0x02),
				DKR1, 1,	/* Dock register 1 */
		Offset (0x05),
				HSPA, 1,
		Offset (0x0C),
				LEDS, 8,	/* LED state */
		Offset (0x0F),
				    , 7,
				TBSW, 1,	/* Tablet mode switch */
		Offset (0x1a),
				DKR2, 1,	/* Dock register 2 */
		Offset (0x2a),
				EVNT, 8,	/* write will trigger EC event */
		Offset (0x2f),
				    , 6,
				FAND, 1,	/* Fan disengage */
				FANA, 1,	/* Fan automatic mode enable */
		Offset (0x30),
				    , 6,
				ALMT, 1,	/* Audio Mute + LED */
		Offset (0x31),
				    , 2,
				UWBE, 1,	/* Ultra Wideband enable */
		Offset (0x3a),
				AMUT, 1,	/* Audio Mute (internal use) */
				    , 3,
				BTEB, 1,
				WLEB, 1,
				WWEB, 1,
		Offset (0x3B),
				    , 1,
				KBLT, 1,	/* Keyboard Light */
				    , 2,
				USPW, 1,	/* USB Power enable */
		Offset (0x48),
				HPPI, 1,	/* Headphone plugged in */
				GSTS, 1,	/* Master wireless switch */
		Offset (0x4e),
				WAKE, 16,
		Offset (0x78),
				TMP0, 8,	/* Thermal Zone 0 temperature */
				TMP1, 8,	/* Thermal Zone 1 temperature */
		Offset (0x81),
				PAGE, 8,	/* Information Page Selector */
		Offset (0xfe),
				    , 4,
				DKR3, 1		/* Dock register 3 */
	}

	/* Called on OperationRegion driver changes */
	Method (_REG, 2, NotSerialized)
	{
		/* Wait for ERAM driver loaded */
		if (Arg1 == 1) {
			/* Fill HKEY defaults on first boot */
			if (^HKEY.INIT == 0) {
				^HKEY.WBDC = BTEB
				^HKEY.WWAN = WWEB
				^HKEY.INIT = 1
			}
		}
	}

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

	Method (TLED, 1, NotSerialized)
	{
		LEDS = Arg0
	}

	/* Not used for coreboot. Provided for compatibility with thinkpad-acpi.  */
	Method (LED, 2, NotSerialized)
	{
		TLED(Arg0 | Arg1)
	}

	Method (_INI, 0, NotSerialized)
	{
	}

	Method (MUTE, 1, NotSerialized)
	{
		AMUT = Arg0
	}

	Method (RADI, 1, NotSerialized)
	{
		WLEB = Arg0
		WWEB = Arg0
		BTEB = Arg0
	}

	Method (USBP, 1, NotSerialized)
	{
		USPW = Arg0
	}

	Method (LGHT, 1, NotSerialized)
	{
		KBLT = Arg0
	}


	/* Sleep Button pressed */
	Method(_Q13, 0, NotSerialized)
	{
		Notify(^SLPB, 0x80)
	}

	/* Brightness up GPE */
	Method(_Q14, 0, NotSerialized)
	{
		BRIGHTNESS_UP()
	}

	/* Brightness down GPE */
	Method(_Q15, 0, NotSerialized)
	{
		BRIGHTNESS_DOWN()
	}

	/* Next display GPE */
	Method(_Q16, 0, NotSerialized)
	{
		Notify (\_SB.PCI0.GFX0, 0x82)
	}

	/* AC status change: present */
	Method(_Q26, 0, NotSerialized)
	{
		Notify (AC, 0x80)
		\PNOT()
	}

	/* AC status change: not present */
	Method(_Q27, 0, NotSerialized)
	{
		Notify (AC, 0x80)
		EVNT = 0x50
		\PNOT()
	}

	Method(_Q2A, 0, NotSerialized)
	{
		Notify(^LID, 0x80)
	}

	Method(_Q2B, 0, NotSerialized)
	{
		Notify(^LID, 0x80)
	}


	/* IBM proprietary buttons.  */

	Method (_Q10, 0, NotSerialized)
	{
		^HKEY.RHK (0x01)
	}

	/*
	 * Alternative layout (like in the Thinkpad X1 Carbon 1st generation):
	 *  * Fn-F2 (_Q11) -> not mapped
	 *  * Fn-F3 (_Q12) -> scancode 0x01 (KEY_COFFEE)
	 *
	 * Default layout (like in the Thinkpad X220):
	 *  * Fn-F2 (_Q11) -> scancode 0x01 (KEY_COFFEE)
	 *  * Fn-F3 (_Q12) -> scancode 0x02 (KEY_BATTERY)
	 */
#ifdef EC_LENOVO_H8_ALT_FN_F2F3_LAYOUT
	Method (_Q11, 0, NotSerialized)
	{
		// Not mapped
	}

	Method (_Q12, 0, NotSerialized)
	{
		^HKEY.RHK (0x02)
	}
#else
	Method (_Q11, 0, NotSerialized)
	{
		^HKEY.RHK (0x02)
	}

	Method (_Q12, 0, NotSerialized)
	{
		^HKEY.RHK (0x03)
	}
#endif

	Method (_Q64, 0, NotSerialized)
	{
		^HKEY.RHK (0x05)
	}

	Method (_Q65, 0, NotSerialized)
	{
		^HKEY.RHK (0x06)
	}

	Method (_Q17, 0, NotSerialized)
	{
		^HKEY.RHK (0x08)
	}

	Method (_Q66, 0, NotSerialized)
	{
		^HKEY.RHK (0x0A)
	}

	Method (_Q6A, 0, NotSerialized)
	{
		^HKEY.RHK (0x1B)
	}

	Method (_Q1A, 0, NotSerialized)
	{
		^HKEY.RHK (0x0B)
	}

	Method (_Q1B, 0, NotSerialized)
	{
		^HKEY.RHK (0x0C)
	}

	Method (_Q62, 0, NotSerialized)
	{
		^HKEY.RHK (0x0D)
	}

	Method (_Q60, 0, NotSerialized)
	{
		^HKEY.RHK (0x0E)
	}

	Method (_Q61, 0, NotSerialized)
	{
		^HKEY.RHK (0x0F)
	}

	Method (_Q1F, 0, NotSerialized)
	{
		^HKEY.RHK (0x12)
	}

	Method (_Q67, 0, NotSerialized)
	{
		^HKEY.RHK (0x13)
	}

	Method (_Q63, 0, NotSerialized)
	{
		^HKEY.RHK (0x14)
	}

	Method (_Q19, 0, NotSerialized)
	{
		^HKEY.RHK (0x18)
	}

	Method (_Q1C, 0, NotSerialized)
	{
		^HKEY.RHK (0x19)
	}

	Method (_Q1D, 0, NotSerialized)
	{
		^HKEY.RHK (0x1A)
	}

	Method (_Q5C, 0, NotSerialized)
	{
		^HKEY.RTAB (0xB)
	}

	Method (_Q5D, 0, NotSerialized)
	{
		^HKEY.RTAB (0xC)
	}

	Method (_Q5E, 0, NotSerialized)
	{
		^HKEY.RTAB (0x9)
	}

	Method (_Q5F, 0, NotSerialized)
	{
		^HKEY.RTAB (0xA)
	}

	/*
	 * Set FAN disengage:
	 * Arg0: 1: Run at full speed
	 *       0: Automatic fan control
	 */
	Method (FANE, 1, Serialized)
	{
		If (Arg0) {
			FAND = 1
			FANA = 0
		} Else {
			FAND = 0
			FANA = 1
		}
	}

#include "ac.asl"
#include "battery.asl"
#include "sleepbutton.asl"
#include "lid.asl"
#include "beep.asl"
#include "thermal.asl"
#include "systemstatus.asl"
#include "thinkpad.asl"
}