94e6617d267aadb230d1243055d6ccc733f55efc
[openwrt/staging/wigyori.git] / target / linux / mediatek / patches-5.15 / 350-06-cpufreq-mediatek-Record-previous-target-vproc-value.patch
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
5
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
9 it from regulators.
10
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>
16 ---
17 drivers/cpufreq/mediatek-cpufreq.c | 20 ++++++++++++++++----
18 1 file changed, 16 insertions(+), 4 deletions(-)
19
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;
26 + int pre_vproc;
27 };
28
29 static struct platform_device *cpufreq_pdev;
30 @@ -193,11 +194,17 @@ static int mtk_cpufreq_voltage_tracking(
31
32 static int mtk_cpufreq_set_voltage(struct mtk_cpu_dvfs_info *info, int vproc)
33 {
34 + int ret;
35 +
36 if (info->need_voltage_tracking)
37 - return mtk_cpufreq_voltage_tracking(info, vproc);
38 + ret = mtk_cpufreq_voltage_tracking(info, vproc);
39 else
40 - return regulator_set_voltage(info->proc_reg, vproc,
41 - vproc + VOLT_TOL);
42 + ret = regulator_set_voltage(info->proc_reg, vproc,
43 + MAX_VOLT_LIMIT);
44 + if (!ret)
45 + info->pre_vproc = vproc;
46 +
47 + return ret;
48 }
49
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;
53
54 pre_freq_hz = clk_get_rate(cpu_clk);
55 - pre_vproc = regulator_get_voltage(info->proc_reg);
56 +
57 + if (unlikely(info->pre_vproc <= 0))
58 + pre_vproc = regulator_get_voltage(info->proc_reg);
59 + else
60 + pre_vproc = info->pre_vproc;
61 +
62 if (pre_vproc < 0) {
63 dev_err(cpu_dev, "invalid Vproc value: %d\n", pre_vproc);
64 return pre_vproc;