• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* SPDX-License-Identifier: GPL-2.0-only */
2
3Field(ERAM, ByteAcc, NoLock, Preserve)
4{
5	Offset(0x20),
6	SPTR,	8,
7	SSTS,	8,
8	SADR,	8,
9	SCMD,	8,
10	SBFR,	256,
11}
12
13Field(ERAM, ByteAcc, Lock, Preserve)
14{
15	Offset(0x24),
16	SBDW,	16,
17}
18
19Method(SBPC, 0, NotSerialized)
20{
21	Local0 = 1000
22	While (Local0)
23	{
24		If (SPTR == 0x00)
25		{
26			Return()
27		}
28
29		Sleep(1)
30		Local0--
31	}
32}
33
34Method(SBRW, 2, NotSerialized)
35{
36	Acquire(ECLK, 0xFFFF)
37	SADR = Arg0 << 1
38	SCMD = Arg1
39	SPTR = 0x09
40	SBPC()
41	Local0 = SBDW
42	Release(ECLK)
43	Return(Local0)
44}
45
46Method(SBRB, 2, NotSerialized)
47{
48	Acquire(ECLK, 0xFFFF)
49	SADR = Arg0 << 1
50	SCMD = Arg1
51	SPTR = 0x0B
52	SBPC()
53	Local0 = SBFR
54	Release(ECLK)
55	Return(Local0)
56}
57
58Device(BAT0)
59{
60	Name(_HID, EisaId("PNP0C0A"))
61	Name(_UID, 0x00)
62	Name(_PCL, Package() { \_SB })
63
64	Name(BATS, Package()
65	{
66		0x00,		// 0: PowerUnit: Report in mWh
67		0xFFFFFFFF,	// 1: Design cap
68		0xFFFFFFFF,	// 2: Last full charge cap
69		0x01,		// 3: Battery Technology
70		10800,		// 4: Design Voltage(mV)
71		0x00,		// 5: Warning design capacity
72		200,		// 6: Low design capacity
73		10,		// 7: granularity1
74		10,		// 8: granularity2
75		"",		// 9: Model number
76		"",		// A: Serial number
77		"",		// B: Battery Type
78		""		// C: OEM information
79	})
80
81	Name(BATI, Package()
82	{
83		0, // Battery State
84		   // Bit 0 - discharge
85		   // Bit 1 - charge
86		   // Bit 2 - critical state
87		0, // Battery present Rate
88		0, // Battery remaining capacity
89		0  // Battery present voltage
90	})
91
92	Method(_BIF, 0, NotSerialized)
93	{
94		BATS[1] = ^^SBRW(0x0B, 0x18) * 10
95		BATS[2] = ^^SBRW(0x0B, 0x10) * 10
96
97		BATS[4] = ^^SBRW(0x0B, 0x19)
98		BATS[9] = ^^SBRB(0x0B, 0x21)
99		BATS[11] = ^^SBRB(0x0B, 0x22)
100		BATS[12] = ^^SBRB(0x0B, 0x20)
101
102		Return(BATS)
103	}
104
105	Method(_STA, 0, NotSerialized)
106	{
107		If (^^SBRW(0x0A, 0x01) & 0x01) {
108			Return(0x1f)
109		} else {
110			Return(0x0f)
111		}
112	}
113
114	Method(_BST, 0, NotSerialized)
115	{
116		/* Check for battery presence.	*/
117		If (!(^^SBRW(0x0A, 0x01) & 0x01)) {
118			Return(Package(4) {
119				0,
120				0xFFFFFFFF,
121				0xFFFFFFFF,
122				0xFFFFFFFF
123			})
124		}
125
126		Local1 = ^^SBRW(0x0B, 0x09)
127		BATI[3] = Local1
128		Local0 = ^^SBRW(0x0B, 0x0A)
129
130		/* Sign-extend Local0.	*/
131		If (Local0 & 0x8000)
132		{
133			Local0 = ~Local0
134			Local0++
135			Local0 &= 0xFFFF
136		}
137
138		Local0 *= Local1
139		BATI[1] = Local0 / 1000
140		BATI[2] = ^^SBRW(0x0B, 0x0F) * 10
141		If (HPAC) {
142			If (!(^^SBRW(0x0B, 0x16) & 0x40)) {
143				BATI[0] = 2
144			} Else {
145				BATI[0] = 0
146			}
147		} Else {
148			BATI[0] = 1
149		}
150
151		Return(BATI)
152	}
153}
154