2 * pm_domain.h - Definitions and headers related to device power domains.
4 * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp.
6 * This file is released under the GPLv2.
9 #ifndef _LINUX_PM_DOMAIN_H
10 #define _LINUX_PM_DOMAIN_H
12 #include <linux/device.h>
15 GPD_STATE_ACTIVE
= 0, /* PM domain is active */
16 GPD_STATE_BUSY
, /* Something is happening to the PM domain */
17 GPD_STATE_REPEAT
, /* Power off in progress, to be repeated */
18 GPD_STATE_POWER_OFF
, /* PM domain is off */
21 struct dev_power_governor
{
22 bool (*power_down_ok
)(struct dev_pm_domain
*domain
);
25 struct generic_pm_domain
{
26 struct dev_pm_domain domain
; /* PM domain operations */
27 struct list_head gpd_list_node
; /* Node in the global PM domains list */
28 struct list_head sd_node
; /* Node in the parent's subdomain list */
29 struct generic_pm_domain
*parent
; /* Parent PM domain */
30 struct list_head sd_list
; /* List of dubdomains */
31 struct list_head dev_list
; /* List of devices */
33 struct dev_power_governor
*gov
;
34 struct work_struct power_off_work
;
35 unsigned int in_progress
; /* Number of devices being suspended now */
36 unsigned int sd_count
; /* Number of subdomains with power "on" */
37 enum gpd_status status
; /* Current state of the domain */
38 wait_queue_head_t status_wait_queue
;
39 struct task_struct
*poweroff_task
; /* Powering off task */
40 unsigned int resume_count
; /* Number of devices being resumed */
41 unsigned int device_count
; /* Number of devices */
42 unsigned int suspended_count
; /* System suspend device counter */
43 unsigned int prepared_count
; /* Suspend counter of prepared devices */
44 bool suspend_power_off
; /* Power status before system suspend */
45 int (*power_off
)(struct generic_pm_domain
*domain
);
46 int (*power_on
)(struct generic_pm_domain
*domain
);
47 int (*start_device
)(struct device
*dev
);
48 int (*stop_device
)(struct device
*dev
);
49 bool (*active_wakeup
)(struct device
*dev
);
52 static inline struct generic_pm_domain
*pd_to_genpd(struct dev_pm_domain
*pd
)
54 return container_of(pd
, struct generic_pm_domain
, domain
);
57 struct dev_list_entry
{
58 struct list_head node
;
63 #ifdef CONFIG_PM_GENERIC_DOMAINS
64 extern int pm_genpd_add_device(struct generic_pm_domain
*genpd
,
66 extern int pm_genpd_remove_device(struct generic_pm_domain
*genpd
,
68 extern int pm_genpd_add_subdomain(struct generic_pm_domain
*genpd
,
69 struct generic_pm_domain
*new_subdomain
);
70 extern int pm_genpd_remove_subdomain(struct generic_pm_domain
*genpd
,
71 struct generic_pm_domain
*target
);
72 extern void pm_genpd_init(struct generic_pm_domain
*genpd
,
73 struct dev_power_governor
*gov
, bool is_off
);
74 extern int pm_genpd_poweron(struct generic_pm_domain
*genpd
);
75 extern void pm_genpd_poweroff_unused(void);
76 extern void genpd_queue_power_off_work(struct generic_pm_domain
*genpd
);
78 static inline int pm_genpd_add_device(struct generic_pm_domain
*genpd
,
83 static inline int pm_genpd_remove_device(struct generic_pm_domain
*genpd
,
88 static inline int pm_genpd_add_subdomain(struct generic_pm_domain
*genpd
,
89 struct generic_pm_domain
*new_sd
)
93 static inline int pm_genpd_remove_subdomain(struct generic_pm_domain
*genpd
,
94 struct generic_pm_domain
*target
)
98 static inline void pm_genpd_init(struct generic_pm_domain
*genpd
,
99 struct dev_power_governor
*gov
, bool is_off
) {}
100 static inline int pm_genpd_poweron(struct generic_pm_domain
*genpd
)
104 static inline void pm_genpd_poweroff_unused(void) {}
105 static inline void genpd_queue_power_off_work(struct generic_pm_domain
*gpd
) {}
108 #endif /* _LINUX_PM_DOMAIN_H */