forked from mirrors/linux
		
	PM / Domains: Add APIs to attach/detach a PM domain for a device
To maintain scalability let's add common methods to attach and detach a PM domain for a device, dev_pm_domain_attach|detach(). Typically dev_pm_domain_attach() shall be invoked from subsystem level code at the probe phase to try to attach a device to its PM domain. The reversed actions may be done a the remove phase and then by invoking dev_pm_domain_detach(). When attachment succeeds, the attach function should assign its corresponding detach function to a new ->detach() callback added in the struct dev_pm_domain. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Kevin Hilman <khilman@linaro.org> Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									aa42240ab2
								
							
						
					
					
						commit
						46420dd73b
					
				
					 2 changed files with 63 additions and 0 deletions
				
			
		|  | @ -11,6 +11,8 @@ | ||||||
| #include <linux/export.h> | #include <linux/export.h> | ||||||
| #include <linux/slab.h> | #include <linux/slab.h> | ||||||
| #include <linux/pm_clock.h> | #include <linux/pm_clock.h> | ||||||
|  | #include <linux/acpi.h> | ||||||
|  | #include <linux/pm_domain.h> | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * dev_pm_get_subsys_data - Create or refcount power.subsys_data for device. |  * dev_pm_get_subsys_data - Create or refcount power.subsys_data for device. | ||||||
|  | @ -82,3 +84,53 @@ int dev_pm_put_subsys_data(struct device *dev) | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data); | EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * dev_pm_domain_attach - Attach a device to its PM domain. | ||||||
|  |  * @dev: Device to attach. | ||||||
|  |  * @power_on: Used to indicate whether we should power on the device. | ||||||
|  |  * | ||||||
|  |  * The @dev may only be attached to a single PM domain. By iterating through | ||||||
|  |  * the available alternatives we try to find a valid PM domain for the device. | ||||||
|  |  * As attachment succeeds, the ->detach() callback in the struct dev_pm_domain | ||||||
|  |  * should be assigned by the corresponding attach function. | ||||||
|  |  * | ||||||
|  |  * This function should typically be invoked from subsystem level code during | ||||||
|  |  * the probe phase. Especially for those that holds devices which requires | ||||||
|  |  * power management through PM domains. | ||||||
|  |  * | ||||||
|  |  * Callers must ensure proper synchronization of this function with power | ||||||
|  |  * management callbacks. | ||||||
|  |  * | ||||||
|  |  * Returns 0 on successfully attached PM domain or negative error code. | ||||||
|  |  */ | ||||||
|  | int dev_pm_domain_attach(struct device *dev, bool power_on) | ||||||
|  | { | ||||||
|  | 	int ret; | ||||||
|  | 
 | ||||||
|  | 	ret = acpi_dev_pm_attach(dev, power_on); | ||||||
|  | 	if (ret) | ||||||
|  | 		ret = genpd_dev_pm_attach(dev); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(dev_pm_domain_attach); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * dev_pm_domain_detach - Detach a device from its PM domain. | ||||||
|  |  * @dev: Device to attach. | ||||||
|  |  * @power_off: Used to indicate whether we should power off the device. | ||||||
|  |  * | ||||||
|  |  * This functions will reverse the actions from dev_pm_domain_attach() and thus | ||||||
|  |  * try to detach the @dev from its PM domain. Typically it should be invoked | ||||||
|  |  * from subsystem level code during the remove phase. | ||||||
|  |  * | ||||||
|  |  * Callers must ensure proper synchronization of this function with power | ||||||
|  |  * management callbacks. | ||||||
|  |  */ | ||||||
|  | void dev_pm_domain_detach(struct device *dev, bool power_off) | ||||||
|  | { | ||||||
|  | 	if (dev->pm_domain && dev->pm_domain->detach) | ||||||
|  | 		dev->pm_domain->detach(dev, power_off); | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(dev_pm_domain_detach); | ||||||
|  |  | ||||||
|  | @ -622,6 +622,17 @@ struct dev_pm_domain { | ||||||
| 	void (*detach)(struct device *dev, bool power_off); | 	void (*detach)(struct device *dev, bool power_off); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_PM | ||||||
|  | extern int dev_pm_domain_attach(struct device *dev, bool power_on); | ||||||
|  | extern void dev_pm_domain_detach(struct device *dev, bool power_off); | ||||||
|  | #else | ||||||
|  | static inline int dev_pm_domain_attach(struct device *dev, bool power_on) | ||||||
|  | { | ||||||
|  | 	return -ENODEV; | ||||||
|  | } | ||||||
|  | static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * The PM_EVENT_ messages are also used by drivers implementing the legacy |  * The PM_EVENT_ messages are also used by drivers implementing the legacy | ||||||
|  * suspend framework, based on the ->suspend() and ->resume() callbacks common |  * suspend framework, based on the ->suspend() and ->resume() callbacks common | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ulf Hansson
						Ulf Hansson