mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Merge branch 'pm-sleep'
* pm-sleep: PM: Prevent runtime suspend during system resume PM / Sleep: use resume event when call dpm_resume_early Conflicts: drivers/base/power/main.c (trivial)
This commit is contained in:
		
						commit
						057d51a126
					
				
					 2 changed files with 19 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -570,7 +570,6 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
 | 
			
		|||
	pm_callback_t callback = NULL;
 | 
			
		||||
	char *info = NULL;
 | 
			
		||||
	int error = 0;
 | 
			
		||||
	bool put = false;
 | 
			
		||||
 | 
			
		||||
	TRACE_DEVICE(dev);
 | 
			
		||||
	TRACE_RESUME(0);
 | 
			
		||||
| 
						 | 
				
			
			@ -591,7 +590,6 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
 | 
			
		|||
		goto Unlock;
 | 
			
		||||
 | 
			
		||||
	pm_runtime_enable(dev);
 | 
			
		||||
	put = true;
 | 
			
		||||
 | 
			
		||||
	if (dev->pm_domain) {
 | 
			
		||||
		info = "power domain ";
 | 
			
		||||
| 
						 | 
				
			
			@ -646,9 +644,6 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
 | 
			
		|||
 | 
			
		||||
	TRACE_RESUME(error);
 | 
			
		||||
 | 
			
		||||
	if (put)
 | 
			
		||||
		pm_runtime_put_sync(dev);
 | 
			
		||||
 | 
			
		||||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -762,6 +757,8 @@ static void device_complete(struct device *dev, pm_message_t state)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	device_unlock(dev);
 | 
			
		||||
 | 
			
		||||
	pm_runtime_put_sync(dev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -1015,7 +1012,7 @@ int dpm_suspend_end(pm_message_t state)
 | 
			
		|||
 | 
			
		||||
	error = dpm_suspend_noirq(state);
 | 
			
		||||
	if (error) {
 | 
			
		||||
		dpm_resume_early(state);
 | 
			
		||||
		dpm_resume_early(resume_event(state));
 | 
			
		||||
		return error;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1062,12 +1059,16 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
 | 
			
		|||
	if (async_error)
 | 
			
		||||
		goto Complete;
 | 
			
		||||
 | 
			
		||||
	pm_runtime_get_noresume(dev);
 | 
			
		||||
	/*
 | 
			
		||||
	 * If a device configured to wake up the system from sleep states
 | 
			
		||||
	 * has been suspended at run time and there's a resume request pending
 | 
			
		||||
	 * for it, this is equivalent to the device signaling wakeup, so the
 | 
			
		||||
	 * system suspend operation should be aborted.
 | 
			
		||||
	 */
 | 
			
		||||
	if (pm_runtime_barrier(dev) && device_may_wakeup(dev))
 | 
			
		||||
		pm_wakeup_event(dev, 0);
 | 
			
		||||
 | 
			
		||||
	if (pm_wakeup_pending()) {
 | 
			
		||||
		pm_runtime_put_sync(dev);
 | 
			
		||||
		async_error = -EBUSY;
 | 
			
		||||
		goto Complete;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1133,12 +1134,10 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
 | 
			
		|||
 Complete:
 | 
			
		||||
	complete_all(&dev->power.completion);
 | 
			
		||||
 | 
			
		||||
	if (error) {
 | 
			
		||||
		pm_runtime_put_sync(dev);
 | 
			
		||||
	if (error)
 | 
			
		||||
		async_error = error;
 | 
			
		||||
	} else if (dev->power.is_suspended) {
 | 
			
		||||
	else if (dev->power.is_suspended)
 | 
			
		||||
		__pm_runtime_disable(dev, false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return error;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1234,6 +1233,14 @@ static int device_prepare(struct device *dev, pm_message_t state)
 | 
			
		|||
	if (dev->power.syscore)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If a device's parent goes into runtime suspend at the wrong time,
 | 
			
		||||
	 * it won't be possible to resume the device.  To prevent this we
 | 
			
		||||
	 * block runtime suspend here, during the prepare phase, and allow
 | 
			
		||||
	 * it again during the complete phase.
 | 
			
		||||
	 */
 | 
			
		||||
	pm_runtime_get_noresume(dev);
 | 
			
		||||
 | 
			
		||||
	device_lock(dev);
 | 
			
		||||
 | 
			
		||||
	dev->power.wakeup_path = device_may_wakeup(dev);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -629,21 +629,6 @@ static int pci_pm_prepare(struct device *dev)
 | 
			
		|||
	struct device_driver *drv = dev->driver;
 | 
			
		||||
	int error = 0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If a PCI device configured to wake up the system from sleep states
 | 
			
		||||
	 * has been suspended at run time and there's a resume request pending
 | 
			
		||||
	 * for it, this is equivalent to the device signaling wakeup, so the
 | 
			
		||||
	 * system suspend operation should be aborted.
 | 
			
		||||
	 */
 | 
			
		||||
	pm_runtime_get_noresume(dev);
 | 
			
		||||
	if (pm_runtime_barrier(dev) && device_may_wakeup(dev))
 | 
			
		||||
		pm_wakeup_event(dev, 0);
 | 
			
		||||
 | 
			
		||||
	if (pm_wakeup_pending()) {
 | 
			
		||||
		pm_runtime_put_sync(dev);
 | 
			
		||||
		return -EBUSY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * PCI devices suspended at run time need to be resumed at this
 | 
			
		||||
	 * point, because in general it is necessary to reconfigure them for
 | 
			
		||||
| 
						 | 
				
			
			@ -667,8 +652,6 @@ static void pci_pm_complete(struct device *dev)
 | 
			
		|||
 | 
			
		||||
	if (drv && drv->pm && drv->pm->complete)
 | 
			
		||||
		drv->pm->complete(dev);
 | 
			
		||||
 | 
			
		||||
	pm_runtime_put_sync(dev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else /* !CONFIG_PM_SLEEP */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue