155716d26SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2f721889fSRafael J. Wysocki /* 3f721889fSRafael J. Wysocki * pm_domain.h - Definitions and headers related to device power domains. 4f721889fSRafael J. Wysocki * 5f721889fSRafael J. Wysocki * Copyright (C) 2011 Rafael J. Wysocki <[email protected]>, Renesas Electronics Corp. 6f721889fSRafael J. Wysocki */ 7f721889fSRafael J. Wysocki 8f721889fSRafael J. Wysocki #ifndef _LINUX_PM_DOMAIN_H 9f721889fSRafael J. Wysocki #define _LINUX_PM_DOMAIN_H 10f721889fSRafael J. Wysocki 11f721889fSRafael J. Wysocki #include <linux/device.h> 12*67e3242eSLina Iyer #include <linux/ktime.h> 13313162d0SPaul Gortmaker #include <linux/mutex.h> 14313162d0SPaul Gortmaker #include <linux/pm.h> 154f042cdaSGuennadi Liakhovetski #include <linux/err.h> 16c8aa130bSThomas Abraham #include <linux/of.h> 176ff7bb0dSRafael J. Wysocki #include <linux/notifier.h> 18d716f479SLina Iyer #include <linux/spinlock.h> 19eb594b73SUlf Hansson #include <linux/cpumask.h> 20f721889fSRafael J. Wysocki 21e5089c2cSUlf Hansson /* 22e5089c2cSUlf Hansson * Flags to control the behaviour of a genpd. 23e5089c2cSUlf Hansson * 24e5089c2cSUlf Hansson * These flags may be set in the struct generic_pm_domain's flags field by a 25e5089c2cSUlf Hansson * genpd backend driver. The flags must be set before it calls pm_genpd_init(), 26e5089c2cSUlf Hansson * which initializes a genpd. 27e5089c2cSUlf Hansson * 28e5089c2cSUlf Hansson * GENPD_FLAG_PM_CLK: Instructs genpd to use the PM clk framework, 29e5089c2cSUlf Hansson * while powering on/off attached devices. 30e5089c2cSUlf Hansson * 31e5089c2cSUlf Hansson * GENPD_FLAG_IRQ_SAFE: This informs genpd that its backend callbacks, 32e5089c2cSUlf Hansson * ->power_on|off(), doesn't sleep. Hence, these 33e5089c2cSUlf Hansson * can be invoked from within atomic context, which 34e5089c2cSUlf Hansson * enables genpd to power on/off the PM domain, 35e5089c2cSUlf Hansson * even when pm_runtime_is_irq_safe() returns true, 36e5089c2cSUlf Hansson * for any of its attached devices. Note that, a 37e5089c2cSUlf Hansson * genpd having this flag set, requires its 38e5089c2cSUlf Hansson * masterdomains to also have it set. 39e5089c2cSUlf Hansson * 40e5089c2cSUlf Hansson * GENPD_FLAG_ALWAYS_ON: Instructs genpd to always keep the PM domain 41e5089c2cSUlf Hansson * powered on. 42e5089c2cSUlf Hansson * 43e5089c2cSUlf Hansson * GENPD_FLAG_ACTIVE_WAKEUP: Instructs genpd to keep the PM domain powered 44e5089c2cSUlf Hansson * on, in case any of its attached devices is used 45e5089c2cSUlf Hansson * in the wakeup path to serve system wakeups. 46eb594b73SUlf Hansson * 47eb594b73SUlf Hansson * GENPD_FLAG_CPU_DOMAIN: Instructs genpd that it should expect to get 48eb594b73SUlf Hansson * devices attached, which may belong to CPUs or 49eb594b73SUlf Hansson * possibly have subdomains with CPUs attached. 50eb594b73SUlf Hansson * This flag enables the genpd backend driver to 51eb594b73SUlf Hansson * deploy idle power management support for CPUs 52eb594b73SUlf Hansson * and groups of CPUs. Note that, the backend 53eb594b73SUlf Hansson * driver must then comply with the so called, 54eb594b73SUlf Hansson * last-man-standing algorithm, for the CPUs in the 55eb594b73SUlf Hansson * PM domain. 56ed61e18aSLeonard Crestez * 57ed61e18aSLeonard Crestez * GENPD_FLAG_RPM_ALWAYS_ON: Instructs genpd to always keep the PM domain 58ed61e18aSLeonard Crestez * powered on except for system suspend. 59e5089c2cSUlf Hansson */ 60e5089c2cSUlf Hansson #define GENPD_FLAG_PM_CLK (1U << 0) 61e5089c2cSUlf Hansson #define GENPD_FLAG_IRQ_SAFE (1U << 1) 62e5089c2cSUlf Hansson #define GENPD_FLAG_ALWAYS_ON (1U << 2) 63e5089c2cSUlf Hansson #define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) 64eb594b73SUlf Hansson #define GENPD_FLAG_CPU_DOMAIN (1U << 4) 65ed61e18aSLeonard Crestez #define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5) 66c11f6f5bSUlf Hansson 6717b75ecaSRafael J. Wysocki enum gpd_status { 6849f618e1SUlf Hansson GENPD_STATE_ON = 0, /* PM domain is on */ 6949f618e1SUlf Hansson GENPD_STATE_OFF, /* PM domain is off */ 7017b75ecaSRafael J. Wysocki }; 71596ba34bSRafael J. Wysocki 72d4f81383SUlf Hansson enum genpd_notication { 73d4f81383SUlf Hansson GENPD_NOTIFY_PRE_OFF = 0, 74d4f81383SUlf Hansson GENPD_NOTIFY_OFF, 75d4f81383SUlf Hansson GENPD_NOTIFY_PRE_ON, 76d4f81383SUlf Hansson GENPD_NOTIFY_ON, 77d4f81383SUlf Hansson }; 78d4f81383SUlf Hansson 79f721889fSRafael J. Wysocki struct dev_power_governor { 80f721889fSRafael J. Wysocki bool (*power_down_ok)(struct dev_pm_domain *domain); 819df3921eSUlf Hansson bool (*suspend_ok)(struct device *dev); 82f721889fSRafael J. Wysocki }; 83f721889fSRafael J. Wysocki 84d5e4cbfeSRafael J. Wysocki struct gpd_dev_ops { 85d5e4cbfeSRafael J. Wysocki int (*start)(struct device *dev); 86d5e4cbfeSRafael J. Wysocki int (*stop)(struct device *dev); 87d5e4cbfeSRafael J. Wysocki }; 88d5e4cbfeSRafael J. Wysocki 89fc5cbf0cSAxel Haslam struct genpd_power_state { 90fc5cbf0cSAxel Haslam s64 power_off_latency_ns; 91fc5cbf0cSAxel Haslam s64 power_on_latency_ns; 92405f7226SLina Iyer s64 residency_ns; 93c6a113b5SLina Iyer u64 usage; 94c6a113b5SLina Iyer u64 rejected; 950c9b694aSLina Iyer struct fwnode_handle *fwnode; 96afece3abSThara Gopinath ktime_t idle_time; 9749a27e27SUlf Hansson void *data; 98fc5cbf0cSAxel Haslam }; 99fc5cbf0cSAxel Haslam 10035241d12SLina Iyer struct genpd_lock_ops; 1016e41766aSViresh Kumar struct dev_pm_opp; 1021067ae3eSViresh Kumar struct opp_table; 10335241d12SLina Iyer 104f721889fSRafael J. Wysocki struct generic_pm_domain { 105401ea157SViresh Kumar struct device dev; 106f721889fSRafael J. Wysocki struct dev_pm_domain domain; /* PM domain operations */ 1075125bbf3SRafael J. Wysocki struct list_head gpd_list_node; /* Node in the global PM domains list */ 1088d87ae48SKees Cook struct list_head parent_links; /* Links with PM domain as a parent */ 1098d87ae48SKees Cook struct list_head child_links; /* Links with PM domain as a child */ 110f721889fSRafael J. Wysocki struct list_head dev_list; /* List of devices */ 111f721889fSRafael J. Wysocki struct dev_power_governor *gov; 112f721889fSRafael J. Wysocki struct work_struct power_off_work; 113de0aa06dSJon Hunter struct fwnode_handle *provider; /* Identity of the domain provider */ 114de0aa06dSJon Hunter bool has_provider; 115d07e9c17SGeert Uytterhoeven const char *name; 116c4bb3160SRafael J. Wysocki atomic_t sd_count; /* Number of subdomains with power "on" */ 11717b75ecaSRafael J. Wysocki enum gpd_status status; /* Current state of the domain */ 118596ba34bSRafael J. Wysocki unsigned int device_count; /* Number of devices */ 119596ba34bSRafael J. Wysocki unsigned int suspended_count; /* System suspend device counter */ 120596ba34bSRafael J. Wysocki unsigned int prepared_count; /* Suspend counter of prepared devices */ 12142f6284aSViresh Kumar unsigned int performance_state; /* Aggregated max performance state */ 122eb594b73SUlf Hansson cpumask_var_t cpus; /* A cpumask of the attached CPUs */ 123f721889fSRafael J. Wysocki int (*power_off)(struct generic_pm_domain *domain); 124f721889fSRafael J. Wysocki int (*power_on)(struct generic_pm_domain *domain); 125d4f81383SUlf Hansson struct raw_notifier_head power_notifiers; /* Power on/off notifiers */ 1261067ae3eSViresh Kumar struct opp_table *opp_table; /* OPP table of the genpd */ 1276e41766aSViresh Kumar unsigned int (*opp_to_performance_state)(struct generic_pm_domain *genpd, 1286e41766aSViresh Kumar struct dev_pm_opp *opp); 12942f6284aSViresh Kumar int (*set_performance_state)(struct generic_pm_domain *genpd, 13042f6284aSViresh Kumar unsigned int state); 131d5e4cbfeSRafael J. Wysocki struct gpd_dev_ops dev_ops; 132221e9b58SRafael J. Wysocki s64 max_off_time_ns; /* Maximum allowed "suspended" time. */ 1336ff7bb0dSRafael J. Wysocki bool max_off_time_changed; 1346ff7bb0dSRafael J. Wysocki bool cached_power_down_ok; 135e9499968SUlf Hansson bool cached_power_down_state_idx; 136c16561e8SUlf Hansson int (*attach_dev)(struct generic_pm_domain *domain, 137c16561e8SUlf Hansson struct device *dev); 138c16561e8SUlf Hansson void (*detach_dev)(struct generic_pm_domain *domain, 139c16561e8SUlf Hansson struct device *dev); 140c11f6f5bSUlf Hansson unsigned int flags; /* Bit field of configs for genpd */ 14159d65b73SLina Iyer struct genpd_power_state *states; 14249a27e27SUlf Hansson void (*free_states)(struct genpd_power_state *states, 14349a27e27SUlf Hansson unsigned int state_count); 144fc5cbf0cSAxel Haslam unsigned int state_count; /* number of states */ 145fc5cbf0cSAxel Haslam unsigned int state_idx; /* state that genpd will go to when off */ 146afece3abSThara Gopinath ktime_t on_time; 147afece3abSThara Gopinath ktime_t accounting_time; 14835241d12SLina Iyer const struct genpd_lock_ops *lock_ops; 149d716f479SLina Iyer union { 15035241d12SLina Iyer struct mutex mlock; 151d716f479SLina Iyer struct { 152d716f479SLina Iyer spinlock_t slock; 153d716f479SLina Iyer unsigned long lock_flags; 154d716f479SLina Iyer }; 155d716f479SLina Iyer }; 156fc5cbf0cSAxel Haslam 157f721889fSRafael J. Wysocki }; 158f721889fSRafael J. Wysocki 159596ba34bSRafael J. Wysocki static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) 160596ba34bSRafael J. Wysocki { 161596ba34bSRafael J. Wysocki return container_of(pd, struct generic_pm_domain, domain); 162596ba34bSRafael J. Wysocki } 163596ba34bSRafael J. Wysocki 1645063ce15SRafael J. Wysocki struct gpd_link { 1658d87ae48SKees Cook struct generic_pm_domain *parent; 1668d87ae48SKees Cook struct list_head parent_node; 1678d87ae48SKees Cook struct generic_pm_domain *child; 1688d87ae48SKees Cook struct list_head child_node; 16918edf49cSViresh Kumar 17018edf49cSViresh Kumar /* Sub-domain's per-master domain performance state */ 17118edf49cSViresh Kumar unsigned int performance_state; 17218edf49cSViresh Kumar unsigned int prev_performance_state; 1735063ce15SRafael J. Wysocki }; 1745063ce15SRafael J. Wysocki 175b02c999aSRafael J. Wysocki struct gpd_timing_data { 1762b1d88cdSUlf Hansson s64 suspend_latency_ns; 1772b1d88cdSUlf Hansson s64 resume_latency_ns; 178a5bef810SRafael J. Wysocki s64 effective_constraint_ns; 1796ff7bb0dSRafael J. Wysocki bool constraint_changed; 1809df3921eSUlf Hansson bool cached_suspend_ok; 181b02c999aSRafael J. Wysocki }; 182b02c999aSRafael J. Wysocki 18300e7c295SUlf Hansson struct pm_domain_data { 18400e7c295SUlf Hansson struct list_head list_node; 18500e7c295SUlf Hansson struct device *dev; 18600e7c295SUlf Hansson }; 18700e7c295SUlf Hansson 188cd0ea672SRafael J. Wysocki struct generic_pm_domain_data { 189cd0ea672SRafael J. Wysocki struct pm_domain_data base; 190b02c999aSRafael J. Wysocki struct gpd_timing_data td; 1916ff7bb0dSRafael J. Wysocki struct notifier_block nb; 192d4f81383SUlf Hansson struct notifier_block *power_nb; 193f9ccd7c3SUlf Hansson int cpu; 19442f6284aSViresh Kumar unsigned int performance_state; 195*67e3242eSLina Iyer ktime_t next_wakeup; 196a5ea7a0fSDave Gerlach void *data; 197cd0ea672SRafael J. Wysocki }; 198cd0ea672SRafael J. Wysocki 1999b4f617bSGuennadi Liakhovetski #ifdef CONFIG_PM_GENERIC_DOMAINS 200cd0ea672SRafael J. Wysocki static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *pdd) 201cd0ea672SRafael J. Wysocki { 202cd0ea672SRafael J. Wysocki return container_of(pdd, struct generic_pm_domain_data, base); 203cd0ea672SRafael J. Wysocki } 204cd0ea672SRafael J. Wysocki 205d5e4cbfeSRafael J. Wysocki static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev) 206d5e4cbfeSRafael J. Wysocki { 207d5e4cbfeSRafael J. Wysocki return to_gpd_data(dev->power.subsys_data->domain_data); 208d5e4cbfeSRafael J. Wysocki } 209d5e4cbfeSRafael J. Wysocki 2101a7a6707SUlf Hansson int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev); 211924f4486SUlf Hansson int pm_genpd_remove_device(struct device *dev); 212781b9d6bSUlf Hansson int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, 2130d1e16c6SUlf Hansson struct generic_pm_domain *subdomain); 214781b9d6bSUlf Hansson int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, 2150d1e16c6SUlf Hansson struct generic_pm_domain *subdomain); 216781b9d6bSUlf Hansson int pm_genpd_init(struct generic_pm_domain *genpd, 217f721889fSRafael J. Wysocki struct dev_power_governor *gov, bool is_off); 218781b9d6bSUlf Hansson int pm_genpd_remove(struct generic_pm_domain *genpd); 219781b9d6bSUlf Hansson int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state); 220d4f81383SUlf Hansson int dev_pm_genpd_add_notifier(struct device *dev, struct notifier_block *nb); 221d4f81383SUlf Hansson int dev_pm_genpd_remove_notifier(struct device *dev); 222*67e3242eSLina Iyer void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next); 223b02c999aSRafael J. Wysocki 224ae3c511cSUlf Hansson extern struct dev_power_governor simple_qos_governor; 225925b44a2SMark Brown extern struct dev_power_governor pm_domain_always_on_gov; 226e9499968SUlf Hansson #ifdef CONFIG_CPU_IDLE 227e9499968SUlf Hansson extern struct dev_power_governor pm_domain_cpu_gov; 228e9499968SUlf Hansson #endif 229f721889fSRafael J. Wysocki #else 230b02c999aSRafael J. Wysocki 231b642631dSMagnus Damm static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev) 232b642631dSMagnus Damm { 233b642631dSMagnus Damm return ERR_PTR(-ENOSYS); 234b642631dSMagnus Damm } 2351a7a6707SUlf Hansson static inline int pm_genpd_add_device(struct generic_pm_domain *genpd, 2361a7a6707SUlf Hansson struct device *dev) 237b02c999aSRafael J. Wysocki { 238b02c999aSRafael J. Wysocki return -ENOSYS; 239b02c999aSRafael J. Wysocki } 240924f4486SUlf Hansson static inline int pm_genpd_remove_device(struct device *dev) 241f721889fSRafael J. Wysocki { 242f721889fSRafael J. Wysocki return -ENOSYS; 243f721889fSRafael J. Wysocki } 244f721889fSRafael J. Wysocki static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, 2450d1e16c6SUlf Hansson struct generic_pm_domain *subdomain) 246f721889fSRafael J. Wysocki { 247f721889fSRafael J. Wysocki return -ENOSYS; 248f721889fSRafael J. Wysocki } 249f721889fSRafael J. Wysocki static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, 2500d1e16c6SUlf Hansson struct generic_pm_domain *subdomain) 251f721889fSRafael J. Wysocki { 252f721889fSRafael J. Wysocki return -ENOSYS; 253f721889fSRafael J. Wysocki } 2547eb231c3SUlf Hansson static inline int pm_genpd_init(struct generic_pm_domain *genpd, 255b642631dSMagnus Damm struct dev_power_governor *gov, bool is_off) 256b02c999aSRafael J. Wysocki { 2577eb231c3SUlf Hansson return -ENOSYS; 258b02c999aSRafael J. Wysocki } 2593fe57710SJon Hunter static inline int pm_genpd_remove(struct generic_pm_domain *genpd) 2603fe57710SJon Hunter { 261a94ef811SLina Iyer return -EOPNOTSUPP; 2623fe57710SJon Hunter } 26316d0bf18SGeert Uytterhoeven 26442f6284aSViresh Kumar static inline int dev_pm_genpd_set_performance_state(struct device *dev, 26542f6284aSViresh Kumar unsigned int state) 26642f6284aSViresh Kumar { 267a94ef811SLina Iyer return -EOPNOTSUPP; 26842f6284aSViresh Kumar } 26942f6284aSViresh Kumar 270d4f81383SUlf Hansson static inline int dev_pm_genpd_add_notifier(struct device *dev, 271d4f81383SUlf Hansson struct notifier_block *nb) 272d4f81383SUlf Hansson { 273a94ef811SLina Iyer return -EOPNOTSUPP; 274d4f81383SUlf Hansson } 275d4f81383SUlf Hansson 276d4f81383SUlf Hansson static inline int dev_pm_genpd_remove_notifier(struct device *dev) 277d4f81383SUlf Hansson { 278a94ef811SLina Iyer return -EOPNOTSUPP; 279d4f81383SUlf Hansson } 280d4f81383SUlf Hansson 281*67e3242eSLina Iyer static inline void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next) 282*67e3242eSLina Iyer { } 283*67e3242eSLina Iyer 28416d0bf18SGeert Uytterhoeven #define simple_qos_governor (*(struct dev_power_governor *)(NULL)) 28516d0bf18SGeert Uytterhoeven #define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL)) 28617f2ae7fSRafael J. Wysocki #endif 28717f2ae7fSRafael J. Wysocki 28877f827deSRafael J. Wysocki #ifdef CONFIG_PM_GENERIC_DOMAINS_SLEEP 289fc519890SUlf Hansson void dev_pm_genpd_suspend(struct device *dev); 290fc519890SUlf Hansson void dev_pm_genpd_resume(struct device *dev); 29177f827deSRafael J. Wysocki #else 292fc519890SUlf Hansson static inline void dev_pm_genpd_suspend(struct device *dev) {} 293fc519890SUlf Hansson static inline void dev_pm_genpd_resume(struct device *dev) {} 29477f827deSRafael J. Wysocki #endif 29577f827deSRafael J. Wysocki 296aa42240aSTomasz Figa /* OF PM domain providers */ 297aa42240aSTomasz Figa struct of_device_id; 298aa42240aSTomasz Figa 29940845524SThierry Reding typedef struct generic_pm_domain *(*genpd_xlate_t)(struct of_phandle_args *args, 30040845524SThierry Reding void *data); 30140845524SThierry Reding 302aa42240aSTomasz Figa struct genpd_onecell_data { 303aa42240aSTomasz Figa struct generic_pm_domain **domains; 304aa42240aSTomasz Figa unsigned int num_domains; 30540845524SThierry Reding genpd_xlate_t xlate; 306aa42240aSTomasz Figa }; 307aa42240aSTomasz Figa 308aa42240aSTomasz Figa #ifdef CONFIG_PM_GENERIC_DOMAINS_OF 309892ebdccSJon Hunter int of_genpd_add_provider_simple(struct device_node *np, 310892ebdccSJon Hunter struct generic_pm_domain *genpd); 311892ebdccSJon Hunter int of_genpd_add_provider_onecell(struct device_node *np, 312892ebdccSJon Hunter struct genpd_onecell_data *data); 313aa42240aSTomasz Figa void of_genpd_del_provider(struct device_node *np); 314781b9d6bSUlf Hansson int of_genpd_add_device(struct of_phandle_args *args, struct device *dev); 3150d1e16c6SUlf Hansson int of_genpd_add_subdomain(struct of_phandle_args *parent_spec, 3160d1e16c6SUlf Hansson struct of_phandle_args *subdomain_spec); 317dedd1492SUlf Hansson int of_genpd_remove_subdomain(struct of_phandle_args *parent_spec, 318dedd1492SUlf Hansson struct of_phandle_args *subdomain_spec); 319781b9d6bSUlf Hansson struct generic_pm_domain *of_genpd_remove_last(struct device_node *np); 320781b9d6bSUlf Hansson int of_genpd_parse_idle_states(struct device_node *dn, 32130f60428SLina Iyer struct genpd_power_state **states, int *n); 322e38f89d3SViresh Kumar unsigned int pm_genpd_opp_to_performance_state(struct device *genpd_dev, 323e38f89d3SViresh Kumar struct dev_pm_opp *opp); 324aa42240aSTomasz Figa 325aa42240aSTomasz Figa int genpd_dev_pm_attach(struct device *dev); 3263c095f32SUlf Hansson struct device *genpd_dev_pm_attach_by_id(struct device *dev, 3273c095f32SUlf Hansson unsigned int index); 3285d6be70aSUlf Hansson struct device *genpd_dev_pm_attach_by_name(struct device *dev, 3297416f1f2SDouglas Anderson const char *name); 330aa42240aSTomasz Figa #else /* !CONFIG_PM_GENERIC_DOMAINS_OF */ 331892ebdccSJon Hunter static inline int of_genpd_add_provider_simple(struct device_node *np, 332892ebdccSJon Hunter struct generic_pm_domain *genpd) 333aa42240aSTomasz Figa { 334a94ef811SLina Iyer return -EOPNOTSUPP; 335aa42240aSTomasz Figa } 336aa42240aSTomasz Figa 337892ebdccSJon Hunter static inline int of_genpd_add_provider_onecell(struct device_node *np, 338892ebdccSJon Hunter struct genpd_onecell_data *data) 339892ebdccSJon Hunter { 340a94ef811SLina Iyer return -EOPNOTSUPP; 341892ebdccSJon Hunter } 342892ebdccSJon Hunter 343892ebdccSJon Hunter static inline void of_genpd_del_provider(struct device_node *np) {} 344aa42240aSTomasz Figa 345ec69572bSJon Hunter static inline int of_genpd_add_device(struct of_phandle_args *args, 346ec69572bSJon Hunter struct device *dev) 347ec69572bSJon Hunter { 348ec69572bSJon Hunter return -ENODEV; 349ec69572bSJon Hunter } 350ec69572bSJon Hunter 3510d1e16c6SUlf Hansson static inline int of_genpd_add_subdomain(struct of_phandle_args *parent_spec, 3520d1e16c6SUlf Hansson struct of_phandle_args *subdomain_spec) 353ec69572bSJon Hunter { 354ec69572bSJon Hunter return -ENODEV; 355ec69572bSJon Hunter } 356ec69572bSJon Hunter 357dedd1492SUlf Hansson static inline int of_genpd_remove_subdomain(struct of_phandle_args *parent_spec, 358dedd1492SUlf Hansson struct of_phandle_args *subdomain_spec) 359dedd1492SUlf Hansson { 360dedd1492SUlf Hansson return -ENODEV; 361dedd1492SUlf Hansson } 362dedd1492SUlf Hansson 36330f60428SLina Iyer static inline int of_genpd_parse_idle_states(struct device_node *dn, 36430f60428SLina Iyer struct genpd_power_state **states, int *n) 36530f60428SLina Iyer { 36630f60428SLina Iyer return -ENODEV; 36730f60428SLina Iyer } 36830f60428SLina Iyer 3696e41766aSViresh Kumar static inline unsigned int 370e38f89d3SViresh Kumar pm_genpd_opp_to_performance_state(struct device *genpd_dev, 371e38f89d3SViresh Kumar struct dev_pm_opp *opp) 372e38f89d3SViresh Kumar { 373e38f89d3SViresh Kumar return 0; 374e38f89d3SViresh Kumar } 375e38f89d3SViresh Kumar 376aa42240aSTomasz Figa static inline int genpd_dev_pm_attach(struct device *dev) 377aa42240aSTomasz Figa { 378919b7308SUlf Hansson return 0; 379aa42240aSTomasz Figa } 38017926551SJon Hunter 3813c095f32SUlf Hansson static inline struct device *genpd_dev_pm_attach_by_id(struct device *dev, 3823c095f32SUlf Hansson unsigned int index) 3833c095f32SUlf Hansson { 3843c095f32SUlf Hansson return NULL; 3853c095f32SUlf Hansson } 3863c095f32SUlf Hansson 3875d6be70aSUlf Hansson static inline struct device *genpd_dev_pm_attach_by_name(struct device *dev, 3887416f1f2SDouglas Anderson const char *name) 3895d6be70aSUlf Hansson { 3905d6be70aSUlf Hansson return NULL; 3915d6be70aSUlf Hansson } 3925d6be70aSUlf Hansson 39317926551SJon Hunter static inline 39417926551SJon Hunter struct generic_pm_domain *of_genpd_remove_last(struct device_node *np) 39517926551SJon Hunter { 396a94ef811SLina Iyer return ERR_PTR(-EOPNOTSUPP); 39717926551SJon Hunter } 398aa42240aSTomasz Figa #endif /* CONFIG_PM_GENERIC_DOMAINS_OF */ 399aa42240aSTomasz Figa 400f48c767cSUlf Hansson #ifdef CONFIG_PM 401781b9d6bSUlf Hansson int dev_pm_domain_attach(struct device *dev, bool power_on); 40282e12d9eSUlf Hansson struct device *dev_pm_domain_attach_by_id(struct device *dev, 40382e12d9eSUlf Hansson unsigned int index); 40427dceb81SUlf Hansson struct device *dev_pm_domain_attach_by_name(struct device *dev, 405eeb35df0SDouglas Anderson const char *name); 406781b9d6bSUlf Hansson void dev_pm_domain_detach(struct device *dev, bool power_off); 407ca765a8cSUlf Hansson int dev_pm_domain_start(struct device *dev); 408781b9d6bSUlf Hansson void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd); 409f48c767cSUlf Hansson #else 410f48c767cSUlf Hansson static inline int dev_pm_domain_attach(struct device *dev, bool power_on) 411f48c767cSUlf Hansson { 412919b7308SUlf Hansson return 0; 413f48c767cSUlf Hansson } 41482e12d9eSUlf Hansson static inline struct device *dev_pm_domain_attach_by_id(struct device *dev, 41582e12d9eSUlf Hansson unsigned int index) 41682e12d9eSUlf Hansson { 41782e12d9eSUlf Hansson return NULL; 41882e12d9eSUlf Hansson } 41927dceb81SUlf Hansson static inline struct device *dev_pm_domain_attach_by_name(struct device *dev, 420eeb35df0SDouglas Anderson const char *name) 42127dceb81SUlf Hansson { 42227dceb81SUlf Hansson return NULL; 42327dceb81SUlf Hansson } 424f48c767cSUlf Hansson static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {} 425ca765a8cSUlf Hansson static inline int dev_pm_domain_start(struct device *dev) 426ca765a8cSUlf Hansson { 427ca765a8cSUlf Hansson return 0; 428ca765a8cSUlf Hansson } 429989561deSTomeu Vizoso static inline void dev_pm_domain_set(struct device *dev, 430989561deSTomeu Vizoso struct dev_pm_domain *pd) {} 431f48c767cSUlf Hansson #endif 432f48c767cSUlf Hansson 433f721889fSRafael J. Wysocki #endif /* _LINUX_PM_DOMAIN_H */ 434