linux/drivers/devfreq/governor.h
<<
>>
Prefs
   1/*
   2 * governor.h - internal header for devfreq governors.
   3 *
   4 * Copyright (C) 2011 Samsung Electronics
   5 *      MyungJoo Ham <myungjoo.ham@samsung.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 *
  11 * This header is for devfreq governors in drivers/devfreq/
  12 */
  13
  14#ifndef _GOVERNOR_H
  15#define _GOVERNOR_H
  16
  17#include <linux/devfreq.h>
  18
  19#define to_devfreq(DEV) container_of((DEV), struct devfreq, dev)
  20
  21/* Devfreq events */
  22#define DEVFREQ_GOV_START                       0x1
  23#define DEVFREQ_GOV_STOP                        0x2
  24#define DEVFREQ_GOV_INTERVAL                    0x3
  25#define DEVFREQ_GOV_SUSPEND                     0x4
  26#define DEVFREQ_GOV_RESUME                      0x5
  27
  28/**
  29 * struct devfreq_governor - Devfreq policy governor
  30 * @node:               list node - contains registered devfreq governors
  31 * @name:               Governor's name
  32 * @immutable:          Immutable flag for governor. If the value is 1,
  33 *                      this govenror is never changeable to other governor.
  34 * @get_target_freq:    Returns desired operating frequency for the device.
  35 *                      Basically, get_target_freq will run
  36 *                      devfreq_dev_profile.get_dev_status() to get the
  37 *                      status of the device (load = busy_time / total_time).
  38 *                      If no_central_polling is set, this callback is called
  39 *                      only with update_devfreq() notified by OPP.
  40 * @event_handler:      Callback for devfreq core framework to notify events
  41 *                      to governors. Events include per device governor
  42 *                      init and exit, opp changes out of devfreq, suspend
  43 *                      and resume of per device devfreq during device idle.
  44 *
  45 * Note that the callbacks are called with devfreq->lock locked by devfreq.
  46 */
  47struct devfreq_governor {
  48        struct list_head node;
  49
  50        const char name[DEVFREQ_NAME_LEN];
  51        const unsigned int immutable;
  52        int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
  53        int (*event_handler)(struct devfreq *devfreq,
  54                                unsigned int event, void *data);
  55};
  56
  57/* Caution: devfreq->lock must be locked before calling update_devfreq */
  58extern int update_devfreq(struct devfreq *devfreq);
  59
  60extern void devfreq_monitor_start(struct devfreq *devfreq);
  61extern void devfreq_monitor_stop(struct devfreq *devfreq);
  62extern void devfreq_monitor_suspend(struct devfreq *devfreq);
  63extern void devfreq_monitor_resume(struct devfreq *devfreq);
  64extern void devfreq_interval_update(struct devfreq *devfreq,
  65                                        unsigned int *delay);
  66
  67extern int devfreq_add_governor(struct devfreq_governor *governor);
  68extern int devfreq_remove_governor(struct devfreq_governor *governor);
  69
  70extern int devfreq_update_status(struct devfreq *devfreq, unsigned long freq);
  71
  72static inline int devfreq_update_stats(struct devfreq *df)
  73{
  74        return df->profile->get_dev_status(df->dev.parent, &df->last_status);
  75}
  76#endif /* _GOVERNOR_H */
  77