From 952119dd29e3b4f8c125c82e22fe4dc0aa71617c Mon Sep 17 00:00:00 2001 From: Mason Huo Date: Wed, 1 Mar 2023 18:24:51 +0800 Subject: [PATCH] cpufreq: Introduce the cpufreq-dt driver for JH7110 The original starfive-cpufreq is deprecated. Use the cpufreq-dt driver for JH7110, as this is a generic cpu scaling driver. Signed-off-by: Mason Huo --- drivers/cpufreq/Kconfig | 3 - drivers/cpufreq/Kconfig.riscv | 15 --- drivers/cpufreq/cpufreq-dt-platdev.c | 2 +- drivers/cpufreq/starfive-cpufreq.c | 212 ----------------------------------- 4 files changed, 1 insertion(+), 231 deletions(-) delete mode 100644 drivers/cpufreq/Kconfig.riscv delete mode 100644 drivers/cpufreq/starfive-cpufreq.c diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index d62547d..d39f9f3 100644 --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig @@ -323,7 +323,4 @@ config QORIQ_CPUFREQ endif -if RISCV -source "drivers/cpufreq/Kconfig.riscv" -endif endmenu diff --git a/drivers/cpufreq/Kconfig.riscv b/drivers/cpufreq/Kconfig.riscv deleted file mode 100644 index b375e26..0000000 --- a/drivers/cpufreq/Kconfig.riscv +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# RISCV CPU Frequency scaling drivers -# - -config RISCV_STARFIVE_CPUFREQ - bool "Starfive JH7110" - depends on SOC_STARFIVE - default y - help - This adds the CPUFreq driver for Starfive SoC. - - If in doubt, say N. - - diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c index 5cbdeb5..422c1f2 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c @@ -92,6 +92,7 @@ static const struct of_device_id allowlist[] __initconst = { { .compatible = "xlnx,zynq-7000", }, { .compatible = "xlnx,zynqmp", }, + { .compatible = "starfive,jh7110", }, { } }; @@ -160,7 +161,6 @@ static const struct of_device_id blocklist[] __initconst = { { .compatible = "qcom,apq8064", }, { .compatible = "qcom,msm8974", }, { .compatible = "qcom,msm8960", }, - { .compatible = "starfive,jh7110", }, { } }; diff --git a/drivers/cpufreq/starfive-cpufreq.c b/drivers/cpufreq/starfive-cpufreq.c deleted file mode 100644 index 54c2539..0000000 --- a/drivers/cpufreq/starfive-cpufreq.c +++ /dev/null @@ -1,212 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright 2022 StarFive Technology Co., Ltd. - * - * Starfive CPUfreq Support - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define VOLT_TOL (10000) - -struct starfive_cpu_dvfs_info { - struct regulator *vddcpu; - struct clk *cpu_clk; - unsigned long regulator_latency; - struct device *cpu_dev; - struct cpumask cpus; -}; - -static int starfive_cpufreq_set_target_index(struct cpufreq_policy *policy, - unsigned int index) -{ - struct cpufreq_frequency_table *freq_table = policy->freq_table; - struct starfive_cpu_dvfs_info *info = cpufreq_get_driver_data(); - struct dev_pm_opp *opp; - unsigned long old_freq, new_freq; - int old_vdd, target_vdd, ret; - - old_freq = clk_get_rate(info->cpu_clk); - old_vdd = regulator_get_voltage(info->vddcpu); - if (old_vdd < 0) { - pr_err("Invalid cpu regulator value: %d\n", old_vdd); - return old_vdd; - } - - new_freq = freq_table[index].frequency * 1000; - opp = dev_pm_opp_find_freq_ceil(info->cpu_dev, &new_freq); - if (IS_ERR(opp)) { - pr_err("Failed to find OPP for %ld\n", new_freq); - return PTR_ERR(opp); - } - target_vdd = dev_pm_opp_get_voltage(opp); - dev_pm_opp_put(opp); - - - if (info->vddcpu && new_freq > old_freq) { - ret = regulator_set_voltage(info->vddcpu, - target_vdd, target_vdd + VOLT_TOL); - if (ret != 0) { - pr_err("Failed to set vddcpu for %ldkHz: %d\n", - new_freq, ret); - return ret; - } - } - - ret = clk_set_rate(info->cpu_clk, new_freq); - if (ret < 0) { - pr_err("Failed to set rate %ldkHz: %d\n", - new_freq, ret); - } - - if (info->vddcpu && new_freq < old_freq) { - ret = regulator_set_voltage(info->vddcpu, - target_vdd, target_vdd + VOLT_TOL); - if (ret != 0) { - pr_err("Failed to set vddcpu for %ldkHz: %d\n", - new_freq, ret); - if (clk_set_rate(policy->clk, old_freq * 1000) < 0) - pr_err("Failed to restore original clock rate\n"); - - return ret; - } - } - - pr_debug("Set actual frequency %lukHz\n", - clk_get_rate(policy->clk) / 1000); - - return 0; -} - -static int starfive_cpufreq_driver_init(struct cpufreq_policy *policy) -{ - struct starfive_cpu_dvfs_info *info = cpufreq_get_driver_data(); - struct cpufreq_frequency_table *freq_table; - int ret; - - ret = dev_pm_opp_init_cpufreq_table(info->cpu_dev, &freq_table); - if (ret) { - pr_err("Failed to init cpufreq table for cpu%d: %d\n", - policy->cpu, ret); - return ret; - } - - cpumask_copy(policy->cpus, &info->cpus); - policy->freq_table = freq_table; - policy->driver_data = info; - policy->clk = info->cpu_clk; - - return 0; -} - -static int starfive_cpu_dvfs_info_init(struct platform_device *pdev, - struct starfive_cpu_dvfs_info *info) -{ - struct device *dev = &pdev->dev; - int ret; - static int retry = 3; - - info->vddcpu = regulator_get_optional(&pdev->dev, "cpu_vdd"); - if (IS_ERR(info->vddcpu)) { - if (PTR_ERR(info->vddcpu) == -EPROBE_DEFER) - dev_warn(&pdev->dev, "The cpu regulator is not ready, retry.\n"); - else - dev_err(&pdev->dev, "Failed to get regulator for cpu!\n"); - if (retry-- > 0) - return -EPROBE_DEFER; - else - return PTR_ERR(info->vddcpu); - } - - info->cpu_clk = devm_clk_get(dev, "cpu_clk"); - if (IS_ERR(info->cpu_clk)) { - dev_err(&pdev->dev, "Unable to obtain cpu_clk: %ld\n", - PTR_ERR(info->cpu_clk)); - return PTR_ERR(info->cpu_clk); - } - - info->cpu_dev = get_cpu_device(1); - if (!info->cpu_dev) { - dev_err(&pdev->dev, "Failed to get cpu device\n"); - return -ENODEV; - } - /* Get OPP-sharing information from "operating-points-v2" bindings */ - ret = dev_pm_opp_of_get_sharing_cpus(info->cpu_dev, &info->cpus); - if (ret) { - dev_err(&pdev->dev, "Failed to get OPP-sharing information for cpu\n"); - return -EINVAL; - } - - ret = dev_pm_opp_of_cpumask_add_table(&info->cpus); - if (ret) { - pr_warn("no OPP table for cpu\n"); - return -EINVAL; - } - - return 0; -} - -static struct cpufreq_driver starfive_cpufreq_driver = { - .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, - .verify = cpufreq_generic_frequency_table_verify, - .target_index = starfive_cpufreq_set_target_index, - .get = cpufreq_generic_get, - .init = starfive_cpufreq_driver_init, - .name = "starfive-cpufreq", - .attr = cpufreq_generic_attr, -}; - -static int starfive_cpufreq_probe(struct platform_device *pdev) -{ - struct starfive_cpu_dvfs_info *info; - int ret; - - info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - ret = starfive_cpu_dvfs_info_init(pdev, info); - if (ret) { - dev_err(&pdev->dev, "Failed to init starfive cpu dvfs info\n"); - return ret; - } - - starfive_cpufreq_driver.driver_data = info; - ret = cpufreq_register_driver(&starfive_cpufreq_driver); - if (ret) - dev_err(&pdev->dev, "Failed to register starfive cpufreq driver\n"); - - return ret; - -} - -static const struct of_device_id starfive_cpufreq_match_table[] = { - { .compatible = "starfive,jh7110-cpufreq" }, - {} -}; - -static struct platform_driver starfive_cpufreq_plat_driver = { - .probe = starfive_cpufreq_probe, - .driver = { - .name = "starfive-cpufreq", - .of_match_table = starfive_cpufreq_match_table, - }, -}; - -static int __init starfive_cpufreq_init(void) -{ - return platform_driver_register(&starfive_cpufreq_plat_driver); -} -device_initcall(starfive_cpufreq_init); - -MODULE_DESCRIPTION("STARFIVE CPUFREQ Driver"); -MODULE_AUTHOR("Mason Huuo "); -MODULE_LICENSE("GPL v2"); - -- 2.7.4