xref: /linux-6.15/include/linux/pm_domain.h (revision f721889f)
1*f721889fSRafael J. Wysocki /*
2*f721889fSRafael J. Wysocki  * pm_domain.h - Definitions and headers related to device power domains.
3*f721889fSRafael J. Wysocki  *
4*f721889fSRafael J. Wysocki  * Copyright (C) 2011 Rafael J. Wysocki <[email protected]>, Renesas Electronics Corp.
5*f721889fSRafael J. Wysocki  *
6*f721889fSRafael J. Wysocki  * This file is released under the GPLv2.
7*f721889fSRafael J. Wysocki  */
8*f721889fSRafael J. Wysocki 
9*f721889fSRafael J. Wysocki #ifndef _LINUX_PM_DOMAIN_H
10*f721889fSRafael J. Wysocki #define _LINUX_PM_DOMAIN_H
11*f721889fSRafael J. Wysocki 
12*f721889fSRafael J. Wysocki #include <linux/device.h>
13*f721889fSRafael J. Wysocki 
14*f721889fSRafael J. Wysocki struct dev_power_governor {
15*f721889fSRafael J. Wysocki 	bool (*power_down_ok)(struct dev_pm_domain *domain);
16*f721889fSRafael J. Wysocki };
17*f721889fSRafael J. Wysocki 
18*f721889fSRafael J. Wysocki struct generic_pm_domain {
19*f721889fSRafael J. Wysocki 	struct dev_pm_domain domain;	/* PM domain operations */
20*f721889fSRafael J. Wysocki 	struct list_head sd_node;	/* Node in the parent's subdomain list */
21*f721889fSRafael J. Wysocki 	struct generic_pm_domain *parent;	/* Parent PM domain */
22*f721889fSRafael J. Wysocki 	struct list_head sd_list;	/* List of dubdomains */
23*f721889fSRafael J. Wysocki 	struct list_head dev_list;	/* List of devices */
24*f721889fSRafael J. Wysocki 	struct mutex lock;
25*f721889fSRafael J. Wysocki 	struct dev_power_governor *gov;
26*f721889fSRafael J. Wysocki 	struct work_struct power_off_work;
27*f721889fSRafael J. Wysocki 	unsigned int in_progress;	/* Number of devices being suspended now */
28*f721889fSRafael J. Wysocki 	unsigned int sd_count;	/* Number of subdomains with power "on" */
29*f721889fSRafael J. Wysocki 	bool power_is_off;	/* Whether or not power has been removed */
30*f721889fSRafael J. Wysocki 	int (*power_off)(struct generic_pm_domain *domain);
31*f721889fSRafael J. Wysocki 	int (*power_on)(struct generic_pm_domain *domain);
32*f721889fSRafael J. Wysocki 	int (*start_device)(struct device *dev);
33*f721889fSRafael J. Wysocki 	int (*stop_device)(struct device *dev);
34*f721889fSRafael J. Wysocki };
35*f721889fSRafael J. Wysocki 
36*f721889fSRafael J. Wysocki struct dev_list_entry {
37*f721889fSRafael J. Wysocki 	struct list_head node;
38*f721889fSRafael J. Wysocki 	struct device *dev;
39*f721889fSRafael J. Wysocki 	bool need_restore;
40*f721889fSRafael J. Wysocki };
41*f721889fSRafael J. Wysocki 
42*f721889fSRafael J. Wysocki #ifdef CONFIG_PM_GENERIC_DOMAINS
43*f721889fSRafael J. Wysocki extern int pm_genpd_add_device(struct generic_pm_domain *genpd,
44*f721889fSRafael J. Wysocki 			       struct device *dev);
45*f721889fSRafael J. Wysocki extern int pm_genpd_remove_device(struct generic_pm_domain *genpd,
46*f721889fSRafael J. Wysocki 				  struct device *dev);
47*f721889fSRafael J. Wysocki extern int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
48*f721889fSRafael J. Wysocki 				  struct generic_pm_domain *new_subdomain);
49*f721889fSRafael J. Wysocki extern int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
50*f721889fSRafael J. Wysocki 				     struct generic_pm_domain *target);
51*f721889fSRafael J. Wysocki extern void pm_genpd_init(struct generic_pm_domain *genpd,
52*f721889fSRafael J. Wysocki 			  struct dev_power_governor *gov, bool is_off);
53*f721889fSRafael J. Wysocki #else
54*f721889fSRafael J. Wysocki static inline int pm_genpd_add_device(struct generic_pm_domain *genpd,
55*f721889fSRafael J. Wysocki 				      struct device *dev)
56*f721889fSRafael J. Wysocki {
57*f721889fSRafael J. Wysocki 	return -ENOSYS;
58*f721889fSRafael J. Wysocki }
59*f721889fSRafael J. Wysocki static inline int pm_genpd_remove_device(struct generic_pm_domain *genpd,
60*f721889fSRafael J. Wysocki 					 struct device *dev)
61*f721889fSRafael J. Wysocki {
62*f721889fSRafael J. Wysocki 	return -ENOSYS;
63*f721889fSRafael J. Wysocki }
64*f721889fSRafael J. Wysocki static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
65*f721889fSRafael J. Wysocki 					 struct generic_pm_domain *new_sd)
66*f721889fSRafael J. Wysocki {
67*f721889fSRafael J. Wysocki 	return -ENOSYS;
68*f721889fSRafael J. Wysocki }
69*f721889fSRafael J. Wysocki static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
70*f721889fSRafael J. Wysocki 					    struct generic_pm_domain *target)
71*f721889fSRafael J. Wysocki {
72*f721889fSRafael J. Wysocki 	return -ENOSYS;
73*f721889fSRafael J. Wysocki }
74*f721889fSRafael J. Wysocki static inline void pm_genpd_init(struct generic_pm_domain *genpd,
75*f721889fSRafael J. Wysocki 				 struct dev_power_governor *gov, bool is_off) {}
76*f721889fSRafael J. Wysocki #endif
77*f721889fSRafael J. Wysocki 
78*f721889fSRafael J. Wysocki #endif /* _LINUX_PM_DOMAIN_H */
79