Skip to content

Commit 5da10c8

Browse files
vireshkAlex Shi
authored andcommitted
cpufreq: dt: Use dev_pm_opp_set_rate() to switch frequency
OPP core supports frequency/voltage changes based on the target frequency now, use that instead of open coding the same in cpufreq-dt driver. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> (cherry picked from commit 78c3ba5df96c875b1668e1cd3ee0a69e62454f32) Signed-off-by: Alex Shi <alex.shi@linaro.org>
1 parent ba7b484 commit 5da10c8

1 file changed

Lines changed: 2 additions & 71 deletions

File tree

drivers/cpufreq/cpufreq-dt.c

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -45,79 +45,10 @@ static struct freq_attr *cpufreq_dt_attr[] = {
4545

4646
static int set_target(struct cpufreq_policy *policy, unsigned int index)
4747
{
48-
struct dev_pm_opp *opp;
49-
struct cpufreq_frequency_table *freq_table = policy->freq_table;
50-
struct clk *cpu_clk = policy->clk;
5148
struct private_data *priv = policy->driver_data;
52-
struct device *cpu_dev = priv->cpu_dev;
53-
struct regulator *cpu_reg = priv->cpu_reg;
54-
unsigned long volt = 0, tol = 0;
55-
int volt_old = 0;
56-
unsigned int old_freq, new_freq;
57-
long freq_Hz, freq_exact;
58-
int ret;
59-
60-
freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000);
61-
if (freq_Hz <= 0)
62-
freq_Hz = freq_table[index].frequency * 1000;
63-
64-
freq_exact = freq_Hz;
65-
new_freq = freq_Hz / 1000;
66-
old_freq = clk_get_rate(cpu_clk) / 1000;
67-
68-
if (!IS_ERR(cpu_reg)) {
69-
unsigned long opp_freq;
70-
71-
rcu_read_lock();
72-
opp = dev_pm_opp_find_freq_ceil(cpu_dev, &freq_Hz);
73-
if (IS_ERR(opp)) {
74-
rcu_read_unlock();
75-
dev_err(cpu_dev, "failed to find OPP for %ld\n",
76-
freq_Hz);
77-
return PTR_ERR(opp);
78-
}
79-
volt = dev_pm_opp_get_voltage(opp);
80-
opp_freq = dev_pm_opp_get_freq(opp);
81-
rcu_read_unlock();
82-
tol = volt * priv->voltage_tolerance / 100;
83-
volt_old = regulator_get_voltage(cpu_reg);
84-
dev_dbg(cpu_dev, "Found OPP: %ld kHz, %ld uV\n",
85-
opp_freq / 1000, volt);
86-
}
87-
88-
dev_dbg(cpu_dev, "%u MHz, %d mV --> %u MHz, %ld mV\n",
89-
old_freq / 1000, (volt_old > 0) ? volt_old / 1000 : -1,
90-
new_freq / 1000, volt ? volt / 1000 : -1);
91-
92-
/* scaling up? scale voltage before frequency */
93-
if (!IS_ERR(cpu_reg) && new_freq > old_freq) {
94-
ret = regulator_set_voltage_tol(cpu_reg, volt, tol);
95-
if (ret) {
96-
dev_err(cpu_dev, "failed to scale voltage up: %d\n",
97-
ret);
98-
return ret;
99-
}
100-
}
101-
102-
ret = clk_set_rate(cpu_clk, freq_exact);
103-
if (ret) {
104-
dev_err(cpu_dev, "failed to set clock rate: %d\n", ret);
105-
if (!IS_ERR(cpu_reg) && volt_old > 0)
106-
regulator_set_voltage_tol(cpu_reg, volt_old, tol);
107-
return ret;
108-
}
10949

110-
/* scaling down? scale voltage after frequency */
111-
if (!IS_ERR(cpu_reg) && new_freq < old_freq) {
112-
ret = regulator_set_voltage_tol(cpu_reg, volt, tol);
113-
if (ret) {
114-
dev_err(cpu_dev, "failed to scale voltage down: %d\n",
115-
ret);
116-
clk_set_rate(cpu_clk, old_freq * 1000);
117-
}
118-
}
119-
120-
return ret;
50+
return dev_pm_opp_set_rate(priv->cpu_dev,
51+
policy->freq_table[index].frequency * 1000);
12152
}
12253

12354
/*

0 commit comments

Comments
 (0)