cpufreq_userspace.c (c1f3ee120bb61045b1c0a3ead620d1d65af47130) cpufreq_userspace.c (9e76988e9390a4ff4d171f690586d0c58186b47e)
1
2/*
3 * linux/drivers/cpufreq/cpufreq_userspace.c
4 *
5 * Copyright (C) 2001 Russell King
6 * (C) 2002 - 2004 Dominik Brodowski <linux@brodo.de>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 51 unchanged lines hidden (view full) ---

60
61static struct notifier_block userspace_cpufreq_notifier_block = {
62 .notifier_call = userspace_cpufreq_notifier
63};
64
65
66/**
67 * cpufreq_set - set the CPU frequency
1
2/*
3 * linux/drivers/cpufreq/cpufreq_userspace.c
4 *
5 * Copyright (C) 2001 Russell King
6 * (C) 2002 - 2004 Dominik Brodowski <linux@brodo.de>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 51 unchanged lines hidden (view full) ---

60
61static struct notifier_block userspace_cpufreq_notifier_block = {
62 .notifier_call = userspace_cpufreq_notifier
63};
64
65
66/**
67 * cpufreq_set - set the CPU frequency
68 * @policy: pointer to policy struct where freq is being set
68 * @freq: target frequency in kHz
69 * @freq: target frequency in kHz
69 * @cpu: CPU for which the frequency is to be set
70 *
71 * Sets the CPU frequency to freq.
72 */
70 *
71 * Sets the CPU frequency to freq.
72 */
73static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy)
73static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
74{
75 int ret = -EINVAL;
76
77 dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);
78
79 mutex_lock(&userspace_mutex);
80 if (!cpu_is_managed[policy->cpu])
81 goto err;

--- 15 unchanged lines hidden (view full) ---

97 ret = __cpufreq_driver_target(policy, freq, CPUFREQ_RELATION_L);
98
99 err:
100 mutex_unlock(&userspace_mutex);
101 return ret;
102}
103
104
74{
75 int ret = -EINVAL;
76
77 dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);
78
79 mutex_lock(&userspace_mutex);
80 if (!cpu_is_managed[policy->cpu])
81 goto err;

--- 15 unchanged lines hidden (view full) ---

97 ret = __cpufreq_driver_target(policy, freq, CPUFREQ_RELATION_L);
98
99 err:
100 mutex_unlock(&userspace_mutex);
101 return ret;
102}
103
104
105/************************** sysfs interface ************************/
106static ssize_t show_speed (struct cpufreq_policy *policy, char *buf)
105static ssize_t show_speed(struct cpufreq_policy *policy, char *buf)
107{
106{
108 return sprintf (buf, "%u\n", cpu_cur_freq[policy->cpu]);
107 return sprintf(buf, "%u\n", cpu_cur_freq[policy->cpu]);
109}
110
108}
109
111static ssize_t
112store_speed (struct cpufreq_policy *policy, const char *buf, size_t count)
113{
114 unsigned int freq = 0;
115 unsigned int ret;
116
117 ret = sscanf (buf, "%u", &freq);
118 if (ret != 1)
119 return -EINVAL;
120
121 cpufreq_set(freq, policy);
122
123 return count;
124}
125
126static struct freq_attr freq_attr_scaling_setspeed =
127{
128 .attr = { .name = "scaling_setspeed", .mode = 0644 },
129 .show = show_speed,
130 .store = store_speed,
131};
132
133static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
134 unsigned int event)
135{
136 unsigned int cpu = policy->cpu;
137 int rc = 0;
138
139 switch (event) {
140 case CPUFREQ_GOV_START:
141 if (!cpu_online(cpu))
142 return -EINVAL;
143 BUG_ON(!policy->cur);
144 mutex_lock(&userspace_mutex);
110static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
111 unsigned int event)
112{
113 unsigned int cpu = policy->cpu;
114 int rc = 0;
115
116 switch (event) {
117 case CPUFREQ_GOV_START:
118 if (!cpu_online(cpu))
119 return -EINVAL;
120 BUG_ON(!policy->cur);
121 mutex_lock(&userspace_mutex);
145 rc = sysfs_create_file (&policy->kobj,
146 &freq_attr_scaling_setspeed.attr);
147 if (rc)
148 goto start_out;
149
150 if (cpus_using_userspace_governor == 0) {
151 cpufreq_register_notifier(
152 &userspace_cpufreq_notifier_block,
153 CPUFREQ_TRANSITION_NOTIFIER);
154 }
155 cpus_using_userspace_governor++;
156
157 cpu_is_managed[cpu] = 1;
158 cpu_min_freq[cpu] = policy->min;
159 cpu_max_freq[cpu] = policy->max;
160 cpu_cur_freq[cpu] = policy->cur;
161 cpu_set_freq[cpu] = policy->cur;
162 dprintk("managing cpu %u started (%u - %u kHz, currently %u kHz)\n", cpu, cpu_min_freq[cpu], cpu_max_freq[cpu], cpu_cur_freq[cpu]);
122
123 if (cpus_using_userspace_governor == 0) {
124 cpufreq_register_notifier(
125 &userspace_cpufreq_notifier_block,
126 CPUFREQ_TRANSITION_NOTIFIER);
127 }
128 cpus_using_userspace_governor++;
129
130 cpu_is_managed[cpu] = 1;
131 cpu_min_freq[cpu] = policy->min;
132 cpu_max_freq[cpu] = policy->max;
133 cpu_cur_freq[cpu] = policy->cur;
134 cpu_set_freq[cpu] = policy->cur;
135 dprintk("managing cpu %u started (%u - %u kHz, currently %u kHz)\n", cpu, cpu_min_freq[cpu], cpu_max_freq[cpu], cpu_cur_freq[cpu]);
163start_out:
136
164 mutex_unlock(&userspace_mutex);
165 break;
166 case CPUFREQ_GOV_STOP:
167 mutex_lock(&userspace_mutex);
168 cpus_using_userspace_governor--;
169 if (cpus_using_userspace_governor == 0) {
170 cpufreq_unregister_notifier(
171 &userspace_cpufreq_notifier_block,
172 CPUFREQ_TRANSITION_NOTIFIER);
173 }
174
175 cpu_is_managed[cpu] = 0;
176 cpu_min_freq[cpu] = 0;
177 cpu_max_freq[cpu] = 0;
178 cpu_set_freq[cpu] = 0;
137 mutex_unlock(&userspace_mutex);
138 break;
139 case CPUFREQ_GOV_STOP:
140 mutex_lock(&userspace_mutex);
141 cpus_using_userspace_governor--;
142 if (cpus_using_userspace_governor == 0) {
143 cpufreq_unregister_notifier(
144 &userspace_cpufreq_notifier_block,
145 CPUFREQ_TRANSITION_NOTIFIER);
146 }
147
148 cpu_is_managed[cpu] = 0;
149 cpu_min_freq[cpu] = 0;
150 cpu_max_freq[cpu] = 0;
151 cpu_set_freq[cpu] = 0;
179 sysfs_remove_file (&policy->kobj, &freq_attr_scaling_setspeed.attr);
180 dprintk("managing cpu %u stopped\n", cpu);
181 mutex_unlock(&userspace_mutex);
182 break;
183 case CPUFREQ_GOV_LIMITS:
184 mutex_lock(&userspace_mutex);
185 dprintk("limit event for cpu %u: %u - %u kHz,"
186 "currently %u kHz, last set to %u kHz\n",
187 cpu, policy->min, policy->max,

--- 18 unchanged lines hidden (view full) ---

206 }
207 return rc;
208}
209
210
211struct cpufreq_governor cpufreq_gov_userspace = {
212 .name = "userspace",
213 .governor = cpufreq_governor_userspace,
152 dprintk("managing cpu %u stopped\n", cpu);
153 mutex_unlock(&userspace_mutex);
154 break;
155 case CPUFREQ_GOV_LIMITS:
156 mutex_lock(&userspace_mutex);
157 dprintk("limit event for cpu %u: %u - %u kHz,"
158 "currently %u kHz, last set to %u kHz\n",
159 cpu, policy->min, policy->max,

--- 18 unchanged lines hidden (view full) ---

178 }
179 return rc;
180}
181
182
183struct cpufreq_governor cpufreq_gov_userspace = {
184 .name = "userspace",
185 .governor = cpufreq_governor_userspace,
186 .store_setspeed = cpufreq_set,
187 .show_setspeed = show_speed,
214 .owner = THIS_MODULE,
215};
216EXPORT_SYMBOL(cpufreq_gov_userspace);
217
218static int __init cpufreq_gov_userspace_init(void)
219{
220 return cpufreq_register_governor(&cpufreq_gov_userspace);
221}

--- 18 unchanged lines hidden ---
188 .owner = THIS_MODULE,
189};
190EXPORT_SYMBOL(cpufreq_gov_userspace);
191
192static int __init cpufreq_gov_userspace_init(void)
193{
194 return cpufreq_register_governor(&cpufreq_gov_userspace);
195}

--- 18 unchanged lines hidden ---