/* 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, One)

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

	// 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 = One
		WAEC ()

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

		//
		// 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 (And (HB0S, 0x20))
		{
			Local0 = 2
		}
		Else
		{
			if (And (HB0S, 0x40))
			{
				Local0 = One
			}
			Else
			{
				Local0 = Zero
			}
		}

		// Set critical flag if battery is empty
		If (And (HB0S, 0x0F) == 0)
		{
			Or (Local0, 4, Local0)
		}

		Local1 = Zero

		// Check if AC is present
		If (ACPW)
		{
			// Set only charging/discharging bits
			And (Local0, 0x03, Local1)
		}
		Else
		{
			// Always discharging when on battery power
			Local1 = One
		}

		// Flag if the battery level is critical
		And (Local0, 0x04, Local4)
		Or (Local1, Local4, Local1)
		PBST[0] = Local1

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

		Local6 = DerefOf (PBIF[0]) ^ One

		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)
	}
}
