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/cleanup.h> 15 #include <linux/energy_model.h> 16 #include <linux/err.h> 17 #include <linux/notifier.h> 18 19 struct clk; 20 struct cpufreq_frequency_table; 21 struct regulator; 22 struct dev_pm_opp; 23 struct device; 24 struct opp_table; 25 26 enum dev_pm_opp_event { 27 OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, 28 OPP_EVENT_ADJUST_VOLTAGE, 29 }; 30 31 /** 32 * struct dev_pm_opp_supply - Power supply voltage/current values 33 * @u_volt: Target voltage in microvolts corresponding to this OPP 34 * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP 35 * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP 36 * @u_amp: Maximum current drawn by the device in microamperes 37 * @u_watt: Power used by the device in microwatts 38 * 39 * This structure stores the voltage/current/power values for a single power 40 * supply. 41 */ 42 struct dev_pm_opp_supply { 43 unsigned long u_volt; 44 unsigned long u_volt_min; 45 unsigned long u_volt_max; 46 unsigned long u_amp; 47 unsigned long u_watt; 48 }; 49 50 typedef int (*config_regulators_t)(struct device *dev, 51 struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp, 52 struct regulator **regulators, unsigned int count); 53 54 typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table, 55 struct dev_pm_opp *opp, void *data, bool scaling_down); 56 57 /** 58 * struct dev_pm_opp_config - Device OPP configuration values 59 * @clk_names: Clk names, NULL terminated array. 60 * @config_clks: Custom set clk helper. 61 * @prop_name: Name to postfix to properties. 62 * @config_regulators: Custom set regulator helper. 63 * @supported_hw: Array of hierarchy of versions to match. 64 * @supported_hw_count: Number of elements in the array. 65 * @regulator_names: Array of pointers to the names of the regulator, NULL terminated. 66 * @required_dev: The required OPP device. 67 * @required_dev_index: The index of the required OPP for the @required_dev. 68 * 69 * This structure contains platform specific OPP configurations for the device. 70 */ 71 struct dev_pm_opp_config { 72 /* NULL terminated */ 73 const char * const *clk_names; 74 config_clks_t config_clks; 75 const char *prop_name; 76 config_regulators_t config_regulators; 77 const unsigned int *supported_hw; 78 unsigned int supported_hw_count; 79 const char * const *regulator_names; 80 struct device *required_dev; 81 unsigned int required_dev_index; 82 }; 83 84 #define OPP_LEVEL_UNSET U32_MAX 85 86 /** 87 * struct dev_pm_opp_data - The data to use to initialize an OPP. 88 * @turbo: Flag to indicate whether the OPP is to be marked turbo or not. 89 * @level: The performance level for the OPP. Set level to OPP_LEVEL_UNSET if 90 * level field isn't used. 91 * @freq: The clock rate in Hz for the OPP. 92 * @u_volt: The voltage in uV for the OPP. 93 */ 94 struct dev_pm_opp_data { 95 bool turbo; 96 unsigned int level; 97 unsigned long freq; 98 unsigned long u_volt; 99 }; 100 101 /** 102 * struct dev_pm_opp_key - Key used to identify OPP entries 103 * @freq: Frequency in Hz. Use 0 if frequency is not to be matched. 104 * @level: Performance level associated with the OPP entry. 105 * Use OPP_LEVEL_UNSET if level is not to be matched. 106 * @bw: Bandwidth associated with the OPP entry. 107 * Use 0 if bandwidth is not to be matched. 108 * 109 * This structure is used to uniquely identify an OPP entry based on 110 * frequency, performance level, and bandwidth. Each field can be 111 * selectively ignored during matching by setting it to its respective 112 * NOP value. 113 */ 114 struct dev_pm_opp_key { 115 unsigned long freq; 116 unsigned int level; 117 u32 bw; 118 }; 119 120 #if defined(CONFIG_PM_OPP) 121 122 struct opp_table *dev_pm_opp_get_opp_table(struct device *dev); 123 struct opp_table *dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table); 124 void dev_pm_opp_put_opp_table(struct opp_table *opp_table); 125 126 unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index); 127 128 unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); 129 130 int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies); 131 132 unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp); 133 134 unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index); 135 136 unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp); 137 138 unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp, 139 unsigned int index); 140 141 bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp); 142 143 int dev_pm_opp_get_opp_count(struct device *dev); 144 unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev); 145 unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev); 146 unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev); 147 unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev); 148 149 struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, 150 unsigned long freq, 151 bool available); 152 153 struct dev_pm_opp *dev_pm_opp_find_key_exact(struct device *dev, 154 struct dev_pm_opp_key *key, 155 bool available); 156 157 struct dev_pm_opp * 158 dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq, 159 u32 index, bool available); 160 161 struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, 162 unsigned long *freq); 163 164 struct dev_pm_opp *dev_pm_opp_find_freq_floor_indexed(struct device *dev, 165 unsigned long *freq, u32 index); 166 167 struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, 168 unsigned long *freq); 169 170 struct dev_pm_opp *dev_pm_opp_find_freq_ceil_indexed(struct device *dev, 171 unsigned long *freq, u32 index); 172 173 struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev, 174 unsigned int level); 175 176 struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev, 177 unsigned int *level); 178 179 struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev, 180 unsigned int *level); 181 182 struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev, 183 unsigned int *bw, int index); 184 185 struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev, 186 unsigned int *bw, int index); 187 188 struct dev_pm_opp *dev_pm_opp_get(struct dev_pm_opp *opp); 189 void dev_pm_opp_put(struct dev_pm_opp *opp); 190 191 int dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp); 192 193 void dev_pm_opp_remove(struct device *dev, unsigned long freq); 194 void dev_pm_opp_remove_all_dynamic(struct device *dev); 195 196 int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq, 197 unsigned long u_volt, unsigned long u_volt_min, 198 unsigned long u_volt_max); 199 200 int dev_pm_opp_enable(struct device *dev, unsigned long freq); 201 202 int dev_pm_opp_disable(struct device *dev, unsigned long freq); 203 204 int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb); 205 int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb); 206 207 int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config); 208 int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config); 209 void dev_pm_opp_clear_config(int token); 210 int dev_pm_opp_config_clks_simple(struct device *dev, 211 struct opp_table *opp_table, struct dev_pm_opp *opp, void *data, 212 bool scaling_down); 213 214 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); 215 int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate); 216 int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq); 217 int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp); 218 int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask); 219 int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask); 220 void dev_pm_opp_remove_table(struct device *dev); 221 void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask); 222 int dev_pm_opp_sync_regulators(struct device *dev); 223 224 #else 225 static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev) 226 { 227 return ERR_PTR(-EOPNOTSUPP); 228 } 229 230 static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index) 231 { 232 return ERR_PTR(-EOPNOTSUPP); 233 } 234 235 static inline struct opp_table *dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table) 236 { 237 return opp_table; 238 } 239 240 static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {} 241 242 static inline unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index) 243 { 244 return 0; 245 } 246 247 static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp) 248 { 249 return 0; 250 } 251 252 static inline int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies) 253 { 254 return -EOPNOTSUPP; 255 } 256 257 static inline unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp) 258 { 259 return 0; 260 } 261 262 static inline unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index) 263 { 264 return 0; 265 } 266 267 static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp) 268 { 269 return 0; 270 } 271 272 static inline 273 unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp, 274 unsigned int index) 275 { 276 return 0; 277 } 278 279 static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp) 280 { 281 return false; 282 } 283 284 static inline int dev_pm_opp_get_opp_count(struct device *dev) 285 { 286 return 0; 287 } 288 289 static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) 290 { 291 return 0; 292 } 293 294 static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev) 295 { 296 return 0; 297 } 298 299 static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev) 300 { 301 return 0; 302 } 303 304 static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev) 305 { 306 return 0; 307 } 308 309 static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, 310 unsigned long freq, bool available) 311 { 312 return ERR_PTR(-EOPNOTSUPP); 313 } 314 315 static inline struct dev_pm_opp *dev_pm_opp_find_key_exact(struct device *dev, 316 struct dev_pm_opp_key *key, 317 bool available) 318 { 319 return ERR_PTR(-EOPNOTSUPP); 320 } 321 322 static inline struct dev_pm_opp * 323 dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq, 324 u32 index, bool available) 325 { 326 return ERR_PTR(-EOPNOTSUPP); 327 } 328 329 static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, 330 unsigned long *freq) 331 { 332 return ERR_PTR(-EOPNOTSUPP); 333 } 334 335 static inline struct dev_pm_opp * 336 dev_pm_opp_find_freq_floor_indexed(struct device *dev, unsigned long *freq, u32 index) 337 { 338 return ERR_PTR(-EOPNOTSUPP); 339 } 340 341 static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, 342 unsigned long *freq) 343 { 344 return ERR_PTR(-EOPNOTSUPP); 345 } 346 347 static inline struct dev_pm_opp * 348 dev_pm_opp_find_freq_ceil_indexed(struct device *dev, unsigned long *freq, u32 index) 349 { 350 return ERR_PTR(-EOPNOTSUPP); 351 } 352 353 static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev, 354 unsigned int level) 355 { 356 return ERR_PTR(-EOPNOTSUPP); 357 } 358 359 static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev, 360 unsigned int *level) 361 { 362 return ERR_PTR(-EOPNOTSUPP); 363 } 364 365 static inline struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev, 366 unsigned int *level) 367 { 368 return ERR_PTR(-EOPNOTSUPP); 369 } 370 371 static inline struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev, 372 unsigned int *bw, int index) 373 { 374 return ERR_PTR(-EOPNOTSUPP); 375 } 376 377 static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev, 378 unsigned int *bw, int index) 379 { 380 return ERR_PTR(-EOPNOTSUPP); 381 } 382 383 static inline struct dev_pm_opp *dev_pm_opp_get(struct dev_pm_opp *opp) 384 { 385 return opp; 386 } 387 388 static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {} 389 390 static inline int 391 dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp) 392 { 393 return -EOPNOTSUPP; 394 } 395 396 static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq) 397 { 398 } 399 400 static inline void dev_pm_opp_remove_all_dynamic(struct device *dev) 401 { 402 } 403 404 static inline int 405 dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq, 406 unsigned long u_volt, unsigned long u_volt_min, 407 unsigned long u_volt_max) 408 { 409 return 0; 410 } 411 412 static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq) 413 { 414 return 0; 415 } 416 417 static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq) 418 { 419 return 0; 420 } 421 422 static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb) 423 { 424 return -EOPNOTSUPP; 425 } 426 427 static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb) 428 { 429 return -EOPNOTSUPP; 430 } 431 432 static inline int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config) 433 { 434 return -EOPNOTSUPP; 435 } 436 437 static inline int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config) 438 { 439 return -EOPNOTSUPP; 440 } 441 442 static inline void dev_pm_opp_clear_config(int token) {} 443 444 static inline int dev_pm_opp_config_clks_simple(struct device *dev, 445 struct opp_table *opp_table, struct dev_pm_opp *opp, void *data, 446 bool scaling_down) 447 { 448 return -EOPNOTSUPP; 449 } 450 451 static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, 452 struct opp_table *dst_table, struct dev_pm_opp *src_opp) 453 { 454 return ERR_PTR(-EOPNOTSUPP); 455 } 456 457 static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate) 458 { 459 return -EOPNOTSUPP; 460 } 461 462 static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) 463 { 464 return -EOPNOTSUPP; 465 } 466 467 static inline int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp) 468 { 469 return -EOPNOTSUPP; 470 } 471 472 static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask) 473 { 474 return -EOPNOTSUPP; 475 } 476 477 static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask) 478 { 479 return -EINVAL; 480 } 481 482 static inline void dev_pm_opp_remove_table(struct device *dev) 483 { 484 } 485 486 static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask) 487 { 488 } 489 490 static inline int dev_pm_opp_sync_regulators(struct device *dev) 491 { 492 return -EOPNOTSUPP; 493 } 494 495 #endif /* CONFIG_PM_OPP */ 496 497 #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP) 498 int dev_pm_opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table); 499 void dev_pm_opp_free_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table); 500 #else 501 static inline int dev_pm_opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table) 502 { 503 return -EINVAL; 504 } 505 506 static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table) 507 { 508 } 509 #endif 510 511 512 #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF) 513 int dev_pm_opp_of_add_table(struct device *dev); 514 int dev_pm_opp_of_add_table_indexed(struct device *dev, int index); 515 int devm_pm_opp_of_add_table_indexed(struct device *dev, int index); 516 void dev_pm_opp_of_remove_table(struct device *dev); 517 int devm_pm_opp_of_add_table(struct device *dev); 518 int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask); 519 void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask); 520 int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask); 521 struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev); 522 struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp); 523 int of_get_required_opp_performance_state(struct device_node *np, int index); 524 bool dev_pm_opp_of_has_required_opp(struct device *dev); 525 int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table); 526 int dev_pm_opp_of_register_em(struct device *dev, struct cpumask *cpus); 527 int dev_pm_opp_calc_power(struct device *dev, unsigned long *uW, 528 unsigned long *kHz); 529 static inline void dev_pm_opp_of_unregister_em(struct device *dev) 530 { 531 em_dev_unregister_perf_domain(dev); 532 } 533 #else 534 static inline int dev_pm_opp_of_add_table(struct device *dev) 535 { 536 return -EOPNOTSUPP; 537 } 538 539 static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index) 540 { 541 return -EOPNOTSUPP; 542 } 543 544 static inline int devm_pm_opp_of_add_table_indexed(struct device *dev, int index) 545 { 546 return -EOPNOTSUPP; 547 } 548 549 static inline void dev_pm_opp_of_remove_table(struct device *dev) 550 { 551 } 552 553 static inline int devm_pm_opp_of_add_table(struct device *dev) 554 { 555 return -EOPNOTSUPP; 556 } 557 558 static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask) 559 { 560 return -EOPNOTSUPP; 561 } 562 563 static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask) 564 { 565 } 566 567 static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask) 568 { 569 return -EOPNOTSUPP; 570 } 571 572 static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev) 573 { 574 return NULL; 575 } 576 577 static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp) 578 { 579 return NULL; 580 } 581 582 static inline int dev_pm_opp_of_register_em(struct device *dev, 583 struct cpumask *cpus) 584 { 585 return -EOPNOTSUPP; 586 } 587 588 static inline void dev_pm_opp_of_unregister_em(struct device *dev) 589 { 590 } 591 592 static inline int dev_pm_opp_calc_power(struct device *dev, unsigned long *uW, 593 unsigned long *kHz) 594 { 595 return -EOPNOTSUPP; 596 } 597 598 static inline int of_get_required_opp_performance_state(struct device_node *np, int index) 599 { 600 return -EOPNOTSUPP; 601 } 602 603 static inline bool dev_pm_opp_of_has_required_opp(struct device *dev) 604 { 605 return false; 606 } 607 608 static inline int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table) 609 { 610 return -EOPNOTSUPP; 611 } 612 #endif 613 614 /* Scope based cleanup macro for OPP reference counting */ 615 DEFINE_FREE(put_opp, struct dev_pm_opp *, if (!IS_ERR_OR_NULL(_T)) dev_pm_opp_put(_T)) 616 617 /* Scope based cleanup macro for OPP table reference counting */ 618 DEFINE_FREE(put_opp_table, struct opp_table *, if (!IS_ERR_OR_NULL(_T)) dev_pm_opp_put_opp_table(_T)) 619 620 /* OPP Configuration helpers */ 621 622 static inline int dev_pm_opp_add(struct device *dev, unsigned long freq, 623 unsigned long u_volt) 624 { 625 struct dev_pm_opp_data data = { 626 .freq = freq, 627 .u_volt = u_volt, 628 }; 629 630 return dev_pm_opp_add_dynamic(dev, &data); 631 } 632 633 /* Regulators helpers */ 634 static inline int dev_pm_opp_set_regulators(struct device *dev, 635 const char * const names[]) 636 { 637 struct dev_pm_opp_config config = { 638 .regulator_names = names, 639 }; 640 641 return dev_pm_opp_set_config(dev, &config); 642 } 643 644 static inline void dev_pm_opp_put_regulators(int token) 645 { 646 dev_pm_opp_clear_config(token); 647 } 648 649 static inline int devm_pm_opp_set_regulators(struct device *dev, 650 const char * const names[]) 651 { 652 struct dev_pm_opp_config config = { 653 .regulator_names = names, 654 }; 655 656 return devm_pm_opp_set_config(dev, &config); 657 } 658 659 /* Supported-hw helpers */ 660 static inline int dev_pm_opp_set_supported_hw(struct device *dev, 661 const u32 *versions, 662 unsigned int count) 663 { 664 struct dev_pm_opp_config config = { 665 .supported_hw = versions, 666 .supported_hw_count = count, 667 }; 668 669 return dev_pm_opp_set_config(dev, &config); 670 } 671 672 static inline void dev_pm_opp_put_supported_hw(int token) 673 { 674 dev_pm_opp_clear_config(token); 675 } 676 677 static inline int devm_pm_opp_set_supported_hw(struct device *dev, 678 const u32 *versions, 679 unsigned int count) 680 { 681 struct dev_pm_opp_config config = { 682 .supported_hw = versions, 683 .supported_hw_count = count, 684 }; 685 686 return devm_pm_opp_set_config(dev, &config); 687 } 688 689 /* clkname helpers */ 690 static inline int dev_pm_opp_set_clkname(struct device *dev, const char *name) 691 { 692 const char *names[] = { name, NULL }; 693 struct dev_pm_opp_config config = { 694 .clk_names = names, 695 }; 696 697 return dev_pm_opp_set_config(dev, &config); 698 } 699 700 static inline void dev_pm_opp_put_clkname(int token) 701 { 702 dev_pm_opp_clear_config(token); 703 } 704 705 static inline int devm_pm_opp_set_clkname(struct device *dev, const char *name) 706 { 707 const char *names[] = { name, NULL }; 708 struct dev_pm_opp_config config = { 709 .clk_names = names, 710 }; 711 712 return devm_pm_opp_set_config(dev, &config); 713 } 714 715 /* config-regulators helpers */ 716 static inline int dev_pm_opp_set_config_regulators(struct device *dev, 717 config_regulators_t helper) 718 { 719 struct dev_pm_opp_config config = { 720 .config_regulators = helper, 721 }; 722 723 return dev_pm_opp_set_config(dev, &config); 724 } 725 726 static inline void dev_pm_opp_put_config_regulators(int token) 727 { 728 dev_pm_opp_clear_config(token); 729 } 730 731 /* prop-name helpers */ 732 static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name) 733 { 734 struct dev_pm_opp_config config = { 735 .prop_name = name, 736 }; 737 738 return dev_pm_opp_set_config(dev, &config); 739 } 740 741 static inline void dev_pm_opp_put_prop_name(int token) 742 { 743 dev_pm_opp_clear_config(token); 744 } 745 746 static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) 747 { 748 return dev_pm_opp_get_freq_indexed(opp, 0); 749 } 750 751 static inline int dev_pm_opp_set_level(struct device *dev, unsigned int level) 752 { 753 struct dev_pm_opp *opp __free(put_opp) = dev_pm_opp_find_level_exact(dev, level); 754 755 if (IS_ERR(opp)) 756 return PTR_ERR(opp); 757 758 return dev_pm_opp_set_opp(dev, opp); 759 } 760 761 #endif /* __LINUX_OPP_H__ */ 762