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

// Scope (EC0)

Device (BATX)
{
	Name (_HID, EISAID ("PNP0C0A"))
	Name (_UID, 1)
	Name (_PCL, Package () { \_SB })

	//
	// Indicator of BATX attach/detach
	// Battery X Information
	// Battery X Status
	//
	Name (BXST, Zero)

	//
	// Default Static Battery Information
	//
	Name (PBIF, Package()
	{
		0,            //  0: Power Unit
		0xFFFFFFFF,   //  1: Design Capacity
		0xFFFFFFFF,   //  2: Last Full Charge Capacity
		1,            //  3: Battery Technology(Rechargeable)
		10800,        //  4: Design Voltage 10.8V
		0,            //  5: Design capacity of warning
		0,            //  6: Design capacity of low
		1,            //  7: Battery capacity granularity 1
		1,            //  8: Battery capacity granularity 2
		"",           //  9: Model Number
		"",           // 10: Serial Number
		"",           // 11: Battery Type
		""            // 12: OEM Infomration
	})

	Name (PBST, Package ()
	{
		0x00000000,  // Battery State
		0xFFFFFFFF,  // Battery Present Rate
		0xFFFFFFFF,  // Battery Remaining Capacity
		0xFFFFFFFF,  // Battery Present Voltage
	})

	// Workaround for full battery status, enabled by default
	Name (BFWK, 1)

	// Method to enable full battery workaround
	Method (BFWE)
	{
		BFWK = 1
	}

	// Method to disable full battery workaround
	Method (BFWD)
	{
		BFWK = Zero
	}

	// Method to wait for EC to be ready after changing the Battery Info ID
	// Selector
	Method (WAEC)
	{
		Local0 = 20	// Timeout 100 msec
		While (HSID == 0)
		{
			// EC Is not ready
			Sleep (5)
			Local0--
			If (Local0 == 0)
			{
				Break
			}
		}
	}

	// Battery Slot Status
	Method (_STA, 0, Serialized)
	{
		BXST = MBTS
		If (BXST)
		{
			// Battery is present
			Return (0x1F)
		}
		Else
		{
			Return (0x0F)
		}
	}

	Method (_BIF, 0, Serialized)
	{
		// Update fields from EC

		//
		// Information ID 1 -
		//
		HIID = 1
		WAEC ()

		//
		//  Power Unit
		//   SMART battery : 1 - 10mWh : 0 - mAh
		//   ACPI spec     : 0 - mWh   : 1 - mAh
		//
		Local7 = SBCM
		PBIF[0] = Local7 ^ 1

		//
		// Information ID 0 -
		//
		HIID = Zero
		WAEC ()

		//
		//  Last Full Charge Capacity
		//
		If (Local7)
		{
			PBIF[2] = SBFC * 10
		}
		Else
		{
			PBIF[2] = SBFC
		}

		//
		// Information ID 2 -
		//
		HIID = 2
		WAEC ()

		//
		//  Design capacity
		//
		If (Local7)
		{
			Local0 = SBDC * 10
		}
		Else
		{
			Local0 = SBDC
		}
		PBIF[1] = Local0

		//
		//  Design capacity of High (5%)
		//  Design capacity of Low (1%)
		//
		PBIF[5] = Local0 / 20
		PBIF[6] = Local0 / 100

		//
		//  Design voltage
		//
		PBIF[4] = SBDV

		//
		// Serial Number
		//
		PBIF[10] = ToHexString (SBSN)

		//
		// Information ID 4 -
		//
		HIID = 4
		WAEC ()

		//
		//  Battery Type - Device Chemistry
		//
		PBIF[11] = ToString (Concatenate(SBCH, 0x00))

		//
		// Information ID 5 -
		//
		HIID = 5
		WAEC ()

		//
		// OEM Information - Manufacturer Name
		//
		PBIF[12] = ToString (Concatenate(SBMN, 0x00))

		//
		// Information ID 6 -
		//
		HIID = 6
		WAEC ()

		//
		// Model Number - Device Name
		//
		PBIF[9] = ToString (Concatenate(SBDN, 0x00))

		Return (PBIF)
	}

	Method (_BST, 0, Serialized)
	{
		// Update Battery First Used Date, if requested
		If (BFUD)
		{
			// TODO: Handle First Used Date Request
			//\BFUD()
		}

		//
		// 0: BATTERY STATE
		//
		// bit 0 = discharging
		// bit 1 = charging
		// bit 2 = critical level
		//

		// Get battery state from EC
		If (HB0S & 0x20)
		{
			Local0 = 2
		}
		Else
		{
			if (HB0S & 0x40)
			{
				Local0 = 1
			}
			Else
			{
				Local0 = Zero
			}
		}

		// Set critical flag if battery is empty
		If (HB0S & 0x0F == 0)
		{
			Local0 |= 4
		}

		Local1 = Zero

		// Check if AC is present
		If (ACPW)
		{
			// Set only charging/discharging bits
			Local1 = Local0 & 3
		}
		Else
		{
			// Always discharging when on battery power
			Local1 = 1
		}

		// Flag if the battery level is critical
		Local4 = Local0 & 4
		Local1 |= Local4
		PBST[0] = Local1

		//
		// 1: BATTERY PRESENT RATE/CURRENT
		//
		Local1 = ECAC
		If (Local1 >= 0x8000)
		{
			If (Local0 & 1)
			{
				Local1 = 0x10000 - Local1
			}
			Else
			{
				// Error
				Local1 = Zero
			}
		}
		Else
		{
			If (!(Local0 & 2))
			{
				// Battery is not charging
				Local1 = Zero
			}
		}

		Local6 = DerefOf (PBIF[0]) ^ 1

		If (Local6)
		{
			Local1 *= ECVO
			Local1 /= 1000
		}
		PBST[1] = Local1

		//
		// 2: BATTERY REMAINING CAPACITY
		//
		// Get Power unit from the battery static information
		//   SMART battery : 1 - 10mWh : 0 - mAh
		//   ACPI spec     : 0 - mWh   : 1 - mAh
		If (Local6)
		{
			Local1 = ECRC * 10
		}
		Else
		{
			Local1 = ECRC
		}

		If (BFWK && ACPW && !Local0)
		{
			// On AC power and battery is neither charging
			// nor discharging.  Linux expects a full battery
			// to report same capacity as last full charge.
			// https://bugzilla.kernel.org/show_bug.cgi?id=12632
			// TODO: Is SBRS the "battery gas gauge"?
			Local2 = SBRS

			// See if within ~3% of full
			Local3 = Local2 >> 5
			If (Local1 > Local2 - Local3 && Local1 < Local2 + Local3)
			{
				Local1 = Local2
			}
		}
		PBST[2] = Local1

		//
		// 3: BATTERY PRESENT VOLTAGE
		//
		PBST[3] = ECVO

		Return (PBST)
	}
}
