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 --- |