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