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>
33 #include <dt-bindings/arm/qcom,ids.h>
84 drv->versions = 1 << *speedbin; in qcom_cpufreq_simple_get_version()
141 /* 4 bits of PVS are in efuse register bits 31, 8-6. */ in get_krait_bin_format_b()
199 drv->versions = 1 << (unsigned int)(*speedbin); in qcom_cpufreq_kryo_name_version()
203 drv->versions = 1 << ((unsigned int)(*speedbin) + 4); in qcom_cpufreq_kryo_name_version()
239 ret = -ENODEV; in qcom_cpufreq_krait_name_version()
243 snprintf(*pvs_name, sizeof("speedXX-pvsXX-vXX"), "speed%d-pvs%d-v%d", in qcom_cpufreq_krait_name_version()
246 drv->versions = (1 << speed); in qcom_cpufreq_krait_name_version()
269 ret = -ENODEV; in qcom_cpufreq_ipq8064_name_version()
281 drv->versions = BIT(IPQ8062_VERSION); in qcom_cpufreq_ipq8064_name_version()
286 drv->versions = BIT(IPQ8064_VERSION); in qcom_cpufreq_ipq8064_name_version()
290 drv->versions = BIT(IPQ8065_VERSION); in qcom_cpufreq_ipq8064_name_version()
296 drv->versions = BIT(IPQ8062_VERSION); in qcom_cpufreq_ipq8064_name_version()
301 snprintf(*pvs_name, sizeof("speed0-pvsXX"), "speed0-pvs%d", pvs); in qcom_cpufreq_ipq8064_name_version()
332 * --------------------------------- in qcom_cpufreq_ipq6018_name_version()
336 drv->versions = 1 << (unsigned int)(*speedbin); in qcom_cpufreq_ipq6018_name_version()
340 * IPQ6018 family only has one bit to advertise the CPU in qcom_cpufreq_ipq6018_name_version()
341 * speed-bin, but that is not enough for IPQ6000 which in qcom_cpufreq_ipq6018_name_version()
345 drv->versions = IPQ6000_VERSION; in qcom_cpufreq_ipq6018_name_version()
351 drv->versions = IPQ6000_VERSION; in qcom_cpufreq_ipq6018_name_version()
378 drv->versions = BIT(IPQ8074_ACORN_VERSION); in qcom_cpufreq_ipq8074_name_version()
384 drv->versions = BIT(IPQ8074_HAWKEYE_VERSION); in qcom_cpufreq_ipq8074_name_version()
390 drv->versions = BIT(IPQ8074_ACORN_VERSION); in qcom_cpufreq_ipq8074_name_version()
430 static void qcom_cpufreq_suspend_virt_devs(struct qcom_cpufreq_drv *drv, unsigned int cpu) in qcom_cpufreq_suspend_virt_devs() argument
432 const char * const *name = drv->data->genpd_names; in qcom_cpufreq_suspend_virt_devs()
435 if (!drv->cpus[cpu].virt_devs) in qcom_cpufreq_suspend_virt_devs()
439 device_set_awake_path(drv->cpus[cpu].virt_devs[i]); in qcom_cpufreq_suspend_virt_devs()
442 static void qcom_cpufreq_put_virt_devs(struct qcom_cpufreq_drv *drv, unsigned int cpu) in qcom_cpufreq_put_virt_devs() argument
444 const char * const *name = drv->data->genpd_names; in qcom_cpufreq_put_virt_devs()
447 if (!drv->cpus[cpu].virt_devs) in qcom_cpufreq_put_virt_devs()
451 pm_runtime_put(drv->cpus[cpu].virt_devs[i]); in qcom_cpufreq_put_virt_devs()
460 char pvs_name_buffer[] = "speedXX-pvsXX-vXX"; in qcom_cpufreq_probe()
462 unsigned cpu; in qcom_cpufreq_probe() local
468 return -ENODEV; in qcom_cpufreq_probe()
472 return -ENOENT; in qcom_cpufreq_probe()
474 ret = of_device_is_compatible(np, "operating-points-v2-kryo-cpu") || in qcom_cpufreq_probe()
475 of_device_is_compatible(np, "operating-points-v2-krait-cpu"); in qcom_cpufreq_probe()
478 return -ENOENT; in qcom_cpufreq_probe()
481 drv = devm_kzalloc(&pdev->dev, struct_size(drv, cpus, num_possible_cpus()), in qcom_cpufreq_probe()
484 return -ENOMEM; in qcom_cpufreq_probe()
486 match = pdev->dev.platform_data; in qcom_cpufreq_probe()
487 drv->data = match->data; in qcom_cpufreq_probe()
488 if (!drv->data) in qcom_cpufreq_probe()
489 return -ENODEV; in qcom_cpufreq_probe()
491 if (drv->data->get_version) { in qcom_cpufreq_probe()
497 ret = drv->data->get_version(cpu_dev, in qcom_cpufreq_probe()
507 for_each_possible_cpu(cpu) { in qcom_cpufreq_probe()
513 cpu_dev = get_cpu_device(cpu); in qcom_cpufreq_probe()
515 ret = -ENODEV; in qcom_cpufreq_probe()
519 if (drv->data->get_version) { in qcom_cpufreq_probe()
520 config.supported_hw = &drv->versions; in qcom_cpufreq_probe()
527 if (drv->data->genpd_names) { in qcom_cpufreq_probe()
528 config.genpd_names = drv->data->genpd_names; in qcom_cpufreq_probe()
533 drv->cpus[cpu].opp_token = dev_pm_opp_set_config(cpu_dev, &config); in qcom_cpufreq_probe()
534 if (drv->cpus[cpu].opp_token < 0) { in qcom_cpufreq_probe()
535 ret = drv->cpus[cpu].opp_token; in qcom_cpufreq_probe()
559 drv->cpus[cpu].virt_devs = virt_devs; in qcom_cpufreq_probe()
563 cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1, in qcom_cpufreq_probe()
574 for_each_possible_cpu(cpu) { in qcom_cpufreq_probe()
575 qcom_cpufreq_put_virt_devs(drv, cpu); in qcom_cpufreq_probe()
576 dev_pm_opp_clear_config(drv->cpus[cpu].opp_token); in qcom_cpufreq_probe()
584 unsigned int cpu; in qcom_cpufreq_remove() local
588 for_each_possible_cpu(cpu) { in qcom_cpufreq_remove()
589 qcom_cpufreq_put_virt_devs(drv, cpu); in qcom_cpufreq_remove()
590 dev_pm_opp_clear_config(drv->cpus[cpu].opp_token); in qcom_cpufreq_remove()
597 unsigned int cpu; in qcom_cpufreq_suspend() local
599 for_each_possible_cpu(cpu) in qcom_cpufreq_suspend()
600 qcom_cpufreq_suspend_virt_devs(drv, cpu); in qcom_cpufreq_suspend()
611 .name = "qcom-cpufreq-nvmem",
646 return -ENODEV; in qcom_cpufreq_init()
651 return -ENODEV; in qcom_cpufreq_init()
657 cpufreq_pdev = platform_device_register_data(NULL, "qcom-cpufreq-nvmem", in qcom_cpufreq_init()
658 -1, match, sizeof(*match)); in qcom_cpufreq_init()
676 MODULE_LICENSE("GPL v2");