Skip to content

Commit 8140ee7

Browse files
committed
Use both powesStateWill and powerStateDidChangeTo, check whatDevice parameter in both
1 parent 78b5e0b commit 8140ee7

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

VoodooRMI/Transports/SMBus/RMISMBus.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ bool RMISMBus::start(IOService *provider)
5858
IOService *ps2 = OSDynamicCast(IOService, device_nub->getProperty("PS/2 Parent"));
5959
if (ps2) {
6060
(void) ps2->registerInterestedDriver(this);
61-
ps2PowerDriver = true;
61+
ps2Parent = ps2;
6262
}
6363

6464
// Receive power notifications for sleep/wake
@@ -286,22 +286,28 @@ IOReturn RMISMBus::setPowerState(unsigned long whichState, IOService* whatDevice
286286
return processPowerState(whichState);
287287
}
288288

289-
IOReturn RMISMBus::powerStateDidChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService *whatDevice) {
290-
unsigned long newState;
289+
IOReturn RMISMBus::powerStateWillChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService *whatDevice) {
290+
// Shut down touchpad before PS/2 starts disabling PS/2 ports
291+
if ((capabilities & kIOPMDeviceUsable) || whatDevice != ps2Parent)
292+
return kIOPMAckImplied;
291293

292294
IOLogInfo("Received PS2 Power State Change: 0x%lx", capabilities);
293-
ps2Awake = capabilities & kIOPMDeviceUsable;
294-
if (capabilities & kIOPMDeviceUsable) {
295-
newState = RMI_POWER_ON;
296-
} else {
297-
newState = RMI_POWER_OFF;
298-
}
295+
ps2Awake = false;
296+
return processPowerState(RMI_POWER_OFF);
297+
}
298+
299+
IOReturn RMISMBus::powerStateDidChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService *whatDevice) {
300+
// Start up SMBus interface after PS/2 reset/reinit
301+
if (!(capabilities & kIOPMDeviceUsable) || whatDevice != ps2Parent)
302+
return kIOPMAckImplied;
299303

300-
return processPowerState(newState);
304+
IOLogInfo("Received PS2 Power State Change: 0x%lx", capabilities);
305+
ps2Awake = true;
306+
return processPowerState(RMI_POWER_ON);
301307
}
302308

303309
IOReturn RMISMBus::processPowerState(unsigned long whichState) {
304-
if (ps2PowerDriver && ps2Awake != smbusAwake) {
310+
if (ps2Parent && ps2Awake != smbusAwake) {
305311
IOLogDebug("PS2 Power State (%b) != SMB Power State (%b) - Waiting!",
306312
ps2Awake, smbusAwake);
307313
return kIOPMAckImplied;

VoodooRMI/Transports/SMBus/RMISMBus.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class RMISMBus : public RMITransport {
3434
bool start(IOService *provider) override;
3535
IOReturn message(UInt32 type, IOService *provider, void *argument = 0) override;
3636
IOReturn setPowerState(unsigned long whichState, IOService* whatDevice) override;
37+
IOReturn powerStateWillChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService *whatDevice) override;
3738
IOReturn powerStateDidChangeTo(IOPMPowerFlags capabilities, unsigned long stateNumber, IOService *whatDevice) override;
3839
void stop(IOService *provider) override;
3940
void free() override;
@@ -47,11 +48,11 @@ class RMISMBus : public RMITransport {
4748
VoodooSMBusDeviceNub *device_nub;
4849
IOLock *page_mutex;
4950
IOLock *mapping_table_mutex;
51+
IOService *ps2Parent {nullptr};
5052

5153
struct mapping_table_entry mapping_table[RMI_SMB2_MAP_SIZE];
5254
UInt8 table_index {0};
5355

54-
bool ps2PowerDriver {false};
5556
bool ps2Awake {true};
5657
bool smbusAwake {true};
5758
bool vrmiAwake {true};

0 commit comments

Comments
 (0)