1/* 2 * (C) 2004-2009 Dominik Brodowski <linux@dominikbrodowski.de> 3 * 4 * Licensed under the terms of the GNU GPL License version 2. 5 */ 6 7 8#include <stdio.h> 9#include <errno.h> 10#include <stdlib.h> 11#include <string.h> 12 13#include "cpufreq.h" 14#include "sysfs.h" 15 16int cpufreq_cpu_exists(unsigned int cpu) 17{ 18 return sysfs_cpu_exists(cpu); 19} 20 21unsigned long cpufreq_get_freq_kernel(unsigned int cpu) 22{ 23 return sysfs_get_freq_kernel(cpu); 24} 25 26unsigned long cpufreq_get_freq_hardware(unsigned int cpu) 27{ 28 return sysfs_get_freq_hardware(cpu); 29} 30 31unsigned long cpufreq_get_transition_latency(unsigned int cpu) 32{ 33 return sysfs_get_freq_transition_latency(cpu); 34} 35 36int cpufreq_get_hardware_limits(unsigned int cpu, 37 unsigned long *min, 38 unsigned long *max) 39{ 40 if ((!min) || (!max)) 41 return -EINVAL; 42 return sysfs_get_freq_hardware_limits(cpu, min, max); 43} 44 45char *cpufreq_get_driver(unsigned int cpu) 46{ 47 return sysfs_get_freq_driver(cpu); 48} 49 50void cpufreq_put_driver(char *ptr) 51{ 52 if (!ptr) 53 return; 54 free(ptr); 55} 56 57struct cpufreq_policy *cpufreq_get_policy(unsigned int cpu) 58{ 59 return sysfs_get_freq_policy(cpu); 60} 61 62void cpufreq_put_policy(struct cpufreq_policy *policy) 63{ 64 if ((!policy) || (!policy->governor)) 65 return; 66 67 free(policy->governor); 68 policy->governor = NULL; 69 free(policy); 70} 71 72struct cpufreq_available_governors *cpufreq_get_available_governors(unsigned 73 int cpu) 74{ 75 return sysfs_get_freq_available_governors(cpu); 76} 77 78void cpufreq_put_available_governors(struct cpufreq_available_governors *any) 79{ 80 struct cpufreq_available_governors *tmp, *next; 81 82 if (!any) 83 return; 84 85 tmp = any->first; 86 while (tmp) { 87 next = tmp->next; 88 if (tmp->governor) 89 free(tmp->governor); 90 free(tmp); 91 tmp = next; 92 } 93} 94 95 96struct cpufreq_available_frequencies 97*cpufreq_get_available_frequencies(unsigned int cpu) 98{ 99 return sysfs_get_available_frequencies(cpu); 100} 101 102void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies 103 *any) { 104 struct cpufreq_available_frequencies *tmp, *next; 105 106 if (!any) 107 return; 108 109 tmp = any->first; 110 while (tmp) { 111 next = tmp->next; 112 free(tmp); 113 tmp = next; 114 } 115} 116 117 118struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned int cpu) 119{ 120 return sysfs_get_freq_affected_cpus(cpu); 121} 122 123void cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *any) 124{ 125 struct cpufreq_affected_cpus *tmp, *next; 126 127 if (!any) 128 return; 129 130 tmp = any->first; 131 while (tmp) { 132 next = tmp->next; 133 free(tmp); 134 tmp = next; 135 } 136} 137 138 139struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned int cpu) 140{ 141 return sysfs_get_freq_related_cpus(cpu); 142} 143 144void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *any) 145{ 146 cpufreq_put_affected_cpus(any); 147} 148 149 150int cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy) 151{ 152 if (!policy || !(policy->governor)) 153 return -EINVAL; 154 155 return sysfs_set_freq_policy(cpu, policy); 156} 157 158 159int cpufreq_modify_policy_min(unsigned int cpu, unsigned long min_freq) 160{ 161 return sysfs_modify_freq_policy_min(cpu, min_freq); 162} 163 164 165int cpufreq_modify_policy_max(unsigned int cpu, unsigned long max_freq) 166{ 167 return sysfs_modify_freq_policy_max(cpu, max_freq); 168} 169 170 171int cpufreq_modify_policy_governor(unsigned int cpu, char *governor) 172{ 173 if ((!governor) || (strlen(governor) > 19)) 174 return -EINVAL; 175 176 return sysfs_modify_freq_policy_governor(cpu, governor); 177} 178 179int cpufreq_set_frequency(unsigned int cpu, unsigned long target_frequency) 180{ 181 return sysfs_set_frequency(cpu, target_frequency); 182} 183 184struct cpufreq_stats *cpufreq_get_stats(unsigned int cpu, 185 unsigned long long *total_time) 186{ 187 return sysfs_get_freq_stats(cpu, total_time); 188} 189 190void cpufreq_put_stats(struct cpufreq_stats *any) 191{ 192 struct cpufreq_stats *tmp, *next; 193 194 if (!any) 195 return; 196 197 tmp = any->first; 198 while (tmp) { 199 next = tmp->next; 200 free(tmp); 201 tmp = next; 202 } 203} 204 205unsigned long cpufreq_get_transitions(unsigned int cpu) 206{ 207 return sysfs_get_freq_transitions(cpu); 208} 209