linux/include/linux/pm_opp.h
<<
>>
Prefs
   1/*
   2 * Generic OPP Interface
   3 *
   4 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
   5 *      Nishanth Menon
   6 *      Romit Dasgupta
   7 *      Kevin Hilman
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License version 2 as
  11 * published by the Free Software Foundation.
  12 */
  13
  14#ifndef __LINUX_OPP_H__
  15#define __LINUX_OPP_H__
  16
  17#include <linux/err.h>
  18#include <linux/notifier.h>
  19
  20struct clk;
  21struct regulator;
  22struct dev_pm_opp;
  23struct device;
  24struct opp_table;
  25
  26enum dev_pm_opp_event {
  27        OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
  28};
  29
  30/**
  31 * struct dev_pm_opp_supply - Power supply voltage/current values
  32 * @u_volt:     Target voltage in microvolts corresponding to this OPP
  33 * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
  34 * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
  35 * @u_amp:      Maximum current drawn by the device in microamperes
  36 *
  37 * This structure stores the voltage/current values for a single power supply.
  38 */
  39struct dev_pm_opp_supply {
  40        unsigned long u_volt;
  41        unsigned long u_volt_min;
  42        unsigned long u_volt_max;
  43        unsigned long u_amp;
  44};
  45
  46/**
  47 * struct dev_pm_opp_info - OPP freq/voltage/current values
  48 * @rate:       Target clk rate in hz
  49 * @supplies:   Array of voltage/current values for all power supplies
  50 *
  51 * This structure stores the freq/voltage/current values for a single OPP.
  52 */
  53struct dev_pm_opp_info {
  54        unsigned long rate;
  55        struct dev_pm_opp_supply *supplies;
  56};
  57
  58/**
  59 * struct dev_pm_set_opp_data - Set OPP data
  60 * @old_opp:    Old OPP info
  61 * @new_opp:    New OPP info
  62 * @regulators: Array of regulator pointers
  63 * @regulator_count: Number of regulators
  64 * @clk:        Pointer to clk
  65 * @dev:        Pointer to the struct device
  66 *
  67 * This structure contains all information required for setting an OPP.
  68 */
  69struct dev_pm_set_opp_data {
  70        struct dev_pm_opp_info old_opp;
  71        struct dev_pm_opp_info new_opp;
  72
  73        struct regulator **regulators;
  74        unsigned int regulator_count;
  75        struct clk *clk;
  76        struct device *dev;
  77};
  78
  79#if defined(CONFIG_PM_OPP)
  80
  81struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
  82void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
  83
  84unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
  85
  86unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
  87
  88bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
  89
  90int dev_pm_opp_get_opp_count(struct device *dev);
  91unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
  92unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
  93unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
  94unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
  95
  96struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
  97                                              unsigned long freq,
  98                                              bool available);
  99
 100struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
 101                                              unsigned long *freq);
 102
 103struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
 104                                             unsigned long *freq);
 105void dev_pm_opp_put(struct dev_pm_opp *opp);
 106
 107int dev_pm_opp_add(struct device *dev, unsigned long freq,
 108                   unsigned long u_volt);
 109void dev_pm_opp_remove(struct device *dev, unsigned long freq);
 110
 111int dev_pm_opp_enable(struct device *dev, unsigned long freq);
 112
 113int dev_pm_opp_disable(struct device *dev, unsigned long freq);
 114
 115int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
 116int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
 117
 118struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
 119void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
 120struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name);
 121void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
 122struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
 123void dev_pm_opp_put_regulators(struct opp_table *opp_table);
 124struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name);
 125void dev_pm_opp_put_clkname(struct opp_table *opp_table);
 126struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
 127void dev_pm_opp_register_put_opp_helper(struct opp_table *opp_table);
 128int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
 129int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
 130int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
 131void dev_pm_opp_remove_table(struct device *dev);
 132void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
 133#else
 134static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
 135{
 136        return ERR_PTR(-ENOTSUPP);
 137}
 138
 139static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
 140
 141static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
 142{
 143        return 0;
 144}
 145
 146static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
 147{
 148        return 0;
 149}
 150
 151static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
 152{
 153        return false;
 154}
 155
 156static inline int dev_pm_opp_get_opp_count(struct device *dev)
 157{
 158        return 0;
 159}
 160
 161static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
 162{
 163        return 0;
 164}
 165
 166static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
 167{
 168        return 0;
 169}
 170
 171static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
 172{
 173        return 0;
 174}
 175
 176static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
 177{
 178        return 0;
 179}
 180
 181static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
 182                                        unsigned long freq, bool available)
 183{
 184        return ERR_PTR(-ENOTSUPP);
 185}
 186
 187static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
 188                                        unsigned long *freq)
 189{
 190        return ERR_PTR(-ENOTSUPP);
 191}
 192
 193static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
 194                                        unsigned long *freq)
 195{
 196        return ERR_PTR(-ENOTSUPP);
 197}
 198
 199static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
 200
 201static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
 202                                        unsigned long u_volt)
 203{
 204        return -ENOTSUPP;
 205}
 206
 207static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
 208{
 209}
 210
 211static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
 212{
 213        return 0;
 214}
 215
 216static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
 217{
 218        return 0;
 219}
 220
 221static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
 222{
 223        return -ENOTSUPP;
 224}
 225
 226static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
 227{
 228        return -ENOTSUPP;
 229}
 230
 231static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
 232                                                            const u32 *versions,
 233                                                            unsigned int count)
 234{
 235        return ERR_PTR(-ENOTSUPP);
 236}
 237
 238static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
 239
 240static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
 241                        int (*set_opp)(struct dev_pm_set_opp_data *data))
 242{
 243        return ERR_PTR(-ENOTSUPP);
 244}
 245
 246static inline void dev_pm_opp_register_put_opp_helper(struct opp_table *opp_table) {}
 247
 248static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
 249{
 250        return ERR_PTR(-ENOTSUPP);
 251}
 252
 253static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
 254
 255static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
 256{
 257        return ERR_PTR(-ENOTSUPP);
 258}
 259
 260static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
 261
 262static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name)
 263{
 264        return ERR_PTR(-ENOTSUPP);
 265}
 266
 267static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
 268
 269static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
 270{
 271        return -ENOTSUPP;
 272}
 273
 274static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
 275{
 276        return -ENOTSUPP;
 277}
 278
 279static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
 280{
 281        return -EINVAL;
 282}
 283
 284static inline void dev_pm_opp_remove_table(struct device *dev)
 285{
 286}
 287
 288static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
 289{
 290}
 291
 292#endif          /* CONFIG_PM_OPP */
 293
 294#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
 295int dev_pm_opp_of_add_table(struct device *dev);
 296void dev_pm_opp_of_remove_table(struct device *dev);
 297int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
 298void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
 299int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
 300struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
 301#else
 302static inline int dev_pm_opp_of_add_table(struct device *dev)
 303{
 304        return -ENOTSUPP;
 305}
 306
 307static inline void dev_pm_opp_of_remove_table(struct device *dev)
 308{
 309}
 310
 311static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
 312{
 313        return -ENOTSUPP;
 314}
 315
 316static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
 317{
 318}
 319
 320static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
 321{
 322        return -ENOTSUPP;
 323}
 324
 325static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
 326{
 327        return NULL;
 328}
 329#endif
 330
 331#endif          /* __LINUX_OPP_H__ */
 332