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

Method (RPTS, 1, Serialized)
{

	/* Store current EC settings in CMOS */
	Switch (ToInteger (\_SB.PCI0.LPCB.EC.ECRD (RefOf (\_SB.PCI0.LPCB.EC.TPLE))))
	{
		// 0x00 == Enabled    == 0x00
		// 0x11 == Re-enabled == 0x00
		// 0x22 == Disabled   == 0x01
		Case (0x00)
		{
			\_SB.PCI0.LPCB.TPLC = 0x00
		}
		Case (0x11)
		{
			\_SB.PCI0.LPCB.TPLC = 0x00
		}
		Case (0x22)
		{
			\_SB.PCI0.LPCB.TPLC = 0x01
		}
	}

	\_SB.PCI0.LPCB.FLKC =
		\_SB.PCI0.LPCB.EC.ECRD (RefOf (\_SB.PCI0.LPCB.EC.FLKE))

	Switch (ToInteger (\_SB.PCI0.LPCB.EC.ECRD (RefOf (\_SB.PCI0.LPCB.EC.KLSE))))
	{
		// 0x00 == Disabled == 0x00
		// 0xdd == Enabled  == 0x01
		Case (0x00)
		{
			\_SB.PCI0.LPCB.KLSC = 0x00
		}
		Case (0xdd)
		{
			\_SB.PCI0.LPCB.KLSC = 0x01
		}
	}

	Switch (ToInteger (\_SB.PCI0.LPCB.EC.ECRD (RefOf (\_SB.PCI0.LPCB.EC.KLBE))))
	{
		// 0xdd == On   == 0x00
		// 0xcc == Off  == 0x01
		// 0xbb == Low  == 0x02
		// 0xaa == High == 0x03
		Case (0xdd)
		{
			\_SB.PCI0.LPCB.KLBC = 0x00
		}
		Case (0xcc)
		{
			\_SB.PCI0.LPCB.KLBC = 0x01
		}
		Case (0xbb)
		{
			\_SB.PCI0.LPCB.KLBC = 0x02
		}
		Case (0xaa)
		{
			\_SB.PCI0.LPCB.KLBC = 0x03
		}
	}

	/*
	 * Disable ACPI support.
	 * This should always be the last action before entering S4 or S5.
	 */
	\_SB.PCI0.LPCB.EC.OSFG = 0x00
}

Method (RWAK, 1, Serialized)
{
	/*
	 * Enable ACPI support.
	 * This should always be the first action when exiting S4 or S5.
	 */
	\_SB.PCI0.LPCB.EC.OSFG = 0x01

	/* Restore EC settings from CMOS */
	Switch (ToInteger (\_SB.PCI0.LPCB.TPLC))
	{
		// 0x00 == Enabled    == 0x00
		// 0x00 == Re-enabled == 0x11
		// 0x01 == Disabled   == 0x22
		Case (0x00)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0x00,  RefOf(\_SB.PCI0.LPCB.EC.TPLE))
		}
		Case (0x01)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0x22,  RefOf(\_SB.PCI0.LPCB.EC.TPLE))
		}
	}

	\_SB.PCI0.LPCB.EC.ECWR (\_SB.PCI0.LPCB.FLKC,  RefOf(\_SB.PCI0.LPCB.EC.FLKE))

	Switch (ToInteger (\_SB.PCI0.LPCB.KLSC))
	{
		// 0x00 == Disabled == 0x00
		// 0x01 == Enabled  == 0xdd
		Case (0x00)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0x00,  RefOf(\_SB.PCI0.LPCB.EC.KLSE))
		}
		Case (0x01)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0xdd,  RefOf(\_SB.PCI0.LPCB.EC.KLSE))
		}
	}

	Switch (ToInteger (\_SB.PCI0.LPCB.KLBC))
	{
		// 0x00 == On   == 0xdd
		// 0x01 == Off  == 0xcc
		// 0x02 == Low  == 0xbb
		// 0x03 == High == 0xaa
		Case (0x00)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0xdd,  RefOf(\_SB.PCI0.LPCB.EC.KLBE))
		}
		Case (0x01)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0xcc,  RefOf(\_SB.PCI0.LPCB.EC.KLBE))
		}
		Case (0x02)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0xbb,  RefOf(\_SB.PCI0.LPCB.EC.KLBE))
		}
		Case (0x03)
		{
			\_SB.PCI0.LPCB.EC.ECWR (0xaa,  RefOf(\_SB.PCI0.LPCB.EC.KLBE))
		}
	}
}