root/include/linux/devfreq.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. devfreq_add_device
  2. devfreq_remove_device
  3. devm_devfreq_add_device
  4. devm_devfreq_remove_device
  5. devfreq_suspend_device
  6. devfreq_resume_device
  7. devfreq_suspend
  8. devfreq_resume
  9. devfreq_recommended_opp
  10. devfreq_register_opp_notifier
  11. devfreq_unregister_opp_notifier
  12. devm_devfreq_register_opp_notifier
  13. devm_devfreq_unregister_opp_notifier
  14. devfreq_register_notifier
  15. devfreq_unregister_notifier
  16. devm_devfreq_register_notifier
  17. devm_devfreq_unregister_notifier
  18. devfreq_get_devfreq_by_phandle
  19. devfreq_update_stats

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * devfreq: Generic Dynamic Voltage and Frequency Scaling (DVFS) Framework
   4  *          for Non-CPU Devices.
   5  *
   6  * Copyright (C) 2011 Samsung Electronics
   7  *      MyungJoo Ham <myungjoo.ham@samsung.com>
   8  */
   9 
  10 #ifndef __LINUX_DEVFREQ_H__
  11 #define __LINUX_DEVFREQ_H__
  12 
  13 #include <linux/device.h>
  14 #include <linux/notifier.h>
  15 #include <linux/pm_opp.h>
  16 
  17 #define DEVFREQ_NAME_LEN 16
  18 
  19 /* DEVFREQ governor name */
  20 #define DEVFREQ_GOV_SIMPLE_ONDEMAND     "simple_ondemand"
  21 #define DEVFREQ_GOV_PERFORMANCE         "performance"
  22 #define DEVFREQ_GOV_POWERSAVE           "powersave"
  23 #define DEVFREQ_GOV_USERSPACE           "userspace"
  24 #define DEVFREQ_GOV_PASSIVE             "passive"
  25 
  26 /* DEVFREQ notifier interface */
  27 #define DEVFREQ_TRANSITION_NOTIFIER     (0)
  28 
  29 /* Transition notifiers of DEVFREQ_TRANSITION_NOTIFIER */
  30 #define DEVFREQ_PRECHANGE               (0)
  31 #define DEVFREQ_POSTCHANGE              (1)
  32 
  33 struct devfreq;
  34 struct devfreq_governor;
  35 
  36 /**
  37  * struct devfreq_dev_status - Data given from devfreq user device to
  38  *                           governors. Represents the performance
  39  *                           statistics.
  40  * @total_time:         The total time represented by this instance of
  41  *                      devfreq_dev_status
  42  * @busy_time:          The time that the device was working among the
  43  *                      total_time.
  44  * @current_frequency:  The operating frequency.
  45  * @private_data:       An entry not specified by the devfreq framework.
  46  *                      A device and a specific governor may have their
  47  *                      own protocol with private_data. However, because
  48  *                      this is governor-specific, a governor using this
  49  *                      will be only compatible with devices aware of it.
  50  */
  51 struct devfreq_dev_status {
  52         /* both since the last measure */
  53         unsigned long total_time;
  54         unsigned long busy_time;
  55         unsigned long current_frequency;
  56         void *private_data;
  57 };
  58 
  59 /*
  60  * The resulting frequency should be at most this. (this bound is the
  61  * least upper bound; thus, the resulting freq should be lower or same)
  62  * If the flag is not set, the resulting frequency should be at most the
  63  * bound (greatest lower bound)
  64  */
  65 #define DEVFREQ_FLAG_LEAST_UPPER_BOUND          0x1
  66 
  67 /**
  68  * struct devfreq_dev_profile - Devfreq's user device profile
  69  * @initial_freq:       The operating frequency when devfreq_add_device() is
  70  *                      called.
  71  * @polling_ms:         The polling interval in ms. 0 disables polling.
  72  * @target:             The device should set its operating frequency at
  73  *                      freq or lowest-upper-than-freq value. If freq is
  74  *                      higher than any operable frequency, set maximum.
  75  *                      Before returning, target function should set
  76  *                      freq at the current frequency.
  77  *                      The "flags" parameter's possible values are
  78  *                      explained above with "DEVFREQ_FLAG_*" macros.
  79  * @get_dev_status:     The device should provide the current performance
  80  *                      status to devfreq. Governors are recommended not to
  81  *                      use this directly. Instead, governors are recommended
  82  *                      to use devfreq_update_stats() along with
  83  *                      devfreq.last_status.
  84  * @get_cur_freq:       The device should provide the current frequency
  85  *                      at which it is operating.
  86  * @exit:               An optional callback that is called when devfreq
  87  *                      is removing the devfreq object due to error or
  88  *                      from devfreq_remove_device() call. If the user
  89  *                      has registered devfreq->nb at a notifier-head,
  90  *                      this is the time to unregister it.
  91  * @freq_table:         Optional list of frequencies to support statistics
  92  *                      and freq_table must be generated in ascending order.
  93  * @max_state:          The size of freq_table.
  94  */
  95 struct devfreq_dev_profile {
  96         unsigned long initial_freq;
  97         unsigned int polling_ms;
  98 
  99         int (*target)(struct device *dev, unsigned long *freq, u32 flags);
 100         int (*get_dev_status)(struct device *dev,
 101                               struct devfreq_dev_status *stat);
 102         int (*get_cur_freq)(struct device *dev, unsigned long *freq);
 103         void (*exit)(struct device *dev);
 104 
 105         unsigned long *freq_table;
 106         unsigned int max_state;
 107 };
 108 
 109 /**
 110  * struct devfreq - Device devfreq structure
 111  * @node:       list node - contains the devices with devfreq that have been
 112  *              registered.
 113  * @lock:       a mutex to protect accessing devfreq.
 114  * @dev:        device registered by devfreq class. dev.parent is the device
 115  *              using devfreq.
 116  * @profile:    device-specific devfreq profile
 117  * @governor:   method how to choose frequency based on the usage.
 118  * @governor_name:      devfreq governor name for use with this devfreq
 119  * @nb:         notifier block used to notify devfreq object that it should
 120  *              reevaluate operable frequencies. Devfreq users may use
 121  *              devfreq.nb to the corresponding register notifier call chain.
 122  * @work:       delayed work for load monitoring.
 123  * @previous_freq:      previously configured frequency value.
 124  * @data:       Private data of the governor. The devfreq framework does not
 125  *              touch this.
 126  * @min_freq:   Limit minimum frequency requested by user (0: none)
 127  * @max_freq:   Limit maximum frequency requested by user (0: none)
 128  * @scaling_min_freq:   Limit minimum frequency requested by OPP interface
 129  * @scaling_max_freq:   Limit maximum frequency requested by OPP interface
 130  * @stop_polling:        devfreq polling status of a device.
 131  * @suspend_freq:        frequency of a device set during suspend phase.
 132  * @resume_freq:         frequency of a device set in resume phase.
 133  * @suspend_count:       suspend requests counter for a device.
 134  * @total_trans:        Number of devfreq transitions
 135  * @trans_table:        Statistics of devfreq transitions
 136  * @time_in_state:      Statistics of devfreq states
 137  * @last_stat_updated:  The last time stat updated
 138  * @transition_notifier_list: list head of DEVFREQ_TRANSITION_NOTIFIER notifier
 139  *
 140  * This structure stores the devfreq information for a give device.
 141  *
 142  * Note that when a governor accesses entries in struct devfreq in its
 143  * functions except for the context of callbacks defined in struct
 144  * devfreq_governor, the governor should protect its access with the
 145  * struct mutex lock in struct devfreq. A governor may use this mutex
 146  * to protect its own private data in void *data as well.
 147  */
 148 struct devfreq {
 149         struct list_head node;
 150 
 151         struct mutex lock;
 152         struct device dev;
 153         struct devfreq_dev_profile *profile;
 154         const struct devfreq_governor *governor;
 155         char governor_name[DEVFREQ_NAME_LEN];
 156         struct notifier_block nb;
 157         struct delayed_work work;
 158 
 159         unsigned long previous_freq;
 160         struct devfreq_dev_status last_status;
 161 
 162         void *data; /* private data for governors */
 163 
 164         unsigned long min_freq;
 165         unsigned long max_freq;
 166         unsigned long scaling_min_freq;
 167         unsigned long scaling_max_freq;
 168         bool stop_polling;
 169 
 170         unsigned long suspend_freq;
 171         unsigned long resume_freq;
 172         atomic_t suspend_count;
 173 
 174         /* information for device frequency transition */
 175         unsigned int total_trans;
 176         unsigned int *trans_table;
 177         unsigned long *time_in_state;
 178         unsigned long last_stat_updated;
 179 
 180         struct srcu_notifier_head transition_notifier_list;
 181 };
 182 
 183 struct devfreq_freqs {
 184         unsigned long old;
 185         unsigned long new;
 186 };
 187 
 188 #if defined(CONFIG_PM_DEVFREQ)
 189 extern struct devfreq *devfreq_add_device(struct device *dev,
 190                                   struct devfreq_dev_profile *profile,
 191                                   const char *governor_name,
 192                                   void *data);
 193 extern int devfreq_remove_device(struct devfreq *devfreq);
 194 extern struct devfreq *devm_devfreq_add_device(struct device *dev,
 195                                   struct devfreq_dev_profile *profile,
 196                                   const char *governor_name,
 197                                   void *data);
 198 extern void devm_devfreq_remove_device(struct device *dev,
 199                                   struct devfreq *devfreq);
 200 
 201 /* Supposed to be called by PM callbacks */
 202 extern int devfreq_suspend_device(struct devfreq *devfreq);
 203 extern int devfreq_resume_device(struct devfreq *devfreq);
 204 
 205 extern void devfreq_suspend(void);
 206 extern void devfreq_resume(void);
 207 
 208 /**
 209  * update_devfreq() - Reevaluate the device and configure frequency
 210  * @devfreq:    the devfreq device
 211  *
 212  * Note: devfreq->lock must be held
 213  */
 214 extern int update_devfreq(struct devfreq *devfreq);
 215 
 216 /* Helper functions for devfreq user device driver with OPP. */
 217 extern struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
 218                                            unsigned long *freq, u32 flags);
 219 extern int devfreq_register_opp_notifier(struct device *dev,
 220                                          struct devfreq *devfreq);
 221 extern int devfreq_unregister_opp_notifier(struct device *dev,
 222                                            struct devfreq *devfreq);
 223 extern int devm_devfreq_register_opp_notifier(struct device *dev,
 224                                               struct devfreq *devfreq);
 225 extern void devm_devfreq_unregister_opp_notifier(struct device *dev,
 226                                                 struct devfreq *devfreq);
 227 extern int devfreq_register_notifier(struct devfreq *devfreq,
 228                                         struct notifier_block *nb,
 229                                         unsigned int list);
 230 extern int devfreq_unregister_notifier(struct devfreq *devfreq,
 231                                         struct notifier_block *nb,
 232                                         unsigned int list);
 233 extern int devm_devfreq_register_notifier(struct device *dev,
 234                                 struct devfreq *devfreq,
 235                                 struct notifier_block *nb,
 236                                 unsigned int list);
 237 extern void devm_devfreq_unregister_notifier(struct device *dev,
 238                                 struct devfreq *devfreq,
 239                                 struct notifier_block *nb,
 240                                 unsigned int list);
 241 extern struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
 242                                                 int index);
 243 
 244 #if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND)
 245 /**
 246  * struct devfreq_simple_ondemand_data - void *data fed to struct devfreq
 247  *      and devfreq_add_device
 248  * @upthreshold:        If the load is over this value, the frequency jumps.
 249  *                      Specify 0 to use the default. Valid value = 0 to 100.
 250  * @downdifferential:   If the load is under upthreshold - downdifferential,
 251  *                      the governor may consider slowing the frequency down.
 252  *                      Specify 0 to use the default. Valid value = 0 to 100.
 253  *                      downdifferential < upthreshold must hold.
 254  *
 255  * If the fed devfreq_simple_ondemand_data pointer is NULL to the governor,
 256  * the governor uses the default values.
 257  */
 258 struct devfreq_simple_ondemand_data {
 259         unsigned int upthreshold;
 260         unsigned int downdifferential;
 261 };
 262 #endif
 263 
 264 #if IS_ENABLED(CONFIG_DEVFREQ_GOV_PASSIVE)
 265 /**
 266  * struct devfreq_passive_data - void *data fed to struct devfreq
 267  *      and devfreq_add_device
 268  * @parent:     the devfreq instance of parent device.
 269  * @get_target_freq:    Optional callback, Returns desired operating frequency
 270  *                      for the device using passive governor. That is called
 271  *                      when passive governor should decide the next frequency
 272  *                      by using the new frequency of parent devfreq device
 273  *                      using governors except for passive governor.
 274  *                      If the devfreq device has the specific method to decide
 275  *                      the next frequency, should use this callback.
 276  * @this:       the devfreq instance of own device.
 277  * @nb:         the notifier block for DEVFREQ_TRANSITION_NOTIFIER list
 278  *
 279  * The devfreq_passive_data have to set the devfreq instance of parent
 280  * device with governors except for the passive governor. But, don't need to
 281  * initialize the 'this' and 'nb' field because the devfreq core will handle
 282  * them.
 283  */
 284 struct devfreq_passive_data {
 285         /* Should set the devfreq instance of parent device */
 286         struct devfreq *parent;
 287 
 288         /* Optional callback to decide the next frequency of passvice device */
 289         int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
 290 
 291         /* For passive governor's internal use. Don't need to set them */
 292         struct devfreq *this;
 293         struct notifier_block nb;
 294 };
 295 #endif
 296 
 297 #else /* !CONFIG_PM_DEVFREQ */
 298 static inline struct devfreq *devfreq_add_device(struct device *dev,
 299                                           struct devfreq_dev_profile *profile,
 300                                           const char *governor_name,
 301                                           void *data)
 302 {
 303         return ERR_PTR(-ENOSYS);
 304 }
 305 
 306 static inline int devfreq_remove_device(struct devfreq *devfreq)
 307 {
 308         return 0;
 309 }
 310 
 311 static inline struct devfreq *devm_devfreq_add_device(struct device *dev,
 312                                         struct devfreq_dev_profile *profile,
 313                                         const char *governor_name,
 314                                         void *data)
 315 {
 316         return ERR_PTR(-ENOSYS);
 317 }
 318 
 319 static inline void devm_devfreq_remove_device(struct device *dev,
 320                                         struct devfreq *devfreq)
 321 {
 322 }
 323 
 324 static inline int devfreq_suspend_device(struct devfreq *devfreq)
 325 {
 326         return 0;
 327 }
 328 
 329 static inline int devfreq_resume_device(struct devfreq *devfreq)
 330 {
 331         return 0;
 332 }
 333 
 334 static inline void devfreq_suspend(void) {}
 335 static inline void devfreq_resume(void) {}
 336 
 337 static inline struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
 338                                            unsigned long *freq, u32 flags)
 339 {
 340         return ERR_PTR(-EINVAL);
 341 }
 342 
 343 static inline int devfreq_register_opp_notifier(struct device *dev,
 344                                          struct devfreq *devfreq)
 345 {
 346         return -EINVAL;
 347 }
 348 
 349 static inline int devfreq_unregister_opp_notifier(struct device *dev,
 350                                            struct devfreq *devfreq)
 351 {
 352         return -EINVAL;
 353 }
 354 
 355 static inline int devm_devfreq_register_opp_notifier(struct device *dev,
 356                                                      struct devfreq *devfreq)
 357 {
 358         return -EINVAL;
 359 }
 360 
 361 static inline void devm_devfreq_unregister_opp_notifier(struct device *dev,
 362                                                         struct devfreq *devfreq)
 363 {
 364 }
 365 
 366 static inline int devfreq_register_notifier(struct devfreq *devfreq,
 367                                         struct notifier_block *nb,
 368                                         unsigned int list)
 369 {
 370         return 0;
 371 }
 372 
 373 static inline int devfreq_unregister_notifier(struct devfreq *devfreq,
 374                                         struct notifier_block *nb,
 375                                         unsigned int list)
 376 {
 377         return 0;
 378 }
 379 
 380 static inline int devm_devfreq_register_notifier(struct device *dev,
 381                                 struct devfreq *devfreq,
 382                                 struct notifier_block *nb,
 383                                 unsigned int list)
 384 {
 385         return 0;
 386 }
 387 
 388 static inline void devm_devfreq_unregister_notifier(struct device *dev,
 389                                 struct devfreq *devfreq,
 390                                 struct notifier_block *nb,
 391                                 unsigned int list)
 392 {
 393 }
 394 
 395 static inline struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
 396                                                         int index)
 397 {
 398         return ERR_PTR(-ENODEV);
 399 }
 400 
 401 static inline int devfreq_update_stats(struct devfreq *df)
 402 {
 403         return -EINVAL;
 404 }
 405 #endif /* CONFIG_PM_DEVFREQ */
 406 
 407 #endif /* __LINUX_DEVFREQ_H__ */

/* [<][>][^][v][top][bottom][index][help] */