msm: lpm: Remove enums in the device tree
Add pxo, l2 and sleep modes enum to string mapping. Add functional
interface to get enum values all resource types, sleep modes.
Change-Id: I8200b17863fe20bc327f42c28549d505616ab6a9
Signed-off-by: Archana Sathyakumar <asathyak@codeaurora.org>
diff --git a/Documentation/devicetree/bindings/arm/msm/lpm-levels.txt b/Documentation/devicetree/bindings/arm/msm/lpm-levels.txt
index 6d22003..195a98d 100644
--- a/Documentation/devicetree/bindings/arm/msm/lpm-levels.txt
+++ b/Documentation/devicetree/bindings/arm/msm/lpm-levels.txt
@@ -8,17 +8,24 @@
lpm-level. The units for voltage are dependent on the PMIC used on the target
and are in uV.
-The optional properties are:
-
-- qcom,use-qtimer: Indicates whether the target uses the synchronized QTimer.
-
The required nodes for lpm-levels are:
- compatible: "qcom,lpm-levels"
- reg: The numeric level id
-- qcom,mode: The sleep mode of the processor
-- qcom,xo: The state of XO clock.
-- qcom,l2: The state of L2 cache.
+- qcom,mode: The sleep mode of the processor, values for the property are:
+ "wfi" - Wait for Interrupt
+ "ramp_down_and_wfi" - Ramp down and wait for interrupt
+ "standalone_pc" - Standalone power collapse
+ "pc" - Power Collapse
+ "retention" - Retention
+ "pc_suspend" - Suspended Power Collapse
+ "pc_no_xo_shutdown" - Power Collapse with no XO shutdown
+- qcom,xo: The state of XO clock. Values are "xo_on" and "xo_off"
+- qcom,l2: The state of L2 cache. Values are:
+ "l2_cache_pc" - L2 cache in power collapse
+ "l2_cache_retenetion" - L2 cache in retention
+ "l2_cache_gdhs" - L2 cache in GDHS
+ "l2_cache_active" - L2 cache in active mode
- qcom,vdd-mem-upper-bound: The upper bound value of mem voltage in uV
- qcom,vdd-mem-lower-bound: The lower bound value of mem voltage in uV
- qcom,vdd-dig-upper-bound: The upper bound value of dig voltage in uV
@@ -41,6 +48,7 @@
- qcom,gpio-detectable: The field indicates whether the GPIOs can be detected
by the GPIO interrupt controller during a given low
power mode.
+- qcom,use-qtimer: Indicates whether the target uses the synchronized QTimer.
Example:
@@ -48,9 +56,9 @@
qcom,use-qtimer;
qcom,lpm-level@0 {
reg = <0>;
- qcom,mode = <0>; /* MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "wfi";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
diff --git a/Documentation/devicetree/bindings/arm/msm/lpm-resources.txt b/Documentation/devicetree/bindings/arm/msm/lpm-resources.txt
index ccb3465..7b5fda3 100644
--- a/Documentation/devicetree/bindings/arm/msm/lpm-resources.txt
+++ b/Documentation/devicetree/bindings/arm/msm/lpm-resources.txt
@@ -20,10 +20,9 @@
- reg: The numeric level id
- qcom,name: The name of the low power resource represented
as a string.
-- qcom,resource-type: The type of the LPM resource.
- MSM_LPM_RPM_RS_TYPE = 0
- MSM_LPM_LOCAL_RS_TYPE = 1
-- qcom,init-value: Initialization value of the LPM resource.
+- qcom,init-value: Initialization value of the LPM resource represented as
+ decimal value for vdd-dig and vdd-mem resources and
+ as string for pxo and l2 resources.
Optional Nodes:
@@ -33,12 +32,13 @@
- qcom,id: The id representing a device within a resource type.
- qcom,key: The key is the specific attribute of the resource being
monitored represented as a hex value.
+- qcom,local-resource-type: The property exists only for locally managed
+ resource and is represented as a bool.
Example:
qcom,lpm-resources@0 {
reg = <0x0>;
qcom,name = "vdd-dig";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x02>;
qcom,key = <0x6e726f63>; /* "corn" */
diff --git a/arch/arm/boot/dts/msm8226-pm.dtsi b/arch/arm/boot/dts/msm8226-pm.dtsi
index 6348f5a..b510f13 100644
--- a/arch/arm/boot/dts/msm8226-pm.dtsi
+++ b/arch/arm/boot/dts/msm8226-pm.dtsi
@@ -114,7 +114,6 @@
qcom,lpm-resources@0 {
reg = <0x0>;
qcom,name = "vdd-dig";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x02>;
qcom,key = <0x6e726f63>; /* "corn" */
@@ -124,7 +123,6 @@
qcom,lpm-resources@1 {
reg = <0x1>;
qcom,name = "vdd-mem";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x01>;
qcom,key = <0x7675>; /* "uv" */
@@ -134,18 +132,17 @@
qcom,lpm-resources@2 {
reg = <0x2>;
qcom,name = "pxo";
- qcom,resource-type = <0>;
qcom,type = <0x306b6c63>; /* "clk0" */
qcom,id = <0x00>;
qcom,key = <0x62616e45>; /* "Enab" */
- qcom,init-value = <1>; /* On */
+ qcom,init-value = "xo_on";
};
qcom,lpm-resources@3 {
reg = <0x3>;
qcom,name = "l2";
- qcom,resource-type = <1>;
- qcom,init-value = <2>; /* Retention */
+ qcom,local-resource-type;
+ qcom,init-value = "l2_cache_retention";
};
};
@@ -156,9 +153,9 @@
qcom,lpm-level@0 {
reg = <0x0>;
- qcom,mode = <0>; /* MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "wfi";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -171,9 +168,9 @@
qcom,lpm-level@1 {
reg = <0x1>;
- qcom,mode = <4>; /* MSM_PM_SLEEP_MODE_RETENTION*/
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "retention";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -187,9 +184,9 @@
qcom,lpm-level@2 {
reg = <0x2>;
- qcom,mode = <2>; /* MSM_PM_SLEEP_MODE_STANDALONE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "standalone_pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -202,9 +199,9 @@
qcom,lpm-level@3 {
reg = <0x3>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -217,9 +214,9 @@
qcom,lpm-level@4 {
reg = <0x4>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* ACTIVE */
qcom,vdd-mem-lower-bound = <750000>; /* RETENTION HIGH */
qcom,vdd-dig-upper-bound = <3>; /* ACTIVE */
@@ -232,9 +229,9 @@
qcom,lpm-level@5 {
reg = <0x5>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -247,9 +244,9 @@
qcom,lpm-level@6 {
reg = <0x6>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -262,9 +259,9 @@
qcom,lpm-level@7 {
reg = <0x7>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* ACTIVE */
qcom,vdd-mem-lower-bound = <750000>; /* RETENTION HIGH */
qcom,vdd-dig-upper-bound = <3>; /* ACTIVE */
@@ -277,9 +274,9 @@
qcom,lpm-level@8 {
reg = <0x8>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <750000>; /* RETENTION HIGH */
qcom,vdd-mem-lower-bound = <750000>; /* RETENTION LOW */
qcom,vdd-dig-upper-bound = <2>; /* RETENTION HIGH */
diff --git a/arch/arm/boot/dts/msm8610-pm.dtsi b/arch/arm/boot/dts/msm8610-pm.dtsi
index feb3087..f4f23da 100644
--- a/arch/arm/boot/dts/msm8610-pm.dtsi
+++ b/arch/arm/boot/dts/msm8610-pm.dtsi
@@ -114,7 +114,6 @@
qcom,lpm-resources@0 {
reg = <0x0>;
qcom,name = "vdd-dig";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x02>;
qcom,key = <0x6e726f63>; /* "corn" */
@@ -124,7 +123,6 @@
qcom,lpm-resources@1 {
reg = <0x1>;
qcom,name = "vdd-mem";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x01>;
qcom,key = <0x7675>; /* "uv" */
@@ -134,18 +132,17 @@
qcom,lpm-resources@2 {
reg = <0x2>;
qcom,name = "pxo";
- qcom,resource-type = <0>;
qcom,type = <0x306b6c63>; /* "clk0" */
qcom,id = <0x00>;
qcom,key = <0x62616e45>; /* "Enab" */
- qcom,init-value = <1>; /* On */
+ qcom,init-value = "xo_on";
};
qcom,lpm-resources@3 {
reg = <0x3>;
qcom,name = "l2";
- qcom,resource-type = <1>;
- qcom,init-value = <2>; /* Retention */
+ qcom,local-resource-type;
+ qcom,init-value = "l2_cache_retention";
};
};
@@ -156,9 +153,9 @@
qcom,lpm-level@0 {
reg = <0x0>;
- qcom,mode = <0>; /* MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "wfi";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -171,9 +168,9 @@
qcom,lpm-level@1 {
reg = <0x1>;
- qcom,mode = <4>; /* MSM_PM_SLEEP_MODE_RETENTION*/
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "retention";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -187,9 +184,9 @@
qcom,lpm-level@2 {
reg = <0x2>;
- qcom,mode = <2>; /* MSM_PM_SLEEP_MODE_STANDALONE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "standalone_pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -202,9 +199,9 @@
qcom,lpm-level@3 {
reg = <0x3>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -217,9 +214,9 @@
qcom,lpm-level@4 {
reg = <0x4>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* ACTIVE */
qcom,vdd-mem-lower-bound = <750000>; /* RETENTION HIGH */
qcom,vdd-dig-upper-bound = <3>; /* ACTIVE */
@@ -232,9 +229,9 @@
qcom,lpm-level@5 {
reg = <0x5>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -247,9 +244,9 @@
qcom,lpm-level@6 {
reg = <0x6>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1150000>; /* MAX */
qcom,vdd-mem-lower-bound = <1050000>; /* ACTIVE */
qcom,vdd-dig-upper-bound = <5>; /* MAX */
@@ -262,9 +259,9 @@
qcom,lpm-level@7 {
reg = <0x7>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* ACTIVE */
qcom,vdd-mem-lower-bound = <750000>; /* RETENTION HIGH */
qcom,vdd-dig-upper-bound = <3>; /* ACTIVE */
@@ -277,9 +274,9 @@
qcom,lpm-level@8 {
reg = <0x8>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <750000>; /* RETENTION HIGH */
qcom,vdd-mem-lower-bound = <750000>; /* RETENTION LOW */
qcom,vdd-dig-upper-bound = <2>; /* RETENTION HIGH */
diff --git a/arch/arm/boot/dts/msm8974-v1-pm.dtsi b/arch/arm/boot/dts/msm8974-v1-pm.dtsi
index 2de5fad..dc87ccb 100644
--- a/arch/arm/boot/dts/msm8974-v1-pm.dtsi
+++ b/arch/arm/boot/dts/msm8974-v1-pm.dtsi
@@ -139,7 +139,6 @@
qcom,lpm-resources@0 {
reg = <0x0>;
qcom,name = "vdd-dig";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x02>;
qcom,key = <0x6e726f63>; /* "corn" */
@@ -149,7 +148,6 @@
qcom,lpm-resources@1 {
reg = <0x1>;
qcom,name = "vdd-mem";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x01>;
qcom,key = <0x7675>; /* "uv" */
@@ -159,18 +157,17 @@
qcom,lpm-resources@2 {
reg = <0x2>;
qcom,name = "pxo";
- qcom,resource-type = <0>;
qcom,type = <0x306b6c63>; /* "clk0" */
qcom,id = <0x00>;
qcom,key = <0x62616e45>; /* "Enab" */
- qcom,init-value = <1>; /* On */
+ qcom,init-value = "xo_on";
};
qcom,lpm-resources@3 {
reg = <0x3>;
qcom,name = "l2";
- qcom,resource-type = <1>;
- qcom,init-value = <2>; /* Retention */
+ qcom,local-resource-type;
+ qcom,init-value = "l2_cache_retention";
};
};
@@ -183,9 +180,9 @@
qcom,lpm-level@0 {
reg = <0x0>;
- qcom,mode = <0>; /* MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "wfi";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -200,9 +197,9 @@
qcom,lpm-level@1 {
reg = <0x1>;
- qcom,mode = <4>; /* MSM_PM_SLEEP_MODE_RETENTION*/
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "retention";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -218,9 +215,9 @@
qcom,lpm-level@2 {
reg = <0x2>;
- qcom,mode = <2>; /* MSM_PM_SLEEP_MODE_STANDALONE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "standalone_pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -235,9 +232,9 @@
qcom,lpm-level@3 {
reg = <0x3>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -252,9 +249,9 @@
qcom,lpm-level@4 {
reg = <0x4>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* SVS SOC */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -269,9 +266,9 @@
qcom,lpm-level@5 {
reg = <0x5>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -284,9 +281,9 @@
qcom,lpm-level@6 {
reg = <0x6>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -299,9 +296,9 @@
qcom,lpm-level@7 {
reg = <0x7>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode= "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <950000>; /* NORMAL */
qcom,vdd-mem-lower-bound = <950000>; /* SVS SOC */
qcom,vdd-dig-upper-bound = <4>; /* NORMAL */
@@ -314,9 +311,9 @@
qcom,lpm-level@8 {
reg = <0x8>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode= "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <950000>; /* SVS SOC */
qcom,vdd-mem-lower-bound = <675000>; /* RETENTION */
qcom,vdd-dig-upper-bound = <3>; /* SVS SOC */
diff --git a/arch/arm/boot/dts/msm8974-v2-pm.dtsi b/arch/arm/boot/dts/msm8974-v2-pm.dtsi
index 39268a0..c26f21d 100644
--- a/arch/arm/boot/dts/msm8974-v2-pm.dtsi
+++ b/arch/arm/boot/dts/msm8974-v2-pm.dtsi
@@ -136,7 +136,6 @@
qcom,lpm-resources@0 {
reg = <0x0>;
qcom,name = "vdd-dig";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x02>;
qcom,key = <0x6e726f63>; /* "corn" */
@@ -146,7 +145,6 @@
qcom,lpm-resources@1 {
reg = <0x1>;
qcom,name = "vdd-mem";
- qcom,resource-type = <0>;
qcom,type = <0x62706d73>; /* "smpb" */
qcom,id = <0x01>;
qcom,key = <0x7675>; /* "uv" */
@@ -156,18 +154,17 @@
qcom,lpm-resources@2 {
reg = <0x2>;
qcom,name = "pxo";
- qcom,resource-type = <0>;
qcom,type = <0x306b6c63>; /* "clk0" */
qcom,id = <0x00>;
qcom,key = <0x62616e45>; /* "Enab" */
- qcom,init-value = <1>; /* On */
+ qcom,init-value = "xo_on";
};
qcom,lpm-resources@3 {
reg = <0x3>;
qcom,name = "l2";
- qcom,resource-type = <1>;
- qcom,init-value = <2>; /* Retention */
+ qcom,local-resource-type;
+ qcom,init-value = "l2_cache_retention";
};
};
@@ -180,9 +177,9 @@
qcom,lpm-level@0 {
reg = <0x0>;
- qcom,mode = <0>; /* MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "wfi";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -197,9 +194,9 @@
qcom,lpm-level@1 {
reg = <0x1>;
- qcom,mode = <4>; /* MSM_PM_SLEEP_MODE_RETENTION*/
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "retention";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -215,9 +212,9 @@
qcom,lpm-level@2 {
reg = <0x2>;
- qcom,mode = <2>; /* MSM_PM_SLEEP_MODE_STANDALONE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "standalone_pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -232,9 +229,9 @@
qcom,lpm-level@3 {
reg = <0x3>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -249,9 +246,9 @@
qcom,lpm-level@4 {
reg = <0x4>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* SVS SOC */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -266,9 +263,9 @@
qcom,lpm-level@5 {
reg = <0x5>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -281,9 +278,9 @@
qcom,lpm-level@6 {
reg = <0x6>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -296,9 +293,9 @@
qcom,lpm-level@7 {
reg = <0x7>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode= "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <950000>; /* NORMAL */
qcom,vdd-mem-lower-bound = <950000>; /* SVS SOC */
qcom,vdd-dig-upper-bound = <4>; /* NORMAL */
@@ -311,9 +308,9 @@
qcom,lpm-level@8 {
reg = <0x8>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode= "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <950000>; /* SVS SOC */
qcom,vdd-mem-lower-bound = <675000>; /* RETENTION */
qcom,vdd-dig-upper-bound = <3>; /* SVS SOC */
diff --git a/arch/arm/boot/dts/msm9625-pm.dtsi b/arch/arm/boot/dts/msm9625-pm.dtsi
index e881977..ca3f486 100644
--- a/arch/arm/boot/dts/msm9625-pm.dtsi
+++ b/arch/arm/boot/dts/msm9625-pm.dtsi
@@ -38,7 +38,6 @@
qcom,lpm-resources@0 {
reg = <0x0>;
qcom,name = "vdd-dig";
- qcom,resource-type = <0>;
qcom,type = <0x616F646C>; /* "ldoa" */
qcom,id = <0x0A>;
qcom,key = <0x6e726f63>; /* "corn" */
@@ -48,7 +47,6 @@
qcom,lpm-resources@1 {
reg = <0x1>;
qcom,name = "vdd-mem";
- qcom,resource-type = <0>;
qcom,type = <0x616F646C>; /* "ldoa" */
qcom,id = <0x0C>;
qcom,key = <0x7675>; /* "uv" */
@@ -58,11 +56,10 @@
qcom,lpm-resources@2 {
reg = <0x2>;
qcom,name = "pxo";
- qcom,resource-type = <0>;
qcom,type = <0x306b6c63>; /* "clk0" */
qcom,id = <0x00>;
qcom,key = <0x62616e45>; /* "Enab" */
- qcom,init-value = <1>; /* On */
+ qcom,init-value = "xo_on";
};
};
@@ -75,9 +72,9 @@
qcom,lpm-level@0 {
reg = <0x0>;
- qcom,mode = <0>; /* MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "wfi";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -92,9 +89,9 @@
qcom,lpm-level@1 {
reg = <0x1>;
- qcom,mode = <2>; /* MSM_PM_SLEEP_MODE_STANDALONE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <3>; /* ACTIVE */
+ qcom,mode = "standalone_pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_active";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -109,9 +106,9 @@
qcom,lpm-level@2 {
reg = <0x2>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <1>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_gdhs";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -126,9 +123,9 @@
qcom,lpm-level@3 {
reg = <0x3>;
- qcom,mode = <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <1>; /* ON */
- qcom,l2 = <0>; /* GDHS */
+ qcom,mode = "pc";
+ qcom,xo = "xo_on";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* SVS SOC */
qcom,vdd-dig-upper-bound = <4>; /* NORMAL */
@@ -143,9 +140,9 @@
qcom,lpm-level@4 {
reg = <0x4>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* NORMAL */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -159,9 +156,9 @@
qcom,lpm-level@5 {
reg = <0x5>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <1050000>; /* SUPER TURBO */
qcom,vdd-mem-lower-bound = <950000>; /* SVS SOC */
qcom,vdd-dig-upper-bound = <6>; /* SUPER TURBO */
@@ -175,9 +172,9 @@
qcom,lpm-level@6 {
reg = <0x6>;
- qcom,mode= <3>; /* MSM_PM_SLEEP_MODE_POWER_COLLAPSE */
- qcom,xo = <0>; /* OFF */
- qcom,l2 = <0>; /* OFF */
+ qcom,mode = "pc";
+ qcom,xo = "xo_off";
+ qcom,l2 = "l2_cache_pc";
qcom,vdd-mem-upper-bound = <950000>; /* SVS SOC */
qcom,vdd-mem-lower-bound = <675000>; /* RETENTION */
qcom,vdd-dig-upper-bound = <3>; /* SVS SOC */
diff --git a/arch/arm/mach-msm/lpm_levels.c b/arch/arm/mach-msm/lpm_levels.c
index 8194721..aa33f2c 100644
--- a/arch/arm/mach-msm/lpm_levels.c
+++ b/arch/arm/mach-msm/lpm_levels.c
@@ -28,6 +28,8 @@
MSM_LPM_LVL_DBG_IDLE_LIMITS = BIT(1),
};
+#define MAX_STR_LEN 30
+
static int msm_lpm_lvl_dbg_msk;
module_param_named(
@@ -41,6 +43,48 @@
static DEFINE_PER_CPU(int , lpm_permitted_level);
static DEFINE_PER_CPU(struct atomic_notifier_head, lpm_notify_head);
+static int msm_pm_get_sleep_mode_value(struct device_node *node,
+ const char *key, uint32_t *sleep_mode_val)
+{
+ int i;
+ struct lpm_lookup_table {
+ uint32_t modes;
+ const char *mode_name;
+ };
+ struct lpm_lookup_table pm_sm_lookup[] = {
+ {MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT,
+ "wfi"},
+ {MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT,
+ "ramp_down_and_wfi"},
+ {MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE,
+ "standalone_pc"},
+ {MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
+ "pc"},
+ {MSM_PM_SLEEP_MODE_RETENTION,
+ "retention"},
+ {MSM_PM_SLEEP_MODE_POWER_COLLAPSE_SUSPEND,
+ "pc_suspend"},
+ {MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN,
+ "pc_no_xo_shutdown"}
+ };
+ int ret;
+ const char *mode_name;
+
+ ret = of_property_read_string(node, key, &mode_name);
+ if (!ret) {
+ ret = -EINVAL;
+ for (i = 0; i < ARRAY_SIZE(pm_sm_lookup); i++) {
+ if (!strncmp(mode_name, pm_sm_lookup[i].mode_name,
+ MAX_STR_LEN)) {
+ *sleep_mode_val = pm_sm_lookup[i].modes;
+ ret = 0;
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
static void msm_lpm_level_update(void)
{
unsigned int lpm_level;
@@ -343,19 +387,19 @@
level->available = false;
key = "qcom,mode";
- ret = of_property_read_u32(node, key, &val);
+ ret = msm_pm_get_sleep_mode_value(node, key, &val);
if (ret)
goto fail;
level->sleep_mode = val;
key = "qcom,xo";
- ret = of_property_read_u32(node, key, &val);
+ ret = msm_lpm_get_xo_value(node, key, &val);
if (ret)
goto fail;
level->rs_limits.pxo = val;
key = "qcom,l2";
- ret = of_property_read_u32(node, key, &val);
+ ret = msm_lpm_get_l2_cache_value(node, key, &val);
if (ret)
goto fail;
level->rs_limits.l2_cache = val;
diff --git a/arch/arm/mach-msm/lpm_resources.c b/arch/arm/mach-msm/lpm_resources.c
index 60184b4..f0e5ebd 100644
--- a/arch/arm/mach-msm/lpm_resources.c
+++ b/arch/arm/mach-msm/lpm_resources.c
@@ -51,29 +51,39 @@
#define MAX_RS_SIZE (4)
#define IS_RPM_CTL(rs) \
(!strncmp(rs->name, "rpm_ctl", MAX_RS_NAME))
+#define MAX_STR_LEN 30
static bool msm_lpm_beyond_limits_vdd_dig(struct msm_rpmrs_limits *limits);
static void msm_lpm_aggregate_vdd_dig(struct msm_rpmrs_limits *limits);
static void msm_lpm_flush_vdd_dig(int notify_rpm);
static void msm_lpm_notify_vdd_dig(struct msm_rpm_notifier_data
*rpm_notifier_cb);
+static int msm_lpm_init_value_vdd_dig(struct device_node *node,
+ char *key, uint32_t *default_value);
static bool msm_lpm_beyond_limits_vdd_mem(struct msm_rpmrs_limits *limits);
static void msm_lpm_aggregate_vdd_mem(struct msm_rpmrs_limits *limits);
static void msm_lpm_flush_vdd_mem(int notify_rpm);
static void msm_lpm_notify_vdd_mem(struct msm_rpm_notifier_data
*rpm_notifier_cb);
+static int msm_lpm_init_value_vdd_mem(struct device_node *node,
+ char *key, uint32_t *default_value);
+
static bool msm_lpm_beyond_limits_pxo(struct msm_rpmrs_limits *limits);
static void msm_lpm_aggregate_pxo(struct msm_rpmrs_limits *limits);
static void msm_lpm_flush_pxo(int notify_rpm);
static void msm_lpm_notify_pxo(struct msm_rpm_notifier_data
*rpm_notifier_cb);
+static int msm_lpm_init_value_pxo(struct device_node *node,
+ char *key, uint32_t *default_value);
static bool msm_lpm_beyond_limits_l2(struct msm_rpmrs_limits *limits);
static void msm_lpm_flush_l2(int notify_rpm);
static void msm_lpm_aggregate_l2(struct msm_rpmrs_limits *limits);
+static int msm_lpm_init_value_l2(struct device_node *node,
+ char *key, uint32_t *default_value);
static void msm_lpm_flush_rpm_ctl(int notify_rpm);
@@ -127,8 +137,14 @@
void (*flush)(int notify_rpm);
void (*notify)(struct msm_rpm_notifier_data *rpm_notifier_cb);
struct kobj_attribute ko_attr;
+ int (*init_value)(struct device_node *node,
+ char *key, uint32_t *default_value);
};
+struct lpm_lookup_table {
+ uint32_t modes;
+ const char *mode_name;
+};
static struct msm_lpm_resource msm_lpm_l2 = {
.name = "l2",
@@ -138,6 +154,7 @@
.notify = NULL,
.valid = false,
.ko_attr = RPMRS_ATTR(l2),
+ .init_value = msm_lpm_init_value_l2,
};
static struct msm_lpm_resource msm_lpm_vdd_dig = {
@@ -148,6 +165,7 @@
.notify = msm_lpm_notify_vdd_dig,
.valid = false,
.ko_attr = RPMRS_ATTR(vdd_dig),
+ .init_value = msm_lpm_init_value_vdd_dig,
};
static struct msm_lpm_resource msm_lpm_vdd_mem = {
@@ -158,6 +176,7 @@
.notify = msm_lpm_notify_vdd_mem,
.valid = false,
.ko_attr = RPMRS_ATTR(vdd_mem),
+ .init_value = msm_lpm_init_value_vdd_mem,
};
static struct msm_lpm_resource msm_lpm_pxo = {
@@ -168,6 +187,7 @@
.notify = msm_lpm_notify_pxo,
.valid = false,
.ko_attr = RPMRS_ATTR(pxo),
+ .init_value = msm_lpm_init_value_pxo,
};
static struct msm_lpm_resource *msm_lpm_resources[] = {
@@ -444,6 +464,12 @@
__func__, lpm);
}
+static int msm_lpm_init_value_l2(struct device_node *node,
+ char *key, uint32_t *default_value)
+{
+ return msm_lpm_get_l2_cache_value(node, key, default_value);
+}
+
static void msm_lpm_flush_l2(int notify_rpm)
{
struct msm_lpm_resource *rs = &msm_lpm_l2;
@@ -451,6 +477,34 @@
msm_lpm_set_l2_mode(rs->sleep_value, notify_rpm);
}
+int msm_lpm_get_l2_cache_value(struct device_node *node,
+ char *key, uint32_t *l2_val)
+{
+ int i;
+ struct lpm_lookup_table l2_mode_lookup[] = {
+ {MSM_LPM_L2_CACHE_HSFS_OPEN, "l2_cache_pc"},
+ {MSM_LPM_L2_CACHE_GDHS, "l2_cache_gdhs"},
+ {MSM_LPM_L2_CACHE_RETENTION, "l2_cache_retention"},
+ {MSM_LPM_L2_CACHE_ACTIVE, "l2_cache_active"}
+ };
+ const char *l2_str;
+ int ret;
+
+ ret = of_property_read_string(node, key, &l2_str);
+ if (!ret) {
+ ret = -EINVAL;
+ for (i = 0; i < ARRAY_SIZE(l2_mode_lookup); i++) {
+ if (!strncmp(l2_str, l2_mode_lookup[i].mode_name,
+ MAX_STR_LEN)) {
+ *l2_val = l2_mode_lookup[i].modes;
+ ret = 0;
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
/* RPM CTL */
static void msm_lpm_flush_rpm_ctl(int notify_rpm)
{
@@ -484,6 +538,12 @@
return ret;
}
+static int msm_lpm_init_value_vdd_dig(struct device_node *node,
+ char *key, uint32_t *default_value)
+{
+ return of_property_read_u32(node, key, default_value);
+}
+
static void msm_lpm_aggregate_vdd_dig(struct msm_rpmrs_limits *limits)
{
struct msm_lpm_resource *rs = &msm_lpm_vdd_dig;
@@ -570,6 +630,12 @@
msm_lpm_notify_common(rpm_notifier_cb, rs);
}
+static int msm_lpm_init_value_vdd_mem(struct device_node *node,
+ char *key, uint32_t *default_value)
+{
+ return of_property_read_u32(node, key, default_value);
+}
+
/*PXO*/
static bool msm_lpm_beyond_limits_pxo(struct msm_rpmrs_limits *limits)
{
@@ -628,11 +694,43 @@
msm_lpm_notify_common(rpm_notifier_cb, rs);
}
+static int msm_lpm_init_value_pxo(struct device_node *node,
+ char *key, uint32_t *default_value)
+{
+ return msm_lpm_get_xo_value(node, key, default_value);
+}
+
static inline bool msm_lpm_use_mpm(struct msm_rpmrs_limits *limits)
{
return (limits->pxo == MSM_LPM_PXO_OFF);
}
+int msm_lpm_get_xo_value(struct device_node *node,
+ char *key, uint32_t *xo_val)
+{
+ int i;
+ struct lpm_lookup_table pxo_mode_lookup[] = {
+ {MSM_LPM_PXO_OFF, "xo_off"},
+ {MSM_LPM_PXO_ON, "xo_on"}
+ };
+ const char *xo_str;
+ int ret;
+
+ ret = of_property_read_string(node, key, &xo_str);
+ if (!ret) {
+ ret = -EINVAL;
+ for (i = 0; i < ARRAY_SIZE(pxo_mode_lookup); i++) {
+ if (!strncmp(xo_str, pxo_mode_lookup[i].mode_name,
+ MAX_STR_LEN)) {
+ *xo_val = pxo_mode_lookup[i].modes;
+ ret = 0;
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
/* LPM levels interface */
bool msm_lpm_level_beyond_limit(struct msm_rpmrs_limits *limits)
{
@@ -797,7 +895,7 @@
struct msm_lpm_resource *rs = NULL;
const char *val;
int i;
- uint32_t resource_type;
+ bool local_resource;
key = "qcom,name";
ret = of_property_read_string(node, key, &val);
@@ -822,8 +920,7 @@
}
key = "qcom,init-value";
- ret = of_property_read_u32(node, key,
- &rs->rs_data.default_value);
+ ret = rs->init_value(node, key, &rs->rs_data.default_value);
if (ret) {
pr_err("%s():Failed to read %s\n", __func__, key);
goto fail;
@@ -831,18 +928,13 @@
rs->rs_data.value = rs->rs_data.default_value;
- key = "qcom,resource-type";
- ret = of_property_read_u32(node, key, &resource_type);
- if (ret) {
- pr_err("Failed to read resource-type\n");
- goto fail;
- }
+ key = "qcom,local-resource-type";
+ local_resource = of_property_read_bool(node, key);
- switch (resource_type) {
- case MSM_LPM_RPM_RS_TYPE:
+ if (!local_resource) {
key = "qcom,type";
ret = of_property_read_u32(node, key,
- &rs->rs_data.type);
+ &rs->rs_data.type);
if (ret) {
pr_err("Failed to read type\n");
goto fail;
@@ -873,15 +965,9 @@
goto fail;
}
/* fall through */
-
- case MSM_LPM_LOCAL_RS_TYPE:
- rs->valid = true;
- break;
- default:
- pr_err("%s: Invalid resource type %d", __func__,
- resource_type);
- goto fail;
}
+
+ rs->valid = true;
}
msm_rpm_register_notifier(&msm_lpm_rpm_nblk);
msm_lpm_init_rpm_ctl();
diff --git a/arch/arm/mach-msm/lpm_resources.h b/arch/arm/mach-msm/lpm_resources.h
index 1a2d72d..105cfe6 100644
--- a/arch/arm/mach-msm/lpm_resources.h
+++ b/arch/arm/mach-msm/lpm_resources.h
@@ -17,15 +17,15 @@
#include "test-lpm.h"
enum {
- MSM_LPM_PXO_OFF = 0,
- MSM_LPM_PXO_ON = 1,
+ MSM_LPM_PXO_OFF,
+ MSM_LPM_PXO_ON
};
enum {
- MSM_LPM_L2_CACHE_HSFS_OPEN = 0,
- MSM_LPM_L2_CACHE_GDHS = 1,
- MSM_LPM_L2_CACHE_RETENTION = 2,
- MSM_LPM_L2_CACHE_ACTIVE = 3,
+ MSM_LPM_L2_CACHE_HSFS_OPEN,
+ MSM_LPM_L2_CACHE_GDHS,
+ MSM_LPM_L2_CACHE_RETENTION,
+ MSM_LPM_L2_CACHE_ACTIVE,
};
struct msm_rpmrs_limits {
@@ -99,6 +99,24 @@
uint32_t msm_pm_get_vdd_dig(struct msm_rpmrs_limits *limits);
/**
+ * msm_lpm_get_xo_value() - get the enum value for xo
+ * @node pointer to the device node
+ * @key pxo property key
+ * @xo_val xo enum value
+ */
+int msm_lpm_get_xo_value(struct device_node *node,
+ char *key, uint32_t *xo_val);
+
+/**
+ * msm_lpm_get_l2_cache_value() - get the enum value for l2 cache
+ * @node pointer to the device node
+ * @key l2 cache property key
+ * @l2_val l2 mode enum value
+ */
+int msm_lpm_get_l2_cache_value(struct device_node *node,
+ char *key, uint32_t *l2_val);
+
+/**
* struct msm_lpm_sleep_data - abstraction to get sleep data
* @limits: pointer to the msm_rpmrs_limits structure
* @kernel_sleep: kernel sleep time as decided by the power calculation