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

/* ACPI_POWER_RECORD */
Name (ECPR, 0)

Method (ECQP, 0, Serialized)
{
	Local0 = R (PWSR)
	Local1 = Local0 ^ ECPR
	ECPR = Local0

	If (EBIT (ACEX, Local1)) {
		Printf ("AC Power Status Changed")
		Notify (AC, 0x80)
	}

	If (EBIT (BTEX, Local1)) {
		If (EBIT (BTEX, Local0)) {
			Printf ("BAT0 Inserted")
			Notify (BAT0, 0x81)
		} Else {
			Printf ("BAT0 Removed")
			Notify (BAT0, 0x80)
			Notify (BAT0, 0x81)
		}
	}

	/*
	 * Battery status is cleared when read so always use the value from
	 * PWSR directly regardless of the previous value stored in ECPR.
	 */
	If (EBIT (BTSC, Local0)) {
		Printf ("BAT0 Status Change")
		Notify (BAT0, 0x80)
	}
}

/* Handle events in PmEv1 */
Method (ECQ1, 1, Serialized)
{
	/* Power button pressed */
	If (EBIT (E1PB, Arg0)) {
		Printf ("Power Button Event")
		/* Do not notify \_SB.PWRB here to prevent double event */
	}

	/* LID state changed */
	If (EBIT (E1LD, Arg0)) {
		Printf ("Lid State Changed")
		Notify (^LID0, 0x80)
	}

	/* Power Event */
	If (EBIT (E1PW, Arg0)) {
		Printf ("Power Event")
		ECQP ()
	}

	/* Sleep Button */
	If (EBIT (E1SB, Arg0)) {
		Printf ("Sleep Button")
	}
}

/* Handle events in PmEv2 */
Method (ECQ2, 1, Serialized)
{
	Printf ("EVT2: %o", Arg0)

	If (EBIT (E2QS, Arg0)) {
		Printf ("QS EVENT")
		Notify (^WEVT, 0x90)
	}

	If (EBIT (E2OR, Arg0)) {
		If (R (OTBL)) {
			Printf ("EC event indicates tablet mode")
			Notify (^VBTN, ^VTBL)
		} Else {
			Printf ("EC event indicates laptop mode")
			Notify (^VBTN, ^VLAP)
		}
	}
}

/* Handle events in PmEv3 */
Method (ECQ3, 1, Serialized)
{
	Printf ("EVT3: %o", Arg0)

	If (EBIT (E3CP, Arg0)) {
		If (R (P2PB)) {
			Printf ("Power button pressed")
			Notify (^VBTN, ^VPPB)
		} Else {
			Printf ("Power button released")
			Notify (^VBTN, ^VRPB)
		}
	}

#ifdef EC_ENABLE_DPTF
	/* Theraml Events */
	If (EBIT (E3TH, Arg0)) {
		^PATX ()
	}
#endif
}

/* Handle events in PmEv4 */
Method (ECQ4, 1, Serialized)
{
	Printf ("EVT4: %o", Arg0)
}

/* Process all events */
Method (_Q66, 0, Serialized)
{
	Local0 = R (EVT1)
	If (Local0) {
		ECQ1 (Local0)
	}

	Local0 = R (EVT2)
	If (Local0) {
		ECQ2 (Local0)
	}

	Local0 = R (EVT3)
	If (Local0) {
		ECQ3 (Local0)
	}

	Local0 = R (EVT4)
	If (Local0) {
		ECQ4 (Local0)
	}
}

/* UCSI SCI uses a unique event code */
Method (_Q79, 0, Serialized)
{
	If (ISSX == 0) {
		Printf ("EC _Q79 UCSI Event")

		\_SB.UCSI.RMSG()

		Notify (\_SB.UCSI, 0x80)
		^UCEP = 0
	} Else {
		Printf ("EC _Q79 UCSI Event Masked in S0ix")
		^UCEP = 1
	}
}