diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 49 | 
1 files changed, 20 insertions, 29 deletions
| diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 7c48e7316d91..c35e7da1ed7a 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -976,10 +976,14 @@ static int cpufreq_init_policy(struct cpufreq_policy *policy)  	new_policy.governor = gov; -	/* Use the default policy if its valid. */ -	if (cpufreq_driver->setpolicy) -		cpufreq_parse_governor(gov->name, &new_policy.policy, NULL); - +	/* Use the default policy if there is no last_policy. */ +	if (cpufreq_driver->setpolicy) { +		if (policy->last_policy) +			new_policy.policy = policy->last_policy; +		else +			cpufreq_parse_governor(gov->name, &new_policy.policy, +					       NULL); +	}  	/* set default policy */  	return cpufreq_set_policy(policy, &new_policy);  } @@ -1330,6 +1334,8 @@ static void cpufreq_offline_prepare(unsigned int cpu)  		if (has_target())  			strncpy(policy->last_governor, policy->governor->name,  				CPUFREQ_NAME_LEN); +		else +			policy->last_policy = policy->policy;  	} else if (cpu == policy->cpu) {  		/* Nominate new CPU */  		policy->cpu = cpumask_any(policy->cpus); @@ -1401,13 +1407,10 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)  	}  	cpumask_clear_cpu(cpu, policy->real_cpus); +	remove_cpu_dev_symlink(policy, cpu); -	if (cpumask_empty(policy->real_cpus)) { +	if (cpumask_empty(policy->real_cpus))  		cpufreq_policy_free(policy, true); -		return; -	} - -	remove_cpu_dev_symlink(policy, cpu);  }  static void handle_update(struct work_struct *work) @@ -2327,29 +2330,15 @@ int cpufreq_boost_trigger_state(int state)  	return ret;  } -int cpufreq_boost_supported(void) +static bool cpufreq_boost_supported(void)  { -	if (likely(cpufreq_driver)) -		return cpufreq_driver->boost_supported; - -	return 0; +	return likely(cpufreq_driver) && cpufreq_driver->set_boost;  } -EXPORT_SYMBOL_GPL(cpufreq_boost_supported);  static int create_boost_sysfs_file(void)  {  	int ret; -	if (!cpufreq_boost_supported()) -		return 0; - -	/* -	 * Check if driver provides function to enable boost - -	 * if not, use cpufreq_boost_set_sw as default -	 */ -	if (!cpufreq_driver->set_boost) -		cpufreq_driver->set_boost = cpufreq_boost_set_sw; -  	ret = sysfs_create_file(cpufreq_global_kobject, &boost.attr);  	if (ret)  		pr_err("%s: cannot register global BOOST sysfs file\n", @@ -2372,7 +2361,7 @@ int cpufreq_enable_boost_support(void)  	if (cpufreq_boost_supported())  		return 0; -	cpufreq_driver->boost_supported = true; +	cpufreq_driver->set_boost = cpufreq_boost_set_sw;  	/* This will get removed on driver unregister */  	return create_boost_sysfs_file(); @@ -2432,9 +2421,11 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)  	if (driver_data->setpolicy)  		driver_data->flags |= CPUFREQ_CONST_LOOPS; -	ret = create_boost_sysfs_file(); -	if (ret) -		goto err_null_driver; +	if (cpufreq_boost_supported()) { +		ret = create_boost_sysfs_file(); +		if (ret) +			goto err_null_driver; +	}  	ret = subsys_interface_register(&cpufreq_interface);  	if (ret) | 
