1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3Device (EC0) 4{ 5 Name (_HID, EISAID ("PNP0C09")) 6 Name (_UID, 0) 7 8 Name (_GPE, THINKPAD_EC_GPE) 9 Mutex (ECLK, 0x07) 10 11 /* EmbeddedControl should work as well, but memory mapped is faster. */ 12 OperationRegion (ERAM, SystemMemory, (CONFIG_EC_BASE_ADDRESS + 0x100), 0x100) 13 Field (ERAM, ByteAcc, Lock, Preserve) 14 { 15 , 1, 16 , 1, 17 HKFA, 1, // FN lock (Hotkey / FN row toggle) 18 , 1, 19 , 1, 20 , 1, 21 , 1, 22 23 Offset(0x0c), 24 HLCL, 8, // LED control 25 26 Offset(0x46), 27 , 4, 28 ONAC, 1, 29 , 3, 30 31 Offset(0x81), 32 PAGE, 8, 33 } 34 35 /* Battery info page 0 */ 36 Field (ERAM, ByteAcc, NoLock, Preserve) 37 { 38 Offset(0xA0), 39 SBRC, 16, /* Remaining capacity */ 40 SBFC, 16, /* Full-charge capacity */ 41 SBAE, 16, 42 SBRS, 16, 43 SBAC, 16, /* Present rate */ 44 SBVO, 16, /* Present voltage */ 45 SBAF, 16, 46 SBBS, 16, 47 } 48 49 /* Battery info page 1 */ 50 Field (ERAM, ByteAcc, NoLock, Preserve) 51 { 52 Offset (0xA0), 53 , 15, 54 SBCM, 1, /* Power unit (0 == mA/mAh, 1 == mW/mWh) */ 55 SBMD, 16, 56 SBCC, 16, 57 } 58 59 /* Battery info page 2 */ 60 Field (ERAM, ByteAcc, NoLock, Preserve) 61 { 62 Offset (0xA0), 63 SBDC, 16, /* Design Capacity */ 64 SBDV, 16, /* Design Voltage */ 65 SBOM, 16, 66 SBSI, 16, 67 SBDT, 16, 68 SBSN, 16, /* Serial number */ 69 } 70 71 /* Battery info page 4 */ 72 Field (ERAM, ByteAcc, NoLock, Preserve) 73 { 74 Offset (0xA0), 75 SBCH, 32, /* Type (LiON) */ 76 } 77 78 /* Battery info page 5 */ 79 Field (ERAM, ByteAcc, NoLock, Preserve) 80 { 81 Offset (0xA0), 82 SBMN, 128, /* Manufacturer */ 83 } 84 85 /* Battery info page 6 */ 86 Field (ERAM, ByteAcc, NoLock, Preserve) 87 { 88 Offset (0xA0), 89 SBDN, 128, /* Model */ 90 } 91 92 Method (_CRS, 0, Serialized) 93 { 94 Name (ECMD, ResourceTemplate() 95 { 96 IO (Decode16, 0x62, 0x62, 0, 1) 97 IO (Decode16, 0x66, 0x66, 0, 1) 98 IO (Decode16, 0x700, 0x700, 0, 8) 99 Memory32Fixed(ReadOnly, CONFIG_EC_BASE_ADDRESS, 0x1000, FF00) 100 }) 101 Return (ECMD) 102 } 103 104 /* Increase brightness hotkey */ 105 Method (_Q14, 0, NotSerialized) { 106 BRIGHTNESS_UP() 107 ^HKEY.MHKQ (0x1010) 108 } 109 110 /* Decrease brightness hotkey */ 111 Method (_Q15, 0, NotSerialized) { 112 BRIGHTNESS_DOWN() 113 ^HKEY.MHKQ (0x1011) 114 } 115 116 /* Video output switch hotkey */ 117 Method (_Q16, 0, NotSerialized) { 118 Notify (\_SB.PCI0.GFX0, 0x82) 119 ^HKEY.MHKQ (0x1007) 120 } 121 122 Method (_Q19, 0, NotSerialized) 123 { 124 ^HKEY.MHKQ (0x1018) 125 } 126 127 /* Switched to AC power */ 128 Method (_Q26, 0, NotSerialized) 129 { 130 PWRS = 1 131 Notify (^AC, 0x80) 132 Notify (^BAT0, 0x80) 133 \PNOT () 134 ^HKEY.MHKQ (0x6040) 135 } 136 137 /* Switched to battery power */ 138 Method (_Q27, 0, NotSerialized) 139 { 140 PWRS = 0 141 Notify (^AC, 0x80) 142 Notify (^BAT0, 0x80) 143 \PNOT () 144 ^HKEY.MHKQ (0x6040) 145 } 146 147 /* Lid opened */ 148 Method (_Q2A, 0, NotSerialized) 149 { 150 LIDS = 1 151 Notify(^LID, 0x80) 152 ^HKEY.MHKQ (0x5002) 153 } 154 155 /* Lid closed */ 156 Method (_Q2B, 0, NotSerialized) 157 { 158 LIDS = 0 159 Notify(^LID, 0x80) 160 ^HKEY.MHKQ (0x5001) 161 } 162 163 /* Tablet swivel down */ 164 Method (_Q35, 0, NotSerialized) 165 { 166 ^HKEY.MHKQ (0x60c0) 167 ^HKEY.MHKQ (0x500a) 168 } 169 170 /* Tablet swivel up */ 171 Method (_Q36, 0, NotSerialized) 172 { 173 ^HKEY.MHKQ (0x60c0) 174 ^HKEY.MHKQ (0x5009) 175 } 176 177 /* Tablet rotate lock button */ 178 Method (_Q37, 0, NotSerialized) 179 { 180 ^HKEY.MHKQ (0x6020) 181 } 182 183 /* Numlock pressed */ 184 Method (_Q3F, 0, NotSerialized) 185 { 186 ^HKEY.MHKQ (0x6000) 187 } 188 189 /* RFKill status changed */ 190 Method (_Q41, 0, NotSerialized) { 191 ^HKEY.MHKQ (0x7000) 192 } 193 194 /* Mute hotkey */ 195 Method (_Q43, 0, NotSerialized) { 196 ^HKEY.MHKQ (0x1017) 197 } 198 199 /* Settings hotkey */ 200 Method (_Q5A, 0, NotSerialized) 201 { 202 ^HKEY.MHKQ (0x101D) 203 } 204 205 /* Search hotkey */ 206 Method (_Q5B, 0, NotSerialized) 207 { 208 ^HKEY.MHKQ (0x101E) 209 } 210 211 /* Scale hotkey */ 212 Method (_Q5C, 0, NotSerialized) 213 { 214 ^HKEY.MHKQ (0x101F) 215 } 216 217 /* File hotkey */ 218 Method (_Q5D, 0, NotSerialized) 219 { 220 ^HKEY.MHKQ (0x1020) 221 } 222 223 /* RFkill hotkey */ 224 Method (_Q64, 0, NotSerialized) { 225 ^HKEY.MHKQ (0x1005) 226 } 227 228 /* Mic mute hotkey */ 229 Method (_Q6A, 0, NotSerialized) 230 { 231 ^HKEY.MHKQ (0x101B) 232 } 233 234 /* FN key pressed */ 235 Method (_Q70, 0, NotSerialized) { } 236 237 /* FN+Esc pressed / FN row mode switch */ 238 Method (_Q74, 0, NotSerialized) { 239 HKFA = 1 ^ HKFA 240 ^HKEY.MHKQ (0x6060) 241 } 242 243 /* Implements enough of the Lenovo hotkey device for 244 * thinkpad-acpi to work, no real support for hotkey masking */ 245 Device (HKEY) 246 { 247 Name (_HID, EisaId ("LEN0068")) 248 249 Name (DHKC, 0) 250 Name (DHKV, 0) 251 Name (DHKN, 0xFC018070) // Hotkey mask 252 Mutex (XDHK, 0x07) 253 254 Method (_STA, 0, NotSerialized) 255 { 256 Return (0x0F) 257 } 258 259 Method (MHKV, 0, NotSerialized) 260 { 261 Return (0x0100) // Interface version 1.0 262 } 263 264 Method (MHKA, 0, NotSerialized) // Hotkey all mask 265 { 266 Return (0xFFFFFFFF) 267 } 268 269 Method (MHKM, 2, NotSerialized) // Set hotkey mask 270 { 271 Acquire (XDHK, 0xFFFF) 272 273 Local0 = 1 << Arg0-- 274 If (Arg1) { 275 DHKN |= Local0 276 } Else { 277 DHKN &= ~Local0 278 } 279 280 Release (XDHK) 281 } 282 283 Method (MHKC, 1, NotSerialized) // Hotkey disable? 284 { 285 Acquire (XDHK, 0xFFFF) 286 287 DHKC = Arg0 288 289 Release (XDHK) 290 } 291 292 Method (MHKP, 0, NotSerialized) // Hotkey poll 293 { 294 Acquire (XDHK, 0xFFFF) 295 296 Local0 = 0 297 298 if (DHKV) { 299 Local0 = DHKV 300 DHKV = 0 301 } 302 303 Release (XDHK) 304 305 Return (Local0) 306 } 307 308 Method (MHKQ, 1, NotSerialized) // Send hotkey event 309 { 310 Acquire (XDHK, 0xFFFF) 311 312 DHKV = Arg0 313 314 Release (XDHK) 315 316 Notify (HKEY, 0x80) // Status Change 317 } 318 } 319 320 /* LED support for thinkpad-acpi */ 321 Method (LED, 2, NotSerialized) 322 { 323 HLCL = Arg0 | Arg1 324 } 325 326 Device (AC) 327 { 328 Name (_HID, "ACPI0003") 329 Name (_PCL, Package (1) { \_SB }) 330 331 Method (_PSR, 0, NotSerialized) 332 { 333 Return (ONAC) 334 } 335 Method (_STA, 0, NotSerialized) 336 { 337 Return (0x0F) 338 } 339 } 340 341 /* Battery is H8 compatible, but requires an explicit delay */ 342 #define BATTERY_PAGE_DELAY_MS 20 343 #include <ec/lenovo/h8/acpi/battery.asl> 344 345 /* LID is H8 compatible */ 346 #include <ec/lenovo/h8/acpi/lid.asl> 347} 348