diff options
Diffstat (limited to 'drivers/devfreq/devfreq.c')
| -rw-r--r-- | drivers/devfreq/devfreq.c | 69 | 
1 files changed, 69 insertions, 0 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index f3100b19f79..5d15b812377 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -437,6 +437,74 @@ int devfreq_remove_device(struct devfreq *devfreq)  	return 0;  } +static ssize_t show_governor(struct device *dev, +			     struct device_attribute *attr, char *buf) +{ +	return sprintf(buf, "%s\n", to_devfreq(dev)->governor->name); +} + +static ssize_t show_freq(struct device *dev, +			 struct device_attribute *attr, char *buf) +{ +	return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq); +} + +static ssize_t show_polling_interval(struct device *dev, +				     struct device_attribute *attr, char *buf) +{ +	return sprintf(buf, "%d\n", to_devfreq(dev)->profile->polling_ms); +} + +static ssize_t store_polling_interval(struct device *dev, +				      struct device_attribute *attr, +				      const char *buf, size_t count) +{ +	struct devfreq *df = to_devfreq(dev); +	unsigned int value; +	int ret; + +	ret = sscanf(buf, "%u", &value); +	if (ret != 1) +		goto out; + +	mutex_lock(&df->lock); +	df->profile->polling_ms = value; +	df->next_polling = df->polling_jiffies +			 = msecs_to_jiffies(value); +	mutex_unlock(&df->lock); + +	ret = count; + +	if (df->governor->no_central_polling) +		goto out; + +	mutex_lock(&devfreq_list_lock); +	if (df->next_polling > 0 && !polling) { +		polling = true; +		queue_delayed_work(devfreq_wq, &devfreq_work, +				   df->next_polling); +	} +	mutex_unlock(&devfreq_list_lock); +out: +	return ret; +} + +static ssize_t show_central_polling(struct device *dev, +				    struct device_attribute *attr, char *buf) +{ +	return sprintf(buf, "%d\n", +		       !to_devfreq(dev)->governor->no_central_polling); +} + +static struct device_attribute devfreq_attrs[] = { +	__ATTR(governor, S_IRUGO, show_governor, NULL), +	__ATTR(cur_freq, S_IRUGO, show_freq, NULL), +	__ATTR(central_polling, S_IRUGO, show_central_polling, NULL), +	__ATTR(polling_interval, S_IRUGO | S_IWUSR, show_polling_interval, +	       store_polling_interval), +	{ }, +}; +  /**   * devfreq_start_polling() - Initialize data structure for devfreq framework and   *			   start polling registered devfreq devices. @@ -461,6 +529,7 @@ static int __init devfreq_init(void)  		pr_err("%s: couldn't create class\n", __FILE__);  		return PTR_ERR(devfreq_class);  	} +	devfreq_class->dev_attrs = devfreq_attrs;  	return 0;  }  subsys_initcall(devfreq_init);  |