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