From: Viresh Kumar <viresh.kumar@linaro.org>
To: rjw@rjwysocki.net, shawn.guo@linaro.org
Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org, arvind.chauhan@arm.com,
sboyd@codeaurora.org, linux-arm-msm@vger.kernel.org,
spk.linux@gmail.com, thomas.ab@samsung.com, nm@ti.com,
t.figa@samsung.com, Viresh Kumar <viresh.kumar@linaro.org>,
devicetree@vger.kernel.org
Subject: [PATCH 12/14] cpufreq: cpu0: Extend support beyond CPU0
Date: Tue, 1 Jul 2014 22:02:41 +0530 [thread overview]
Message-ID: <89da404a3b8f545774f5782d901b8381caf02c07.1404231535.git.viresh.kumar@linaro.org> (raw)
In-Reply-To: <cover.1404231535.git.viresh.kumar@linaro.org>
In-Reply-To: <cover.1404231535.git.viresh.kumar@linaro.org>
Most of the infrastructure is in place now, with only little left. How to find
siblings ?
Stephen Boyd suggested to compare "clocks" properties from CPU's DT node and
siblings should match. This patch adds another routine find_siblings() which
calls of_clk_shared_by_cpus() to find if CPUs share clock line or not.
If of_clk_shared_by_cpus() returns error, we fallback to all CPUs sharing clock
line assumption as existing platforms don't have "clocks" property in all CPU
nodes and would fail from of_clk_shared_by_cpus().
Cc: devicetree@vger.kernel.org
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
.../devicetree/bindings/cpufreq/cpufreq-cpu0.txt | 72 ++++++++++++++++++++--
drivers/cpufreq/cpufreq-cpu0.c | 35 ++++++++++-
2 files changed, 101 insertions(+), 6 deletions(-)
diff --git a/Documentation/devicetree/bindings/cpufreq/cpufreq-cpu0.txt b/Documentation/devicetree/bindings/cpufreq/cpufreq-cpu0.txt
index f055515..4b83c1a 100644
--- a/Documentation/devicetree/bindings/cpufreq/cpufreq-cpu0.txt
+++ b/Documentation/devicetree/bindings/cpufreq/cpufreq-cpu0.txt
@@ -1,11 +1,11 @@
-Generic CPU0 cpufreq driver
+Generic cpufreq driver
-It is a generic cpufreq driver for CPU0 frequency management. It
+It is a generic cpufreq driver for frequency management. It
supports both uniprocessor (UP) and symmetric multiprocessor (SMP)
-systems which share clock and voltage across all CPUs.
+systems which may or maynot share clock and voltage across all CPUs.
Both required and optional properties listed below must be defined
-under node /cpus/cpu@0.
+under node /cpus/cpu@x. Where x is the first cpu inside a cluster.
Required properties:
- operating-points: Refer to Documentation/devicetree/bindings/power/opp.txt
@@ -19,9 +19,16 @@ Optional properties:
- cooling-min-level:
- cooling-max-level:
Please refer to Documentation/devicetree/bindings/thermal/thermal.txt.
+- clocks: If CPU clock is populated from DT, "clocks" property must be copied to
+ every cpu node sharing clock with cpu@x. Generic cpufreq driver compares
+ "clocks" to find siblings, i.e. to see which CPUs share clock/voltages. If
+ only cpu@0 contains "clocks" property it is assumed that all CPUs share clock
+ line.
Examples:
+1. All CPUs share clock/voltages
+
cpus {
#address-cells = <1>;
#size-cells = <0>;
@@ -36,6 +43,8 @@ cpus {
396000 950000
198000 850000
>;
+ clocks = <&clock CLK_ARM_CLK>;
+ clock-names = "cpu";
clock-latency = <61036>; /* two CLK32 periods */
#cooling-cells = <2>;
cooling-min-level = <0>;
@@ -46,17 +55,72 @@ cpus {
compatible = "arm,cortex-a9";
reg = <1>;
next-level-cache = <&L2>;
+ clocks = <&clock CLK_ARM_CLK>;
};
cpu@2 {
compatible = "arm,cortex-a9";
reg = <2>;
next-level-cache = <&L2>;
+ clocks = <&clock CLK_ARM_CLK>;
};
cpu@3 {
compatible = "arm,cortex-a9";
reg = <3>;
next-level-cache = <&L2>;
+ clocks = <&clock CLK_ARM_CLK>;
+ };
+};
+
+
+2. All CPUs inside a cluster share clock/voltages, there are multiple clusters.
+
+cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu@0 {
+ compatible = "arm,cortex-a15";
+ reg = <0>;
+ next-level-cache = <&L2>;
+ operating-points = <
+ /* kHz uV */
+ 792000 1100000
+ 396000 950000
+ 198000 850000
+ >;
+ clocks = <&clock CLK_ARM1_CLK>;
+ clock-names = "cpu";
+ clock-latency = <61036>; /* two CLK32 periods */
+ };
+
+ cpu@1 {
+ compatible = "arm,cortex-a15";
+ reg = <1>;
+ next-level-cache = <&L2>;
+ clocks = <&clock CLK_ARM1_CLK>;
+ };
+
+ cpu@100 {
+ compatible = "arm,cortex-a7";
+ reg = <100>;
+ next-level-cache = <&L2>;
+ operating-points = <
+ /* kHz uV */
+ 792000 950000
+ 396000 750000
+ 198000 450000
+ >;
+ clocks = <&clock CLK_ARM2_CLK>;
+ clock-names = "cpu";
+ clock-latency = <61036>; /* two CLK32 periods */
+ };
+
+ cpu@101 {
+ compatible = "arm,cortex-a7";
+ reg = <101>;
+ next-level-cache = <&L2>;
+ clocks = <&clock CLK_ARM2_CLK>;
};
};
diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c
index 44633f6..b3f2bf0 100644
--- a/drivers/cpufreq/cpufreq-cpu0.c
+++ b/drivers/cpufreq/cpufreq-cpu0.c
@@ -177,6 +177,30 @@ try_again:
return ret;
}
+/*
+ * Sets all CPUs as sibling if any cpu doesn't have a "clocks" property,
+ * Otherwise it matches "clocks" property to find siblings.
+ */
+static void find_siblings(struct cpufreq_policy *policy)
+{
+ int cpu, ret;
+
+ for_each_possible_cpu(cpu) {
+ if (cpu == policy->cpu)
+ continue;
+
+ ret = of_clk_shared_by_cpus(policy->cpu, cpu);
+
+ /* Error while parsing nodes, fallback to set-all */
+ if (ret < 0) {
+ cpumask_setall(policy->cpus);
+ return;
+ } else if (ret == 1) {
+ cpumask_set_cpu(cpu, policy->cpus);
+ }
+ }
+}
+
static int cpu0_cpufreq_init(struct cpufreq_policy *policy)
{
struct cpufreq_frequency_table *freq_table;
@@ -266,9 +290,16 @@ static int cpu0_cpufreq_init(struct cpufreq_policy *policy)
policy->driver_data = priv;
policy->clk = cpu_clk;
- ret = cpufreq_generic_init(policy, freq_table, transition_latency);
- if (ret)
+
+ find_siblings(policy);
+ ret = cpufreq_table_validate_and_show(policy, freq_table);
+ if (ret) {
+ dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__,
+ ret);
goto out_cooling_unregister;
+ }
+
+ policy->cpuinfo.transition_latency = transition_latency;
return 0;
--
2.0.0.rc2
next prev parent reply other threads:[~2014-07-01 16:32 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <e0680f66383f71400f0caa7032620b82c7b3af83.1404273178.git.viresh.kumar@linaro.org>
2014-07-01 16:32 ` [PATCH 00/14] cpufreq: cpu0: Extend support beyond CPU0, V2 Viresh Kumar
2014-07-01 16:32 ` [PATCH 01/14] of: Create of_property_match() Viresh Kumar
2014-07-01 16:32 ` Viresh Kumar [this message]
2014-07-02 4:03 ` [PATCH V2 Resend 12/14] cpufreq: cpu0: Extend support beyond CPU0 Viresh Kumar
2014-07-02 4:12 ` [PATCH 00/14] cpufreq: cpu0: Extend support beyond CPU0, V2 Viresh Kumar
2014-07-03 1:24 ` Stephen Boyd
2014-07-03 2:44 ` Viresh Kumar
2014-07-03 22:16 ` Mike Turquette
2014-07-04 4:21 ` Viresh Kumar
2014-07-08 4:50 ` Viresh Kumar
2014-07-09 17:41 ` Stephen Boyd
2014-07-16 16:01 ` Viresh Kumar
2014-07-16 17:28 ` Thomas Petazzoni
2014-07-16 21:17 ` Rafael J. Wysocki
2014-07-16 21:18 ` Rafael J. Wysocki
2014-07-17 0:28 ` Viresh Kumar
2014-07-17 7:35 ` Thomas Petazzoni
2014-07-17 7:41 ` Viresh Kumar
2014-07-18 1:02 ` Rafael J. Wysocki
2014-07-18 4:17 ` Viresh Kumar
[not found] ` <CAKohpomKzK8pMJs1gv+uXxhd17HtCQyfjSnVYw9KpGz6FwbgDA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-24 10:48 ` Viresh Kumar
2014-07-25 14:29 ` Rob Herring
[not found] ` <CAL_JsqKqCeU0zs+rS1vxsOeh=Kuw_-gaVHtGU76Lb6TchCTytw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-25 14:34 ` Viresh Kumar
2014-07-25 15:41 ` Thomas Petazzoni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=89da404a3b8f545774f5782d901b8381caf02c07.1404231535.git.viresh.kumar@linaro.org \
--to=viresh.kumar@linaro.org \
--cc=arvind.chauhan@arm.com \
--cc=devicetree@vger.kernel.org \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=nm@ti.com \
--cc=rjw@rjwysocki.net \
--cc=sboyd@codeaurora.org \
--cc=shawn.guo@linaro.org \
--cc=spk.linux@gmail.com \
--cc=t.figa@samsung.com \
--cc=thomas.ab@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).