mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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