PM / devfreq: map devfreq drivers to governor using name
[deliverable/linux.git] / include / linux / devfreq.h
index 281c72a3b9d50d19161c0f6182d38f67991cce8f..235248cb2c938452cbd998c8a171b4ac7c6d0b69 100644 (file)
@@ -25,12 +25,12 @@ struct devfreq;
  * struct devfreq_dev_status - Data given from devfreq user device to
  *                          governors. Represents the performance
  *                          statistics.
- * @total_time         The total time represented by this instance of
+ * @total_time:                The total time represented by this instance of
  *                     devfreq_dev_status
- * @busy_time          The time that the device was working among the
+ * @busy_time:         The time that the device was working among the
  *                     total_time.
- * @current_frequency  The operating frequency.
- * @private_data       An entry not specified by the devfreq framework.
+ * @current_frequency: The operating frequency.
+ * @private_data:      An entry not specified by the devfreq framework.
  *                     A device and a specific governor may have their
  *                     own protocol with private_data. However, because
  *                     this is governor-specific, a governor using this
@@ -54,23 +54,27 @@ struct devfreq_dev_status {
 
 /**
  * struct devfreq_dev_profile - Devfreq's user device profile
- * @initial_freq       The operating frequency when devfreq_add_device() is
+ * @initial_freq:      The operating frequency when devfreq_add_device() is
  *                     called.
- * @polling_ms         The polling interval in ms. 0 disables polling.
- * @target             The device should set its operating frequency at
+ * @polling_ms:                The polling interval in ms. 0 disables polling.
+ * @target:            The device should set its operating frequency at
  *                     freq or lowest-upper-than-freq value. If freq is
  *                     higher than any operable frequency, set maximum.
  *                     Before returning, target function should set
  *                     freq at the current frequency.
  *                     The "flags" parameter's possible values are
  *                     explained above with "DEVFREQ_FLAG_*" macros.
- * @get_dev_status     The device should provide the current performance
+ * @get_dev_status:    The device should provide the current performance
  *                     status to devfreq, which is used by governors.
- * @exit               An optional callback that is called when devfreq
+ * @get_cur_freq:      The device should provide the current frequency
+ *                     at which it is operating.
+ * @exit:              An optional callback that is called when devfreq
  *                     is removing the devfreq object due to error or
  *                     from devfreq_remove_device() call. If the user
  *                     has registered devfreq->nb at a notifier-head,
  *                     this is the time to unregister it.
+ * @freq_table:        Optional list of frequencies to support statistics.
+ * @max_state: The size of freq_table.
  */
 struct devfreq_dev_profile {
        unsigned long initial_freq;
@@ -79,63 +83,63 @@ struct devfreq_dev_profile {
        int (*target)(struct device *dev, unsigned long *freq, u32 flags);
        int (*get_dev_status)(struct device *dev,
                              struct devfreq_dev_status *stat);
+       int (*get_cur_freq)(struct device *dev, unsigned long *freq);
        void (*exit)(struct device *dev);
+
+       unsigned int *freq_table;
+       unsigned int max_state;
 };
 
 /**
  * struct devfreq_governor - Devfreq policy governor
- * @name               Governor's name
- * @get_target_freq    Returns desired operating frequency for the device.
+ * @node:              list node - contains registered devfreq governors
+ * @name:              Governor's name
+ * @get_target_freq:   Returns desired operating frequency for the device.
  *                     Basically, get_target_freq will run
  *                     devfreq_dev_profile.get_dev_status() to get the
  *                     status of the device (load = busy_time / total_time).
  *                     If no_central_polling is set, this callback is called
  *                     only with update_devfreq() notified by OPP.
- * @init               Called when the devfreq is being attached to a device
- * @exit               Called when the devfreq is being removed from a
- *                     device. Governor should stop any internal routines
- *                     before return because related data may be
- *                     freed after exit().
- * @no_central_polling Do not use devfreq's central polling mechanism.
- *                     When this is set, devfreq will not call
- *                     get_target_freq with devfreq_monitor(). However,
- *                     devfreq will call get_target_freq with
- *                     devfreq_update() notified by OPP framework.
+ * @event_handler:      Callback for devfreq core framework to notify events
+ *                      to governors. Events include per device governor
+ *                      init and exit, opp changes out of devfreq, suspend
+ *                      and resume of per device devfreq during device idle.
  *
  * Note that the callbacks are called with devfreq->lock locked by devfreq.
  */
 struct devfreq_governor {
+       struct list_head node;
+
        const char name[DEVFREQ_NAME_LEN];
        int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
-       int (*init)(struct devfreq *this);
-       void (*exit)(struct devfreq *this);
-       const bool no_central_polling;
+       int (*event_handler)(struct devfreq *devfreq,
+                               unsigned int event, void *data);
 };
 
 /**
  * struct devfreq - Device devfreq structure
- * @node       list node - contains the devices with devfreq that have been
+ * @node:      list node - contains the devices with devfreq that have been
  *             registered.
- * @lock       a mutex to protect accessing devfreq.
- * @dev                device registered by devfreq class. dev.parent is the device
+ * @lock:      a mutex to protect accessing devfreq.
+ * @dev:       device registered by devfreq class. dev.parent is the device
  *             using devfreq.
- * @profile    device-specific devfreq profile
- * @governor   method how to choose frequency based on the usage.
- * @nb         notifier block used to notify devfreq object that it should
+ * @profile:   device-specific devfreq profile
+ * @governor:  method how to choose frequency based on the usage.
+ * @governor_name:     devfreq governor name for use with this devfreq
+ * @nb:                notifier block used to notify devfreq object that it should
  *             reevaluate operable frequencies. Devfreq users may use
  *             devfreq.nb to the corresponding register notifier call chain.
- * @polling_jiffies    interval in jiffies.
- * @previous_freq      previously configured frequency value.
- * @next_polling       the number of remaining jiffies to poll with
- *                     "devfreq_monitor" executions to reevaluate
- *                     frequency/voltage of the device. Set by
- *                     profile's polling_ms interval.
- * @data       Private data of the governor. The devfreq framework does not
+ * @work:      delayed work for load monitoring.
+ * @previous_freq:     previously configured frequency value.
+ * @data:      Private data of the governor. The devfreq framework does not
  *             touch this.
- * @being_removed      a flag to mark that this object is being removed in
- *                     order to prevent trying to remove the object multiple times.
- * @min_freq   Limit minimum frequency requested by user (0: none)
- * @max_freq   Limit maximum frequency requested by user (0: none)
+ * @min_freq:  Limit minimum frequency requested by user (0: none)
+ * @max_freq:  Limit maximum frequency requested by user (0: none)
+ * @stop_polling:       devfreq polling status of a device.
+ * @total_trans:       Number of devfreq transitions
+ * @trans_table:       Statistics of devfreq transitions
+ * @time_in_state:     Statistics of devfreq states
+ * @last_stat_updated: The last time stat updated
  *
  * This structure stores the devfreq information for a give device.
  *
@@ -152,26 +156,33 @@ struct devfreq {
        struct device dev;
        struct devfreq_dev_profile *profile;
        const struct devfreq_governor *governor;
+       char governor_name[DEVFREQ_NAME_LEN];
        struct notifier_block nb;
+       struct delayed_work work;
 
-       unsigned long polling_jiffies;
        unsigned long previous_freq;
-       unsigned int next_polling;
 
        void *data; /* private data for governors */
 
-       bool being_removed;
-
        unsigned long min_freq;
        unsigned long max_freq;
+       bool stop_polling;
+
+       /* information for device freqeuncy transition */
+       unsigned int total_trans;
+       unsigned int *trans_table;
+       unsigned long *time_in_state;
+       unsigned long last_stat_updated;
 };
 
 #if defined(CONFIG_PM_DEVFREQ)
 extern struct devfreq *devfreq_add_device(struct device *dev,
                                  struct devfreq_dev_profile *profile,
-                                 const struct devfreq_governor *governor,
+                                 const char *governor_name,
                                  void *data);
 extern int devfreq_remove_device(struct devfreq *devfreq);
+extern int devfreq_suspend_device(struct devfreq *devfreq);
+extern int devfreq_resume_device(struct devfreq *devfreq);
 
 /* Helper functions for devfreq user device driver with OPP. */
 extern struct opp *devfreq_recommended_opp(struct device *dev,
@@ -181,23 +192,13 @@ extern int devfreq_register_opp_notifier(struct device *dev,
 extern int devfreq_unregister_opp_notifier(struct device *dev,
                                           struct devfreq *devfreq);
 
-#ifdef CONFIG_DEVFREQ_GOV_POWERSAVE
-extern const struct devfreq_governor devfreq_powersave;
-#endif
-#ifdef CONFIG_DEVFREQ_GOV_PERFORMANCE
-extern const struct devfreq_governor devfreq_performance;
-#endif
-#ifdef CONFIG_DEVFREQ_GOV_USERSPACE
-extern const struct devfreq_governor devfreq_userspace;
-#endif
 #ifdef CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND
-extern const struct devfreq_governor devfreq_simple_ondemand;
 /**
  * struct devfreq_simple_ondemand_data - void *data fed to struct devfreq
  *     and devfreq_add_device
- * @ upthreshold       If the load is over this value, the frequency jumps.
+ * @upthreshold:       If the load is over this value, the frequency jumps.
  *                     Specify 0 to use the default. Valid value = 0 to 100.
- * @ downdifferential  If the load is under upthreshold - downdifferential,
+ * @downdifferential:  If the load is under upthreshold - downdifferential,
  *                     the governor may consider slowing the frequency down.
  *                     Specify 0 to use the default. Valid value = 0 to 100.
  *                     downdifferential < upthreshold must hold.
@@ -214,7 +215,7 @@ struct devfreq_simple_ondemand_data {
 #else /* !CONFIG_PM_DEVFREQ */
 static struct devfreq *devfreq_add_device(struct device *dev,
                                          struct devfreq_dev_profile *profile,
-                                         struct devfreq_governor *governor,
+                                         const char *governor_name,
                                          void *data)
 {
        return NULL;
@@ -225,6 +226,16 @@ static int devfreq_remove_device(struct devfreq *devfreq)
        return 0;
 }
 
+static int devfreq_suspend_device(struct devfreq *devfreq)
+{
+       return 0;
+}
+
+static int devfreq_resume_device(struct devfreq *devfreq)
+{
+       return 0;
+}
+
 static struct opp *devfreq_recommended_opp(struct device *dev,
                                           unsigned long *freq, u32 flags)
 {
@@ -243,11 +254,6 @@ static int devfreq_unregister_opp_notifier(struct device *dev,
        return -EINVAL;
 }
 
-#define devfreq_powersave      NULL
-#define devfreq_performance    NULL
-#define devfreq_userspace      NULL
-#define devfreq_simple_ondemand        NULL
-
 #endif /* CONFIG_PM_DEVFREQ */
 
 #endif /* __LINUX_DEVFREQ_H__ */
This page took 0.030929 seconds and 5 git commands to generate.