123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Generic OPP Interface
- *
- * Copyright (C) 2009-2010 Texas Instruments Incorporated.
- * Nishanth Menon
- * Romit Dasgupta
- * Kevin Hilman
- */
- #ifndef __LINUX_OPP_H__
- #define __LINUX_OPP_H__
- #include <linux/energy_model.h>
- #include <linux/err.h>
- #include <linux/notifier.h>
- struct clk;
- struct regulator;
- struct dev_pm_opp;
- struct device;
- struct opp_table;
- enum dev_pm_opp_event {
- OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
- OPP_EVENT_ADJUST_VOLTAGE,
- };
- /**
- * struct dev_pm_opp_supply - Power supply voltage/current values
- * @u_volt: Target voltage in microvolts corresponding to this OPP
- * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
- * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
- * @u_amp: Maximum current drawn by the device in microamperes
- * @u_watt: Power used by the device in microwatts
- *
- * This structure stores the voltage/current/power values for a single power
- * supply.
- */
- struct dev_pm_opp_supply {
- unsigned long u_volt;
- unsigned long u_volt_min;
- unsigned long u_volt_max;
- unsigned long u_amp;
- unsigned long u_watt;
- };
- /**
- * struct dev_pm_opp_icc_bw - Interconnect bandwidth values
- * @avg: Average bandwidth corresponding to this OPP (in icc units)
- * @peak: Peak bandwidth corresponding to this OPP (in icc units)
- *
- * This structure stores the bandwidth values for a single interconnect path.
- */
- struct dev_pm_opp_icc_bw {
- u32 avg;
- u32 peak;
- };
- typedef int (*config_regulators_t)(struct device *dev,
- struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp,
- struct regulator **regulators, unsigned int count);
- typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table,
- struct dev_pm_opp *opp, void *data, bool scaling_down);
- /**
- * struct dev_pm_opp_config - Device OPP configuration values
- * @clk_names: Clk names, NULL terminated array.
- * @config_clks: Custom set clk helper.
- * @prop_name: Name to postfix to properties.
- * @config_regulators: Custom set regulator helper.
- * @supported_hw: Array of hierarchy of versions to match.
- * @supported_hw_count: Number of elements in the array.
- * @regulator_names: Array of pointers to the names of the regulator, NULL terminated.
- * @genpd_names: Null terminated array of pointers containing names of genpd to
- * attach.
- * @virt_devs: Pointer to return the array of virtual devices.
- *
- * This structure contains platform specific OPP configurations for the device.
- */
- struct dev_pm_opp_config {
- /* NULL terminated */
- const char * const *clk_names;
- config_clks_t config_clks;
- const char *prop_name;
- config_regulators_t config_regulators;
- const unsigned int *supported_hw;
- unsigned int supported_hw_count;
- const char * const *regulator_names;
- const char * const *genpd_names;
- struct device ***virt_devs;
- };
- #if defined(CONFIG_PM_OPP)
- struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
- void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
- unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
- int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies);
- unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp);
- unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
- unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp);
- unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
- unsigned int index);
- bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
- int dev_pm_opp_get_opp_count(struct device *dev);
- unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
- unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
- unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
- unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
- struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
- unsigned long freq,
- bool available);
- struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
- unsigned long *freq);
- struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
- unsigned int level);
- struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
- unsigned int *level);
- struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
- unsigned long *freq);
- struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
- unsigned int *bw, int index);
- struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
- unsigned int *bw, int index);
- void dev_pm_opp_put(struct dev_pm_opp *opp);
- int dev_pm_opp_add(struct device *dev, unsigned long freq,
- unsigned long u_volt);
- void dev_pm_opp_remove(struct device *dev, unsigned long freq);
- void dev_pm_opp_remove_all_dynamic(struct device *dev);
- int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
- unsigned long u_volt, unsigned long u_volt_min,
- unsigned long u_volt_max);
- int dev_pm_opp_enable(struct device *dev, unsigned long freq);
- int dev_pm_opp_disable(struct device *dev, unsigned long freq);
- int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
- int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
- int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
- int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
- void dev_pm_opp_clear_config(int token);
- int dev_pm_opp_config_clks_simple(struct device *dev,
- struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,
- bool scaling_down);
- struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, struct opp_table *dst_table, struct dev_pm_opp *src_opp);
- int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
- int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
- int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp);
- int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
- int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
- void dev_pm_opp_remove_table(struct device *dev);
- void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
- int dev_pm_opp_sync_regulators(struct device *dev);
- #else
- static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
- static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
- {
- return 0;
- }
- static inline int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies)
- {
- return -EOPNOTSUPP;
- }
- static inline unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp)
- {
- return 0;
- }
- static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
- {
- return 0;
- }
- static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
- {
- return 0;
- }
- static inline
- unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
- unsigned int index)
- {
- return 0;
- }
- static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
- {
- return false;
- }
- static inline int dev_pm_opp_get_opp_count(struct device *dev)
- {
- return 0;
- }
- static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
- {
- return 0;
- }
- static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
- {
- return 0;
- }
- static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
- {
- return 0;
- }
- static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
- {
- return 0;
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
- unsigned int level)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
- unsigned int *level)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
- unsigned long freq, bool available)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
- unsigned long *freq)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
- unsigned long *freq)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
- unsigned int *bw, int index)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
- unsigned int *bw, int index)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
- static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
- unsigned long u_volt)
- {
- return -EOPNOTSUPP;
- }
- static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
- {
- }
- static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
- {
- }
- static inline int
- dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
- unsigned long u_volt, unsigned long u_volt_min,
- unsigned long u_volt_max)
- {
- return 0;
- }
- static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
- {
- return 0;
- }
- static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
- {
- return 0;
- }
- static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
- {
- return -EOPNOTSUPP;
- }
- static inline int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
- {
- return -EOPNOTSUPP;
- }
- static inline void dev_pm_opp_clear_config(int token) {}
- static inline int dev_pm_opp_config_clks_simple(struct device *dev,
- struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,
- bool scaling_down)
- {
- return -EOPNOTSUPP;
- }
- static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,
- struct opp_table *dst_table, struct dev_pm_opp *src_opp)
- {
- return ERR_PTR(-EOPNOTSUPP);
- }
- static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
- {
- return -EINVAL;
- }
- static inline void dev_pm_opp_remove_table(struct device *dev)
- {
- }
- static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
- {
- }
- static inline int dev_pm_opp_sync_regulators(struct device *dev)
- {
- return -EOPNOTSUPP;
- }
- #endif /* CONFIG_PM_OPP */
- #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
- int dev_pm_opp_of_add_table(struct device *dev);
- int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
- int devm_pm_opp_of_add_table_indexed(struct device *dev, int index);
- void dev_pm_opp_of_remove_table(struct device *dev);
- int devm_pm_opp_of_add_table(struct device *dev);
- int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
- void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
- int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
- struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
- struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
- int of_get_required_opp_performance_state(struct device_node *np, int index);
- int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table);
- int dev_pm_opp_of_register_em(struct device *dev, struct cpumask *cpus);
- static inline void dev_pm_opp_of_unregister_em(struct device *dev)
- {
- em_dev_unregister_perf_domain(dev);
- }
- #else
- static inline int dev_pm_opp_of_add_table(struct device *dev)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
- {
- return -EOPNOTSUPP;
- }
- static inline int devm_pm_opp_of_add_table_indexed(struct device *dev, int index)
- {
- return -EOPNOTSUPP;
- }
- static inline void dev_pm_opp_of_remove_table(struct device *dev)
- {
- }
- static inline int devm_pm_opp_of_add_table(struct device *dev)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
- {
- return -EOPNOTSUPP;
- }
- static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
- {
- }
- static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
- {
- return -EOPNOTSUPP;
- }
- static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
- {
- return NULL;
- }
- static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
- {
- return NULL;
- }
- static inline int dev_pm_opp_of_register_em(struct device *dev,
- struct cpumask *cpus)
- {
- return -EOPNOTSUPP;
- }
- static inline void dev_pm_opp_of_unregister_em(struct device *dev)
- {
- }
- static inline int of_get_required_opp_performance_state(struct device_node *np, int index)
- {
- return -EOPNOTSUPP;
- }
- static inline int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table)
- {
- return -EOPNOTSUPP;
- }
- #endif
- /* OPP Configuration helpers */
- /* Regulators helpers */
- static inline int dev_pm_opp_set_regulators(struct device *dev,
- const char * const names[])
- {
- struct dev_pm_opp_config config = {
- .regulator_names = names,
- };
- return dev_pm_opp_set_config(dev, &config);
- }
- static inline void dev_pm_opp_put_regulators(int token)
- {
- dev_pm_opp_clear_config(token);
- }
- static inline int devm_pm_opp_set_regulators(struct device *dev,
- const char * const names[])
- {
- struct dev_pm_opp_config config = {
- .regulator_names = names,
- };
- return devm_pm_opp_set_config(dev, &config);
- }
- /* Supported-hw helpers */
- static inline int dev_pm_opp_set_supported_hw(struct device *dev,
- const u32 *versions,
- unsigned int count)
- {
- struct dev_pm_opp_config config = {
- .supported_hw = versions,
- .supported_hw_count = count,
- };
- return dev_pm_opp_set_config(dev, &config);
- }
- static inline void dev_pm_opp_put_supported_hw(int token)
- {
- dev_pm_opp_clear_config(token);
- }
- static inline int devm_pm_opp_set_supported_hw(struct device *dev,
- const u32 *versions,
- unsigned int count)
- {
- struct dev_pm_opp_config config = {
- .supported_hw = versions,
- .supported_hw_count = count,
- };
- return devm_pm_opp_set_config(dev, &config);
- }
- /* clkname helpers */
- static inline int dev_pm_opp_set_clkname(struct device *dev, const char *name)
- {
- const char *names[] = { name, NULL };
- struct dev_pm_opp_config config = {
- .clk_names = names,
- };
- return dev_pm_opp_set_config(dev, &config);
- }
- static inline void dev_pm_opp_put_clkname(int token)
- {
- dev_pm_opp_clear_config(token);
- }
- static inline int devm_pm_opp_set_clkname(struct device *dev, const char *name)
- {
- const char *names[] = { name, NULL };
- struct dev_pm_opp_config config = {
- .clk_names = names,
- };
- return devm_pm_opp_set_config(dev, &config);
- }
- /* config-regulators helpers */
- static inline int dev_pm_opp_set_config_regulators(struct device *dev,
- config_regulators_t helper)
- {
- struct dev_pm_opp_config config = {
- .config_regulators = helper,
- };
- return dev_pm_opp_set_config(dev, &config);
- }
- static inline void dev_pm_opp_put_config_regulators(int token)
- {
- dev_pm_opp_clear_config(token);
- }
- /* genpd helpers */
- static inline int dev_pm_opp_attach_genpd(struct device *dev,
- const char * const *names,
- struct device ***virt_devs)
- {
- struct dev_pm_opp_config config = {
- .genpd_names = names,
- .virt_devs = virt_devs,
- };
- return dev_pm_opp_set_config(dev, &config);
- }
- static inline void dev_pm_opp_detach_genpd(int token)
- {
- dev_pm_opp_clear_config(token);
- }
- static inline int devm_pm_opp_attach_genpd(struct device *dev,
- const char * const *names,
- struct device ***virt_devs)
- {
- struct dev_pm_opp_config config = {
- .genpd_names = names,
- .virt_devs = virt_devs,
- };
- return devm_pm_opp_set_config(dev, &config);
- }
- /* prop-name helpers */
- static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name)
- {
- struct dev_pm_opp_config config = {
- .prop_name = name,
- };
- return dev_pm_opp_set_config(dev, &config);
- }
- static inline void dev_pm_opp_put_prop_name(int token)
- {
- dev_pm_opp_clear_config(token);
- }
- #endif /* __LINUX_OPP_H__ */
|