* refs/heads/tmp-0fad51f: ANDROID: sched: Add vendor hooks for update_load_avg ANDROID: Update ABI with __traceiter_*() additions ANDROID: Update the cf symbol list ANDROID: Update the qcom symbol list ANDROID: Update the hikey960 symbol list ANDROID: Update the generic symbol list ANDROID: Update the exynos symbol list ANDROID: Update the db845c symbol list UPSTREAM: arm64: Move PSTATE.TCO setting to separate functions FROMGIT: kasan: Add report for async mode FROMGIT: arm64: mte: Drop arch_enable_tagging() ANDROID: GKI: 4/23 KMI update FROMGIT: kasan: Add KASAN mode kernel parameter FROMGIT: arm64: mte: Add asynchronous mode support ANDROID: GKI: update ABI description FROMLIST: remoteproc: core: Move cdev add before device add ANDROID: mm: allow vmas with vm_ops to be speculatively handled ANDROID: sched: Add ANDROID_OEM_DATA_ARRAY in user_struct. ANDROID: sched: Add vendor hooks for sched. ANDROID: sched: Add vendor hooks to compute new cpu freq. Revert "Revert "net: xfrm: Localize sequence counter per network namespace"" FROMGIT: usb: typec: tcpm: Allow slow charging loops to comply to pSnkStby FROMGIT: usb: dwc3: gadget: Check for disabled LPM quirk ANDROID: GKI: arm64: reserve space in cpu_hwcaps and cpu_hwcap_keys arrays FROMLIST: export: Make CRCs robust to symbol trimming ANDROID: Kconfig.gki Add SND_SOC_TOPOLOGY ANDROID: GKI: Change UCLAMP_BUCKETS_COUNT to 20 FROMGIT: ASoC: soc-component: Add snd_soc_pcm_component_ack UPSTREAM: ASoC: dmaengine_pcm: add peripheral configuration UPSTREAM: dmaengine: add peripheral configuration UPSTREAM: PM: domains: use device's next wakeup to determine domain idle state UPSTREAM: PM: domains: inform PM domain of a device's next wakeup Revert "FROMLIST: PM / Domains: add domain feature flag for next wakeup" Revert "FROMLIST: PM / domains: inform PM domain of a device's next wakeup" Revert "FROMLIST: PM / Domains: use device's next wakeup to determine domain idle state" FROMGIT: mm: cma: add the CMA instance name to cma trace events FROMGIT: mm: cma: Add the CMA instance name to the cma_alloc_start trace event FROMGIT: mm: cma: add trace events for CMA alloc perf testing ANDROID: mm: compaction: fix isolate_and_split_free_page() redefinition ANDROID: vendor_hooks: Fix build-break due to psi_event ANDROID: GKI: Update abi_gki_aarch64_qcom list for kprobe module ANDROID: GKI: Enable CONFIG_HIST_TRIGGERS FROMGIT: tick/broadcast: Allow late registered device to enter oneshot mode UPSTREAM: arm64: uaccess: split user/kernel routines UPSTREAM: arm64: uaccess: refactor __{get,put}_user BACKPORT: arm64: uaccess: rename privileged uaccess routines ANDROID: Incremental fs: Add INCFS_IOC_GET_LAST_READ_ERROR ANDROID: Incremental fs: Fix INCFS_MAGIC_NUMBER casts ANDROID: Incremental fs: Add status to sysfs ANDROID: Incremental fs: fix u64 integer cast to pointer ANDROID: Incremental fs: stat should return actual used blocks ANDROID: Incremental fs: Add FS_IOC_READ_VERITY_METADATA ANDROID: export find_user() & free_uid()for GKI purpose. ANDROID: GKI: update ABI description ANDROID: GKI: Update abi_gki_aarch64_qcom for kgsl AO tracing support ANDROID: ABI: update symbols to unisoc whitelist for the fifth time ANDROID: sched: Add vendor hooks for cpu affinity. ANDROID: GKI: Update abi_gki_aarch64_qcom list for reverse migration ANDROID: abi_gki_aarch64_generic: Add a few more symbols FROMGIT: usb: dwc3: gadget: Remove FS bInterval_m1 limitation ANDROID: abi_gki_aarch64_qcom: Add __bitmap_or ANDROID: GKI: Update abi_gki_aarch64_qcom for gpio block read tracepoint FROMGIT: dt-bindings: connector: Add slow-charger-loop definition FROMGIT: usb: dwc3: gadget: Fix START_TRANSFER link state check FROMGIT: usb: gadget: Fix double free of device descriptor pointers FROMGIT: usb: typec: tcpm: Fix error while calculating PPS out values ANDROID: inline isolate_and_split_free_page ANDROID: kernel: clear debug_kinfo precisely ANDROID: cgroup: Add vendor hook for cpuset. ANDROID: GKI: Update abi_gki_aarch64_qcom for PSI tracepoints ANDROID: psi: Add vendor hooks for PSI tracing Linux 5.10.32 net: phy: marvell: fix detection of PHY on Topaz switches bpf: Move sanitize_val_alu out of op switch bpf: Improve verifier error messages for users bpf: Rework ptr_limit into alu_limit and add common error path arm64: mte: Ensure TIF_MTE_ASYNC_FAULT is set atomically ARM: 9071/1: uprobes: Don't hook on thumb instructions bpf: Move off_reg into sanitize_ptr_alu bpf: Ensure off_reg has no mixed signed bounds for all types r8169: don't advertise pause in jumbo mode r8169: tweak max read request size for newer chips also in jumbo mtu mode KVM: VMX: Don't use vcpu->run->internal.ndata as an array index KVM: VMX: Convert vcpu_vmx.exit_reason to a union bpf: Use correct permission flag for mixed signed bounds arithmetic arm64: dts: allwinner: h6: beelink-gs1: Remove ext. 32 kHz osc reference arm64: dts: allwinner: Fix SD card CD GPIO for SOPine systems ARM: OMAP2+: Fix uninitialized sr_inst ARM: footbridge: fix PCI interrupt mapping ARM: 9069/1: NOMMU: Fix conversion for_each_membock() to for_each_mem_range() ARM: OMAP2+: Fix warning for omap_init_time_of() gro: ensure frag0 meets IP header alignment ch_ktls: do not send snd_una update to TCB in middle ch_ktls: tcb close causes tls connection failure ch_ktls: fix device connection close ch_ktls: Fix kernel panic ibmvnic: remove duplicate napi_schedule call in open function ibmvnic: remove duplicate napi_schedule call in do_reset function ibmvnic: avoid calling napi_disable() twice ia64: tools: remove inclusion of ia64-specific version of errno.h header ia64: remove duplicate entries in generic_defconfig ethtool: pause: make sure we init driver stats i40e: fix the panic when running bpf in xdpdrv mode net: Make tcp_allowed_congestion_control readonly in non-init netns mm: ptdump: fix build failure net: ip6_tunnel: Unregister catch-all devices net: sit: Unregister catch-all devices net: davicom: Fix regulator not turned off on failed probe net/mlx5e: Fix setting of RS FEC mode netfilter: nft_limit: avoid possible divide error in nft_limit_init net/mlx5e: fix ingress_ifindex check in mlx5e_flower_parse_meta net: macb: fix the restore of cmp registers libbpf: Fix potential NULL pointer dereference netfilter: arp_tables: add pre_exit hook for table unregister netfilter: bridge: add pre_exit hooks for ebtable unregistration libnvdimm/region: Fix nvdimm_has_flush() to handle ND_REGION_ASYNC ice: Fix potential infinite loop when using u8 loop counter netfilter: conntrack: do not print icmpv6 as unknown via /proc netfilter: flowtable: fix NAT IPv6 offload mangling ixgbe: fix unbalanced device enable/disable in suspend/resume scsi: libsas: Reset num_scatter if libata marks qc as NODATA riscv: Fix spelling mistake "SPARSEMEM" to "SPARSMEM" vfio/pci: Add missing range check in vfio_pci_mmap arm64: alternatives: Move length validation in alternative_{insn, endif} arm64: fix inline asm in load_unaligned_zeropad() readdir: make sure to verify directory entry for legacy interfaces too dm verity fec: fix misaligned RS roots IO HID: wacom: set EV_KEY and EV_ABS only for non-HID_GENERIC type of devices Input: i8042 - fix Pegatron C15B ID entry Input: s6sy761 - fix coordinate read bit shift lib: fix kconfig dependency on ARCH_WANT_FRAME_POINTERS virt_wifi: Return micros for BSS TSF values mac80211: clear sta->fast_rx when STA removed from 4-addr VLAN pcnet32: Use pci_resource_len to validate PCI resource net: ieee802154: forbid monitor for add llsec seclevel net: ieee802154: stop dump llsec seclevels for monitors net: ieee802154: forbid monitor for del llsec devkey net: ieee802154: forbid monitor for add llsec devkey net: ieee802154: stop dump llsec devkeys for monitors net: ieee802154: forbid monitor for del llsec dev net: ieee802154: forbid monitor for add llsec dev net: ieee802154: stop dump llsec devs for monitors net: ieee802154: forbid monitor for del llsec key net: ieee802154: forbid monitor for add llsec key net: ieee802154: stop dump llsec keys for monitors iwlwifi: add support for Qu with AX201 device scsi: scsi_transport_srp: Don't block target in SRP_PORT_LOST state ASoC: fsl_esai: Fix TDM slot setup for I2S mode drm/msm: Fix a5xx/a6xx timestamps ARM: omap1: fix building with clang IAS ARM: keystone: fix integer overflow warning neighbour: Disregard DEAD dst in neigh_update gpu/xen: Fix a use after free in xen_drm_drv_init ASoC: max98373: Added 30ms turn on/off time delay ASoC: max98373: Changed amp shutdown register as volatile xfrm: BEET mode doesn't support fragments for inner packets iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd() arc: kernel: Return -EFAULT if copy_to_user() fails lockdep: Add a missing initialization hint to the "INFO: Trying to register non-static key" message ARM: dts: Fix moving mmc devices with aliases for omap4 & 5 ARM: dts: Drop duplicate sha2md5_fck to fix clk_disable race ACPI: x86: Call acpi_boot_table_init() after acpi_table_upgrade() dmaengine: idxd: fix wq cleanup of WQCFG registers dmaengine: plx_dma: add a missing put_device() on error path dmaengine: Fix a double free in dma_async_device_register dmaengine: dw: Make it dependent to HAS_IOMEM dmaengine: idxd: fix wq size store permission state dmaengine: idxd: fix opcap sysfs attribute output dmaengine: idxd: fix delta_rec and crc size field for completion record dmaengine: idxd: Fix clobbering of SWERR overflow bit on writeback gpio: sysfs: Obey valid_mask Input: nspire-keypad - enable interrupts only when opened mtd: rawnand: mtk: Fix WAITRDY break condition and timeout net/sctp: fix race condition in sctp_destroy_sock ANDROID: abi_gki_aarch64_qcom: Add android_rvh_sched_setaffinity ANDROID: gki_defconfig: temporarily disable KFENCE in GKI ANDROID: GKI: Update abi_gki_aarch64_qcom list for minidump ANDROID: implement wrapper for reverse migration ANDROID: cpuidle: enable TEO and MENU governors in gki_defconfig ANDROID: abi_gki_aarch64_qcom: Update symbol list ANDROID: clang: update to 12.0.5 ANDROID: Add initial Exynos symbol list Conflicts: Documentation/devicetree/bindings Documentation/devicetree/bindings/connector/usb-connector.yaml include/linux/pm_domain.h Change-Id: I5701e429fa31cfb870b758f09af62b9bdad0fac9 Signed-off-by: Ivaylo Georgiev <irgeorgiev@codeaurora.org>
445 lines
13 KiB
C
445 lines
13 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* pm_domain.h - Definitions and headers related to device power domains.
|
|
*
|
|
* Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp.
|
|
*/
|
|
|
|
#ifndef _LINUX_PM_DOMAIN_H
|
|
#define _LINUX_PM_DOMAIN_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/ktime.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/pm.h>
|
|
#include <linux/err.h>
|
|
#include <linux/of.h>
|
|
#include <linux/notifier.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/cpumask.h>
|
|
|
|
/*
|
|
* Flags to control the behaviour of a genpd.
|
|
*
|
|
* These flags may be set in the struct generic_pm_domain's flags field by a
|
|
* genpd backend driver. The flags must be set before it calls pm_genpd_init(),
|
|
* which initializes a genpd.
|
|
*
|
|
* GENPD_FLAG_PM_CLK: Instructs genpd to use the PM clk framework,
|
|
* while powering on/off attached devices.
|
|
*
|
|
* GENPD_FLAG_IRQ_SAFE: This informs genpd that its backend callbacks,
|
|
* ->power_on|off(), doesn't sleep. Hence, these
|
|
* can be invoked from within atomic context, which
|
|
* enables genpd to power on/off the PM domain,
|
|
* even when pm_runtime_is_irq_safe() returns true,
|
|
* for any of its attached devices. Note that, a
|
|
* genpd having this flag set, requires its
|
|
* masterdomains to also have it set.
|
|
*
|
|
* GENPD_FLAG_ALWAYS_ON: Instructs genpd to always keep the PM domain
|
|
* powered on.
|
|
*
|
|
* GENPD_FLAG_ACTIVE_WAKEUP: Instructs genpd to keep the PM domain powered
|
|
* on, in case any of its attached devices is used
|
|
* in the wakeup path to serve system wakeups.
|
|
*
|
|
* GENPD_FLAG_CPU_DOMAIN: Instructs genpd that it should expect to get
|
|
* devices attached, which may belong to CPUs or
|
|
* possibly have subdomains with CPUs attached.
|
|
* This flag enables the genpd backend driver to
|
|
* deploy idle power management support for CPUs
|
|
* and groups of CPUs. Note that, the backend
|
|
* driver must then comply with the so called,
|
|
* last-man-standing algorithm, for the CPUs in the
|
|
* PM domain.
|
|
*
|
|
* GENPD_FLAG_RPM_ALWAYS_ON: Instructs genpd to always keep the PM domain
|
|
* powered on except for system suspend.
|
|
*
|
|
* GENPD_FLAG_MIN_RESIDENCY: Enable the genpd governor to consider its
|
|
* components' next wakeup when determining the
|
|
* optimal idle state.
|
|
*/
|
|
#define GENPD_FLAG_PM_CLK (1U << 0)
|
|
#define GENPD_FLAG_IRQ_SAFE (1U << 1)
|
|
#define GENPD_FLAG_ALWAYS_ON (1U << 2)
|
|
#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3)
|
|
#define GENPD_FLAG_CPU_DOMAIN (1U << 4)
|
|
#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
|
|
#define GENPD_FLAG_MIN_RESIDENCY (1U << 6)
|
|
|
|
enum gpd_status {
|
|
GENPD_STATE_ON = 0, /* PM domain is on */
|
|
GENPD_STATE_OFF, /* PM domain is off */
|
|
};
|
|
|
|
enum genpd_notication {
|
|
GENPD_NOTIFY_PRE_OFF = 0,
|
|
GENPD_NOTIFY_OFF,
|
|
GENPD_NOTIFY_PRE_ON,
|
|
GENPD_NOTIFY_ON,
|
|
};
|
|
|
|
struct dev_power_governor {
|
|
bool (*power_down_ok)(struct dev_pm_domain *domain);
|
|
bool (*suspend_ok)(struct device *dev);
|
|
};
|
|
|
|
struct gpd_dev_ops {
|
|
int (*start)(struct device *dev);
|
|
int (*stop)(struct device *dev);
|
|
};
|
|
|
|
struct genpd_power_state {
|
|
s64 power_off_latency_ns;
|
|
s64 power_on_latency_ns;
|
|
s64 residency_ns;
|
|
u64 usage;
|
|
u64 rejected;
|
|
struct fwnode_handle *fwnode;
|
|
ktime_t idle_time;
|
|
void *data;
|
|
};
|
|
|
|
struct genpd_lock_ops;
|
|
struct dev_pm_opp;
|
|
struct opp_table;
|
|
|
|
struct generic_pm_domain {
|
|
struct device dev;
|
|
struct dev_pm_domain domain; /* PM domain operations */
|
|
struct list_head gpd_list_node; /* Node in the global PM domains list */
|
|
struct list_head parent_links; /* Links with PM domain as a parent */
|
|
struct list_head child_links; /* Links with PM domain as a child */
|
|
struct list_head dev_list; /* List of devices */
|
|
struct dev_power_governor *gov;
|
|
struct work_struct power_off_work;
|
|
struct fwnode_handle *provider; /* Identity of the domain provider */
|
|
bool has_provider;
|
|
const char *name;
|
|
atomic_t sd_count; /* Number of subdomains with power "on" */
|
|
enum gpd_status status; /* Current state of the domain */
|
|
unsigned int device_count; /* Number of devices */
|
|
unsigned int suspended_count; /* System suspend device counter */
|
|
unsigned int prepared_count; /* Suspend counter of prepared devices */
|
|
unsigned int performance_state; /* Aggregated max performance state */
|
|
cpumask_var_t cpus; /* A cpumask of the attached CPUs */
|
|
int (*power_off)(struct generic_pm_domain *domain);
|
|
int (*power_on)(struct generic_pm_domain *domain);
|
|
struct raw_notifier_head power_notifiers; /* Power on/off notifiers */
|
|
struct opp_table *opp_table; /* OPP table of the genpd */
|
|
unsigned int (*opp_to_performance_state)(struct generic_pm_domain *genpd,
|
|
struct dev_pm_opp *opp);
|
|
int (*set_performance_state)(struct generic_pm_domain *genpd,
|
|
unsigned int state);
|
|
struct gpd_dev_ops dev_ops;
|
|
s64 max_off_time_ns; /* Maximum allowed "suspended" time. */
|
|
ktime_t next_wakeup; /* Maintained by the domain governor */
|
|
bool max_off_time_changed;
|
|
bool cached_power_down_ok;
|
|
bool cached_power_down_state_idx;
|
|
int (*attach_dev)(struct generic_pm_domain *domain,
|
|
struct device *dev);
|
|
void (*detach_dev)(struct generic_pm_domain *domain,
|
|
struct device *dev);
|
|
unsigned int flags; /* Bit field of configs for genpd */
|
|
struct genpd_power_state *states;
|
|
void (*free_states)(struct genpd_power_state *states,
|
|
unsigned int state_count);
|
|
unsigned int state_count; /* number of states */
|
|
unsigned int state_idx; /* state that genpd will go to when off */
|
|
ktime_t on_time;
|
|
ktime_t accounting_time;
|
|
const struct genpd_lock_ops *lock_ops;
|
|
union {
|
|
struct mutex mlock;
|
|
struct {
|
|
spinlock_t slock;
|
|
unsigned long lock_flags;
|
|
};
|
|
};
|
|
|
|
};
|
|
|
|
static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd)
|
|
{
|
|
return container_of(pd, struct generic_pm_domain, domain);
|
|
}
|
|
|
|
struct gpd_link {
|
|
struct generic_pm_domain *parent;
|
|
struct list_head parent_node;
|
|
struct generic_pm_domain *child;
|
|
struct list_head child_node;
|
|
|
|
/* Sub-domain's per-master domain performance state */
|
|
unsigned int performance_state;
|
|
unsigned int prev_performance_state;
|
|
};
|
|
|
|
struct gpd_timing_data {
|
|
s64 suspend_latency_ns;
|
|
s64 resume_latency_ns;
|
|
s64 effective_constraint_ns;
|
|
bool constraint_changed;
|
|
bool cached_suspend_ok;
|
|
};
|
|
|
|
struct pm_domain_data {
|
|
struct list_head list_node;
|
|
struct device *dev;
|
|
};
|
|
|
|
struct generic_pm_domain_data {
|
|
struct pm_domain_data base;
|
|
struct gpd_timing_data td;
|
|
struct notifier_block nb;
|
|
struct notifier_block *power_nb;
|
|
int cpu;
|
|
unsigned int performance_state;
|
|
ktime_t next_wakeup;
|
|
void *data;
|
|
};
|
|
|
|
#ifdef CONFIG_PM_GENERIC_DOMAINS
|
|
static inline struct generic_pm_domain_data *to_gpd_data(struct pm_domain_data *pdd)
|
|
{
|
|
return container_of(pdd, struct generic_pm_domain_data, base);
|
|
}
|
|
|
|
static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev)
|
|
{
|
|
return to_gpd_data(dev->power.subsys_data->domain_data);
|
|
}
|
|
|
|
int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev);
|
|
int pm_genpd_remove_device(struct device *dev);
|
|
int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
|
|
struct generic_pm_domain *subdomain);
|
|
int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
|
|
struct generic_pm_domain *subdomain);
|
|
int pm_genpd_init(struct generic_pm_domain *genpd,
|
|
struct dev_power_governor *gov, bool is_off);
|
|
int pm_genpd_remove(struct generic_pm_domain *genpd);
|
|
int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state);
|
|
int dev_pm_genpd_add_notifier(struct device *dev, struct notifier_block *nb);
|
|
int dev_pm_genpd_remove_notifier(struct device *dev);
|
|
void genpd_enable_next_wakeup(struct generic_pm_domain *genpd, bool enable);
|
|
void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next);
|
|
|
|
extern struct dev_power_governor simple_qos_governor;
|
|
extern struct dev_power_governor pm_domain_always_on_gov;
|
|
#ifdef CONFIG_CPU_IDLE
|
|
extern struct dev_power_governor pm_domain_cpu_gov;
|
|
#endif
|
|
#else
|
|
|
|
static inline struct generic_pm_domain_data *dev_gpd_data(struct device *dev)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
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 device *dev)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
|
|
struct generic_pm_domain *subdomain)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
|
|
struct generic_pm_domain *subdomain)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline int pm_genpd_init(struct generic_pm_domain *genpd,
|
|
struct dev_power_governor *gov, bool is_off)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline int pm_genpd_remove(struct generic_pm_domain *genpd)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int dev_pm_genpd_set_performance_state(struct device *dev,
|
|
unsigned int state)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int dev_pm_genpd_add_notifier(struct device *dev,
|
|
struct notifier_block *nb)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int dev_pm_genpd_remove_notifier(struct device *dev)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline void genpd_enable_next_wakeup(struct generic_pm_domain *genpd,
|
|
bool enable)
|
|
{ }
|
|
|
|
static inline void dev_pm_genpd_set_next_wakeup(struct device *dev, ktime_t next)
|
|
{ }
|
|
|
|
#define simple_qos_governor (*(struct dev_power_governor *)(NULL))
|
|
#define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL))
|
|
#endif
|
|
|
|
#ifdef CONFIG_PM_GENERIC_DOMAINS_SLEEP
|
|
void dev_pm_genpd_suspend(struct device *dev);
|
|
void dev_pm_genpd_resume(struct device *dev);
|
|
#else
|
|
static inline void dev_pm_genpd_suspend(struct device *dev) {}
|
|
static inline void dev_pm_genpd_resume(struct device *dev) {}
|
|
#endif
|
|
|
|
/* OF PM domain providers */
|
|
struct of_device_id;
|
|
|
|
typedef struct generic_pm_domain *(*genpd_xlate_t)(struct of_phandle_args *args,
|
|
void *data);
|
|
|
|
struct genpd_onecell_data {
|
|
struct generic_pm_domain **domains;
|
|
unsigned int num_domains;
|
|
genpd_xlate_t xlate;
|
|
};
|
|
|
|
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
|
|
int of_genpd_add_provider_simple(struct device_node *np,
|
|
struct generic_pm_domain *genpd);
|
|
int of_genpd_add_provider_onecell(struct device_node *np,
|
|
struct genpd_onecell_data *data);
|
|
void of_genpd_del_provider(struct device_node *np);
|
|
int of_genpd_add_device(struct of_phandle_args *args, struct device *dev);
|
|
int of_genpd_add_subdomain(struct of_phandle_args *parent_spec,
|
|
struct of_phandle_args *subdomain_spec);
|
|
int of_genpd_remove_subdomain(struct of_phandle_args *parent_spec,
|
|
struct of_phandle_args *subdomain_spec);
|
|
struct generic_pm_domain *of_genpd_remove_last(struct device_node *np);
|
|
int of_genpd_parse_idle_states(struct device_node *dn,
|
|
struct genpd_power_state **states, int *n);
|
|
unsigned int pm_genpd_opp_to_performance_state(struct device *genpd_dev,
|
|
struct dev_pm_opp *opp);
|
|
|
|
int genpd_dev_pm_attach(struct device *dev);
|
|
struct device *genpd_dev_pm_attach_by_id(struct device *dev,
|
|
unsigned int index);
|
|
struct device *genpd_dev_pm_attach_by_name(struct device *dev,
|
|
const char *name);
|
|
#else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
|
|
static inline int of_genpd_add_provider_simple(struct device_node *np,
|
|
struct generic_pm_domain *genpd)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int of_genpd_add_provider_onecell(struct device_node *np,
|
|
struct genpd_onecell_data *data)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline void of_genpd_del_provider(struct device_node *np) {}
|
|
|
|
static inline int of_genpd_add_device(struct of_phandle_args *args,
|
|
struct device *dev)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int of_genpd_add_subdomain(struct of_phandle_args *parent_spec,
|
|
struct of_phandle_args *subdomain_spec)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int of_genpd_remove_subdomain(struct of_phandle_args *parent_spec,
|
|
struct of_phandle_args *subdomain_spec)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int of_genpd_parse_idle_states(struct device_node *dn,
|
|
struct genpd_power_state **states, int *n)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline unsigned int
|
|
pm_genpd_opp_to_performance_state(struct device *genpd_dev,
|
|
struct dev_pm_opp *opp)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int genpd_dev_pm_attach(struct device *dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline struct device *genpd_dev_pm_attach_by_id(struct device *dev,
|
|
unsigned int index)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct device *genpd_dev_pm_attach_by_name(struct device *dev,
|
|
const char *name)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
struct generic_pm_domain *of_genpd_remove_last(struct device_node *np)
|
|
{
|
|
return ERR_PTR(-ENOTSUPP);
|
|
}
|
|
#endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
|
|
|
|
#ifdef CONFIG_PM
|
|
int dev_pm_domain_attach(struct device *dev, bool power_on);
|
|
struct device *dev_pm_domain_attach_by_id(struct device *dev,
|
|
unsigned int index);
|
|
struct device *dev_pm_domain_attach_by_name(struct device *dev,
|
|
const char *name);
|
|
void dev_pm_domain_detach(struct device *dev, bool power_off);
|
|
int dev_pm_domain_start(struct device *dev);
|
|
void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd);
|
|
#else
|
|
static inline int dev_pm_domain_attach(struct device *dev, bool power_on)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline struct device *dev_pm_domain_attach_by_id(struct device *dev,
|
|
unsigned int index)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline struct device *dev_pm_domain_attach_by_name(struct device *dev,
|
|
const char *name)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {}
|
|
static inline int dev_pm_domain_start(struct device *dev)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline void dev_pm_domain_set(struct device *dev,
|
|
struct dev_pm_domain *pd) {}
|
|
#endif
|
|
|
|
#endif /* _LINUX_PM_DOMAIN_H */
|