Lines Matching refs:policy

81 static unsigned int __cpufreq_get(struct cpufreq_policy *policy);
82 static int cpufreq_init_governor(struct cpufreq_policy *policy);
83 static void cpufreq_exit_governor(struct cpufreq_policy *policy);
84 static void cpufreq_governor_limits(struct cpufreq_policy *policy);
85 static int cpufreq_set_policy(struct cpufreq_policy *policy,
118 struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy) in get_governor_parent_kobj() argument
121 return &policy->kobj; in get_governor_parent_kobj()
172 void cpufreq_generic_init(struct cpufreq_policy *policy, in cpufreq_generic_init() argument
176 policy->freq_table = table; in cpufreq_generic_init()
177 policy->cpuinfo.transition_latency = transition_latency; in cpufreq_generic_init()
183 cpumask_setall(policy->cpus); in cpufreq_generic_init()
189 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_cpu_get_raw() local
191 return policy && cpumask_test_cpu(cpu, policy->cpus) ? policy : NULL; in cpufreq_cpu_get_raw()
197 struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu); in cpufreq_generic_get() local
199 if (!policy || IS_ERR(policy->clk)) { in cpufreq_generic_get()
201 __func__, policy ? "clk" : "policy", cpu); in cpufreq_generic_get()
205 return clk_get_rate(policy->clk) / 1000; in cpufreq_generic_get()
222 struct cpufreq_policy *policy = NULL; in cpufreq_cpu_get() local
233 policy = cpufreq_cpu_get_raw(cpu); in cpufreq_cpu_get()
234 if (policy) in cpufreq_cpu_get()
235 kobject_get(&policy->kobj); in cpufreq_cpu_get()
240 return policy; in cpufreq_cpu_get()
248 void cpufreq_cpu_put(struct cpufreq_policy *policy) in cpufreq_cpu_put() argument
250 kobject_put(&policy->kobj); in cpufreq_cpu_put()
258 void cpufreq_cpu_release(struct cpufreq_policy *policy) in cpufreq_cpu_release() argument
260 if (WARN_ON(!policy)) in cpufreq_cpu_release()
263 lockdep_assert_held(&policy->rwsem); in cpufreq_cpu_release()
265 up_write(&policy->rwsem); in cpufreq_cpu_release()
267 cpufreq_cpu_put(policy); in cpufreq_cpu_release()
284 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); in cpufreq_cpu_acquire() local
286 if (!policy) in cpufreq_cpu_acquire()
289 down_write(&policy->rwsem); in cpufreq_cpu_acquire()
291 if (policy_is_inactive(policy)) { in cpufreq_cpu_acquire()
292 cpufreq_cpu_release(policy); in cpufreq_cpu_acquire()
296 return policy; in cpufreq_cpu_acquire()
345 static void cpufreq_notify_transition(struct cpufreq_policy *policy, in cpufreq_notify_transition() argument
356 freqs->policy = policy; in cpufreq_notify_transition()
368 if (policy->cur && policy->cur != freqs->old) { in cpufreq_notify_transition()
370 freqs->old, policy->cur); in cpufreq_notify_transition()
371 freqs->old = policy->cur; in cpufreq_notify_transition()
383 cpumask_pr_args(policy->cpus)); in cpufreq_notify_transition()
385 for_each_cpu(cpu, policy->cpus) in cpufreq_notify_transition()
391 cpufreq_stats_record_transition(policy, freqs->new); in cpufreq_notify_transition()
392 cpufreq_times_record_transition(policy, freqs->new); in cpufreq_notify_transition()
393 policy->cur = freqs->new; in cpufreq_notify_transition()
394 trace_android_rvh_cpufreq_transition(policy); in cpufreq_notify_transition()
399 static void cpufreq_notify_post_transition(struct cpufreq_policy *policy, in cpufreq_notify_post_transition() argument
402 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); in cpufreq_notify_post_transition()
407 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE); in cpufreq_notify_post_transition()
408 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); in cpufreq_notify_post_transition()
411 void cpufreq_freq_transition_begin(struct cpufreq_policy *policy, in cpufreq_freq_transition_begin() argument
424 && current == policy->transition_task); in cpufreq_freq_transition_begin()
427 wait_event(policy->transition_wait, !policy->transition_ongoing); in cpufreq_freq_transition_begin()
429 spin_lock(&policy->transition_lock); in cpufreq_freq_transition_begin()
431 if (unlikely(policy->transition_ongoing)) { in cpufreq_freq_transition_begin()
432 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_begin()
436 policy->transition_ongoing = true; in cpufreq_freq_transition_begin()
437 policy->transition_task = current; in cpufreq_freq_transition_begin()
439 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_begin()
441 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE); in cpufreq_freq_transition_begin()
445 void cpufreq_freq_transition_end(struct cpufreq_policy *policy, in cpufreq_freq_transition_end() argument
448 if (WARN_ON(!policy->transition_ongoing)) in cpufreq_freq_transition_end()
451 cpufreq_notify_post_transition(policy, freqs, transition_failed); in cpufreq_freq_transition_end()
453 arch_set_freq_scale(policy->related_cpus, in cpufreq_freq_transition_end()
454 policy->cur, in cpufreq_freq_transition_end()
455 policy->cpuinfo.max_freq); in cpufreq_freq_transition_end()
457 policy->transition_ongoing = false; in cpufreq_freq_transition_end()
458 policy->transition_task = NULL; in cpufreq_freq_transition_end()
460 wake_up(&policy->transition_wait); in cpufreq_freq_transition_end()
496 void cpufreq_enable_fast_switch(struct cpufreq_policy *policy) in cpufreq_enable_fast_switch() argument
498 lockdep_assert_held(&policy->rwsem); in cpufreq_enable_fast_switch()
500 if (!policy->fast_switch_possible) in cpufreq_enable_fast_switch()
506 policy->fast_switch_enabled = true; in cpufreq_enable_fast_switch()
509 policy->cpu); in cpufreq_enable_fast_switch()
520 void cpufreq_disable_fast_switch(struct cpufreq_policy *policy) in cpufreq_disable_fast_switch() argument
523 if (policy->fast_switch_enabled) { in cpufreq_disable_fast_switch()
524 policy->fast_switch_enabled = false; in cpufreq_disable_fast_switch()
543 unsigned int cpufreq_driver_resolve_freq(struct cpufreq_policy *policy, in cpufreq_driver_resolve_freq() argument
548 target_freq = clamp_val(target_freq, policy->min, policy->max); in cpufreq_driver_resolve_freq()
549 trace_android_vh_cpufreq_resolve_freq(policy, target_freq, old_target_freq); in cpufreq_driver_resolve_freq()
550 policy->cached_target_freq = target_freq; in cpufreq_driver_resolve_freq()
555 idx = cpufreq_frequency_table_target(policy, target_freq, in cpufreq_driver_resolve_freq()
557 policy->cached_resolved_idx = idx; in cpufreq_driver_resolve_freq()
558 return policy->freq_table[idx].frequency; in cpufreq_driver_resolve_freq()
562 return cpufreq_driver->resolve_freq(policy, target_freq); in cpufreq_driver_resolve_freq()
568 unsigned int cpufreq_policy_transition_delay_us(struct cpufreq_policy *policy) in cpufreq_policy_transition_delay_us() argument
572 if (policy->transition_delay_us) in cpufreq_policy_transition_delay_us()
573 return policy->transition_delay_us; in cpufreq_policy_transition_delay_us()
575 latency = policy->cpuinfo.transition_latency / NSEC_PER_USEC; in cpufreq_policy_transition_delay_us()
693 (struct cpufreq_policy *policy, char *buf) \
695 return sprintf(buf, "%u\n", policy->object); \
698 static ssize_t show_cpuinfo_max_freq(struct cpufreq_policy *policy, char *buf) in show_cpuinfo_max_freq() argument
700 unsigned int max_freq = policy->cpuinfo.max_freq; in show_cpuinfo_max_freq()
702 trace_android_vh_show_max_freq(policy, &max_freq); in show_cpuinfo_max_freq()
703 trace_android_rvh_show_max_freq(policy, &max_freq); in show_cpuinfo_max_freq()
717 static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf) in show_scaling_cur_freq() argument
722 freq = arch_freq_get_on_cpu(policy->cpu); in show_scaling_cur_freq()
726 ret = sprintf(buf, "%u\n", cpufreq_driver->get(policy->cpu)); in show_scaling_cur_freq()
728 ret = sprintf(buf, "%u\n", policy->cur); in show_scaling_cur_freq()
737 (struct cpufreq_policy *policy, const char *buf, size_t count) \
746 ret = freq_qos_update_request(policy->object##_freq_req, val);\
756 static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy, in show_cpuinfo_cur_freq() argument
759 unsigned int cur_freq = __cpufreq_get(policy); in show_cpuinfo_cur_freq()
770 static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf) in show_scaling_governor() argument
772 if (policy->policy == CPUFREQ_POLICY_POWERSAVE) in show_scaling_governor()
774 else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) in show_scaling_governor()
776 else if (policy->governor) in show_scaling_governor()
778 policy->governor->name); in show_scaling_governor()
785 static ssize_t store_scaling_governor(struct cpufreq_policy *policy, in store_scaling_governor() argument
802 ret = cpufreq_set_policy(policy, NULL, new_pol); in store_scaling_governor()
810 ret = cpufreq_set_policy(policy, new_gov, in store_scaling_governor()
822 static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf) in show_scaling_driver() argument
830 static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy, in show_scaling_available_governors() argument
875 static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf) in show_related_cpus() argument
877 return cpufreq_show_cpus(policy->related_cpus, buf); in show_related_cpus()
883 static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf) in show_affected_cpus() argument
885 return cpufreq_show_cpus(policy->cpus, buf); in show_affected_cpus()
888 static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, in store_scaling_setspeed() argument
894 if (!policy->governor || !policy->governor->store_setspeed) in store_scaling_setspeed()
901 policy->governor->store_setspeed(policy, freq); in store_scaling_setspeed()
906 static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf) in show_scaling_setspeed() argument
908 if (!policy->governor || !policy->governor->show_setspeed) in show_scaling_setspeed()
911 return policy->governor->show_setspeed(policy, buf); in show_scaling_setspeed()
917 static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf) in show_bios_limit() argument
921 ret = cpufreq_driver->bios_limit(policy->cpu, &limit); in show_bios_limit()
924 return sprintf(buf, "%u\n", policy->cpuinfo.max_freq); in show_bios_limit()
962 struct cpufreq_policy *policy = to_policy(kobj); in show() local
969 down_read(&policy->rwsem); in show()
970 ret = fattr->show(policy, buf); in show()
971 up_read(&policy->rwsem); in show()
979 struct cpufreq_policy *policy = to_policy(kobj); in store() local
993 if (cpu_online(policy->cpu)) { in store()
994 down_write(&policy->rwsem); in store()
995 ret = fattr->store(policy, buf, count); in store()
996 up_write(&policy->rwsem); in store()
1006 struct cpufreq_policy *policy = to_policy(kobj); in cpufreq_sysfs_release() local
1008 complete(&policy->kobj_unregister); in cpufreq_sysfs_release()
1022 static void add_cpu_dev_symlink(struct cpufreq_policy *policy, unsigned int cpu, in add_cpu_dev_symlink() argument
1028 if (cpumask_test_and_set_cpu(cpu, policy->real_cpus)) in add_cpu_dev_symlink()
1032 if (sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq")) in add_cpu_dev_symlink()
1036 static void remove_cpu_dev_symlink(struct cpufreq_policy *policy, in remove_cpu_dev_symlink() argument
1043 static int cpufreq_add_dev_interface(struct cpufreq_policy *policy) in cpufreq_add_dev_interface() argument
1051 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr)); in cpufreq_add_dev_interface()
1057 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr); in cpufreq_add_dev_interface()
1062 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr); in cpufreq_add_dev_interface()
1067 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr); in cpufreq_add_dev_interface()
1075 static int cpufreq_init_policy(struct cpufreq_policy *policy) in cpufreq_init_policy() argument
1083 gov = get_governor(policy->last_governor); in cpufreq_init_policy()
1086 gov->name, policy->cpu); in cpufreq_init_policy()
1099 if (policy->last_policy) { in cpufreq_init_policy()
1100 pol = policy->last_policy; in cpufreq_init_policy()
1109 pol = policy->policy; in cpufreq_init_policy()
1116 ret = cpufreq_set_policy(policy, gov, pol); in cpufreq_init_policy()
1123 static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) in cpufreq_add_policy_cpu() argument
1128 if (cpumask_test_cpu(cpu, policy->cpus)) in cpufreq_add_policy_cpu()
1131 down_write(&policy->rwsem); in cpufreq_add_policy_cpu()
1133 cpufreq_stop_governor(policy); in cpufreq_add_policy_cpu()
1135 cpumask_set_cpu(cpu, policy->cpus); in cpufreq_add_policy_cpu()
1138 ret = cpufreq_start_governor(policy); in cpufreq_add_policy_cpu()
1142 up_write(&policy->rwsem); in cpufreq_add_policy_cpu()
1146 void refresh_frequency_limits(struct cpufreq_policy *policy) in refresh_frequency_limits() argument
1148 if (!policy_is_inactive(policy)) { in refresh_frequency_limits()
1149 pr_debug("updating policy for CPU %u\n", policy->cpu); in refresh_frequency_limits()
1151 cpufreq_set_policy(policy, policy->governor, policy->policy); in refresh_frequency_limits()
1158 struct cpufreq_policy *policy = in handle_update() local
1161 pr_debug("handle_update for cpu %u called\n", policy->cpu); in handle_update()
1162 down_write(&policy->rwsem); in handle_update()
1163 refresh_frequency_limits(policy); in handle_update()
1164 up_write(&policy->rwsem); in handle_update()
1170 struct cpufreq_policy *policy = container_of(nb, struct cpufreq_policy, nb_min); in cpufreq_notifier_min() local
1172 schedule_work(&policy->update); in cpufreq_notifier_min()
1179 struct cpufreq_policy *policy = container_of(nb, struct cpufreq_policy, nb_max); in cpufreq_notifier_max() local
1181 schedule_work(&policy->update); in cpufreq_notifier_max()
1185 static void cpufreq_policy_put_kobj(struct cpufreq_policy *policy) in cpufreq_policy_put_kobj() argument
1190 down_write(&policy->rwsem); in cpufreq_policy_put_kobj()
1191 cpufreq_stats_free_table(policy); in cpufreq_policy_put_kobj()
1192 kobj = &policy->kobj; in cpufreq_policy_put_kobj()
1193 cmp = &policy->kobj_unregister; in cpufreq_policy_put_kobj()
1194 up_write(&policy->rwsem); in cpufreq_policy_put_kobj()
1209 struct cpufreq_policy *policy; in cpufreq_policy_alloc() local
1216 policy = kzalloc(sizeof(*policy), GFP_KERNEL); in cpufreq_policy_alloc()
1217 if (!policy) in cpufreq_policy_alloc()
1220 if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1223 if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1226 if (!zalloc_cpumask_var(&policy->real_cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1229 ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, in cpufreq_policy_alloc()
1238 kobject_put(&policy->kobj); in cpufreq_policy_alloc()
1242 freq_constraints_init(&policy->constraints); in cpufreq_policy_alloc()
1244 policy->nb_min.notifier_call = cpufreq_notifier_min; in cpufreq_policy_alloc()
1245 policy->nb_max.notifier_call = cpufreq_notifier_max; in cpufreq_policy_alloc()
1247 ret = freq_qos_add_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_alloc()
1248 &policy->nb_min); in cpufreq_policy_alloc()
1251 ret, cpumask_pr_args(policy->cpus)); in cpufreq_policy_alloc()
1255 ret = freq_qos_add_notifier(&policy->constraints, FREQ_QOS_MAX, in cpufreq_policy_alloc()
1256 &policy->nb_max); in cpufreq_policy_alloc()
1259 ret, cpumask_pr_args(policy->cpus)); in cpufreq_policy_alloc()
1263 INIT_LIST_HEAD(&policy->policy_list); in cpufreq_policy_alloc()
1264 init_rwsem(&policy->rwsem); in cpufreq_policy_alloc()
1265 spin_lock_init(&policy->transition_lock); in cpufreq_policy_alloc()
1266 init_waitqueue_head(&policy->transition_wait); in cpufreq_policy_alloc()
1267 init_completion(&policy->kobj_unregister); in cpufreq_policy_alloc()
1268 INIT_WORK(&policy->update, handle_update); in cpufreq_policy_alloc()
1270 policy->cpu = cpu; in cpufreq_policy_alloc()
1271 return policy; in cpufreq_policy_alloc()
1274 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_alloc()
1275 &policy->nb_min); in cpufreq_policy_alloc()
1277 cpufreq_policy_put_kobj(policy); in cpufreq_policy_alloc()
1279 free_cpumask_var(policy->real_cpus); in cpufreq_policy_alloc()
1281 free_cpumask_var(policy->related_cpus); in cpufreq_policy_alloc()
1283 free_cpumask_var(policy->cpus); in cpufreq_policy_alloc()
1285 kfree(policy); in cpufreq_policy_alloc()
1290 static void cpufreq_policy_free(struct cpufreq_policy *policy) in cpufreq_policy_free() argument
1297 list_del(&policy->policy_list); in cpufreq_policy_free()
1299 for_each_cpu(cpu, policy->related_cpus) in cpufreq_policy_free()
1303 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MAX, in cpufreq_policy_free()
1304 &policy->nb_max); in cpufreq_policy_free()
1305 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_free()
1306 &policy->nb_min); in cpufreq_policy_free()
1309 cancel_work_sync(&policy->update); in cpufreq_policy_free()
1311 if (policy->max_freq_req) { in cpufreq_policy_free()
1317 CPUFREQ_REMOVE_POLICY, policy); in cpufreq_policy_free()
1318 freq_qos_remove_request(policy->max_freq_req); in cpufreq_policy_free()
1321 freq_qos_remove_request(policy->min_freq_req); in cpufreq_policy_free()
1322 kfree(policy->min_freq_req); in cpufreq_policy_free()
1324 cpufreq_policy_put_kobj(policy); in cpufreq_policy_free()
1325 free_cpumask_var(policy->real_cpus); in cpufreq_policy_free()
1326 free_cpumask_var(policy->related_cpus); in cpufreq_policy_free()
1327 free_cpumask_var(policy->cpus); in cpufreq_policy_free()
1328 kfree(policy); in cpufreq_policy_free()
1333 struct cpufreq_policy *policy; in cpufreq_online() local
1342 policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_online()
1343 if (policy) { in cpufreq_online()
1344 WARN_ON(!cpumask_test_cpu(cpu, policy->related_cpus)); in cpufreq_online()
1345 if (!policy_is_inactive(policy)) in cpufreq_online()
1346 return cpufreq_add_policy_cpu(policy, cpu); in cpufreq_online()
1350 down_write(&policy->rwsem); in cpufreq_online()
1351 policy->cpu = cpu; in cpufreq_online()
1352 policy->governor = NULL; in cpufreq_online()
1353 up_write(&policy->rwsem); in cpufreq_online()
1356 policy = cpufreq_policy_alloc(cpu); in cpufreq_online()
1357 if (!policy) in cpufreq_online()
1362 ret = cpufreq_driver->online(policy); in cpufreq_online()
1370 cpumask_copy(policy->cpus, policy->related_cpus); in cpufreq_online()
1372 cpumask_copy(policy->cpus, cpumask_of(cpu)); in cpufreq_online()
1378 ret = cpufreq_driver->init(policy); in cpufreq_online()
1390 ret = cpufreq_table_validate_and_sort(policy); in cpufreq_online()
1395 cpumask_copy(policy->related_cpus, policy->cpus); in cpufreq_online()
1398 down_write(&policy->rwsem); in cpufreq_online()
1403 cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); in cpufreq_online()
1406 for_each_cpu(j, policy->related_cpus) { in cpufreq_online()
1407 per_cpu(cpufreq_cpu_data, j) = policy; in cpufreq_online()
1408 add_cpu_dev_symlink(policy, j, get_cpu_device(j)); in cpufreq_online()
1411 policy->min_freq_req = kzalloc(2 * sizeof(*policy->min_freq_req), in cpufreq_online()
1413 if (!policy->min_freq_req) in cpufreq_online()
1416 ret = freq_qos_add_request(&policy->constraints, in cpufreq_online()
1417 policy->min_freq_req, FREQ_QOS_MIN, in cpufreq_online()
1424 kfree(policy->min_freq_req); in cpufreq_online()
1425 policy->min_freq_req = NULL; in cpufreq_online()
1434 policy->max_freq_req = policy->min_freq_req + 1; in cpufreq_online()
1436 ret = freq_qos_add_request(&policy->constraints, in cpufreq_online()
1437 policy->max_freq_req, FREQ_QOS_MAX, in cpufreq_online()
1440 policy->max_freq_req = NULL; in cpufreq_online()
1445 CPUFREQ_CREATE_POLICY, policy); in cpufreq_online()
1449 policy->cur = cpufreq_driver->get(policy->cpu); in cpufreq_online()
1450 if (!policy->cur) { in cpufreq_online()
1476 unsigned int old_freq = policy->cur; in cpufreq_online()
1479 ret = cpufreq_frequency_table_get_index(policy, old_freq); in cpufreq_online()
1481 ret = __cpufreq_driver_target(policy, old_freq - 1, in cpufreq_online()
1491 __func__, policy->cpu, old_freq, policy->cur); in cpufreq_online()
1496 ret = cpufreq_add_dev_interface(policy); in cpufreq_online()
1500 cpufreq_stats_create_table(policy); in cpufreq_online()
1501 cpufreq_times_create_policy(policy); in cpufreq_online()
1504 list_add(&policy->policy_list, &cpufreq_policy_list); in cpufreq_online()
1508 ret = cpufreq_init_policy(policy); in cpufreq_online()
1515 up_write(&policy->rwsem); in cpufreq_online()
1517 kobject_uevent(&policy->kobj, KOBJ_ADD); in cpufreq_online()
1521 cpufreq_driver->ready(policy); in cpufreq_online()
1524 policy->cdev = of_cpufreq_cooling_register(policy); in cpufreq_online()
1531 for_each_cpu(j, policy->real_cpus) in cpufreq_online()
1532 remove_cpu_dev_symlink(policy, get_cpu_device(j)); in cpufreq_online()
1534 up_write(&policy->rwsem); in cpufreq_online()
1538 cpufreq_driver->offline(policy); in cpufreq_online()
1542 cpufreq_driver->exit(policy); in cpufreq_online()
1545 cpufreq_policy_free(policy); in cpufreq_online()
1556 struct cpufreq_policy *policy; in cpufreq_add_dev() local
1569 policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_add_dev()
1570 if (policy) in cpufreq_add_dev()
1571 add_cpu_dev_symlink(policy, cpu, dev); in cpufreq_add_dev()
1578 struct cpufreq_policy *policy; in cpufreq_offline() local
1583 policy = cpufreq_cpu_get_raw(cpu); in cpufreq_offline()
1584 if (!policy) { in cpufreq_offline()
1589 down_write(&policy->rwsem); in cpufreq_offline()
1591 cpufreq_stop_governor(policy); in cpufreq_offline()
1593 cpumask_clear_cpu(cpu, policy->cpus); in cpufreq_offline()
1595 if (policy_is_inactive(policy)) { in cpufreq_offline()
1597 strncpy(policy->last_governor, policy->governor->name, in cpufreq_offline()
1600 policy->last_policy = policy->policy; in cpufreq_offline()
1601 } else if (cpu == policy->cpu) { in cpufreq_offline()
1603 policy->cpu = cpumask_any(policy->cpus); in cpufreq_offline()
1607 if (!policy_is_inactive(policy)) { in cpufreq_offline()
1609 ret = cpufreq_start_governor(policy); in cpufreq_offline()
1618 cpufreq_cooling_unregister(policy->cdev); in cpufreq_offline()
1619 policy->cdev = NULL; in cpufreq_offline()
1623 cpufreq_driver->stop_cpu(policy); in cpufreq_offline()
1626 cpufreq_exit_governor(policy); in cpufreq_offline()
1633 cpufreq_driver->offline(policy); in cpufreq_offline()
1635 cpufreq_driver->exit(policy); in cpufreq_offline()
1636 policy->freq_table = NULL; in cpufreq_offline()
1640 up_write(&policy->rwsem); in cpufreq_offline()
1652 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_remove_dev() local
1654 if (!policy) in cpufreq_remove_dev()
1660 cpumask_clear_cpu(cpu, policy->real_cpus); in cpufreq_remove_dev()
1661 remove_cpu_dev_symlink(policy, dev); in cpufreq_remove_dev()
1663 if (cpumask_empty(policy->real_cpus)) { in cpufreq_remove_dev()
1666 cpufreq_driver->exit(policy); in cpufreq_remove_dev()
1668 cpufreq_policy_free(policy); in cpufreq_remove_dev()
1681 static void cpufreq_out_of_sync(struct cpufreq_policy *policy, in cpufreq_out_of_sync() argument
1687 policy->cur, new_freq); in cpufreq_out_of_sync()
1689 freqs.old = policy->cur; in cpufreq_out_of_sync()
1692 cpufreq_freq_transition_begin(policy, &freqs); in cpufreq_out_of_sync()
1693 cpufreq_freq_transition_end(policy, &freqs, 0); in cpufreq_out_of_sync()
1696 static unsigned int cpufreq_verify_current_freq(struct cpufreq_policy *policy, bool update) in cpufreq_verify_current_freq() argument
1700 new_freq = cpufreq_driver->get(policy->cpu); in cpufreq_verify_current_freq()
1708 if (policy->fast_switch_enabled || !has_target()) in cpufreq_verify_current_freq()
1711 if (policy->cur != new_freq) { in cpufreq_verify_current_freq()
1712 cpufreq_out_of_sync(policy, new_freq); in cpufreq_verify_current_freq()
1714 schedule_work(&policy->update); in cpufreq_verify_current_freq()
1729 struct cpufreq_policy *policy; in cpufreq_quick_get() local
1743 policy = cpufreq_cpu_get(cpu); in cpufreq_quick_get()
1744 if (policy) { in cpufreq_quick_get()
1745 ret_freq = policy->cur; in cpufreq_quick_get()
1746 cpufreq_cpu_put(policy); in cpufreq_quick_get()
1761 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); in cpufreq_quick_get_max() local
1764 if (policy) { in cpufreq_quick_get_max()
1765 ret_freq = policy->max; in cpufreq_quick_get_max()
1766 cpufreq_cpu_put(policy); in cpufreq_quick_get_max()
1781 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); in cpufreq_get_hw_max_freq() local
1784 if (policy) { in cpufreq_get_hw_max_freq()
1785 ret_freq = policy->cpuinfo.max_freq; in cpufreq_get_hw_max_freq()
1786 cpufreq_cpu_put(policy); in cpufreq_get_hw_max_freq()
1793 static unsigned int __cpufreq_get(struct cpufreq_policy *policy) in __cpufreq_get() argument
1795 if (unlikely(policy_is_inactive(policy))) in __cpufreq_get()
1798 return cpufreq_verify_current_freq(policy, true); in __cpufreq_get()
1809 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); in cpufreq_get() local
1812 if (policy) { in cpufreq_get()
1813 down_read(&policy->rwsem); in cpufreq_get()
1815 ret_freq = __cpufreq_get(policy); in cpufreq_get()
1816 up_read(&policy->rwsem); in cpufreq_get()
1818 cpufreq_cpu_put(policy); in cpufreq_get()
1836 int cpufreq_generic_suspend(struct cpufreq_policy *policy) in cpufreq_generic_suspend() argument
1840 if (!policy->suspend_freq) { in cpufreq_generic_suspend()
1846 policy->suspend_freq); in cpufreq_generic_suspend()
1848 ret = __cpufreq_driver_target(policy, policy->suspend_freq, in cpufreq_generic_suspend()
1852 __func__, policy->suspend_freq, ret); in cpufreq_generic_suspend()
1868 struct cpufreq_policy *policy; in cpufreq_suspend() local
1878 for_each_active_policy(policy) { in cpufreq_suspend()
1880 down_write(&policy->rwsem); in cpufreq_suspend()
1881 cpufreq_stop_governor(policy); in cpufreq_suspend()
1882 up_write(&policy->rwsem); in cpufreq_suspend()
1885 if (cpufreq_driver->suspend && cpufreq_driver->suspend(policy)) in cpufreq_suspend()
1902 struct cpufreq_policy *policy; in cpufreq_resume() local
1918 for_each_active_policy(policy) { in cpufreq_resume()
1919 if (cpufreq_driver->resume && cpufreq_driver->resume(policy)) { in cpufreq_resume()
1921 policy); in cpufreq_resume()
1923 down_write(&policy->rwsem); in cpufreq_resume()
1924 ret = cpufreq_start_governor(policy); in cpufreq_resume()
1925 up_write(&policy->rwsem); in cpufreq_resume()
1929 __func__, policy); in cpufreq_resume()
2095 unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy, in cpufreq_driver_fast_switch() argument
2102 target_freq = clamp_val(target_freq, policy->min, policy->max); in cpufreq_driver_fast_switch()
2103 trace_android_vh_cpufreq_fast_switch(policy, target_freq, old_target_freq); in cpufreq_driver_fast_switch()
2104 freq = cpufreq_driver->fast_switch(policy, target_freq); in cpufreq_driver_fast_switch()
2109 policy->cur = freq; in cpufreq_driver_fast_switch()
2110 arch_set_freq_scale(policy->related_cpus, freq, in cpufreq_driver_fast_switch()
2111 policy->cpuinfo.max_freq); in cpufreq_driver_fast_switch()
2112 cpufreq_stats_record_transition(policy, freq); in cpufreq_driver_fast_switch()
2113 cpufreq_times_record_transition(policy, freq); in cpufreq_driver_fast_switch()
2114 trace_android_rvh_cpufreq_transition(policy); in cpufreq_driver_fast_switch()
2117 for_each_cpu(cpu, policy->cpus) in cpufreq_driver_fast_switch()
2126 static int __target_intermediate(struct cpufreq_policy *policy, in __target_intermediate() argument
2131 freqs->new = cpufreq_driver->get_intermediate(policy, index); in __target_intermediate()
2138 __func__, policy->cpu, freqs->old, freqs->new); in __target_intermediate()
2140 cpufreq_freq_transition_begin(policy, freqs); in __target_intermediate()
2141 ret = cpufreq_driver->target_intermediate(policy, index); in __target_intermediate()
2142 cpufreq_freq_transition_end(policy, freqs, ret); in __target_intermediate()
2151 static int __target_index(struct cpufreq_policy *policy, int index) in __target_index() argument
2153 struct cpufreq_freqs freqs = {.old = policy->cur, .flags = 0}; in __target_index()
2155 unsigned int newfreq = policy->freq_table[index].frequency; in __target_index()
2159 if (newfreq == policy->cur) in __target_index()
2166 retval = __target_intermediate(policy, &freqs, index); in __target_index()
2178 __func__, policy->cpu, freqs.old, freqs.new); in __target_index()
2180 cpufreq_freq_transition_begin(policy, &freqs); in __target_index()
2183 retval = cpufreq_driver->target_index(policy, index); in __target_index()
2189 cpufreq_freq_transition_end(policy, &freqs, retval); in __target_index()
2199 freqs.new = policy->restore_freq; in __target_index()
2200 cpufreq_freq_transition_begin(policy, &freqs); in __target_index()
2201 cpufreq_freq_transition_end(policy, &freqs, 0); in __target_index()
2208 int __cpufreq_driver_target(struct cpufreq_policy *policy, in __cpufreq_driver_target() argument
2219 target_freq = clamp_val(target_freq, policy->min, policy->max); in __cpufreq_driver_target()
2220 trace_android_vh_cpufreq_target(policy, target_freq, old_target_freq); in __cpufreq_driver_target()
2223 policy->cpu, target_freq, relation, old_target_freq); in __cpufreq_driver_target()
2231 if (target_freq == policy->cur && in __cpufreq_driver_target()
2236 policy->restore_freq = policy->cur; in __cpufreq_driver_target()
2239 return cpufreq_driver->target(policy, target_freq, relation); in __cpufreq_driver_target()
2244 index = cpufreq_frequency_table_target(policy, target_freq, relation); in __cpufreq_driver_target()
2246 return __target_index(policy, index); in __cpufreq_driver_target()
2250 int cpufreq_driver_target(struct cpufreq_policy *policy, in cpufreq_driver_target() argument
2256 down_write(&policy->rwsem); in cpufreq_driver_target()
2258 ret = __cpufreq_driver_target(policy, target_freq, relation); in cpufreq_driver_target()
2260 up_write(&policy->rwsem); in cpufreq_driver_target()
2271 static int cpufreq_init_governor(struct cpufreq_policy *policy) in cpufreq_init_governor() argument
2282 if (!policy->governor) in cpufreq_init_governor()
2286 if (policy->governor->flags & CPUFREQ_GOV_DYNAMIC_SWITCHING && in cpufreq_init_governor()
2292 policy->governor->name, gov->name); in cpufreq_init_governor()
2293 policy->governor = gov; in cpufreq_init_governor()
2299 if (!try_module_get(policy->governor->owner)) in cpufreq_init_governor()
2302 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_init_governor()
2304 if (policy->governor->init) { in cpufreq_init_governor()
2305 ret = policy->governor->init(policy); in cpufreq_init_governor()
2307 module_put(policy->governor->owner); in cpufreq_init_governor()
2312 policy->strict_target = !!(policy->governor->flags & CPUFREQ_GOV_STRICT_TARGET); in cpufreq_init_governor()
2317 static void cpufreq_exit_governor(struct cpufreq_policy *policy) in cpufreq_exit_governor() argument
2319 if (cpufreq_suspended || !policy->governor) in cpufreq_exit_governor()
2322 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_exit_governor()
2324 if (policy->governor->exit) in cpufreq_exit_governor()
2325 policy->governor->exit(policy); in cpufreq_exit_governor()
2327 module_put(policy->governor->owner); in cpufreq_exit_governor()
2330 int cpufreq_start_governor(struct cpufreq_policy *policy) in cpufreq_start_governor() argument
2337 if (!policy->governor) in cpufreq_start_governor()
2340 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_start_governor()
2343 cpufreq_verify_current_freq(policy, false); in cpufreq_start_governor()
2345 if (policy->governor->start) { in cpufreq_start_governor()
2346 ret = policy->governor->start(policy); in cpufreq_start_governor()
2351 if (policy->governor->limits) in cpufreq_start_governor()
2352 policy->governor->limits(policy); in cpufreq_start_governor()
2357 void cpufreq_stop_governor(struct cpufreq_policy *policy) in cpufreq_stop_governor() argument
2359 if (cpufreq_suspended || !policy->governor) in cpufreq_stop_governor()
2362 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_stop_governor()
2364 if (policy->governor->stop) in cpufreq_stop_governor()
2365 policy->governor->stop(policy); in cpufreq_stop_governor()
2368 static void cpufreq_governor_limits(struct cpufreq_policy *policy) in cpufreq_governor_limits() argument
2370 if (cpufreq_suspended || !policy->governor) in cpufreq_governor_limits()
2373 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_governor_limits()
2375 if (policy->governor->limits) in cpufreq_governor_limits()
2376 policy->governor->limits(policy); in cpufreq_governor_limits()
2404 struct cpufreq_policy *policy; in cpufreq_unregister_governor() local
2415 for_each_inactive_policy(policy) { in cpufreq_unregister_governor()
2416 if (!strcmp(policy->last_governor, governor->name)) { in cpufreq_unregister_governor()
2417 policy->governor = NULL; in cpufreq_unregister_governor()
2418 strcpy(policy->last_governor, "\0"); in cpufreq_unregister_governor()
2442 int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu) in cpufreq_get_policy() argument
2445 if (!policy) in cpufreq_get_policy()
2452 memcpy(policy, cpu_policy, sizeof(*policy)); in cpufreq_get_policy()
2474 static int cpufreq_set_policy(struct cpufreq_policy *policy, in cpufreq_set_policy() argument
2482 memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); in cpufreq_set_policy()
2483 new_data.freq_table = policy->freq_table; in cpufreq_set_policy()
2484 new_data.cpu = policy->cpu; in cpufreq_set_policy()
2489 new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); in cpufreq_set_policy()
2490 new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); in cpufreq_set_policy()
2503 policy->min = new_data.min; in cpufreq_set_policy()
2504 policy->max = new_data.max; in cpufreq_set_policy()
2505 trace_cpu_frequency_limits(policy); in cpufreq_set_policy()
2507 policy->cached_target_freq = UINT_MAX; in cpufreq_set_policy()
2510 policy->min, policy->max); in cpufreq_set_policy()
2513 policy->policy = new_pol; in cpufreq_set_policy()
2515 return cpufreq_driver->setpolicy(policy); in cpufreq_set_policy()
2518 if (new_gov == policy->governor) { in cpufreq_set_policy()
2520 cpufreq_governor_limits(policy); in cpufreq_set_policy()
2527 old_gov = policy->governor; in cpufreq_set_policy()
2530 cpufreq_stop_governor(policy); in cpufreq_set_policy()
2531 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2535 policy->governor = new_gov; in cpufreq_set_policy()
2536 ret = cpufreq_init_governor(policy); in cpufreq_set_policy()
2538 ret = cpufreq_start_governor(policy); in cpufreq_set_policy()
2543 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2547 pr_debug("starting governor %s failed\n", policy->governor->name); in cpufreq_set_policy()
2549 policy->governor = old_gov; in cpufreq_set_policy()
2550 if (cpufreq_init_governor(policy)) in cpufreq_set_policy()
2551 policy->governor = NULL; in cpufreq_set_policy()
2553 cpufreq_start_governor(policy); in cpufreq_set_policy()
2571 struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpu); in cpufreq_update_policy() local
2573 if (!policy) in cpufreq_update_policy()
2581 (cpufreq_suspended || WARN_ON(!cpufreq_verify_current_freq(policy, false)))) in cpufreq_update_policy()
2584 refresh_frequency_limits(policy); in cpufreq_update_policy()
2587 cpufreq_cpu_release(policy); in cpufreq_update_policy()
2610 static int cpufreq_boost_set_sw(struct cpufreq_policy *policy, int state) in cpufreq_boost_set_sw() argument
2614 if (!policy->freq_table) in cpufreq_boost_set_sw()
2617 ret = cpufreq_frequency_table_cpuinfo(policy, policy->freq_table); in cpufreq_boost_set_sw()
2623 ret = freq_qos_update_request(policy->max_freq_req, policy->max); in cpufreq_boost_set_sw()
2632 struct cpufreq_policy *policy; in cpufreq_boost_trigger_state() local
2644 for_each_active_policy(policy) { in cpufreq_boost_trigger_state()
2645 ret = cpufreq_driver->set_boost(policy, state); in cpufreq_boost_trigger_state()