diff options
Diffstat (limited to 'drivers/cpufreq/intel_pstate.c')
| -rw-r--r-- | drivers/cpufreq/intel_pstate.c | 42 | 
1 files changed, 14 insertions, 28 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 096fde0ebcb..f6dd1e76112 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -662,6 +662,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)  	cpu = all_cpu_data[policy->cpu]; +	if (!policy->cpuinfo.max_freq) +		return -ENODEV; +  	intel_pstate_get_min_max(cpu, &min, &max);  	limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq; @@ -747,37 +750,11 @@ static struct cpufreq_driver intel_pstate_driver = {  	.owner		= THIS_MODULE,  }; -static void intel_pstate_exit(void) -{ -	int cpu; - -	sysfs_remove_group(intel_pstate_kobject, -				&intel_pstate_attr_group); -	debugfs_remove_recursive(debugfs_parent); - -	cpufreq_unregister_driver(&intel_pstate_driver); - -	if (!all_cpu_data) -		return; - -	get_online_cpus(); -	for_each_online_cpu(cpu) { -		if (all_cpu_data[cpu]) { -			del_timer_sync(&all_cpu_data[cpu]->timer); -			kfree(all_cpu_data[cpu]); -		} -	} - -	put_online_cpus(); -	vfree(all_cpu_data); -} -module_exit(intel_pstate_exit); -  static int __initdata no_load;  static int __init intel_pstate_init(void)  { -	int rc = 0; +	int cpu, rc = 0;  	const struct x86_cpu_id *id;  	if (no_load) @@ -802,7 +779,16 @@ static int __init intel_pstate_init(void)  	intel_pstate_sysfs_expose_params();  	return rc;  out: -	intel_pstate_exit(); +	get_online_cpus(); +	for_each_online_cpu(cpu) { +		if (all_cpu_data[cpu]) { +			del_timer_sync(&all_cpu_data[cpu]->timer); +			kfree(all_cpu_data[cpu]); +		} +	} + +	put_online_cpus(); +	vfree(all_cpu_data);  	return -ENODEV;  }  device_initcall(intel_pstate_init);  |