diff options
| author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2012-12-07 23:13:36 +0100 | 
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2012-12-07 23:13:36 +0100 | 
| commit | bf58cdffac931ff387c657395742a737837b93ca (patch) | |
| tree | 8e5a16a2ece40502f700212220c23c866470d2ff /include/linux/devfreq.h | |
| parent | 6b728f1a906976ec658827adc9c2d27608aa8517 (diff) | |
| parent | 6dcdd8e3cadd8dfcfe63d231631d70e2670970f9 (diff) | |
| download | olio-linux-3.10-bf58cdffac931ff387c657395742a737837b93ca.tar.xz olio-linux-3.10-bf58cdffac931ff387c657395742a737837b93ca.zip  | |
Merge branch 'pm-devfreq'
* pm-devfreq: (23 commits)
  PM / devfreq: remove compiler error with module governors (2)
  PM / devfreq: Fix return value in devfreq_remove_governor()
  PM / devfreq: Fix incorrect argument in error message
  PM / devfreq: missing rcu_read_lock() added for find_device_opp()
  PM / devfreq: remove compiler error when a governor is module
  PM / devfreq: exynos4_bus.c: Fixed an alignment of the func call args.
  PM / devfreq: Add sysfs node to expose available governors
  PM / devfreq: allow sysfs governor node to switch governor
  PM / devfreq: governors: add GPL module license and allow module build
  PM / devfreq: map devfreq drivers to governor using name
  PM / devfreq: register governors with devfreq framework
  PM / devfreq: provide hooks for governors to be registered
  PM / devfreq: export update_devfreq
  PM / devfreq: Add sysfs node for representing frequency transition information.
  PM / devfreq: Add sysfs node to expose available frequencies
  PM / devfreq: documentation cleanups for devfreq header
  PM / devfreq: Use devm_* functions in exynos4_bus.c
  PM / devfreq: make devfreq_class static
  PM / devfreq: fix sscanf handling for writable sysfs entries
  PM / devfreq: kernel-doc typo corrections
  ...
Diffstat (limited to 'include/linux/devfreq.h')
| -rw-r--r-- | include/linux/devfreq.h | 136 | 
1 files changed, 71 insertions, 65 deletions
diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index 281c72a3b9d..e83ef39b3be 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -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; +#if IS_ENABLED(CONFIG_DEVFREQ_GOV_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__ */  |