Lines Matching defs:info
68 struct mtk_cpu_dvfs_info *info;
70 list_for_each_entry(info, &dvfs_info_list, list_head) {
71 if (cpumask_test_cpu(cpu, &info->cpus))
72 return info;
78 static int mtk_cpufreq_voltage_tracking(struct mtk_cpu_dvfs_info *info,
81 const struct mtk_cpufreq_platform_data *soc_data = info->soc_data;
82 struct regulator *proc_reg = info->proc_reg;
83 struct regulator *sram_reg = info->sram_reg;
85 int retry = info->vtrack_max;
89 dev_err(info->cpu_dev,
96 dev_err(info->cpu_dev, "invalid Vsram value: %d\n", pre_vsram);
153 dev_err(info->cpu_dev,
162 static int mtk_cpufreq_set_voltage(struct mtk_cpu_dvfs_info *info, int vproc)
164 const struct mtk_cpufreq_platform_data *soc_data = info->soc_data;
167 if (info->need_voltage_tracking)
168 ret = mtk_cpufreq_voltage_tracking(info, vproc);
170 ret = regulator_set_voltage(info->proc_reg, vproc,
173 info->pre_vproc = vproc;
178 static bool is_ccifreq_ready(struct mtk_cpu_dvfs_info *info)
182 if (info->ccifreq_bound)
185 sup_link = device_link_add(info->cpu_dev, info->cci_dev,
188 dev_err(info->cpu_dev, "cpu%d: sup_link is NULL\n", info->opp_cpu);
195 info->ccifreq_bound = true;
206 struct mtk_cpu_dvfs_info *info = policy->driver_data;
207 struct device *cpu_dev = info->cpu_dev;
212 inter_vproc = info->intermediate_voltage;
216 mutex_lock(&info->reg_lock);
218 if (unlikely(info->pre_vproc <= 0))
219 pre_vproc = regulator_get_voltage(info->proc_reg);
221 pre_vproc = info->pre_vproc;
246 if (info->soc_data->ccifreq_supported && !is_ccifreq_ready(info))
247 vproc = max(vproc, info->vproc_on_boot);
255 ret = mtk_cpufreq_set_voltage(info, target_vproc);
259 mtk_cpufreq_set_voltage(info, pre_vproc);
265 ret = clk_set_parent(cpu_clk, info->inter_clk);
269 mtk_cpufreq_set_voltage(info, pre_vproc);
279 mtk_cpufreq_set_voltage(info, pre_vproc);
288 mtk_cpufreq_set_voltage(info, inter_vproc);
297 ret = mtk_cpufreq_set_voltage(info, vproc);
301 clk_set_parent(cpu_clk, info->inter_clk);
308 info->current_freq = freq_hz;
311 mutex_unlock(&info->reg_lock);
321 struct mtk_cpu_dvfs_info *info;
326 info = container_of(nb, struct mtk_cpu_dvfs_info, opp_nb);
331 mutex_lock(&info->reg_lock);
332 if (info->current_freq == freq) {
334 ret = mtk_cpufreq_set_voltage(info, volt);
336 dev_err(info->cpu_dev,
339 mutex_unlock(&info->reg_lock);
344 if (info->current_freq == freq) {
346 new_opp = dev_pm_opp_find_freq_ceil(info->cpu_dev,
349 dev_err(info->cpu_dev,
356 policy = cpufreq_cpu_get(info->opp_cpu);
385 static int mtk_cpu_dvfs_info_init(struct mtk_cpu_dvfs_info *info, int cpu)
397 info->cpu_dev = cpu_dev;
399 info->ccifreq_bound = false;
400 if (info->soc_data->ccifreq_supported) {
401 info->cci_dev = of_get_cci(info->cpu_dev);
402 if (IS_ERR(info->cci_dev)) {
403 ret = PTR_ERR(info->cci_dev);
409 info->cpu_clk = clk_get(cpu_dev, "cpu");
410 if (IS_ERR(info->cpu_clk)) {
411 ret = PTR_ERR(info->cpu_clk);
416 info->inter_clk = clk_get(cpu_dev, "intermediate");
417 if (IS_ERR(info->inter_clk)) {
418 ret = PTR_ERR(info->inter_clk);
424 info->proc_reg = regulator_get_optional(cpu_dev, "proc");
425 if (IS_ERR(info->proc_reg)) {
426 ret = PTR_ERR(info->proc_reg);
432 ret = regulator_enable(info->proc_reg);
439 info->sram_reg = regulator_get_optional(cpu_dev, "sram");
440 if (IS_ERR(info->sram_reg)) {
441 ret = PTR_ERR(info->sram_reg);
445 info->sram_reg = NULL;
447 ret = regulator_enable(info->sram_reg);
455 ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, &info->cpus);
462 ret = dev_pm_opp_of_cpumask_add_table(&info->cpus);
468 ret = clk_prepare_enable(info->cpu_clk);
472 ret = clk_prepare_enable(info->inter_clk);
476 if (info->soc_data->ccifreq_supported) {
477 info->vproc_on_boot = regulator_get_voltage(info->proc_reg);
478 if (info->vproc_on_boot < 0) {
479 ret = info->vproc_on_boot;
480 dev_err(info->cpu_dev,
481 "invalid Vproc value: %d\n", info->vproc_on_boot);
487 rate = clk_get_rate(info->inter_clk);
494 info->intermediate_voltage = dev_pm_opp_get_voltage(opp);
497 mutex_init(&info->reg_lock);
498 info->current_freq = clk_get_rate(info->cpu_clk);
500 info->opp_cpu = cpu;
501 info->opp_nb.notifier_call = mtk_cpufreq_opp_notifier;
502 ret = dev_pm_opp_register_notifier(cpu_dev, &info->opp_nb);
512 info->need_voltage_tracking = (info->sram_reg != NULL);
519 info->vtrack_max = 3 * DIV_ROUND_UP(max(info->soc_data->sram_max_volt,
520 info->soc_data->proc_max_volt),
521 info->soc_data->min_volt_shift);
526 clk_disable_unprepare(info->inter_clk);
529 clk_disable_unprepare(info->cpu_clk);
532 dev_pm_opp_of_cpumask_remove_table(&info->cpus);
535 if (info->sram_reg)
536 regulator_disable(info->sram_reg);
539 if (info->sram_reg)
540 regulator_put(info->sram_reg);
543 regulator_disable(info->proc_reg);
546 regulator_put(info->proc_reg);
549 clk_put(info->inter_clk);
552 clk_put(info->cpu_clk);
557 static void mtk_cpu_dvfs_info_release(struct mtk_cpu_dvfs_info *info)
559 regulator_disable(info->proc_reg);
560 regulator_put(info->proc_reg);
561 if (info->sram_reg) {
562 regulator_disable(info->sram_reg);
563 regulator_put(info->sram_reg);
565 clk_disable_unprepare(info->cpu_clk);
566 clk_put(info->cpu_clk);
567 clk_disable_unprepare(info->inter_clk);
568 clk_put(info->inter_clk);
569 dev_pm_opp_of_cpumask_remove_table(&info->cpus);
570 dev_pm_opp_unregister_notifier(info->cpu_dev, &info->opp_nb);
575 struct mtk_cpu_dvfs_info *info;
579 info = mtk_cpu_dvfs_info_lookup(policy->cpu);
580 if (!info) {
581 pr_err("dvfs info for cpu%d is not initialized.\n",
586 ret = dev_pm_opp_init_cpufreq_table(info->cpu_dev, &freq_table);
588 dev_err(info->cpu_dev,
594 cpumask_copy(policy->cpus, &info->cpus);
596 policy->driver_data = info;
597 policy->clk = info->cpu_clk;
604 struct mtk_cpu_dvfs_info *info = policy->driver_data;
606 dev_pm_opp_free_cpufreq_table(info->cpu_dev, &policy->freq_table);
628 struct mtk_cpu_dvfs_info *info, *tmp;
639 info = mtk_cpu_dvfs_info_lookup(cpu);
640 if (info)
643 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
644 if (!info) {
649 info->soc_data = data;
650 ret = mtk_cpu_dvfs_info_init(info, cpu);
653 "failed to initialize dvfs info for cpu%d\n",
658 list_add(&info->list_head, &dvfs_info_list);
670 list_for_each_entry_safe(info, tmp, &dvfs_info_list, list_head) {
671 mtk_cpu_dvfs_info_release(info);
672 list_del(&info->list_head);