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