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 16 int cpufreq_cpu_exists(unsigned int cpu) 17 { 18 return sysfs_cpu_exists(cpu); 19 } 20 21 unsigned long cpufreq_get_freq_kernel(unsigned int cpu) 22 { 23 return sysfs_get_freq_kernel(cpu); 24 } 25 26 unsigned long cpufreq_get_freq_hardware(unsigned int cpu) 27 { 28 return sysfs_get_freq_hardware(cpu); 29 } 30 31 unsigned long cpufreq_get_transition_latency(unsigned int cpu) 32 { 33 return sysfs_get_freq_transition_latency(cpu); 34 } 35 36 int 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 45 char *cpufreq_get_driver(unsigned int cpu) 46 { 47 return sysfs_get_freq_driver(cpu); 48 } 49 50 void cpufreq_put_driver(char *ptr) 51 { 52 if (!ptr) 53 return; 54 free(ptr); 55 } 56 57 struct cpufreq_policy *cpufreq_get_policy(unsigned int cpu) 58 { 59 return sysfs_get_freq_policy(cpu); 60 } 61 62 void 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 72 struct cpufreq_available_governors *cpufreq_get_available_governors(unsigned 73 int cpu) 74 { 75 return sysfs_get_freq_available_governors(cpu); 76 } 77 78 void 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 96 struct cpufreq_available_frequencies 97 *cpufreq_get_available_frequencies(unsigned int cpu) 98 { 99 return sysfs_get_available_frequencies(cpu); 100 } 101 102 void 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 118 struct cpufreq_affected_cpus *cpufreq_get_affected_cpus(unsigned int cpu) 119 { 120 return sysfs_get_freq_affected_cpus(cpu); 121 } 122 123 void 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 139 struct cpufreq_affected_cpus *cpufreq_get_related_cpus(unsigned int cpu) 140 { 141 return sysfs_get_freq_related_cpus(cpu); 142 } 143 144 void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *any) 145 { 146 cpufreq_put_affected_cpus(any); 147 } 148 149 150 int 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 159 int 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 165 int 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 171 int 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 179 int cpufreq_set_frequency(unsigned int cpu, unsigned long target_frequency) 180 { 181 return sysfs_set_frequency(cpu, target_frequency); 182 } 183 184 struct 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 190 void 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 205 unsigned long cpufreq_get_transitions(unsigned int cpu) 206 { 207 return sysfs_get_freq_transitions(cpu); 208 } 209