@@ -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
303309IOReturn 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 ;
0 commit comments