PM / Domains: Move code from under #ifdef CONFIG_PM_RUNTIME (v2)
There is some code in drivers/base/power/domain.c that will be useful for both runtime PM and system-wide power transitions, so make it depend on CONFIG_PM instead of CONFIG_PM_RUNTIME. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Kevin Hilman <khilman@ti.com>
This commit is contained in:
		
							parent
							
								
									e529192883
								
							
						
					
					
						commit
						5248051b9a
					
				| @ -14,7 +14,15 @@ | ||||
| #include <linux/slab.h> | ||||
| #include <linux/err.h> | ||||
| 
 | ||||
| #ifdef CONFIG_PM_RUNTIME | ||||
| #ifdef CONFIG_PM | ||||
| 
 | ||||
| static struct generic_pm_domain *dev_to_genpd(struct device *dev) | ||||
| { | ||||
| 	if (IS_ERR_OR_NULL(dev->pm_domain)) | ||||
| 		return ERR_PTR(-EINVAL); | ||||
| 
 | ||||
| 	return container_of(dev->pm_domain, struct generic_pm_domain, domain); | ||||
| } | ||||
| 
 | ||||
| static void genpd_sd_counter_dec(struct generic_pm_domain *genpd) | ||||
| { | ||||
| @ -22,6 +30,58 @@ static void genpd_sd_counter_dec(struct generic_pm_domain *genpd) | ||||
| 			genpd->sd_count--; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * pm_genpd_poweron - Restore power to a given PM domain and its parents. | ||||
|  * @genpd: PM domain to power up. | ||||
|  * | ||||
|  * Restore power to @genpd and all of its parents so that it is possible to | ||||
|  * resume a device belonging to it. | ||||
|  */ | ||||
| static int pm_genpd_poweron(struct generic_pm_domain *genpd) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 
 | ||||
|  start: | ||||
| 	if (genpd->parent) | ||||
| 		mutex_lock(&genpd->parent->lock); | ||||
| 	mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING); | ||||
| 
 | ||||
| 	if (!genpd->power_is_off) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	if (genpd->parent && genpd->parent->power_is_off) { | ||||
| 		mutex_unlock(&genpd->lock); | ||||
| 		mutex_unlock(&genpd->parent->lock); | ||||
| 
 | ||||
| 		ret = pm_genpd_poweron(genpd->parent); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		goto start; | ||||
| 	} | ||||
| 
 | ||||
| 	if (genpd->power_on) { | ||||
| 		int ret = genpd->power_on(genpd); | ||||
| 		if (ret) | ||||
| 			goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	genpd->power_is_off = false; | ||||
| 	if (genpd->parent) | ||||
| 		genpd->parent->sd_count++; | ||||
| 
 | ||||
|  out: | ||||
| 	mutex_unlock(&genpd->lock); | ||||
| 	if (genpd->parent) | ||||
| 		mutex_unlock(&genpd->parent->lock); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| #endif /* CONFIG_PM */ | ||||
| 
 | ||||
| #ifdef CONFIG_PM_RUNTIME | ||||
| 
 | ||||
| /**
 | ||||
|  * __pm_genpd_save_device - Save the pre-suspend state of a device. | ||||
|  * @dle: Device list entry of the device to save the state of. | ||||
| @ -174,11 +234,10 @@ static int pm_genpd_runtime_suspend(struct device *dev) | ||||
| 
 | ||||
| 	dev_dbg(dev, "%s()\n", __func__); | ||||
| 
 | ||||
| 	if (IS_ERR_OR_NULL(dev->pm_domain)) | ||||
| 	genpd = dev_to_genpd(dev); | ||||
| 	if (IS_ERR(genpd)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	genpd = container_of(dev->pm_domain, struct generic_pm_domain, domain); | ||||
| 
 | ||||
| 	if (genpd->parent) | ||||
| 		mutex_lock(&genpd->parent->lock); | ||||
| 	mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING); | ||||
| @ -200,54 +259,6 @@ static int pm_genpd_runtime_suspend(struct device *dev) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * pm_genpd_poweron - Restore power to a given PM domain and its parents. | ||||
|  * @genpd: PM domain to power up. | ||||
|  * | ||||
|  * Restore power to @genpd and all of its parents so that it is possible to | ||||
|  * resume a device belonging to it. | ||||
|  */ | ||||
| static int pm_genpd_poweron(struct generic_pm_domain *genpd) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 
 | ||||
|  start: | ||||
| 	if (genpd->parent) | ||||
| 		mutex_lock(&genpd->parent->lock); | ||||
| 	mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING); | ||||
| 
 | ||||
| 	if (!genpd->power_is_off) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	if (genpd->parent && genpd->parent->power_is_off) { | ||||
| 		mutex_unlock(&genpd->lock); | ||||
| 		mutex_unlock(&genpd->parent->lock); | ||||
| 
 | ||||
| 		ret = pm_genpd_poweron(genpd->parent); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		goto start; | ||||
| 	} | ||||
| 
 | ||||
| 	if (genpd->power_on) { | ||||
| 		int ret = genpd->power_on(genpd); | ||||
| 		if (ret) | ||||
| 			goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	genpd->power_is_off = false; | ||||
| 	if (genpd->parent) | ||||
| 		genpd->parent->sd_count++; | ||||
| 
 | ||||
|  out: | ||||
| 	mutex_unlock(&genpd->lock); | ||||
| 	if (genpd->parent) | ||||
| 		mutex_unlock(&genpd->parent->lock); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * pm_genpd_runtime_resume - Resume a device belonging to I/O PM domain. | ||||
|  * @dev: Device to resume. | ||||
| @ -264,11 +275,10 @@ static int pm_genpd_runtime_resume(struct device *dev) | ||||
| 
 | ||||
| 	dev_dbg(dev, "%s()\n", __func__); | ||||
| 
 | ||||
| 	if (IS_ERR_OR_NULL(dev->pm_domain)) | ||||
| 	genpd = dev_to_genpd(dev); | ||||
| 	if (IS_ERR(genpd)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	genpd = container_of(dev->pm_domain, struct generic_pm_domain, domain); | ||||
| 
 | ||||
| 	ret = pm_genpd_poweron(genpd); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user