diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 37 | 
1 files changed, 26 insertions, 11 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index fb8a5279c5d..1f93dbd7235 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -15,6 +15,8 @@   *   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/init.h> @@ -127,7 +129,7 @@ static int __init init_cpufreq_transition_notifier_list(void)  pure_initcall(init_cpufreq_transition_notifier_list);  static int off __read_mostly; -int cpufreq_disabled(void) +static int cpufreq_disabled(void)  {  	return off;  } @@ -402,7 +404,7 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data,  static ssize_t store_##file_name					\  (struct cpufreq_policy *policy, const char *buf, size_t count)		\  {									\ -	unsigned int ret = -EINVAL;					\ +	unsigned int ret;						\  	struct cpufreq_policy new_policy;				\  									\  	ret = cpufreq_get_policy(&new_policy, policy->cpu);		\ @@ -445,7 +447,7 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)  	else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)  		return sprintf(buf, "performance\n");  	else if (policy->governor) -		return scnprintf(buf, CPUFREQ_NAME_LEN, "%s\n", +		return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n",  				policy->governor->name);  	return -EINVAL;  } @@ -457,7 +459,7 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)  static ssize_t store_scaling_governor(struct cpufreq_policy *policy,  					const char *buf, size_t count)  { -	unsigned int ret = -EINVAL; +	unsigned int ret;  	char	str_governor[16];  	struct cpufreq_policy new_policy; @@ -491,7 +493,7 @@ static ssize_t store_scaling_governor(struct cpufreq_policy *policy,   */  static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf)  { -	return scnprintf(buf, CPUFREQ_NAME_LEN, "%s\n", cpufreq_driver->name); +	return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n", cpufreq_driver->name);  }  /** @@ -512,7 +514,7 @@ static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,  		if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))  		    - (CPUFREQ_NAME_LEN + 2)))  			goto out; -		i += scnprintf(&buf[i], CPUFREQ_NAME_LEN, "%s ", t->name); +		i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);  	}  out:  	i += sprintf(&buf[i], "\n"); @@ -581,7 +583,7 @@ static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)  }  /** - * show_scaling_driver - show the current cpufreq HW/BIOS limitation + * show_bios_limit - show the current cpufreq HW/BIOS limitation   */  static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)  { @@ -1468,12 +1470,23 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,  			    unsigned int relation)  {  	int retval = -EINVAL; +	unsigned int old_target_freq = target_freq;  	if (cpufreq_disabled())  		return -ENODEV; -	pr_debug("target for CPU %u: %u kHz, relation %u\n", policy->cpu, -		target_freq, relation); +	/* Make sure that target_freq is within supported range */ +	if (target_freq > policy->max) +		target_freq = policy->max; +	if (target_freq < policy->min) +		target_freq = policy->min; + +	pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n", +			policy->cpu, target_freq, relation, old_target_freq); + +	if (target_freq == policy->cur) +		return 0; +  	if (cpu_online(policy->cpu) && cpufreq_driver->target)  		retval = cpufreq_driver->target(policy, target_freq, relation); @@ -1509,12 +1522,14 @@ int __cpufreq_driver_getavg(struct cpufreq_policy *policy, unsigned int cpu)  {  	int ret = 0; +	if (!(cpu_online(cpu) && cpufreq_driver->getavg)) +		return 0; +  	policy = cpufreq_cpu_get(policy->cpu);  	if (!policy)  		return -EINVAL; -	if (cpu_online(cpu) && cpufreq_driver->getavg) -		ret = cpufreq_driver->getavg(policy, cpu); +	ret = cpufreq_driver->getavg(policy, cpu);  	cpufreq_cpu_put(policy);  	return ret;  |