208 lines
		
	
	
	
		
			3.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
	
		
			3.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  (C) 2004-2009  Dominik Brodowski <linux@dominikbrodowski.de>
 | |
|  *
 | |
|  *  Licensed under the terms of the GNU GPL License version 2.
 | |
|  */
 | |
| 
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <errno.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #include "cpufreq.h"
 | |
| #include "sysfs.h"
 | |
| 
 | |
| int cpufreq_cpu_exists(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_cpu_exists(cpu);
 | |
| }
 | |
| 
 | |
| unsigned long cpufreq_get_freq_kernel(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_kernel(cpu);
 | |
| }
 | |
| 
 | |
| unsigned long cpufreq_get_freq_hardware(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_hardware(cpu);
 | |
| }
 | |
| 
 | |
| unsigned long cpufreq_get_transition_latency(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_transition_latency(cpu);
 | |
| }
 | |
| 
 | |
| int cpufreq_get_hardware_limits(unsigned int cpu,
 | |
| 				unsigned long *min,
 | |
| 				unsigned long *max)
 | |
| {
 | |
| 	if ((!min) || (!max))
 | |
| 		return -EINVAL;
 | |
| 	return sysfs_get_freq_hardware_limits(cpu, min, max);
 | |
| }
 | |
| 
 | |
| char *cpufreq_get_driver(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_driver(cpu);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_driver(char *ptr)
 | |
| {
 | |
| 	if (!ptr)
 | |
| 		return;
 | |
| 	free(ptr);
 | |
| }
 | |
| 
 | |
| struct cpufreq_policy *cpufreq_get_policy(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_policy(cpu);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_policy(struct cpufreq_policy *policy)
 | |
| {
 | |
| 	if ((!policy) || (!policy->governor))
 | |
| 		return;
 | |
| 
 | |
| 	free(policy->governor);
 | |
| 	policy->governor = NULL;
 | |
| 	free(policy);
 | |
| }
 | |
| 
 | |
| struct cpufreq_available_governors *cpufreq_get_available_governors(unsigned
 | |
| 								int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_available_governors(cpu);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_available_governors(struct cpufreq_available_governors *any)
 | |
| {
 | |
| 	struct cpufreq_available_governors *tmp, *next;
 | |
| 
 | |
| 	if (!any)
 | |
| 		return;
 | |
| 
 | |
| 	tmp = any->first;
 | |
| 	while (tmp) {
 | |
| 		next = tmp->next;
 | |
| 		if (tmp->governor)
 | |
| 			free(tmp->governor);
 | |
| 		free(tmp);
 | |
| 		tmp = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| struct cpufreq_available_frequencies
 | |
| *cpufreq_get_available_frequencies(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_available_frequencies(cpu);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies
 | |
| 				*any) {
 | |
| 	struct cpufreq_available_frequencies *tmp, *next;
 | |
| 
 | |
| 	if (!any)
 | |
| 		return;
 | |
| 
 | |
| 	tmp = any->first;
 | |
| 	while (tmp) {
 | |
| 		next = tmp->next;
 | |
| 		free(tmp);
 | |
| 		tmp = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_affected_cpus(cpu);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *any)
 | |
| {
 | |
| 	struct cpufreq_affected_cpus *tmp, *next;
 | |
| 
 | |
| 	if (!any)
 | |
| 		return;
 | |
| 
 | |
| 	tmp = any->first;
 | |
| 	while (tmp) {
 | |
| 		next = tmp->next;
 | |
| 		free(tmp);
 | |
| 		tmp = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_related_cpus(cpu);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *any)
 | |
| {
 | |
| 	cpufreq_put_affected_cpus(any);
 | |
| }
 | |
| 
 | |
| 
 | |
| int cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy)
 | |
| {
 | |
| 	if (!policy || !(policy->governor))
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	return sysfs_set_freq_policy(cpu, policy);
 | |
| }
 | |
| 
 | |
| 
 | |
| int cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq)
 | |
| {
 | |
| 	return sysfs_modify_freq_policy_min(cpu, min_freq);
 | |
| }
 | |
| 
 | |
| 
 | |
| int cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq)
 | |
| {
 | |
| 	return sysfs_modify_freq_policy_max(cpu, max_freq);
 | |
| }
 | |
| 
 | |
| 
 | |
| int cpufreq_modify_policy_governor(unsigned int cpu, char *governor)
 | |
| {
 | |
| 	if ((!governor) || (strlen(governor) > 19))
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	return sysfs_modify_freq_policy_governor(cpu, governor);
 | |
| }
 | |
| 
 | |
| int cpufreq_set_frequency(unsigned int cpu, unsigned long target_frequency)
 | |
| {
 | |
| 	return sysfs_set_frequency(cpu, target_frequency);
 | |
| }
 | |
| 
 | |
| struct cpufreq_stats *cpufreq_get_stats(unsigned int cpu,
 | |
| 					unsigned long long *total_time)
 | |
| {
 | |
| 	return sysfs_get_freq_stats(cpu, total_time);
 | |
| }
 | |
| 
 | |
| void cpufreq_put_stats(struct cpufreq_stats *any)
 | |
| {
 | |
| 	struct cpufreq_stats *tmp, *next;
 | |
| 
 | |
| 	if (!any)
 | |
| 		return;
 | |
| 
 | |
| 	tmp = any->first;
 | |
| 	while (tmp) {
 | |
| 		next = tmp->next;
 | |
| 		free(tmp);
 | |
| 		tmp = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| unsigned long cpufreq_get_transitions(unsigned int cpu)
 | |
| {
 | |
| 	return sysfs_get_freq_transitions(cpu);
 | |
| }
 | 
