msm: pm: Add API to get deep idle latency

Previously a driver could grab an idle wakelock and prevent the
deep idle sleep states associated with remote processor assisted
power collapse (either via the modem or the RPM). With the
removal of idle wakelocks we must replace them with equivalent
upstream compatabile APIs. Since the drivers are actually
expressing their desire to prevent certain CPU latencys add an
API to expose the latency of deep idle sleep to drivers.

It's expected that this API will be removed once drivers properly
specify their latency requirements.

Change-Id: Iebeb17009fca1486fddda4f78f4952080096234a
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
diff --git a/arch/arm/mach-msm/rpm_resources.c b/arch/arm/mach-msm/rpm_resources.c
index 5314cee..c86da6a 100644
--- a/arch/arm/mach-msm/rpm_resources.c
+++ b/arch/arm/mach-msm/rpm_resources.c
@@ -867,6 +867,29 @@
 	spin_unlock_irqrestore(&msm_rpmrs_lock, flags);
 }
 
+s32 msm_cpuidle_get_deep_idle_latency(void)
+{
+	int i;
+	struct msm_rpmrs_level *level = msm_rpmrs_levels, *best = level;
+
+	if (!level)
+		return 0;
+
+	for (i = 0; i < msm_rpmrs_level_count; i++, level++) {
+		if (!level->available)
+			continue;
+		if (level->sleep_mode != MSM_PM_SLEEP_MODE_POWER_COLLAPSE)
+			continue;
+		/* Pick the first power collapse mode by default */
+		if (best->sleep_mode != MSM_PM_SLEEP_MODE_POWER_COLLAPSE)
+			best = level;
+		/* Find the lowest latency for power collapse */
+		if (level->latency_us < best->latency_us)
+			best = level;
+	}
+	return best->latency_us - 1;
+}
+
 static void *msm_rpmrs_lowest_limits(bool from_idle,
 		enum msm_pm_sleep_mode sleep_mode, uint32_t latency_us,
 		uint32_t sleep_us, uint32_t *power)