forked from mirrors/linux
		
	PM / Runtime: Defer resuming of the device in pm_runtime_force_resume()
When the pm_runtime_force_suspend|resume() helpers were invented, we still had CONFIG_PM_RUNTIME and CONFIG_PM_SLEEP as separate Kconfig options. To make sure these helpers worked for all combinations and without introducing too much of complexity, the device was always resumed in pm_runtime_force_resume(). More precisely, when CONFIG_PM_SLEEP was set and CONFIG_PM_RUNTIME was unset, we needed to resume the device as the subsystem/driver couldn't rely on using runtime PM to do it. As the CONFIG_PM_RUNTIME option was merged into CONFIG_PM a while ago, it removed this combination, of using CONFIG_PM_SLEEP without the earlier CONFIG_PM_RUNTIME. For this reason we can now rely on the subsystem/driver to use runtime PM to resume the device, instead of forcing that to be done in all cases. In other words, let's defer the runtime resume to a later point when it's actually needed. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Acked-by: Kevin Hilman <khilman@baylibre.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									a8636c8964
								
							
						
					
					
						commit
						1d9174fbc5
					
				
					 1 changed files with 30 additions and 5 deletions
				
			
		|  | @ -1489,6 +1489,16 @@ int pm_runtime_force_suspend(struct device *dev) | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto err; | 		goto err; | ||||||
| 
 | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Increase the runtime PM usage count for the device's parent, in case | ||||||
|  | 	 * when we find the device being used when system suspend was invoked. | ||||||
|  | 	 * This informs pm_runtime_force_resume() to resume the parent | ||||||
|  | 	 * immediately, which is needed to be able to resume its children, | ||||||
|  | 	 * when not deferring the resume to be managed via runtime PM. | ||||||
|  | 	 */ | ||||||
|  | 	if (dev->parent && atomic_read(&dev->power.usage_count) > 1) | ||||||
|  | 		pm_runtime_get_noresume(dev->parent); | ||||||
|  | 
 | ||||||
| 	pm_runtime_set_suspended(dev); | 	pm_runtime_set_suspended(dev); | ||||||
| 	return 0; | 	return 0; | ||||||
| err: | err: | ||||||
|  | @ -1498,16 +1508,20 @@ int pm_runtime_force_suspend(struct device *dev) | ||||||
| EXPORT_SYMBOL_GPL(pm_runtime_force_suspend); | EXPORT_SYMBOL_GPL(pm_runtime_force_suspend); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * pm_runtime_force_resume - Force a device into resume state. |  * pm_runtime_force_resume - Force a device into resume state if needed. | ||||||
|  * @dev: Device to resume. |  * @dev: Device to resume. | ||||||
|  * |  * | ||||||
|  * Prior invoking this function we expect the user to have brought the device |  * Prior invoking this function we expect the user to have brought the device | ||||||
|  * into low power state by a call to pm_runtime_force_suspend(). Here we reverse |  * into low power state by a call to pm_runtime_force_suspend(). Here we reverse | ||||||
|  * those actions and brings the device into full power. We update the runtime PM |  * those actions and brings the device into full power, if it is expected to be | ||||||
|  * status and re-enables runtime PM. |  * used on system resume. To distinguish that, we check whether the runtime PM | ||||||
|  |  * usage count is greater than 1 (the PM core increases the usage count in the | ||||||
|  |  * system PM prepare phase), as that indicates a real user (such as a subsystem, | ||||||
|  |  * driver, userspace, etc.) is using it. If that is the case, the device is | ||||||
|  |  * expected to be used on system resume as well, so then we resume it. In the | ||||||
|  |  * other case, we defer the resume to be managed via runtime PM. | ||||||
|  * |  * | ||||||
|  * Typically this function may be invoked from a system resume callback to make |  * Typically this function may be invoked from a system resume callback. | ||||||
|  * sure the device is put into full power state. |  | ||||||
|  */ |  */ | ||||||
| int pm_runtime_force_resume(struct device *dev) | int pm_runtime_force_resume(struct device *dev) | ||||||
| { | { | ||||||
|  | @ -1524,6 +1538,17 @@ int pm_runtime_force_resume(struct device *dev) | ||||||
| 	if (!pm_runtime_status_suspended(dev)) | 	if (!pm_runtime_status_suspended(dev)) | ||||||
| 		goto out; | 		goto out; | ||||||
| 
 | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Decrease the parent's runtime PM usage count, if we increased it | ||||||
|  | 	 * during system suspend in pm_runtime_force_suspend(). | ||||||
|  | 	*/ | ||||||
|  | 	if (atomic_read(&dev->power.usage_count) > 1) { | ||||||
|  | 		if (dev->parent) | ||||||
|  | 			pm_runtime_put_noidle(dev->parent); | ||||||
|  | 	} else { | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ret = pm_runtime_set_active(dev); | 	ret = pm_runtime_set_active(dev); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto out; | 		goto out; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ulf Hansson
						Ulf Hansson