All of lore.kernel.org
 help / color / mirror / Atom feed
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

  parent reply	other threads:[~2014-07-01 16:32 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` [PATCH 02/14] clk: Create of_clk_shared_by_cpus() Viresh Kumar
2014-07-01 18:00   ` Stephen Boyd
2014-07-02  1:57     ` Viresh Kumar
2014-07-09 14:38   ` Santosh Shilimkar
2014-07-09 14:38     ` Santosh Shilimkar
2014-07-09 15:20     ` Viresh Kumar
     [not found]   ` <5f7164d789e87c62d722b575980c92dfd0504334.1404231535.git.viresh.kumar@linar o.org>
2014-07-28 14:01     ` Grant Likely
2014-07-28 14:01       ` Grant Likely
2014-07-01 16:32 ` [PATCH 03/14] cpufreq: Add support for per-policy driver data Viresh Kumar
2014-07-09 14:33   ` Santosh Shilimkar
2014-07-09 14:33     ` Santosh Shilimkar
2014-07-09 15:07     ` Viresh Kumar
2014-07-01 16:32 ` [PATCH 04/14] cpufreq: cpu0: Add Module Author Viresh Kumar
2014-07-09 14:42   ` Santosh Shilimkar
2014-07-09 14:42     ` Santosh Shilimkar
2014-07-09 15:08     ` Viresh Kumar
2014-07-09 15:24       ` Santosh Shilimkar
2014-07-01 16:32 ` [PATCH 05/14] cpufreq: cpu0: don't validate clock on clk_put() Viresh Kumar
2014-07-09 14:42   ` Santosh Shilimkar
2014-07-09 14:42     ` Santosh Shilimkar
2014-07-01 16:32 ` [PATCH 06/14] cpufreq: cpu0: defer probe if clock isn't registered yet Viresh Kumar
2014-07-02  5:53   ` Shawn Guo
2014-07-02  5:53     ` Shawn Guo
2014-07-02  5:55     ` Viresh Kumar
2014-07-02 11:32       ` Viresh Kumar
2014-07-03  0:38         ` Stephen Boyd
2014-07-03  2:19           ` Viresh Kumar
2014-07-09 14:43             ` Santosh Shilimkar
2014-07-09 14:43               ` Santosh Shilimkar
2014-07-01 16:32 ` [PATCH 07/14] cpufreq: cpu0: OPPs can be populated at runtime Viresh Kumar
2014-07-01 18:02   ` Stephen Boyd
2014-07-02  2:03     ` Viresh Kumar
2014-07-02  4:03   ` [PATCH V2 Resend " Viresh Kumar
2014-07-09 14:44   ` [PATCH " Santosh Shilimkar
2014-07-09 14:44     ` Santosh Shilimkar
2014-07-09 15:09     ` Viresh Kumar
2014-07-10 11:19     ` Viresh Kumar
2014-07-10 12:39       ` Nishanth Menon
2014-07-10 13:31         ` Santosh Shilimkar
2014-07-10 13:36           ` Viresh Kumar
2014-07-01 16:32 ` [PATCH 08/14] cpufreq: cpu0: use dev_{err|warn|dbg} instead of pr_{err|warn|debug} Viresh Kumar
2014-07-09 14:45   ` Santosh Shilimkar
2014-07-09 14:45     ` Santosh Shilimkar
2014-07-01 16:32 ` [PATCH 09/14] cpufreq: cpu0: Move per-cluster initialization code to ->init() Viresh Kumar
2014-07-03  0:43   ` Stephen Boyd
2014-07-03  2:11     ` Viresh Kumar
2014-07-09 14:53   ` Santosh Shilimkar
2014-07-09 14:53     ` Santosh Shilimkar
2014-07-09 15:17     ` Viresh Kumar
2014-07-09 15:26       ` Santosh Shilimkar
2014-07-09 15:27         ` Viresh Kumar
2014-07-09 15:29           ` Santosh Shilimkar
2014-07-09 15:33             ` Viresh Kumar
2014-07-01 16:32 ` [PATCH 10/14] cpufreq: cpu0: try regulators with name "cpu-supply" Viresh Kumar
2014-07-01 16:32 ` [PATCH 11/14] cpufreq: cpu0: Make allocate_resources() work for any CPU 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-01 16:32 ` [PATCH 13/14] cpufreq: cpu0: rename driver and internals to 'cpufreq_generic' Viresh Kumar
2014-07-01 16:32 ` [PATCH 14/14] cpufreq: generic: set platform_{driver|device} '.name' to 'cpufreq-generic' 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-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 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.