diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 16:01:57 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 16:01:57 -0700 | 
| commit | 431bf99d26157d56689e5de65bd27ce9f077fc3f (patch) | |
| tree | b15e357039956fcdd0e0e6177d2fc99bb3cfa822 /include/linux/pm_domain.h | |
| parent | 72f96e0e38d7e29ba16dcfd824ecaebe38b8293e (diff) | |
| parent | 7ae033cc0dfce68d8e0c83aca60837cf2bf0d2e6 (diff) | |
| download | olio-linux-3.10-431bf99d26157d56689e5de65bd27ce9f077fc3f.tar.xz olio-linux-3.10-431bf99d26157d56689e5de65bd27ce9f077fc3f.zip  | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: (51 commits)
  PM: Improve error code of pm_notifier_call_chain()
  PM: Add "RTC" to PM trace time stamps to avoid confusion
  PM / Suspend: Export suspend_set_ops, suspend_valid_only_mem
  PM / Suspend: Add .suspend_again() callback to suspend_ops
  PM / OPP: Introduce function to free cpufreq table
  ARM / shmobile: Return -EBUSY from A4LC power off if A3RV is active
  PM / Domains: Take .power_off() error code into account
  ARM / shmobile: Use genpd_queue_power_off_work()
  ARM / shmobile: Use pm_genpd_poweroff_unused()
  PM / Domains: Introduce function to power off all unused PM domains
  OMAP: PM: disable idle on suspend for GPIO and UART
  OMAP: PM: omap_device: add API to disable idle on suspend
  OMAP: PM: omap_device: add system PM methods for PM domain handling
  OMAP: PM: omap_device: conditionally use PM domain runtime helpers
  PM / Runtime: Add new helper function: pm_runtime_status_suspended()
  PM / Domains: Queue up power off work only if it is not pending
  PM / Domains: Improve handling of wakeup devices during system suspend
  PM / Domains: Do not restore all devices on power off error
  PM / Domains: Allow callbacks to execute all runtime PM helpers
  PM / Domains: Do not execute device callbacks under locks
  ...
Diffstat (limited to 'include/linux/pm_domain.h')
| -rw-r--r-- | include/linux/pm_domain.h | 108 | 
1 files changed, 108 insertions, 0 deletions
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h new file mode 100644 index 00000000000..21097cb086f --- /dev/null +++ b/include/linux/pm_domain.h @@ -0,0 +1,108 @@ +/* + * pm_domain.h - Definitions and headers related to device power domains. + * + * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp. + * + * This file is released under the GPLv2. + */ + +#ifndef _LINUX_PM_DOMAIN_H +#define _LINUX_PM_DOMAIN_H + +#include <linux/device.h> + +enum gpd_status { +	GPD_STATE_ACTIVE = 0,	/* PM domain is active */ +	GPD_STATE_BUSY,		/* Something is happening to the PM domain */ +	GPD_STATE_REPEAT,	/* Power off in progress, to be repeated */ +	GPD_STATE_POWER_OFF,	/* PM domain is off */ +}; + +struct dev_power_governor { +	bool (*power_down_ok)(struct dev_pm_domain *domain); +}; + +struct generic_pm_domain { +	struct dev_pm_domain domain;	/* PM domain operations */ +	struct list_head gpd_list_node;	/* Node in the global PM domains list */ +	struct list_head sd_node;	/* Node in the parent's subdomain list */ +	struct generic_pm_domain *parent;	/* Parent PM domain */ +	struct list_head sd_list;	/* List of dubdomains */ +	struct list_head dev_list;	/* List of devices */ +	struct mutex lock; +	struct dev_power_governor *gov; +	struct work_struct power_off_work; +	unsigned int in_progress;	/* Number of devices being suspended now */ +	unsigned int sd_count;	/* Number of subdomains with power "on" */ +	enum gpd_status status;	/* Current state of the domain */ +	wait_queue_head_t status_wait_queue; +	struct task_struct *poweroff_task;	/* Powering off task */ +	unsigned int resume_count;	/* Number of devices being resumed */ +	unsigned int device_count;	/* Number of devices */ +	unsigned int suspended_count;	/* System suspend device counter */ +	unsigned int prepared_count;	/* Suspend counter of prepared devices */ +	bool suspend_power_off;	/* Power status before system suspend */ +	int (*power_off)(struct generic_pm_domain *domain); +	int (*power_on)(struct generic_pm_domain *domain); +	int (*start_device)(struct device *dev); +	int (*stop_device)(struct device *dev); +	bool (*active_wakeup)(struct device *dev); +}; + +static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) +{ +	return container_of(pd, struct generic_pm_domain, domain); +} + +struct dev_list_entry { +	struct list_head node; +	struct device *dev; +	bool need_restore; +}; + +#ifdef CONFIG_PM_GENERIC_DOMAINS +extern int pm_genpd_add_device(struct generic_pm_domain *genpd, +			       struct device *dev); +extern int pm_genpd_remove_device(struct generic_pm_domain *genpd, +				  struct device *dev); +extern int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, +				  struct generic_pm_domain *new_subdomain); +extern int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, +				     struct generic_pm_domain *target); +extern void pm_genpd_init(struct generic_pm_domain *genpd, +			  struct dev_power_governor *gov, bool is_off); +extern int pm_genpd_poweron(struct generic_pm_domain *genpd); +extern void pm_genpd_poweroff_unused(void); +extern void genpd_queue_power_off_work(struct generic_pm_domain *genpd); +#else +static inline int pm_genpd_add_device(struct generic_pm_domain *genpd, +				      struct device *dev) +{ +	return -ENOSYS; +} +static inline int pm_genpd_remove_device(struct generic_pm_domain *genpd, +					 struct device *dev) +{ +	return -ENOSYS; +} +static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, +					 struct generic_pm_domain *new_sd) +{ +	return -ENOSYS; +} +static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, +					    struct generic_pm_domain *target) +{ +	return -ENOSYS; +} +static inline void pm_genpd_init(struct generic_pm_domain *genpd, +				 struct dev_power_governor *gov, bool is_off) {} +static inline int pm_genpd_poweron(struct generic_pm_domain *genpd) +{ +	return -ENOSYS; +} +static inline void pm_genpd_poweroff_unused(void) {} +static inline void genpd_queue_power_off_work(struct generic_pm_domain *gpd) {} +#endif + +#endif /* _LINUX_PM_DOMAIN_H */  |