Lines Matching +full:drv +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0
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.
23 #include <linux/nvmem-consumer.h>
33 #include <dt-bindings/arm/qcom,ids.h>
41 #define IPQ6000_VERSION BIT(2)
54 struct qcom_cpufreq_drv *drv);
75 struct qcom_cpufreq_drv *drv) in qcom_cpufreq_simple_get_version() argument
85 drv->versions = 1 << *speedbin; in qcom_cpufreq_simple_get_version()
137 case 2: in get_krait_bin_format_b()
142 /* 4 bits of PVS are in efuse register bits 31, 8-6. */ in get_krait_bin_format_b()
171 struct qcom_cpufreq_drv *drv) in qcom_cpufreq_kryo_name_version() argument
201 drv->versions = 1 << (unsigned int)(*speedbin); in qcom_cpufreq_kryo_name_version()
205 drv->versions = 1 << ((unsigned int)(*speedbin) + 4); in qcom_cpufreq_kryo_name_version()
219 struct qcom_cpufreq_drv *drv) in qcom_cpufreq_krait_name_version() argument
241 ret = -ENODEV; in qcom_cpufreq_krait_name_version()
245 snprintf(*pvs_name, sizeof("speedXX-pvsXX-vXX"), "speed%d-pvs%d-v%d", in qcom_cpufreq_krait_name_version()
248 drv->versions = (1 << speed); in qcom_cpufreq_krait_name_version()
258 struct qcom_cpufreq_drv *drv) in qcom_cpufreq_ipq8064_name_version() argument
271 ret = -ENODEV; in qcom_cpufreq_ipq8064_name_version()
283 drv->versions = BIT(IPQ8062_VERSION); in qcom_cpufreq_ipq8064_name_version()
288 drv->versions = BIT(IPQ8064_VERSION); in qcom_cpufreq_ipq8064_name_version()
292 drv->versions = BIT(IPQ8065_VERSION); in qcom_cpufreq_ipq8064_name_version()
298 drv->versions = BIT(IPQ8062_VERSION); in qcom_cpufreq_ipq8064_name_version()
303 snprintf(*pvs_name, sizeof("speed0-pvsXX"), "speed0-pvs%d", pvs); in qcom_cpufreq_ipq8064_name_version()
313 struct qcom_cpufreq_drv *drv) in qcom_cpufreq_ipq6018_name_version() argument
334 * --------------------------------- in qcom_cpufreq_ipq6018_name_version()
335 * 2’b0 No Limit BIT(0) in qcom_cpufreq_ipq6018_name_version()
336 * 2’b1 1.5 GHz BIT(1) in qcom_cpufreq_ipq6018_name_version()
338 drv->versions = 1 << (unsigned int)(*speedbin); in qcom_cpufreq_ipq6018_name_version()
343 * speed-bin, but that is not enough for IPQ6000 which in qcom_cpufreq_ipq6018_name_version()
345 * So for IPQ6000 manually set BIT(2) based on SMEM ID. in qcom_cpufreq_ipq6018_name_version()
347 drv->versions = IPQ6000_VERSION; in qcom_cpufreq_ipq6018_name_version()
353 drv->versions = IPQ6000_VERSION; in qcom_cpufreq_ipq6018_name_version()
364 struct qcom_cpufreq_drv *drv) in qcom_cpufreq_ipq8074_name_version() argument
380 drv->versions = BIT(IPQ8074_ACORN_VERSION); in qcom_cpufreq_ipq8074_name_version()
386 drv->versions = BIT(IPQ8074_HAWKEYE_VERSION); in qcom_cpufreq_ipq8074_name_version()
392 drv->versions = BIT(IPQ8074_ACORN_VERSION); in qcom_cpufreq_ipq8074_name_version()
430 static void qcom_cpufreq_suspend_pd_devs(struct qcom_cpufreq_drv *drv, unsigned int cpu) in qcom_cpufreq_suspend_pd_devs() argument
432 struct dev_pm_domain_list *pd_list = drv->cpus[cpu].pd_list; in qcom_cpufreq_suspend_pd_devs()
438 for (i = 0; i < pd_list->num_pds; i++) in qcom_cpufreq_suspend_pd_devs()
439 device_set_awake_path(pd_list->pd_devs[i]); in qcom_cpufreq_suspend_pd_devs()
444 struct qcom_cpufreq_drv *drv; in qcom_cpufreq_probe() local
447 char pvs_name_buffer[] = "speedXX-pvsXX-vXX"; in qcom_cpufreq_probe()
455 return -ENODEV; in qcom_cpufreq_probe()
460 return -ENOENT; in qcom_cpufreq_probe()
462 ret = of_device_is_compatible(np, "operating-points-v2-kryo-cpu") || in qcom_cpufreq_probe()
463 of_device_is_compatible(np, "operating-points-v2-krait-cpu"); in qcom_cpufreq_probe()
465 return -ENOENT; in qcom_cpufreq_probe()
467 drv = devm_kzalloc(&pdev->dev, struct_size(drv, cpus, num_possible_cpus()), in qcom_cpufreq_probe()
469 if (!drv) in qcom_cpufreq_probe()
470 return -ENOMEM; in qcom_cpufreq_probe()
472 match = pdev->dev.platform_data; in qcom_cpufreq_probe()
473 drv->data = match->data; in qcom_cpufreq_probe()
474 if (!drv->data) in qcom_cpufreq_probe()
475 return -ENODEV; in qcom_cpufreq_probe()
477 if (drv->data->get_version) { in qcom_cpufreq_probe()
483 ret = drv->data->get_version(cpu_dev, in qcom_cpufreq_probe()
484 speedbin_nvmem, &pvs_name, drv); in qcom_cpufreq_probe()
499 ret = -ENODEV; in qcom_cpufreq_probe()
503 if (drv->data->get_version) { in qcom_cpufreq_probe()
504 config.supported_hw = &drv->versions; in qcom_cpufreq_probe()
512 drv->cpus[cpu].opp_token = dev_pm_opp_set_config(cpu_dev, &config); in qcom_cpufreq_probe()
513 if (drv->cpus[cpu].opp_token < 0) { in qcom_cpufreq_probe()
514 ret = drv->cpus[cpu].opp_token; in qcom_cpufreq_probe()
520 if (drv->data->pd_names) { in qcom_cpufreq_probe()
522 .pd_names = drv->data->pd_names, in qcom_cpufreq_probe()
523 .num_pd_names = drv->data->num_pd_names, in qcom_cpufreq_probe()
529 &drv->cpus[cpu].pd_list); in qcom_cpufreq_probe()
535 cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1, in qcom_cpufreq_probe()
538 platform_set_drvdata(pdev, drv); in qcom_cpufreq_probe()
547 dev_pm_domain_detach_list(drv->cpus[cpu].pd_list); in qcom_cpufreq_probe()
548 dev_pm_opp_clear_config(drv->cpus[cpu].opp_token); in qcom_cpufreq_probe()
555 struct qcom_cpufreq_drv *drv = platform_get_drvdata(pdev); in qcom_cpufreq_remove() local
561 dev_pm_domain_detach_list(drv->cpus[cpu].pd_list); in qcom_cpufreq_remove()
562 dev_pm_opp_clear_config(drv->cpus[cpu].opp_token); in qcom_cpufreq_remove()
568 struct qcom_cpufreq_drv *drv = dev_get_drvdata(dev); in qcom_cpufreq_suspend() local
572 qcom_cpufreq_suspend_pd_devs(drv, cpu); in qcom_cpufreq_suspend()
583 .name = "qcom-cpufreq-nvmem",
618 return -ENODEV; in qcom_cpufreq_init()
622 return -ENODEV; in qcom_cpufreq_init()
628 cpufreq_pdev = platform_device_register_data(NULL, "qcom-cpufreq-nvmem", in qcom_cpufreq_init()
629 -1, match, sizeof(*match)); in qcom_cpufreq_init()