diff mbox series

[v2,10/14] dt-bindings: power: avs: Add support for CPR (Core Power Reduction)

Message ID 20190725104144.22924-11-niklas.cassel@linaro.org
State New
Headers show
Series [v2,01/14] opp: Add dev_pm_opp_find_level_exact() | expand

Commit Message

Niklas Cassel July 25, 2019, 10:41 a.m. UTC
Add DT bindings to describe the CPR HW found on certain Qualcomm SoCs.

Co-developed-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>

Signed-off-by: Niklas Cassel <niklas.cassel@linaro.org>

Reviewed-by: Rob Herring <robh@kernel.org>

---
Changes since V1:
-Picked up tags.

 .../bindings/power/avs/qcom,cpr.txt           | 193 ++++++++++++++++++
 1 file changed, 193 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/power/avs/qcom,cpr.txt

-- 
2.21.0

Comments

Stephen Boyd Aug. 17, 2019, 6:14 a.m. UTC | #1
Quoting Niklas Cassel (2019-07-25 03:41:38)
> +       cpr@b018000 {

> +               compatible = "qcom,qcs404-cpr", "qcom,cpr";

> +               reg = <0x0b018000 0x1000>;

> +               interrupts = <0 15 IRQ_TYPE_EDGE_RISING>;

> +               clocks = <&xo_board>;

> +               clock-names = "ref";

> +               vdd-apc-supply = <&pms405_s3>;

> +               #power-domain-cells = <0>;

> +               operating-points-v2 = <&cpr_opp_table>;

> +               acc-syscon = <&tcsr>;

> +

> +               nvmem-cells = <&cpr_efuse_quot_offset1>,

> +                       <&cpr_efuse_quot_offset2>,

> +                       <&cpr_efuse_quot_offset3>,

> +                       <&cpr_efuse_init_voltage1>,

> +                       <&cpr_efuse_init_voltage2>,

> +                       <&cpr_efuse_init_voltage3>,

> +                       <&cpr_efuse_quot1>,

> +                       <&cpr_efuse_quot2>,

> +                       <&cpr_efuse_quot3>,

> +                       <&cpr_efuse_ring1>,

> +                       <&cpr_efuse_ring2>,

> +                       <&cpr_efuse_ring3>,

> +                       <&cpr_efuse_revision>;

> +               nvmem-cell-names = "cpr_quotient_offset1",

> +                       "cpr_quotient_offset2",

> +                       "cpr_quotient_offset3",

> +                       "cpr_init_voltage1",

> +                       "cpr_init_voltage2",

> +                       "cpr_init_voltage3",

> +                       "cpr_quotient1",

> +                       "cpr_quotient2",

> +                       "cpr_quotient3",

> +                       "cpr_ring_osc1",

> +                       "cpr_ring_osc2",

> +                       "cpr_ring_osc3",

> +                       "cpr_fuse_revision";

> +

> +               qcom,cpr-timer-delay-us = <5000>;

> +               qcom,cpr-timer-cons-up = <0>;

> +               qcom,cpr-timer-cons-down = <2>;

> +               qcom,cpr-up-threshold = <1>;

> +               qcom,cpr-down-threshold = <3>;

> +               qcom,cpr-idle-clocks = <15>;

> +               qcom,cpr-gcnt-us = <1>;

> +               qcom,vdd-apc-step-up-limit = <1>;

> +               qcom,vdd-apc-step-down-limit = <1>;


Are any of these qcom,* properties going to change for a particular SoC?
They look like SoC config data that should just go into the driver and
change based on the SoC compatible string.
Niklas Cassel Aug. 22, 2019, 10:20 a.m. UTC | #2
On Fri, Aug 16, 2019 at 11:14:13PM -0700, Stephen Boyd wrote:
> Quoting Niklas Cassel (2019-07-25 03:41:38)

> > +       cpr@b018000 {

> > +               compatible = "qcom,qcs404-cpr", "qcom,cpr";

> > +               reg = <0x0b018000 0x1000>;

> > +               interrupts = <0 15 IRQ_TYPE_EDGE_RISING>;

> > +               clocks = <&xo_board>;

> > +               clock-names = "ref";

> > +               vdd-apc-supply = <&pms405_s3>;

> > +               #power-domain-cells = <0>;

> > +               operating-points-v2 = <&cpr_opp_table>;

> > +               acc-syscon = <&tcsr>;

> > +

> > +               nvmem-cells = <&cpr_efuse_quot_offset1>,

> > +                       <&cpr_efuse_quot_offset2>,

> > +                       <&cpr_efuse_quot_offset3>,

> > +                       <&cpr_efuse_init_voltage1>,

> > +                       <&cpr_efuse_init_voltage2>,

> > +                       <&cpr_efuse_init_voltage3>,

> > +                       <&cpr_efuse_quot1>,

> > +                       <&cpr_efuse_quot2>,

> > +                       <&cpr_efuse_quot3>,

> > +                       <&cpr_efuse_ring1>,

> > +                       <&cpr_efuse_ring2>,

> > +                       <&cpr_efuse_ring3>,

> > +                       <&cpr_efuse_revision>;

> > +               nvmem-cell-names = "cpr_quotient_offset1",

> > +                       "cpr_quotient_offset2",

> > +                       "cpr_quotient_offset3",

> > +                       "cpr_init_voltage1",

> > +                       "cpr_init_voltage2",

> > +                       "cpr_init_voltage3",

> > +                       "cpr_quotient1",

> > +                       "cpr_quotient2",

> > +                       "cpr_quotient3",

> > +                       "cpr_ring_osc1",

> > +                       "cpr_ring_osc2",

> > +                       "cpr_ring_osc3",

> > +                       "cpr_fuse_revision";

> > +

> > +               qcom,cpr-timer-delay-us = <5000>;

> > +               qcom,cpr-timer-cons-up = <0>;

> > +               qcom,cpr-timer-cons-down = <2>;

> > +               qcom,cpr-up-threshold = <1>;

> > +               qcom,cpr-down-threshold = <3>;

> > +               qcom,cpr-idle-clocks = <15>;

> > +               qcom,cpr-gcnt-us = <1>;

> > +               qcom,vdd-apc-step-up-limit = <1>;

> > +               qcom,vdd-apc-step-down-limit = <1>;

> 

> Are any of these qcom,* properties going to change for a particular SoC?

> They look like SoC config data that should just go into the driver and

> change based on the SoC compatible string.

> 


Hello Stephen,
thanks a lot for your reviews.

I agree with you, will drop these properties from the dt-binding
and the driver once I respin the series.

I'm hoping to get the cpufreq part of the patch series merged this
merge window, so that the patch pile will decrease.


Kind regards,
Niklas
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/power/avs/qcom,cpr.txt b/Documentation/devicetree/bindings/power/avs/qcom,cpr.txt
new file mode 100644
index 000000000000..93be67fa8f38
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/avs/qcom,cpr.txt
@@ -0,0 +1,193 @@ 
+QCOM CPR (Core Power Reduction)
+
+CPR (Core Power Reduction) is a technology to reduce core power on a CPU
+or other device. Each OPP of a device corresponds to a "corner" that has
+a range of valid voltages for a particular frequency. While the device is
+running at a particular frequency, CPR monitors dynamic factors such as
+temperature, etc. and suggests adjustments to the voltage to save power
+and meet silicon characteristic requirements.
+
+- compatible:
+	Usage: required
+	Value type: <string>
+	Definition: should be "qcom,qcs404-cpr", "qcom,cpr" for qcs404
+
+- reg:
+	Usage: required
+	Value type: <prop-encoded-array>
+	Definition: base address and size of the rbcpr register region
+
+- interrupts:
+	Usage: required
+	Value type: <prop-encoded-array>
+	Definition: should specify the CPR interrupt
+
+- clocks:
+	Usage: required
+	Value type: <prop-encoded-array>
+	Definition: phandle to the reference clock
+
+- clock-names:
+	Usage: required
+	Value type: <stringlist>
+	Definition: must be "ref"
+
+- vdd-apc-supply:
+	Usage: required
+	Value type: <phandle>
+	Definition: phandle to the vdd-apc-supply regulator
+
+- #power-domain-cells:
+	Usage: required
+	Value type: <u32>
+	Definition: should be 0
+
+- operating-points-v2:
+	Usage: required
+	Value type: <phandle>
+	Definition: A phandle to the OPP table containing the
+		    performance states supported by the CPR
+		    power domain
+
+- acc-syscon:
+	Usage: optional
+	Value type: <phandle>
+	Definition: phandle to syscon for writing ACC settings
+
+- nvmem-cells:
+	Usage: required
+	Value type: <phandle>
+	Definition: phandle to nvmem cells containing the data
+		    that makes up a fuse corner, for each fuse corner.
+		    As well as the CPR fuse revision.
+
+- nvmem-cell-names:
+	Usage: required
+	Value type: <stringlist>
+	Definition: should be "cpr_quotient_offset1", "cpr_quotient_offset2",
+		    "cpr_quotient_offset3", "cpr_init_voltage1",
+		    "cpr_init_voltage2", "cpr_init_voltage3", "cpr_quotient1",
+		    "cpr_quotient2", "cpr_quotient3", "cpr_ring_osc1",
+		    "cpr_ring_osc2", "cpr_ring_osc3", "cpr_fuse_revision"
+		    for qcs404.
+
+- qcom,cpr-timer-delay-us:
+	Usage: required
+	Value type: <u32>
+	Definition: delay in uS for the timer interval
+
+- qcom,cpr-timer-cons-up:
+	Usage: required
+	Value type: <u32>
+	Definition: Consecutive number of timer intervals, or units of
+		    qcom,cpr-timer-delay-us, that occur before issuing an up
+		    interrupt
+
+- qcom,cpr-timer-cons-down:
+	Usage: required
+	Value type: <u32>
+	Definition: Consecutive number of timer intervals, or units of
+		    qcom,cpr-timer-delay-us, that occur before issuing a down
+		    interrupt
+
+- qcom,cpr-up-threshold:
+	Usage: optional
+	Value type: <u32>
+	Definition: The threshold for CPR to issue interrupt when error_steps
+		    is greater than it when stepping up
+
+- qcom,cpr-down-threshold:
+	Usage: optional
+	Value type: <u32>
+	Definition: The threshold for CPR to issue interrupt when error_steps
+		    is greater than it when stepping down
+
+- qcom,cpr-idle-clocks:
+	Usage: optional
+	Value type: <u32>
+	Definition: Idle clock cycles ring oscillator can be in
+
+- qcom,cpr-gcnt-us:
+	Usage: required
+	Value type: <u32>
+	Definition: The time for gate count in uS
+
+- qcom,vdd-apc-step-up-limit:
+	Usage: required
+	Value type: <u32>
+	Definition: Limit of number of vdd-apc-supply regulator steps for
+		    scaling up
+
+- qcom,vdd-apc-step-down-limit:
+	Usage: required
+	Value type: <u32>
+	Definition: Limit of number of vdd-apc-supply regulator steps for
+		    scaling down
+
+Example:
+
+	cpr_opp_table: cpr-opp-table {
+		compatible = "operating-points-v2-qcom-level";
+
+		cpr_opp1: opp1 {
+			opp-level = <1>;
+			....
+		};
+		cpr_opp2: opp2 {
+			opp-level = <2>;
+			....
+		};
+		cpr_opp3: opp3 {
+			opp-level = <3>;
+			....
+		};
+	};
+
+	cpr@b018000 {
+		compatible = "qcom,qcs404-cpr", "qcom,cpr";
+		reg = <0x0b018000 0x1000>;
+		interrupts = <0 15 IRQ_TYPE_EDGE_RISING>;
+		clocks = <&xo_board>;
+		clock-names = "ref";
+		vdd-apc-supply = <&pms405_s3>;
+		#power-domain-cells = <0>;
+		operating-points-v2 = <&cpr_opp_table>;
+		acc-syscon = <&tcsr>;
+
+		nvmem-cells = <&cpr_efuse_quot_offset1>,
+			<&cpr_efuse_quot_offset2>,
+			<&cpr_efuse_quot_offset3>,
+			<&cpr_efuse_init_voltage1>,
+			<&cpr_efuse_init_voltage2>,
+			<&cpr_efuse_init_voltage3>,
+			<&cpr_efuse_quot1>,
+			<&cpr_efuse_quot2>,
+			<&cpr_efuse_quot3>,
+			<&cpr_efuse_ring1>,
+			<&cpr_efuse_ring2>,
+			<&cpr_efuse_ring3>,
+			<&cpr_efuse_revision>;
+		nvmem-cell-names = "cpr_quotient_offset1",
+			"cpr_quotient_offset2",
+			"cpr_quotient_offset3",
+			"cpr_init_voltage1",
+			"cpr_init_voltage2",
+			"cpr_init_voltage3",
+			"cpr_quotient1",
+			"cpr_quotient2",
+			"cpr_quotient3",
+			"cpr_ring_osc1",
+			"cpr_ring_osc2",
+			"cpr_ring_osc3",
+			"cpr_fuse_revision";
+
+		qcom,cpr-timer-delay-us = <5000>;
+		qcom,cpr-timer-cons-up = <0>;
+		qcom,cpr-timer-cons-down = <2>;
+		qcom,cpr-up-threshold = <1>;
+		qcom,cpr-down-threshold = <3>;
+		qcom,cpr-idle-clocks = <15>;
+		qcom,cpr-gcnt-us = <1>;
+		qcom,vdd-apc-step-up-limit = <1>;
+		qcom,vdd-apc-step-down-limit = <1>;
+	};