From bfcf50939564cb0192304f75b27393ef7f71821b Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Fri, 15 Mar 2019 17:31:42 +0800 Subject: [PATCH] cpufreq: dt: Add cpu devices to system monitor Change-Id: I5481e50dddc2f9a8888758d096e4c3f185df06dc Signed-off-by: Finley Xiao --- drivers/cpufreq/cpufreq-dt.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 1c302128e53d..db96425f764d 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -29,12 +29,18 @@ #include "cpufreq-dt.h" #ifdef CONFIG_ARCH_ROCKCHIP #include "rockchip-cpufreq.h" +#include +#include #endif struct private_data { struct opp_table *opp_table; struct device *cpu_dev; struct thermal_cooling_device *cdev; +#ifdef CONFIG_ARCH_ROCKCHIP + struct monitor_dev_info *mdev_info; + struct monitor_dev_profile *mdevp; +#endif const char *reg_name; bool have_static_opps; }; @@ -312,6 +318,23 @@ static int cpufreq_init(struct cpufreq_policy *policy) em_register_perf_domain(policy->cpus, nr_opp, &em_cb); #ifdef CONFIG_ARCH_ROCKCHIP + priv->mdevp = kzalloc(sizeof(*priv->mdevp), GFP_KERNEL); + if (!priv->mdevp) + goto check_rate_volt; + priv->mdevp->type = MONITOR_TPYE_CPU; + priv->mdevp->low_temp_adjust = rockchip_monitor_cpu_low_temp_adjust; + priv->mdevp->high_temp_adjust = rockchip_monitor_cpu_high_temp_adjust; + cpumask_copy(&priv->mdevp->allowed_cpus, policy->cpus); + priv->mdev_info = rockchip_system_monitor_register(cpu_dev, + priv->mdevp); + if (IS_ERR(priv->mdev_info)) { + kfree(priv->mdevp); + priv->mdevp = NULL; + dev_dbg(priv->cpu_dev, + "running cpufreq without system monitor\n"); + priv->mdev_info = NULL; + } +check_rate_volt: rockchip_cpufreq_check_rate_volt(cpu_dev); #endif return 0; @@ -343,6 +366,8 @@ static int cpufreq_exit(struct cpufreq_policy *policy) dev_pm_opp_put_regulators(priv->opp_table); #ifdef CONFIG_ARCH_ROCKCHIP rockchip_cpufreq_put_opp_info(priv->cpu_dev); + rockchip_system_monitor_unregister(priv->mdev_info); + kfree(priv->mdevp); #endif clk_put(policy->clk); kfree(priv);