cpufreq.c (652ed95d5fa6074b3c4ea245deb0691f1acb6656) | cpufreq.c (6f19efc0a1ca08bc61841b971d8b85ab505d95c8) |
---|---|
1/* 2 * linux/drivers/cpufreq/cpufreq.c 3 * 4 * Copyright (C) 2001 Russell King 5 * (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de> 6 * (C) 2013 Viresh Kumar <viresh.kumar@linaro.org> 7 * 8 * Oct 2005 - Ashok Raj <ashok.raj@intel.com> --- 338 unchanged lines hidden (view full) --- 347 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); 348} 349EXPORT_SYMBOL_GPL(cpufreq_notify_post_transition); 350 351 352/********************************************************************* 353 * SYSFS INTERFACE * 354 *********************************************************************/ | 1/* 2 * linux/drivers/cpufreq/cpufreq.c 3 * 4 * Copyright (C) 2001 Russell King 5 * (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de> 6 * (C) 2013 Viresh Kumar <viresh.kumar@linaro.org> 7 * 8 * Oct 2005 - Ashok Raj <ashok.raj@intel.com> --- 338 unchanged lines hidden (view full) --- 347 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); 348} 349EXPORT_SYMBOL_GPL(cpufreq_notify_post_transition); 350 351 352/********************************************************************* 353 * SYSFS INTERFACE * 354 *********************************************************************/ |
355ssize_t show_boost(struct kobject *kobj, 356 struct attribute *attr, char *buf) 357{ 358 return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled); 359} |
|
355 | 360 |
361static ssize_t store_boost(struct kobject *kobj, struct attribute *attr, 362 const char *buf, size_t count) 363{ 364 int ret, enable; 365 366 ret = sscanf(buf, "%d", &enable); 367 if (ret != 1 || enable < 0 || enable > 1) 368 return -EINVAL; 369 370 if (cpufreq_boost_trigger_state(enable)) { 371 pr_err("%s: Cannot %s BOOST!\n", __func__, 372 enable ? "enable" : "disable"); 373 return -EINVAL; 374 } 375 376 pr_debug("%s: cpufreq BOOST %s\n", __func__, 377 enable ? "enabled" : "disabled"); 378 379 return count; 380} 381define_one_global_rw(boost); 382 |
|
356static struct cpufreq_governor *__find_governor(const char *str_governor) 357{ 358 struct cpufreq_governor *t; 359 360 list_for_each_entry(t, &cpufreq_governor_list, governor_list) 361 if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN)) 362 return t; 363 --- 1815 unchanged lines hidden (view full) --- 2179 return NOTIFY_OK; 2180} 2181 2182static struct notifier_block __refdata cpufreq_cpu_notifier = { 2183 .notifier_call = cpufreq_cpu_callback, 2184}; 2185 2186/********************************************************************* | 383static struct cpufreq_governor *__find_governor(const char *str_governor) 384{ 385 struct cpufreq_governor *t; 386 387 list_for_each_entry(t, &cpufreq_governor_list, governor_list) 388 if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN)) 389 return t; 390 --- 1815 unchanged lines hidden (view full) --- 2206 return NOTIFY_OK; 2207} 2208 2209static struct notifier_block __refdata cpufreq_cpu_notifier = { 2210 .notifier_call = cpufreq_cpu_callback, 2211}; 2212 2213/********************************************************************* |
2214 * BOOST * 2215 *********************************************************************/ 2216static int cpufreq_boost_set_sw(int state) 2217{ 2218 struct cpufreq_frequency_table *freq_table; 2219 struct cpufreq_policy *policy; 2220 int ret = -EINVAL; 2221 2222 list_for_each_entry(policy, &cpufreq_policy_list, policy_list) { 2223 freq_table = cpufreq_frequency_get_table(policy->cpu); 2224 if (freq_table) { 2225 ret = cpufreq_frequency_table_cpuinfo(policy, 2226 freq_table); 2227 if (ret) { 2228 pr_err("%s: Policy frequency update failed\n", 2229 __func__); 2230 break; 2231 } 2232 policy->user_policy.max = policy->max; 2233 __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS); 2234 } 2235 } 2236 2237 return ret; 2238} 2239 2240int cpufreq_boost_trigger_state(int state) 2241{ 2242 unsigned long flags; 2243 int ret = 0; 2244 2245 if (cpufreq_driver->boost_enabled == state) 2246 return 0; 2247 2248 write_lock_irqsave(&cpufreq_driver_lock, flags); 2249 cpufreq_driver->boost_enabled = state; 2250 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2251 2252 ret = cpufreq_driver->set_boost(state); 2253 if (ret) { 2254 write_lock_irqsave(&cpufreq_driver_lock, flags); 2255 cpufreq_driver->boost_enabled = !state; 2256 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2257 2258 pr_err("%s: Cannot %s BOOST\n", __func__, 2259 state ? "enable" : "disable"); 2260 } 2261 2262 return ret; 2263} 2264 2265int cpufreq_boost_supported(void) 2266{ 2267 if (likely(cpufreq_driver)) 2268 return cpufreq_driver->boost_supported; 2269 2270 return 0; 2271} 2272EXPORT_SYMBOL_GPL(cpufreq_boost_supported); 2273 2274int cpufreq_boost_enabled(void) 2275{ 2276 return cpufreq_driver->boost_enabled; 2277} 2278EXPORT_SYMBOL_GPL(cpufreq_boost_enabled); 2279 2280/********************************************************************* |
|
2187 * REGISTER / UNREGISTER CPUFREQ DRIVER * 2188 *********************************************************************/ 2189 2190/** 2191 * cpufreq_register_driver - register a CPU Frequency driver 2192 * @driver_data: A struct cpufreq_driver containing the values# 2193 * submitted by the CPU Frequency driver. 2194 * --- 23 unchanged lines hidden (view full) --- 2218 write_lock_irqsave(&cpufreq_driver_lock, flags); 2219 if (cpufreq_driver) { 2220 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2221 return -EEXIST; 2222 } 2223 cpufreq_driver = driver_data; 2224 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2225 | 2281 * REGISTER / UNREGISTER CPUFREQ DRIVER * 2282 *********************************************************************/ 2283 2284/** 2285 * cpufreq_register_driver - register a CPU Frequency driver 2286 * @driver_data: A struct cpufreq_driver containing the values# 2287 * submitted by the CPU Frequency driver. 2288 * --- 23 unchanged lines hidden (view full) --- 2312 write_lock_irqsave(&cpufreq_driver_lock, flags); 2313 if (cpufreq_driver) { 2314 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2315 return -EEXIST; 2316 } 2317 cpufreq_driver = driver_data; 2318 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2319 |
2320 if (cpufreq_boost_supported()) { 2321 /* 2322 * Check if driver provides function to enable boost - 2323 * if not, use cpufreq_boost_set_sw as default 2324 */ 2325 if (!cpufreq_driver->set_boost) 2326 cpufreq_driver->set_boost = cpufreq_boost_set_sw; 2327 2328 ret = cpufreq_sysfs_create_file(&boost.attr); 2329 if (ret) { 2330 pr_err("%s: cannot register global BOOST sysfs file\n", 2331 __func__); 2332 goto err_null_driver; 2333 } 2334 } 2335 |
|
2226 ret = subsys_interface_register(&cpufreq_interface); 2227 if (ret) | 2336 ret = subsys_interface_register(&cpufreq_interface); 2337 if (ret) |
2228 goto err_null_driver; | 2338 goto err_boost_unreg; |
2229 2230 if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) { 2231 int i; 2232 ret = -ENODEV; 2233 2234 /* check for at least one working CPU */ 2235 for (i = 0; i < nr_cpu_ids; i++) 2236 if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) { --- 10 unchanged lines hidden (view full) --- 2247 } 2248 2249 register_hotcpu_notifier(&cpufreq_cpu_notifier); 2250 pr_debug("driver %s up and running\n", driver_data->name); 2251 2252 return 0; 2253err_if_unreg: 2254 subsys_interface_unregister(&cpufreq_interface); | 2339 2340 if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) { 2341 int i; 2342 ret = -ENODEV; 2343 2344 /* check for at least one working CPU */ 2345 for (i = 0; i < nr_cpu_ids; i++) 2346 if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) { --- 10 unchanged lines hidden (view full) --- 2357 } 2358 2359 register_hotcpu_notifier(&cpufreq_cpu_notifier); 2360 pr_debug("driver %s up and running\n", driver_data->name); 2361 2362 return 0; 2363err_if_unreg: 2364 subsys_interface_unregister(&cpufreq_interface); |
2365err_boost_unreg: 2366 if (cpufreq_boost_supported()) 2367 cpufreq_sysfs_remove_file(&boost.attr); |
|
2255err_null_driver: 2256 write_lock_irqsave(&cpufreq_driver_lock, flags); 2257 cpufreq_driver = NULL; 2258 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2259 return ret; 2260} 2261EXPORT_SYMBOL_GPL(cpufreq_register_driver); 2262 --- 10 unchanged lines hidden (view full) --- 2273 unsigned long flags; 2274 2275 if (!cpufreq_driver || (driver != cpufreq_driver)) 2276 return -EINVAL; 2277 2278 pr_debug("unregistering driver %s\n", driver->name); 2279 2280 subsys_interface_unregister(&cpufreq_interface); | 2368err_null_driver: 2369 write_lock_irqsave(&cpufreq_driver_lock, flags); 2370 cpufreq_driver = NULL; 2371 write_unlock_irqrestore(&cpufreq_driver_lock, flags); 2372 return ret; 2373} 2374EXPORT_SYMBOL_GPL(cpufreq_register_driver); 2375 --- 10 unchanged lines hidden (view full) --- 2386 unsigned long flags; 2387 2388 if (!cpufreq_driver || (driver != cpufreq_driver)) 2389 return -EINVAL; 2390 2391 pr_debug("unregistering driver %s\n", driver->name); 2392 2393 subsys_interface_unregister(&cpufreq_interface); |
2394 if (cpufreq_boost_supported()) 2395 cpufreq_sysfs_remove_file(&boost.attr); 2396 |
|
2281 unregister_hotcpu_notifier(&cpufreq_cpu_notifier); 2282 2283 down_write(&cpufreq_rwsem); 2284 write_lock_irqsave(&cpufreq_driver_lock, flags); 2285 2286 cpufreq_driver = NULL; 2287 2288 write_unlock_irqrestore(&cpufreq_driver_lock, flags); --- 18 unchanged lines hidden --- | 2397 unregister_hotcpu_notifier(&cpufreq_cpu_notifier); 2398 2399 down_write(&cpufreq_rwsem); 2400 write_lock_irqsave(&cpufreq_driver_lock, flags); 2401 2402 cpufreq_driver = NULL; 2403 2404 write_unlock_irqrestore(&cpufreq_driver_lock, flags); --- 18 unchanged lines hidden --- |