Lines Matching +full:operating +full:- +full:points +full:- +full:v2 +full:- +full:kryo +full:- +full:cpu
1 // SPDX-License-Identifier: GPL-2.0
7 * In Certain QCOM SoCs like apq8096 and msm8996 that have KRYO processors,
8 * the CPU frequency subset and voltage value of each OPP varies
10 * defines the voltage and frequency value based on the msm-id in SMEM
12 * The qcom-cpufreq-nvmem driver reads the msm-id and efuse value from the SoC
15 * operating-points-v2 table when it is parsed by the OPP framework.
18 #include <linux/cpu.h>
23 #include <linux/nvmem-consumer.h>
117 /* 4 bits of PVS are in efuse register bits 31, 8-6. */ in get_krait_bin_format_b()
153 /* The first 4 bytes are format, next to them is the actual msm-id */ in qcom_cpufreq_get_msm_id()
185 return -ENODEV; in qcom_cpufreq_kryo_name_version()
194 drv->versions = 1 << (unsigned int)(*speedbin); in qcom_cpufreq_kryo_name_version()
197 drv->versions = 1 << ((unsigned int)(*speedbin) + 4); in qcom_cpufreq_kryo_name_version()
234 ret = -ENODEV; in qcom_cpufreq_krait_name_version()
238 snprintf(*pvs_name, sizeof("speedXX-pvsXX-vXX"), "speed%d-pvs%d-v%d", in qcom_cpufreq_krait_name_version()
241 drv->versions = (1 << speed); in qcom_cpufreq_krait_name_version()
268 char pvs_name_buffer[] = "speedXX-pvsXX-vXX"; in qcom_cpufreq_probe()
270 unsigned cpu; in qcom_cpufreq_probe() local
276 return -ENODEV; in qcom_cpufreq_probe()
280 return -ENOENT; in qcom_cpufreq_probe()
282 ret = of_device_is_compatible(np, "operating-points-v2-kryo-cpu"); in qcom_cpufreq_probe()
285 return -ENOENT; in qcom_cpufreq_probe()
290 return -ENOMEM; in qcom_cpufreq_probe()
292 match = pdev->dev.platform_data; in qcom_cpufreq_probe()
293 drv->data = match->data; in qcom_cpufreq_probe()
294 if (!drv->data) { in qcom_cpufreq_probe()
295 ret = -ENODEV; in qcom_cpufreq_probe()
299 if (drv->data->get_version) { in qcom_cpufreq_probe()
307 ret = drv->data->get_version(cpu_dev, in qcom_cpufreq_probe()
317 drv->opp_tokens = kcalloc(num_possible_cpus(), sizeof(*drv->opp_tokens), in qcom_cpufreq_probe()
319 if (!drv->opp_tokens) { in qcom_cpufreq_probe()
320 ret = -ENOMEM; in qcom_cpufreq_probe()
324 for_each_possible_cpu(cpu) { in qcom_cpufreq_probe()
329 cpu_dev = get_cpu_device(cpu); in qcom_cpufreq_probe()
331 ret = -ENODEV; in qcom_cpufreq_probe()
335 if (drv->data->get_version) { in qcom_cpufreq_probe()
336 config.supported_hw = &drv->versions; in qcom_cpufreq_probe()
343 if (drv->data->genpd_names) { in qcom_cpufreq_probe()
344 config.genpd_names = drv->data->genpd_names; in qcom_cpufreq_probe()
349 drv->opp_tokens[cpu] = dev_pm_opp_set_config(cpu_dev, &config); in qcom_cpufreq_probe()
350 if (drv->opp_tokens[cpu] < 0) { in qcom_cpufreq_probe()
351 ret = drv->opp_tokens[cpu]; in qcom_cpufreq_probe()
358 cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1, in qcom_cpufreq_probe()
369 for_each_possible_cpu(cpu) in qcom_cpufreq_probe()
370 dev_pm_opp_clear_config(drv->opp_tokens[cpu]); in qcom_cpufreq_probe()
371 kfree(drv->opp_tokens); in qcom_cpufreq_probe()
381 unsigned int cpu; in qcom_cpufreq_remove() local
385 for_each_possible_cpu(cpu) in qcom_cpufreq_remove()
386 dev_pm_opp_clear_config(drv->opp_tokens[cpu]); in qcom_cpufreq_remove()
388 kfree(drv->opp_tokens); in qcom_cpufreq_remove()
398 .name = "qcom-cpufreq-nvmem",
427 return -ENODEV; in qcom_cpufreq_init()
432 return -ENODEV; in qcom_cpufreq_init()
438 cpufreq_pdev = platform_device_register_data(NULL, "qcom-cpufreq-nvmem", in qcom_cpufreq_init()
439 -1, match, sizeof(*match)); in qcom_cpufreq_init()
457 MODULE_LICENSE("GPL v2");