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