diff mbox

[12/17] cpufreq: dt: Pass regulator name to the OPP core for V1 bindings

Message ID 981905b802879bff26d839b0aab19ad67a3aa1ff.1450777582.git.viresh.kumar@linaro.org
State New
Headers show

Commit Message

Viresh Kumar Dec. 22, 2015, 10:16 a.m. UTC
OPP core can handle the regulators by itself, and it allocates the
regulator based on device's name. But for older V1 bindings, many DT
files have used names like 'cpu-supply' instead of 'cpu0-supply'.

The cpufreq-dt driver needs to tell the right name of the regulator in
this case to the OPP core.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

---
 drivers/cpufreq/cpufreq-dt.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

-- 
2.7.0.rc1.186.g94414c4

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Stephen Boyd Jan. 12, 2016, 1:53 a.m. UTC | #1
On 12/22, Viresh Kumar wrote:
> OPP core can handle the regulators by itself, and it allocates the

> regulator based on device's name. But for older V1 bindings, many DT

> files have used names like 'cpu-supply' instead of 'cpu0-supply'.

> 

> The cpufreq-dt driver needs to tell the right name of the regulator in

> this case to the OPP core.

> 

> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>


This whole patch is confusing to me because old style was to be
cpu0-supply, and new style is cpu-supply.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Viresh Kumar Jan. 12, 2016, 7:11 a.m. UTC | #2
On 11-01-16, 17:53, Stephen Boyd wrote:
> On 12/22, Viresh Kumar wrote:

> > OPP core can handle the regulators by itself, and it allocates the

> > regulator based on device's name. But for older V1 bindings, many DT

> > files have used names like 'cpu-supply' instead of 'cpu0-supply'.

> > 

> > The cpufreq-dt driver needs to tell the right name of the regulator in

> > this case to the OPP core.

> > 

> > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

> 

> This whole patch is confusing to me because old style was to be

> cpu0-supply, and new style is cpu-supply.


Long back we used to have cpu0-supply, then while I converted
cpufreq-dt to support multiple clusters, you asked me to name it to
cpu-supply, which I did.

Now, looking at the implementation into the generic OPP layer, it
looks like <device>-name is a far better and reasonable choice.

And so I am moving back to cpu0-supply, will udpate binding doc as
well.

-- 
viresh
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Stephen Boyd Jan. 13, 2016, 12:43 a.m. UTC | #3
On 01/12, Viresh Kumar wrote:
> On 11-01-16, 17:53, Stephen Boyd wrote:

> > On 12/22, Viresh Kumar wrote:

> > > OPP core can handle the regulators by itself, and it allocates the

> > > regulator based on device's name. But for older V1 bindings, many DT

> > > files have used names like 'cpu-supply' instead of 'cpu0-supply'.

> > > 

> > > The cpufreq-dt driver needs to tell the right name of the regulator in

> > > this case to the OPP core.

> > > 

> > > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

> > 

> > This whole patch is confusing to me because old style was to be

> > cpu0-supply, and new style is cpu-supply.

> 

> Long back we used to have cpu0-supply, then while I converted

> cpufreq-dt to support multiple clusters, you asked me to name it to

> cpu-supply, which I did.

> 

> Now, looking at the implementation into the generic OPP layer, it

> looks like <device>-name is a far better and reasonable choice.


It's far easier to implement, but not far better. In most designs
the pin is not called <device_name>-supply, but something more
mundane like vdd-supply, vddio-supply, vcc-supply, etc. In the
case of CPUs, there's probably nothing in the datasheets, so cpu
vs cpu0 is not too important to distinguish here. But for things
like a GPU, DSP, video encoder, etc. I doubt it's going to be
called <device_name>-supply, so making that the norm is
misguided.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Viresh Kumar Jan. 13, 2016, 5:47 a.m. UTC | #4
On 12-01-16, 16:43, Stephen Boyd wrote:
> It's far easier to implement, but not far better. In most designs

> the pin is not called <device_name>-supply, but something more

> mundane like vdd-supply, vddio-supply, vcc-supply, etc. In the

> case of CPUs, there's probably nothing in the datasheets, so cpu

> vs cpu0 is not too important to distinguish here. But for things

> like a GPU, DSP, video encoder, etc. I doubt it's going to be

> called <device_name>-supply, so making that the norm is

> misguided.


I completely agree with that, but here is the usecase:
- A OPP-user driver doesn't need to call any special OPP API and OPP
  layer can allocate the regulator for it using <device>-name. This
  will make all drivers (that follow this nomenclature in DT) very
  simple and straight-forward.
- But then there are drivers, which need special supply-name. They can
  always call opp-set-regulator API to mention that, no one is
  stopping them from that.

And so I still believe, OPP layer has only this option to do it
generically.

Comments ?

-- 
viresh
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Brown Jan. 13, 2016, 11:15 a.m. UTC | #5
On Wed, Jan 13, 2016 at 11:17:50AM +0530, Viresh Kumar wrote:

> - A OPP-user driver doesn't need to call any special OPP API and OPP

>   layer can allocate the regulator for it using <device>-name. This

>   will make all drivers (that follow this nomenclature in DT) very

>   simple and straight-forward.


Viresh, as we've been through multiple times supplies should always be
requested with the name of the supply on the physical device.  Please
stop trying to create ABIs around whatever Linux internals you're
currently working with, this is getting repetitive.
diff mbox

Patch

diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c
index a6f91da7283e..39df4f1a06d2 100644
--- a/drivers/cpufreq/cpufreq-dt.c
+++ b/drivers/cpufreq/cpufreq-dt.c
@@ -34,6 +34,7 @@  struct private_data {
 	struct regulator *cpu_reg;
 	struct thermal_cooling_device *cdev;
 	unsigned int voltage_tolerance; /* in percentage */
+	const char *reg_name;
 };
 
 static struct freq_attr *cpufreq_dt_attr[] = {
@@ -118,6 +119,22 @@  static int set_target(struct cpufreq_policy *policy, unsigned int index)
 	return ret;
 }
 
+/*
+ * An earlier version of opp-v1 bindings used to name the regulator
+ * "cpu-supply", we still need to handle that for backwards compatibility.
+ */
+static const char *find_supply_name(struct device *dev)
+{
+	struct regulator *cpu_reg;
+
+	cpu_reg = regulator_get_optional(dev, dev_name(dev));
+	if (IS_ERR(cpu_reg))
+		return "cpu";
+
+	regulator_put(cpu_reg);
+	return NULL;
+}
+
 static int allocate_resources(int cpu, struct device **cdev,
 			      struct regulator **creg, struct clk **cclk)
 {
@@ -200,6 +217,7 @@  static int cpufreq_init(struct cpufreq_policy *policy)
 	unsigned long min_uV = ~0, max_uV = 0;
 	unsigned int transition_latency;
 	bool opp_v1 = false;
+	const char *name = NULL;
 	int ret;
 
 	ret = allocate_resources(policy->cpu, &cpu_dev, &cpu_reg, &cpu_clk);
@@ -229,6 +247,25 @@  static int cpufreq_init(struct cpufreq_policy *policy)
 	}
 
 	/*
+	 * OPP layer will be taking care of regulators now, but it needs to know
+	 * the name of the regulator for v1 bindings.
+	 */
+	if (opp_v1) {
+		name = find_supply_name(cpu_dev);
+		if (name) {
+			ret = dev_pm_opp_set_regulator(cpu_dev, name);
+			if (ret) {
+				/*
+				 * Regulators aren't compulsory on few
+				 * platforms, don't error out for them.
+				 */
+				dev_dbg(cpu_dev, "Failed to set regulator for cpu%d: %d\n",
+					policy->cpu, ret);
+			}
+		}
+	}
+
+	/*
 	 * Initialize OPP tables for all policy->cpus. They will be shared by
 	 * all CPUs which have marked their CPUs shared with OPP bindings.
 	 *
@@ -273,6 +310,7 @@  static int cpufreq_init(struct cpufreq_policy *policy)
 		goto out_free_opp;
 	}
 
+	priv->reg_name = name;
 	of_property_read_u32(np, "voltage-tolerance", &priv->voltage_tolerance);
 
 	transition_latency = dev_pm_opp_get_max_clock_latency(cpu_dev);
@@ -366,6 +404,8 @@  static int cpufreq_init(struct cpufreq_policy *policy)
 	kfree(priv);
 out_free_opp:
 	dev_pm_opp_of_cpumask_remove_table(policy->cpus);
+	if (opp_v1)
+		dev_pm_opp_put_regulator(cpu_dev);
 out_node_put:
 	of_node_put(np);
 out_put_reg_clk:
@@ -383,6 +423,9 @@  static int cpufreq_exit(struct cpufreq_policy *policy)
 	cpufreq_cooling_unregister(priv->cdev);
 	dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table);
 	dev_pm_opp_of_cpumask_remove_table(policy->related_cpus);
+	if (priv->reg_name)
+		dev_pm_opp_put_regulator(priv->cpu_dev);
+
 	clk_put(policy->clk);
 	if (!IS_ERR(priv->cpu_reg))
 		regulator_put(priv->cpu_reg);