diff mbox

[V3,1/9] PM / OPP: Reword binding supporting multiple regulators per device

Message ID 20161111031120.GE11670@vireshk-i7
State New
Headers show

Commit Message

Viresh Kumar Nov. 11, 2016, 3:11 a.m. UTC
On 10-11-16, 14:51, Stephen Boyd wrote:
> On 11/10, Viresh Kumar wrote:

> > On 10-11-16, 16:36, Mark Brown wrote:

> > > On Thu, Nov 10, 2016 at 09:34:40AM +0530, Viresh Kumar wrote:

> > > > On 09-11-16, 14:58, Mark Brown wrote:

> > > > > On Wed, Oct 26, 2016 at 12:02:56PM +0530, Viresh Kumar wrote:

> > > 

> > > > > > +  Entries for multiple regulators shall be provided in the same field separated

> > > > > > +  by angular brackets <>. The OPP binding doesn't provide any provisions to

> > > > > > +  relate the values to their power supplies or the order in which the supplies

> > > > > > +  need to be configured.

> > > 

> > > > > I don't understand how this works.  If we have an unordered list of

> > > > > values to set for regulators how will we make sense of them?

> > > 

> > > > The platform driver is responsible to identify the order and pass it on to the

> > > > OPP core. And the platform driver needs to have that hard coded.

> > > 

> > > That *really* should be in the binding.

> > 

> > Okay, how do you suggest doing that? Will a property like supply-names

> > in the OPP table be fine? Like this:

> > 

> > @@ -369,13 +378,16 @@ Example 4: Handling multiple regulators

> >                         compatible = "arm,cortex-a7";

> >                         ...

> >  

> > -                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;

> > +                       vcc0-supply = <&cpu_supply0>;

> > +                       vcc1-supply = <&cpu_supply1>;

> > +                       vcc2-supply = <&cpu_supply2>;

> >                         operating-points-v2 = <&cpu0_opp_table>;

> >                 };

> >         };

> >  

> >         cpu0_opp_table: opp_table0 {

> >                 compatible = "operating-points-v2";

> > +               supply-names = "vcc0", "vcc1", "vcc2";

> >                 opp-shared;

> > 

> 

> No. The supply names (and also clock names/index) should be left

> up to the consumer of the OPP table. We don't want to encode any

> sort of details like this between the OPP table and the consumer

> of it in DT because then it seriously couples the OPP table to

> the consumer device. "The binding" in this case that needs to be

> updated is the consumer binding, to indicate that it correlated

> foo-supply and bar-supply to index 0 and 1 of the OPP table

> voltages.


Are you saying that we shall have a property like this then?



-- 
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

Comments

Rob Herring (Arm) Nov. 15, 2016, 1:59 a.m. UTC | #1
On Fri, Nov 11, 2016 at 08:41:20AM +0530, Viresh Kumar wrote:
> On 10-11-16, 14:51, Stephen Boyd wrote:

> > On 11/10, Viresh Kumar wrote:

> > > On 10-11-16, 16:36, Mark Brown wrote:

> > > > On Thu, Nov 10, 2016 at 09:34:40AM +0530, Viresh Kumar wrote:

> > > > > On 09-11-16, 14:58, Mark Brown wrote:

> > > > > > On Wed, Oct 26, 2016 at 12:02:56PM +0530, Viresh Kumar wrote:

> > > > 

> > > > > > > +  Entries for multiple regulators shall be provided in the same field separated

> > > > > > > +  by angular brackets <>. The OPP binding doesn't provide any provisions to

> > > > > > > +  relate the values to their power supplies or the order in which the supplies

> > > > > > > +  need to be configured.

> > > > 

> > > > > > I don't understand how this works.  If we have an unordered list of

> > > > > > values to set for regulators how will we make sense of them?

> > > > 

> > > > > The platform driver is responsible to identify the order and pass it on to the

> > > > > OPP core. And the platform driver needs to have that hard coded.

> > > > 

> > > > That *really* should be in the binding.

> > > 

> > > Okay, how do you suggest doing that? Will a property like supply-names

> > > in the OPP table be fine? Like this:

> > > 

> > > @@ -369,13 +378,16 @@ Example 4: Handling multiple regulators

> > >                         compatible = "arm,cortex-a7";

> > >                         ...

> > >  

> > > -                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;

> > > +                       vcc0-supply = <&cpu_supply0>;

> > > +                       vcc1-supply = <&cpu_supply1>;

> > > +                       vcc2-supply = <&cpu_supply2>;

> > >                         operating-points-v2 = <&cpu0_opp_table>;

> > >                 };

> > >         };

> > >  

> > >         cpu0_opp_table: opp_table0 {

> > >                 compatible = "operating-points-v2";

> > > +               supply-names = "vcc0", "vcc1", "vcc2";

> > >                 opp-shared;

> > > 

> > 

> > No. The supply names (and also clock names/index) should be left

> > up to the consumer of the OPP table. We don't want to encode any

> > sort of details like this between the OPP table and the consumer

> > of it in DT because then it seriously couples the OPP table to

> > the consumer device. "The binding" in this case that needs to be

> > updated is the consumer binding, to indicate that it correlated

> > foo-supply and bar-supply to index 0 and 1 of the OPP table

> > voltages.

> 

> Are you saying that we shall have a property like this then?

> 

> diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt

> index ee91cbdd95ee..733946df2fb8 100644

> --- a/Documentation/devicetree/bindings/opp/opp.txt

> +++ b/Documentation/devicetree/bindings/opp/opp.txt

> @@ -389,7 +389,10 @@ Example 4: Handling multiple regulators

>                         compatible = "arm,cortex-a7";

>                         ...

>  

> -                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;

> +                       vcc0-supply = <&cpu_supply0>;

> +                       vcc1-supply = <&cpu_supply1>;

> +                       vcc2-supply = <&cpu_supply2>;

> +                       opp-supply-names = "vcc0", "vcc1", "vcc2";


Uh, no. You already have the names in the *-supply properties. Yes, they 
are a PIA to retrieve compared to a *-names property, but that is the 
nature of this style of binding.

Rob
--
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 Nov. 15, 2016, 2:13 a.m. UTC | #2
On 11/14, Rob Herring wrote:
> On Fri, Nov 11, 2016 at 08:41:20AM +0530, Viresh Kumar wrote:

> > On 10-11-16, 14:51, Stephen Boyd wrote:

> > > 

> > > No. The supply names (and also clock names/index) should be left

> > > up to the consumer of the OPP table. We don't want to encode any

> > > sort of details like this between the OPP table and the consumer

> > > of it in DT because then it seriously couples the OPP table to

> > > the consumer device. "The binding" in this case that needs to be

> > > updated is the consumer binding, to indicate that it correlated

> > > foo-supply and bar-supply to index 0 and 1 of the OPP table

> > > voltages.

> > 

> > Are you saying that we shall have a property like this then?

> > 

> > diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt

> > index ee91cbdd95ee..733946df2fb8 100644

> > --- a/Documentation/devicetree/bindings/opp/opp.txt

> > +++ b/Documentation/devicetree/bindings/opp/opp.txt

> > @@ -389,7 +389,10 @@ Example 4: Handling multiple regulators

> >                         compatible = "arm,cortex-a7";

> >                         ...

> >  

> > -                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;

> > +                       vcc0-supply = <&cpu_supply0>;

> > +                       vcc1-supply = <&cpu_supply1>;

> > +                       vcc2-supply = <&cpu_supply2>;

> > +                       opp-supply-names = "vcc0", "vcc1", "vcc2";

> 

> Uh, no. You already have the names in the *-supply properties. Yes, they 

> are a PIA to retrieve compared to a *-names property, but that is the 

> nature of this style of binding.

> 


I think the problem is that Viresh wants the binding to be "self
describing" so that the OPP can be used without a driver knowing
that a supply corresponds to a particular column in the voltage
table. I don't understand that though. Can't we set the supply
names from C code somewhere based on the consumer of the OPPs?
Similar to how we pick the different tables based on fuses?

-- 
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 Nov. 15, 2016, 3:31 a.m. UTC | #3
First of all, thanks to all of you for commenting here. Please
continue doing so as I want to finish this stuff quickly, it has
already killed a lot of time :)

On 14-11-16, 18:13, Stephen Boyd wrote:
> On 11/14, Rob Herring wrote:

> > On Fri, Nov 11, 2016 at 08:41:20AM +0530, Viresh Kumar wrote:

> > > On 10-11-16, 14:51, Stephen Boyd wrote:

> > > > 

> > > > No. The supply names (and also clock names/index) should be left

> > > > up to the consumer of the OPP table. We don't want to encode any

> > > > sort of details like this between the OPP table and the consumer

> > > > of it in DT because then it seriously couples the OPP table to

> > > > the consumer device. "The binding" in this case that needs to be

> > > > updated is the consumer binding, to indicate that it correlated

> > > > foo-supply and bar-supply to index 0 and 1 of the OPP table

> > > > voltages.

> > > 

> > > Are you saying that we shall have a property like this then?

> > > 

> > > diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt

> > > index ee91cbdd95ee..733946df2fb8 100644

> > > --- a/Documentation/devicetree/bindings/opp/opp.txt

> > > +++ b/Documentation/devicetree/bindings/opp/opp.txt

> > > @@ -389,7 +389,10 @@ Example 4: Handling multiple regulators

> > >                         compatible = "arm,cortex-a7";

> > >                         ...

> > >  

> > > -                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;

> > > +                       vcc0-supply = <&cpu_supply0>;

> > > +                       vcc1-supply = <&cpu_supply1>;

> > > +                       vcc2-supply = <&cpu_supply2>;

> > > +                       opp-supply-names = "vcc0", "vcc1", "vcc2";

> > 

> > Uh, no. You already have the names in the *-supply properties. Yes, they 

> > are a PIA to retrieve compared to a *-names property, but that is the 

> > nature of this style of binding.


Its not just PIA, but impossible AFAICT.

There are two important pieces of information we need for multiple
regulator support:
- Which regulator in the consumer node corresponds to which entry in
  the OPP table. As Mark mentioned earlier, DT should be able to get
  us this.
- The order in which the supplies need to be programmed. We have all
  agreed to do this in code instead of inferring it from DT and this
  patch series already does that.

I want to solve the first problem here and I don't see how it can be
solved using such entries:

	cpus {
		cpu@0 {
			compatible = "arm,cortex-a7";
			...

                        vcc0-supply = <&cpu_supply0>;
                        vcc1-supply = <&cpu_supply1>;
                        vcc2-supply = <&cpu_supply2>;
			operating-points-v2 = <&cpu0_opp_table>;
                };
        };

	cpu0_opp_table: opp_table0 {
		compatible = "operating-points-v2";
		opp-shared;

		opp@1000000000 {
			opp-hz = /bits/ 64 <1000000000>;
			opp-microvolt = <970000>, /* Supply 0 */
					<960000>, /* Supply 1 */
					<960000>; /* Supply 2 */
		};
        };

The code can't figure out which of vcc0, vcc1, vcc2 is added first in
the CPU node and so we need to get the order somehow. A separate
binding as I mentioned earlier is a probably (ugly) solution.

> I think the problem is that Viresh wants the binding to be "self

> describing" so that the OPP can be used without a driver knowing

> that a supply corresponds to a particular column in the voltage

> table.


Right, and that's what Mark suggested as well.

> I don't understand that though. Can't we set the supply

> names from C code somewhere based on the consumer of the OPPs?


That's what this patch series is doing right now.

So, are you saying that the way this patchset does it is fine with you
?

-- 
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
Dave Gerlach Nov. 15, 2016, 10:11 p.m. UTC | #4
Hi,
On 11/15/2016 12:56 PM, Stephen Boyd wrote:
> On 11/15, Viresh Kumar wrote:

>> On 14-11-16, 18:13, Stephen Boyd wrote:

>>> On 11/14, Rob Herring wrote:

>>>> On Fri, Nov 11, 2016 at 08:41:20AM +0530, Viresh Kumar wrote:

>>>>> On 10-11-16, 14:51, Stephen Boyd wrote:

>>>>>>

>>>>>> No. The supply names (and also clock names/index) should be left

>>>>>> up to the consumer of the OPP table. We don't want to encode any

>>>>>> sort of details like this between the OPP table and the consumer

>>>>>> of it in DT because then it seriously couples the OPP table to

>>>>>> the consumer device. "The binding" in this case that needs to be

>>>>>> updated is the consumer binding, to indicate that it correlated

>>>>>> foo-supply and bar-supply to index 0 and 1 of the OPP table

>>>>>> voltages.

>>>>>

>>>>> Are you saying that we shall have a property like this then?

>>>>>

>>>>> diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt

>>>>> index ee91cbdd95ee..733946df2fb8 100644

>>>>> --- a/Documentation/devicetree/bindings/opp/opp.txt

>>>>> +++ b/Documentation/devicetree/bindings/opp/opp.txt

>>>>> @@ -389,7 +389,10 @@ Example 4: Handling multiple regulators

>>>>>                         compatible = "arm,cortex-a7";

>>>>>                         ...

>>>>>

>>>>> -                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;

>>>>> +                       vcc0-supply = <&cpu_supply0>;

>>>>> +                       vcc1-supply = <&cpu_supply1>;

>>>>> +                       vcc2-supply = <&cpu_supply2>;

>>>>> +                       opp-supply-names = "vcc0", "vcc1", "vcc2";

>>>>

>>>> Uh, no. You already have the names in the *-supply properties. Yes, they

>>>> are a PIA to retrieve compared to a *-names property, but that is the

>>>> nature of this style of binding.

>>

>> Its not just PIA, but impossible AFAICT.

>>

>> There are two important pieces of information we need for multiple

>> regulator support:

>> - Which regulator in the consumer node corresponds to which entry in

>>   the OPP table. As Mark mentioned earlier, DT should be able to get

>>   us this.

>

> This is also possible from C code though. Or is there some case

> where it isn't possible if we're sharing the same table with two

> devices? I'm lost on when this would ever happen.

>

> It feels like trying to keep the OPP table agnostic of the

> consuming device and the device's binding is more trouble than

> it's worth. Especially considering we have opp-shared and *-name

> now.


I agree with this, I do not like having to pass a list of regulator 
names to the opp core that I *hope* the device I am controlling has 
provided. The intent seems to be to use the cpufreq-dt driver as is and 
not pass any cpu-supply anymore so the cpufreq-dt driver has no 
knowledge of what regulators are present (it operates as it would today 
on a system with no regulator required). But as is it will move forward 
regardless of whether or not we actually intended to provide a multi 
regulator set up or platform set_opp helper, and this probably isn't 
ideal. I would think cpufreq-dt/opp core should be have knowledge of 
what regulators are needed to achieve these opp transitions and make 
sure everything is in place before moving ahead.

>

>> - The order in which the supplies need to be programmed. We have all

>>   agreed to do this in code instead of inferring it from DT and this

>>   patch series already does that.

>

> Agreed. Encoding a sequence into DT doesn't sound very feasible.

> How is this going to be handled though? I don't see any users of

> the code we're reviewing here, so it's hard to grasp how things

> will work. It would be really useful if we had some user of the

> code included in the patch series to get the big picture.


I have sent a patch in reply to the cover letter of this series showing 
the driver that I used to test multi regulator on TI am57x platform and 
wrote as much detail as I could on how I used what Viresh has provided. 
Perhaps that will show how this can be used and help to see what's 
missing from the core implementation here.

Previous discussions drove me to pass regulators and necessary values in 
the DT but do all sequencing from the driver from fixed code without 
inferring anything from the device tree.

Regards,
Dave

>

>>

>> I want to solve the first problem here and I don't see how it can be

>> solved using such entries:

>>

>> 	cpus {

>> 		cpu@0 {

>> 			compatible = "arm,cortex-a7";

>> 			...

>>

>>                         vcc0-supply = <&cpu_supply0>;

>>                         vcc1-supply = <&cpu_supply1>;

>>                         vcc2-supply = <&cpu_supply2>;

>> 			operating-points-v2 = <&cpu0_opp_table>;

>>                 };

>>         };

>>

>> 	cpu0_opp_table: opp_table0 {

>> 		compatible = "operating-points-v2";

>> 		opp-shared;

>>

>> 		opp@1000000000 {

>> 			opp-hz = /bits/ 64 <1000000000>;

>> 			opp-microvolt = <970000>, /* Supply 0 */

>> 					<960000>, /* Supply 1 */

>> 					<960000>; /* Supply 2 */

>> 		};

>>         };

>>

>> The code can't figure out which of vcc0, vcc1, vcc2 is added first in

>> the CPU node and so we need to get the order somehow. A separate

>> binding as I mentioned earlier is a probably (ugly) solution.

>>

>>> I think the problem is that Viresh wants the binding to be "self

>>> describing" so that the OPP can be used without a driver knowing

>>> that a supply corresponds to a particular column in the voltage

>>> table.

>>

>> Right, and that's what Mark suggested as well.

>>

>>> I don't understand that though. Can't we set the supply

>>> names from C code somewhere based on the consumer of the OPPs?

>>

>> That's what this patch series is doing right now.

>>

>> So, are you saying that the way this patchset does it is fine with you

>> ?

>

> That's just to handle the ordering of operations? I need to take

> a minute and understand what's changing. You may have spent

> plenty of time developing/updating, but I haven't spent near

> enough time understanding what's going on in these patches to

> give a thorough review.

>


--
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
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt
index ee91cbdd95ee..733946df2fb8 100644
--- a/Documentation/devicetree/bindings/opp/opp.txt
+++ b/Documentation/devicetree/bindings/opp/opp.txt
@@ -389,7 +389,10 @@  Example 4: Handling multiple regulators
                        compatible = "arm,cortex-a7";
                        ...
 
-                       cpu-supply = <&cpu_supply0>, <&cpu_supply1>, <&cpu_supply2>;
+                       vcc0-supply = <&cpu_supply0>;
+                       vcc1-supply = <&cpu_supply1>;
+                       vcc2-supply = <&cpu_supply2>;
+                       opp-supply-names = "vcc0", "vcc1", "vcc2";
                        operating-points-v2 = <&cpu0_opp_table>;
                };
        };