1 From 34737eb8d0daa0d4183f10286a2f55d8788066bc Mon Sep 17 00:00:00 2001
2 From: Jia-Wei Chang <jia-wei.chang@mediatek.com>
3 Date: Fri, 22 Apr 2022 15:52:29 +0800
4 Subject: [PATCH 06/21] cpufreq: mediatek: Record previous target vproc value
6 We found the buck voltage may not be exactly the same with what we set
7 because CPU may share the same buck with other module.
8 Therefore, we need to record the previous desired value instead of reading
11 Signed-off-by: Andrew-sh.Cheng <andrew-sh.cheng@mediatek.com>
12 Signed-off-by: Jia-Wei Chang <jia-wei.chang@mediatek.com>
13 Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com>
14 Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
15 Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
17 drivers/cpufreq/mediatek-cpufreq.c | 20 ++++++++++++++++----
18 1 file changed, 16 insertions(+), 4 deletions(-)
20 --- a/drivers/cpufreq/mediatek-cpufreq.c
21 +++ b/drivers/cpufreq/mediatek-cpufreq.c
22 @@ -40,6 +40,7 @@ struct mtk_cpu_dvfs_info {
23 struct list_head list_head;
24 int intermediate_voltage;
25 bool need_voltage_tracking;
29 static struct platform_device *cpufreq_pdev;
30 @@ -193,11 +194,17 @@ static int mtk_cpufreq_voltage_tracking(
32 static int mtk_cpufreq_set_voltage(struct mtk_cpu_dvfs_info *info, int vproc)
36 if (info->need_voltage_tracking)
37 - return mtk_cpufreq_voltage_tracking(info, vproc);
38 + ret = mtk_cpufreq_voltage_tracking(info, vproc);
40 - return regulator_set_voltage(info->proc_reg, vproc,
42 + ret = regulator_set_voltage(info->proc_reg, vproc,
45 + info->pre_vproc = vproc;
50 static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
51 @@ -215,7 +222,12 @@ static int mtk_cpufreq_set_target(struct
52 inter_vproc = info->intermediate_voltage;
54 pre_freq_hz = clk_get_rate(cpu_clk);
55 - pre_vproc = regulator_get_voltage(info->proc_reg);
57 + if (unlikely(info->pre_vproc <= 0))
58 + pre_vproc = regulator_get_voltage(info->proc_reg);
60 + pre_vproc = info->pre_vproc;
63 dev_err(cpu_dev, "invalid Vproc value: %d\n", pre_vproc);