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_unregister_set_opp_helper(struct opp_table *opp_table);
 128struct opp_table *dev_pm_opp_register_get_pstate_helper(struct device *dev, int (*get_pstate)(struct device *dev, unsigned long rate));
 129void dev_pm_opp_unregister_get_pstate_helper(struct opp_table *opp_table);
 130int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
 131int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
 132int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
 133void dev_pm_opp_remove_table(struct device *dev);
 134void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
 135#else
 136static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
 137{
 138        return ERR_PTR(-ENOTSUPP);
 139}
 140
 141static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
 142
 143static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
 144{
 145        return 0;
 146}
 147
 148static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
 149{
 150        return 0;
 151}
 152
 153static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
 154{
 155        return false;
 156}
 157
 158static inline int dev_pm_opp_get_opp_count(struct device *dev)
 159{
 160        return 0;
 161}
 162
 163static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
 164{
 165        return 0;
 166}
 167
 168static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
 169{
 170        return 0;
 171}
 172
 173static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
 174{
 175        return 0;
 176}
 177
 178static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
 179{
 180        return 0;
 181}
 182
 183static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
 184                                        unsigned long freq, bool available)
 185{
 186        return ERR_PTR(-ENOTSUPP);
 187}
 188
 189static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
 190                                        unsigned long *freq)
 191{
 192        return ERR_PTR(-ENOTSUPP);
 193}
 194
 195static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
 196                                        unsigned long *freq)
 197{
 198        return ERR_PTR(-ENOTSUPP);
 199}
 200
 201static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
 202
 203static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
 204                                        unsigned long u_volt)
 205{
 206        return -ENOTSUPP;
 207}
 208
 209static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
 210{
 211}
 212
 213static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
 214{
 215        return 0;
 216}
 217
 218static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
 219{
 220        return 0;
 221}
 222
 223static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
 224{
 225        return -ENOTSUPP;
 226}
 227
 228static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
 229{
 230        return -ENOTSUPP;
 231}
 232
 233static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
 234                                                            const u32 *versions,
 235                                                            unsigned int count)
 236{
 237        return ERR_PTR(-ENOTSUPP);
 238}
 239
 240static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
 241
 242static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
 243                        int (*set_opp)(struct dev_pm_set_opp_data *data))
 244{
 245        return ERR_PTR(-ENOTSUPP);
 246}
 247
 248static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) {}
 249
 250static inline struct opp_table *dev_pm_opp_register_get_pstate_helper(struct device *dev,
 251                int (*get_pstate)(struct device *dev, unsigned long rate))
 252{
 253        return ERR_PTR(-ENOTSUPP);
 254}
 255
 256static inline void dev_pm_opp_unregister_get_pstate_helper(struct opp_table *opp_table) {}
 257
 258static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
 259{
 260        return ERR_PTR(-ENOTSUPP);
 261}
 262
 263static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
 264
 265static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
 266{
 267        return ERR_PTR(-ENOTSUPP);
 268}
 269
 270static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
 271
 272static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name)
 273{
 274        return ERR_PTR(-ENOTSUPP);
 275}
 276
 277static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
 278
 279static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
 280{
 281        return -ENOTSUPP;
 282}
 283
 284static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
 285{
 286        return -ENOTSUPP;
 287}
 288
 289static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
 290{
 291        return -EINVAL;
 292}
 293
 294static inline void dev_pm_opp_remove_table(struct device *dev)
 295{
 296}
 297
 298static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
 299{
 300}
 301
 302#endif          /* CONFIG_PM_OPP */
 303
 304#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
 305int dev_pm_opp_of_add_table(struct device *dev);
 306void dev_pm_opp_of_remove_table(struct device *dev);
 307int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
 308void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
 309int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
 310struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
 311#else
 312static inline int dev_pm_opp_of_add_table(struct device *dev)
 313{
 314        return -ENOTSUPP;
 315}
 316
 317static inline void dev_pm_opp_of_remove_table(struct device *dev)
 318{
 319}
 320
 321static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
 322{
 323        return -ENOTSUPP;
 324}
 325
 326static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
 327{
 328}
 329
 330static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
 331{
 332        return -ENOTSUPP;
 333}
 334
 335static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
 336{
 337        return NULL;
 338}
 339#endif
 340
 341#endif          /* __LINUX_OPP_H__ */
 342