blob: b1ff65f10046a4d0dc2e83fdc8157e547b43a0a1 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* This defines the battery charging thresholds setting methods tpacpi-bat can
* use. This implements what the vendor defines but is rather ugly...
*/
/* SetBatteryCharge Start/Stop Capacity Threshold
* In Parameter:
* DWORD
* Bit 7-0: Charge stop capacity (Unit:%)
* =0: Use battery default setting
* =1-99: Threshold to stop charging battery (Relative capacity)
* Bit 9-8:BatteryID
* = 0: Any battery
* = 1: Primary battery
* = 2: Secondary battery
* = Others: Reserved (0)
* Bit 31-10: Reserved (0)
* Must be 0
*
* Out Parameter:
* DWORD
* Bit 30-0: Reserved (0)
* Bit 31: Error status
* 0 ... Success
* 1 ... Fail
*/
#define START_THRESH_ARG 0
#define STOP_THRESH_ARG 1
// Set stop threshold
Method (BCSS, 1, NotSerialized)
{
Local0 = Arg0 & 0xff // Percentage
Local1 = (Arg0 >> 8) & 0x3 // Battery ID
// Any battery
If (Local1 == 0)
{
\_SB.PCI0.LPCB.EC.BAT0.SETT(STOP_THRESH_ARG, Local0)
\_SB.PCI0.LPCB.EC.BAT1.SETT(STOP_THRESH_ARG, Local0)
Local2 = Local0 != \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG)
Local3 = Local0 != \_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG)
Return ((Local2 && Local3) << 31)
}
// Battery1
If (Local1 == 1)
{
\_SB.PCI0.LPCB.EC.BAT0.SETT(STOP_THRESH_ARG, Local0)
Return ((Local0 !=
\_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG)) << 31)
}
// Battery2
If (Local1 == 2)
{
\_SB.PCI0.LPCB.EC.BAT1.SETT(STOP_THRESH_ARG, Local0)
Return ((Local0 !=
\_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG)) << 31)
}
Return (1 << 31) /* Should not be reached */
}
// Set start threshold
Method (BCCS, 1, NotSerialized)
{
Local0 = Arg0 & 0xff // Percentage
Local1 = (Arg0 >> 8) & 0x3 // Battery ID
// Any battery
If (Local1 == 0)
{
\_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Local0)
\_SB.PCI0.LPCB.EC.BAT1.SETT(START_THRESH_ARG, Local0)
Local2 = Local0 != \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG)
Local3 = Local0 != \_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG)
Return ((Local2 && Local3) << 31)
}
// Battery1
If (Local1 == 1)
{
\_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Local0)
Return ((Local0 !=
\_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG)) << 31)
}
// Battery2
If (Local1 == 2)
{
\_SB.PCI0.LPCB.EC.BAT1.SETT(START_THRESH_ARG, Local0)
Return ((Local0 !=
\_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG)) << 31)
}
Return (1 << 31) /* Should not be reached */
}
/*
* GetBatteryCharge Start/Stop Capacity Threshold
* In Parameter:
* DWORD
* Bit 7-0:BatteryID
* Bit 31-8: Reserved (0)
* Must be 0
*
* Out Parameter:
* DWORD
* Bit 7-0: Charge stop capacity (Unit:%)
* =0: Use battery default setting
* =1-99: Threshold to stop charging battery (Relative capacity)
* =Others: Reserved (0)
* Bit 9-8: Capability of BatteryCharge Stop Capacity Threshold
* Bit 8:Batterycharge stop capacity threshold
* (0:Not support 1:Support)
* Bit 9: Specify every battery parameter
* (0:Not support(apply parameter for all battery)
* 1:Support(apply parameter for all battery))
* Bit 30-10: Reserved (0)
* Bit 31: Error status
* 0 ... Success
* 1 ... Fail
*/
// Get stop threshold
Method (BCSG, 1, NotSerialized)
{
// Battery1
If (Arg0 == 1)
{
Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG))
}
// Battery2
If (Arg0 == 2)
{
Return (0x300 | \_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG))
}
Return (1 << 31)
}
// Get start threshold
Method (BCTG, 1, NotSerialized)
{
// Battery 1
If (Arg0 == 1)
{
Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG))
}
// Battery 2
If (Arg0 == 2)
{
Return (0x300 | \_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG))
}
Return (1 << 31)
}