linux/include/linux/pm_opp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Generic OPP Interface
   4 *
   5 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
   6 *      Nishanth Menon
   7 *      Romit Dasgupta
   8 *      Kevin Hilman
   9 */
  10
  11#ifndef __LINUX_OPP_H__
  12#define __LINUX_OPP_H__
  13
  14#include <linux/energy_model.h>
  15#include <linux/err.h>
  16#include <linux/notifier.h>
  17
  18struct clk;
  19struct regulator;
  20struct dev_pm_opp;
  21struct device;
  22struct opp_table;
  23
  24enum dev_pm_opp_event {
  25        OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
  26        OPP_EVENT_ADJUST_VOLTAGE,
  27};
  28
  29/**
  30 * struct dev_pm_opp_supply - Power supply voltage/current values
  31 * @u_volt:     Target voltage in microvolts corresponding to this OPP
  32 * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
  33 * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
  34 * @u_amp:      Maximum current drawn by the device in microamperes
  35 * @u_watt:     Power used by the device in microwatts
  36 *
  37 * This structure stores the voltage/current/power values for a single power
  38 * supply.
  39 */
  40struct dev_pm_opp_supply {
  41        unsigned long u_volt;
  42        unsigned long u_volt_min;
  43        unsigned long u_volt_max;
  44        unsigned long u_amp;
  45        unsigned long u_watt;
  46};
  47
  48/**
  49 * struct dev_pm_opp_icc_bw - Interconnect bandwidth values
  50 * @avg:        Average bandwidth corresponding to this OPP (in icc units)
  51 * @peak:       Peak bandwidth corresponding to this OPP (in icc units)
  52 *
  53 * This structure stores the bandwidth values for a single interconnect path.
  54 */
  55struct dev_pm_opp_icc_bw {
  56        u32 avg;
  57        u32 peak;
  58};
  59
  60/**
  61 * struct dev_pm_opp_info - OPP freq/voltage/current values
  62 * @rate:       Target clk rate in hz
  63 * @supplies:   Array of voltage/current values for all power supplies
  64 *
  65 * This structure stores the freq/voltage/current values for a single OPP.
  66 */
  67struct dev_pm_opp_info {
  68        unsigned long rate;
  69        struct dev_pm_opp_supply *supplies;
  70};
  71
  72/**
  73 * struct dev_pm_set_opp_data - Set OPP data
  74 * @old_opp:    Old OPP info
  75 * @new_opp:    New OPP info
  76 * @regulators: Array of regulator pointers
  77 * @regulator_count: Number of regulators
  78 * @clk:        Pointer to clk
  79 * @dev:        Pointer to the struct device
  80 *
  81 * This structure contains all information required for setting an OPP.
  82 */
  83struct dev_pm_set_opp_data {
  84        struct dev_pm_opp_info old_opp;
  85        struct dev_pm_opp_info new_opp;
  86
  87        struct regulator **regulators;
  88        unsigned int regulator_count;
  89        struct clk *clk;
  90        struct device *dev;
  91};
  92
  93#if defined(CONFIG_PM_OPP)
  94
  95struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
  96void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
  97
  98unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
  99
 100unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp);
 101
 102unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
 103
 104unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp);
 105
 106unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
 107                                            unsigned int index);
 108
 109bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
 110
 111int dev_pm_opp_get_opp_count(struct device *dev);
 112unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
 113unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
 114unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
 115unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
 116
 117struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
 118                                              unsigned long freq,
 119                                              bool available);
 120struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
 121                                               unsigned int level);
 122struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
 123                                              unsigned int *level);
 124
 125struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
 126                                              unsigned long *freq);
 127struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
 128                                                     unsigned long u_volt);
 129
 130struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
 131                                             unsigned long *freq);
 132void dev_pm_opp_put(struct dev_pm_opp *opp);
 133
 134int dev_pm_opp_add(struct device *dev, unsigned long freq,
 135                   unsigned long u_volt);
 136void dev_pm_opp_remove(struct device *dev, unsigned long freq);
 137void dev_pm_opp_remove_all_dynamic(struct device *dev);
 138
 139int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
 140                              unsigned long u_volt, unsigned long u_volt_min,
 141                              unsigned long u_volt_max);
 142
 143int dev_pm_opp_enable(struct device *dev, unsigned long freq);
 144
 145int dev_pm_opp_disable(struct device *dev, unsigned long freq);
 146
 147int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
 148int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
 149
 150struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
 151void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
 152int devm_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
 153struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name);
 154void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
 155struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
 156void dev_pm_opp_put_regulators(struct opp_table *opp_table);
 157int devm_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
 158struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name);
 159void dev_pm_opp_put_clkname(struct opp_table *opp_table);
 160int devm_pm_opp_set_clkname(struct device *dev, const char *name);
 161struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
 162void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table);
 163int devm_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
 164struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char * const *names, struct device ***virt_devs);
 165void dev_pm_opp_detach_genpd(struct opp_table *opp_table);
 166int devm_pm_opp_attach_genpd(struct device *dev, const char * const *names, struct device ***virt_devs);
 167struct 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);
 168int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
 169int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
 170int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp);
 171int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
 172int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
 173void dev_pm_opp_remove_table(struct device *dev);
 174void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
 175int dev_pm_opp_sync_regulators(struct device *dev);
 176#else
 177static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
 178{
 179        return ERR_PTR(-EOPNOTSUPP);
 180}
 181
 182static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
 183{
 184        return ERR_PTR(-EOPNOTSUPP);
 185}
 186
 187static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
 188
 189static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
 190{
 191        return 0;
 192}
 193
 194static inline unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp)
 195{
 196        return 0;
 197}
 198
 199static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
 200{
 201        return 0;
 202}
 203
 204static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
 205{
 206        return 0;
 207}
 208
 209static inline
 210unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
 211                                            unsigned int index)
 212{
 213        return 0;
 214}
 215
 216static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
 217{
 218        return false;
 219}
 220
 221static inline int dev_pm_opp_get_opp_count(struct device *dev)
 222{
 223        return 0;
 224}
 225
 226static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
 227{
 228        return 0;
 229}
 230
 231static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
 232{
 233        return 0;
 234}
 235
 236static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
 237{
 238        return 0;
 239}
 240
 241static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
 242{
 243        return 0;
 244}
 245
 246static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
 247                                        unsigned long freq, bool available)
 248{
 249        return ERR_PTR(-EOPNOTSUPP);
 250}
 251
 252static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
 253                                        unsigned int level)
 254{
 255        return ERR_PTR(-EOPNOTSUPP);
 256}
 257
 258static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
 259                                        unsigned int *level)
 260{
 261        return ERR_PTR(-EOPNOTSUPP);
 262}
 263
 264static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
 265                                        unsigned long *freq)
 266{
 267        return ERR_PTR(-EOPNOTSUPP);
 268}
 269
 270static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
 271                                        unsigned long u_volt)
 272{
 273        return ERR_PTR(-EOPNOTSUPP);
 274}
 275
 276static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
 277                                        unsigned long *freq)
 278{
 279        return ERR_PTR(-EOPNOTSUPP);
 280}
 281
 282static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
 283
 284static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
 285                                        unsigned long u_volt)
 286{
 287        return -EOPNOTSUPP;
 288}
 289
 290static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
 291{
 292}
 293
 294static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
 295{
 296}
 297
 298static inline int
 299dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
 300                          unsigned long u_volt, unsigned long u_volt_min,
 301                          unsigned long u_volt_max)
 302{
 303        return 0;
 304}
 305
 306static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
 307{
 308        return 0;
 309}
 310
 311static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
 312{
 313        return 0;
 314}
 315
 316static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
 317{
 318        return -EOPNOTSUPP;
 319}
 320
 321static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
 322{
 323        return -EOPNOTSUPP;
 324}
 325
 326static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
 327                                                            const u32 *versions,
 328                                                            unsigned int count)
 329{
 330        return ERR_PTR(-EOPNOTSUPP);
 331}
 332
 333static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
 334
 335static inline int devm_pm_opp_set_supported_hw(struct device *dev,
 336                                               const u32 *versions,
 337                                               unsigned int count)
 338{
 339        return -EOPNOTSUPP;
 340}
 341
 342static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
 343                        int (*set_opp)(struct dev_pm_set_opp_data *data))
 344{
 345        return ERR_PTR(-EOPNOTSUPP);
 346}
 347
 348static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) {}
 349
 350static inline int devm_pm_opp_register_set_opp_helper(struct device *dev,
 351                                    int (*set_opp)(struct dev_pm_set_opp_data *data))
 352{
 353        return -EOPNOTSUPP;
 354}
 355
 356static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
 357{
 358        return ERR_PTR(-EOPNOTSUPP);
 359}
 360
 361static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
 362
 363static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
 364{
 365        return ERR_PTR(-EOPNOTSUPP);
 366}
 367
 368static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
 369
 370static inline int devm_pm_opp_set_regulators(struct device *dev,
 371                                             const char * const names[],
 372                                             unsigned int count)
 373{
 374        return -EOPNOTSUPP;
 375}
 376
 377static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name)
 378{
 379        return ERR_PTR(-EOPNOTSUPP);
 380}
 381
 382static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
 383
 384static inline int devm_pm_opp_set_clkname(struct device *dev, const char *name)
 385{
 386        return -EOPNOTSUPP;
 387}
 388
 389static inline struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char * const *names, struct device ***virt_devs)
 390{
 391        return ERR_PTR(-EOPNOTSUPP);
 392}
 393
 394static inline void dev_pm_opp_detach_genpd(struct opp_table *opp_table) {}
 395
 396static inline int devm_pm_opp_attach_genpd(struct device *dev,
 397                                           const char * const *names,
 398                                           struct device ***virt_devs)
 399{
 400        return -EOPNOTSUPP;
 401}
 402
 403static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,
 404                                struct opp_table *dst_table, struct dev_pm_opp *src_opp)
 405{
 406        return ERR_PTR(-EOPNOTSUPP);
 407}
 408
 409static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate)
 410{
 411        return -EOPNOTSUPP;
 412}
 413
 414static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
 415{
 416        return -EOPNOTSUPP;
 417}
 418
 419static inline int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
 420{
 421        return -EOPNOTSUPP;
 422}
 423
 424static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
 425{
 426        return -EOPNOTSUPP;
 427}
 428
 429static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
 430{
 431        return -EINVAL;
 432}
 433
 434static inline void dev_pm_opp_remove_table(struct device *dev)
 435{
 436}
 437
 438static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
 439{
 440}
 441
 442static inline int dev_pm_opp_sync_regulators(struct device *dev)
 443{
 444        return -EOPNOTSUPP;
 445}
 446
 447#endif          /* CONFIG_PM_OPP */
 448
 449#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
 450int dev_pm_opp_of_add_table(struct device *dev);
 451int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
 452int devm_pm_opp_of_add_table_indexed(struct device *dev, int index);
 453int dev_pm_opp_of_add_table_noclk(struct device *dev, int index);
 454int devm_pm_opp_of_add_table_noclk(struct device *dev, int index);
 455void dev_pm_opp_of_remove_table(struct device *dev);
 456int devm_pm_opp_of_add_table(struct device *dev);
 457int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
 458void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
 459int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
 460struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
 461struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
 462int of_get_required_opp_performance_state(struct device_node *np, int index);
 463int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table);
 464int dev_pm_opp_of_register_em(struct device *dev, struct cpumask *cpus);
 465static inline void dev_pm_opp_of_unregister_em(struct device *dev)
 466{
 467        em_dev_unregister_perf_domain(dev);
 468}
 469#else
 470static inline int dev_pm_opp_of_add_table(struct device *dev)
 471{
 472        return -EOPNOTSUPP;
 473}
 474
 475static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
 476{
 477        return -EOPNOTSUPP;
 478}
 479
 480static inline int devm_pm_opp_of_add_table_indexed(struct device *dev, int index)
 481{
 482        return -EOPNOTSUPP;
 483}
 484
 485static inline int dev_pm_opp_of_add_table_noclk(struct device *dev, int index)
 486{
 487        return -EOPNOTSUPP;
 488}
 489
 490static inline int devm_pm_opp_of_add_table_noclk(struct device *dev, int index)
 491{
 492        return -EOPNOTSUPP;
 493}
 494
 495static inline void dev_pm_opp_of_remove_table(struct device *dev)
 496{
 497}
 498
 499static inline int devm_pm_opp_of_add_table(struct device *dev)
 500{
 501        return -EOPNOTSUPP;
 502}
 503
 504static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
 505{
 506        return -EOPNOTSUPP;
 507}
 508
 509static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
 510{
 511}
 512
 513static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
 514{
 515        return -EOPNOTSUPP;
 516}
 517
 518static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
 519{
 520        return NULL;
 521}
 522
 523static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
 524{
 525        return NULL;
 526}
 527
 528static inline int dev_pm_opp_of_register_em(struct device *dev,
 529                                            struct cpumask *cpus)
 530{
 531        return -EOPNOTSUPP;
 532}
 533
 534static inline void dev_pm_opp_of_unregister_em(struct device *dev)
 535{
 536}
 537
 538static inline int of_get_required_opp_performance_state(struct device_node *np, int index)
 539{
 540        return -EOPNOTSUPP;
 541}
 542
 543static inline int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table)
 544{
 545        return -EOPNOTSUPP;
 546}
 547#endif
 548
 549#endif          /* __LINUX_OPP_H__ */
 550