mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
5ba02d10ed
The opp_notifier introduced with patch 0054-Handle-OPP-voltage adjust for some reason missed the actual registration in the opp struct, resulting in never being registred. This was present in kernel 4.9 patchset but dropped in the transition to 4.14. Reintroduce this and fix patch 0055 about L2 cache scaling. Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
89 lines
2.8 KiB
Diff
89 lines
2.8 KiB
Diff
From 0759cdff49f1cf361bf503c13f7bcb33da43ab95 Mon Sep 17 00:00:00 2001
|
|
From: Georgi Djakov <georgi.djakov@linaro.org>
|
|
Date: Tue, 8 Sep 2015 11:24:41 +0300
|
|
Subject: [PATCH 55/69] cpufreq-dt: Add L2 frequency scaling support
|
|
|
|
Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
|
---
|
|
drivers/cpufreq/cpufreq-dt.c | 41 ++++++++++++++++++++++++++++++++++++++++-
|
|
include/linux/cpufreq.h | 2 ++
|
|
2 files changed, 42 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/cpufreq/cpufreq-dt.c
|
|
+++ b/drivers/cpufreq/cpufreq-dt.c
|
|
@@ -49,11 +49,40 @@ static int set_target(struct cpufreq_pol
|
|
struct private_data *priv = policy->driver_data;
|
|
unsigned long freq = policy->freq_table[index].frequency;
|
|
int ret;
|
|
+ struct clk *l2_clk = policy->l2_clk;
|
|
+ unsigned int l2_freq;
|
|
+ unsigned long new_l2_freq = 0;
|
|
|
|
mutex_lock(&priv->lock);
|
|
ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000);
|
|
|
|
if (!ret) {
|
|
+ if (!IS_ERR(l2_clk) && policy->l2_rate[0] && policy->l2_rate[1] &&
|
|
+ policy->l2_rate[2]) {
|
|
+ static unsigned long krait_l2[CONFIG_NR_CPUS] = { };
|
|
+ int cpu, ret = 0;
|
|
+ unsigned long target_freq = freq * 1000;
|
|
+
|
|
+ if (target_freq >= policy->l2_rate[2])
|
|
+ new_l2_freq = policy->l2_rate[2];
|
|
+ else if (target_freq >= policy->l2_rate[1])
|
|
+ new_l2_freq = policy->l2_rate[1];
|
|
+ else
|
|
+ new_l2_freq = policy->l2_rate[0];
|
|
+
|
|
+ krait_l2[policy->cpu] = new_l2_freq;
|
|
+ for_each_present_cpu(cpu)
|
|
+ new_l2_freq = max(new_l2_freq, krait_l2[cpu]);
|
|
+
|
|
+ l2_freq = clk_get_rate(l2_clk);
|
|
+
|
|
+ if (l2_freq != new_l2_freq) {
|
|
+ ret = clk_set_rate(l2_clk, policy->l2_rate[0]);
|
|
+ /* scale l2 with the core */
|
|
+ ret = clk_set_rate(l2_clk, new_l2_freq);
|
|
+ }
|
|
+ }
|
|
+
|
|
priv->opp_freq = freq * 1000;
|
|
arch_set_freq_scale(policy->related_cpus, freq,
|
|
policy->cpuinfo.max_freq);
|
|
@@ -201,6 +230,8 @@ static int cpufreq_init(struct cpufreq_p
|
|
bool fallback = false;
|
|
const char *name;
|
|
int ret;
|
|
+ struct device_node *l2_np;
|
|
+ struct clk *l2_clk = NULL;
|
|
|
|
cpu_dev = get_cpu_device(policy->cpu);
|
|
if (!cpu_dev) {
|
|
@@ -307,6 +338,13 @@ static int cpufreq_init(struct cpufreq_p
|
|
|
|
policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000;
|
|
|
|
+ l2_clk = clk_get(cpu_dev, "l2");
|
|
+ if (!IS_ERR(l2_clk))
|
|
+ policy->l2_clk = l2_clk;
|
|
+ l2_np = of_find_node_by_name(NULL, "qcom,l2");
|
|
+ if (l2_np)
|
|
+ of_property_read_u32_array(l2_np, "qcom,l2-rates", policy->l2_rate, 3);
|
|
+
|
|
/* Support turbo/boost mode */
|
|
if (policy_has_boost_freq(policy)) {
|
|
/* This gets disabled by core on driver unregister */
|
|
--- a/include/linux/cpufreq.h
|
|
+++ b/include/linux/cpufreq.h
|
|
@@ -73,6 +73,8 @@ struct cpufreq_policy {
|
|
unsigned int cpu; /* cpu managing this policy, must be online */
|
|
|
|
struct clk *clk;
|
|
+ struct clk *l2_clk; /* L2 clock */
|
|
+ unsigned int l2_rate[3]; /* L2 bus clock rate thresholds */
|
|
struct cpufreq_cpuinfo cpuinfo;/* see above */
|
|
|
|
unsigned int min; /* in kHz */
|