[PATCH 08/12] OMAP SR/SRF: use opp_find_opp_by_opp_id()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



SmartReflex and SRF code should use opp_find_opp_by_opp_id() to find
OPP entries by the OPP ID.  This hides OPP layer details from SR/SRF code
and also allows the removal of the open-coded OPP traversal.
---
 arch/arm/mach-omap2/resource34xx.c |   30 ++++++++--------
 arch/arm/mach-omap2/smartreflex.c  |   66 ++++++++++++++++++++++++++++--------
 2 files changed, 66 insertions(+), 30 deletions(-)

diff --git a/arch/arm/mach-omap2/resource34xx.c b/arch/arm/mach-omap2/resource34xx.c
index baa33c4..05e70b7 100644
--- a/arch/arm/mach-omap2/resource34xx.c
+++ b/arch/arm/mach-omap2/resource34xx.c
@@ -25,6 +25,7 @@
 #include <plat/powerdomain.h>
 #include <plat/clockdomain.h>
 #include <plat/omap34xx.h>
+#include <plat/opp_twl_tps.h>
 
 #include "smartreflex.h"
 #include "resource34xx.h"
@@ -157,10 +158,6 @@ static int curr_vdd1_opp;
 static int curr_vdd2_opp;
 static DEFINE_MUTEX(dvfs_mutex);
 
-/* Introducing deprecated function because we got to.. */
-#define IS_OPP_TERMINATOR(opps, i) (!(opps)[(i)].enabled &&	\
-		!(opps)[(i)].rate && !(opps)[(i)].vsel)
-
 /**
  * opp_to_freq - convert OPPID to frequency (DEPRECATED)
  * @freq: return frequency back to caller
@@ -175,20 +172,17 @@ static DEFINE_MUTEX(dvfs_mutex);
 static int __deprecated opp_to_freq(unsigned long *freq,
 		const struct omap_opp *opps, u8 opp_id)
 {
-	int i = 1;
+	struct omap_opp *opp;
 
 	BUG_ON(!freq || !opps);
 
-	/* The first entry is a dummy one, loop till we hit terminator */
-	while (!IS_OPP_TERMINATOR(opps, i)) {
-		if (opps[i].enabled && (opps[i].opp_id == opp_id)) {
-			*freq = opps[i].rate;
-			return 0;
-		}
-		i++;
-	}
+	opp = opp_find_by_opp_id(opps, opp_id);
+	if (!opp)
+		return -EINVAL;
 
-	return -EINVAL;
+	*freq = opp_get_freq(opp);
+
+	return 0;
 }
 
 /**
@@ -365,18 +359,22 @@ static int program_opp(int res, struct omap_opp *opp, int target_level,
 		else {
 			u8 vc, vt;
 			struct omap_opp *oppx;
+			unsigned long uvdc;
+
 			/*
 			 * transitioning from good to good OPP
 			 * none of the following should fail..
 			 */
 			oppx = opp_find_freq_exact(opp, freq, true);
 			BUG_ON(IS_ERR(oppx));
-			vt = oppx->vsel;
+			uvdc = opp_get_voltage(oppx);
+			vt = omap_twl_uv_to_vsel(uvdc);
 
 			BUG_ON(opp_to_freq(&freq, opp, current_level));
 			oppx = opp_find_freq_exact(opp, freq, true);
 			BUG_ON(IS_ERR(oppx));
-			vc = oppx->vsel;
+			uvdc = opp_get_voltage(oppx);
+			vc = omap_twl_uv_to_vsel(uvdc);
 
 			/* ok to scale.. */
 			sr_voltagescale_vcbypass(t_opp, c_opp, vt, vc);
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
index 50332ae..e086f2d 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -31,6 +31,7 @@
 #include <plat/control.h>
 #include <plat/clock.h>
 #include <plat/omap-pm.h>
+#include <plat/opp_twl_tps.h>
 
 #include "prm.h"
 #include "smartreflex.h"
@@ -282,15 +283,20 @@ static void sr_configure_vp(int srid)
 {
 	u32 vpconfig;
 	u32 vsel;
+	int uvdc;
 	u32 target_opp_no;
+	struct omap_opp *opp;
 
 	if (srid == SR1) {
 		target_opp_no = get_vdd1_opp();
 		if (!target_opp_no)
-			/* Assume Nominal OPP as current OPP unknown */
-			vsel = mpu_opps[VDD1_OPP3].vsel;
-		else
-			vsel = mpu_opps[target_opp_no].vsel;
+			target_opp_no = VDD1_OPP3;
+
+		opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
+		BUG_ON(!opp); /* XXX ugh */
+
+		uvdc = opp_get_voltage(opp);
+		vsel = omap_twl_uv_to_vsel(uvdc);
 
 		vpconfig = PRM_VP1_CONFIG_ERROROFFSET |
 			PRM_VP1_CONFIG_ERRORGAIN |
@@ -333,10 +339,13 @@ static void sr_configure_vp(int srid)
 	} else if (srid == SR2) {
 		target_opp_no = get_vdd2_opp();
 		if (!target_opp_no)
-			/* Assume Nominal OPP */
-			vsel = l3_opps[VDD2_OPP3].vsel;
-		else
-			vsel = l3_opps[target_opp_no].vsel;
+			target_opp_no = VDD2_OPP3;
+
+		opp = opp_find_by_opp_id(l3_opps, target_opp_no);
+		BUG_ON(!opp); /* XXX ugh */
+
+		uvdc = opp_get_voltage(opp);
+		vsel = omap_twl_uv_to_vsel(uvdc);
 
 		vpconfig = PRM_VP2_CONFIG_ERROROFFSET |
 			PRM_VP2_CONFIG_ERRORGAIN |
@@ -428,6 +437,8 @@ static void sr_configure(struct omap_sr *sr)
 
 static int sr_reset_voltage(int srid)
 {
+	struct omap_opp *opp;
+	unsigned long uvdc;
 	u32 target_opp_no, vsel = 0;
 	u32 reg_addr = 0;
 	u32 loop_cnt = 0, retries_cnt = 0;
@@ -442,7 +453,14 @@ static int sr_reset_voltage(int srid)
 			pr_info("Current OPP unknown: Cannot reset voltage\n");
 			return 1;
 		}
-		vsel = mpu_opps[target_opp_no].vsel;
+
+		opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
+		if (!opp)
+			return 1;
+
+		uvdc = opp_get_voltage(opp);
+		vsel = omap_twl_uv_to_vsel(uvdc);
+
 		reg_addr = R_VDD1_SR_CONTROL;
 		prm_vp1_voltage = prm_read_mod_reg(OMAP3430_GR_MOD,
 						OMAP3_PRM_VP1_VOLTAGE_OFFSET);
@@ -453,7 +471,14 @@ static int sr_reset_voltage(int srid)
 			pr_info("Current OPP unknown: Cannot reset voltage\n");
 			return 1;
 		}
-		vsel = l3_opps[target_opp_no].vsel;
+
+		opp = opp_find_by_opp_id(l3_opps, target_opp_no);
+		if (!opp)
+			return 1;
+
+		uvdc = opp_get_voltage(opp);
+		vsel = omap_twl_uv_to_vsel(uvdc);
+
 		reg_addr = R_VDD2_SR_CONTROL;
 		prm_vp2_voltage = prm_read_mod_reg(OMAP3430_GR_MOD,
 						OMAP3_PRM_VP2_VOLTAGE_OFFSET);
@@ -499,6 +524,9 @@ static int sr_reset_voltage(int srid)
 static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
 {
 	u32 nvalue_reciprocal, v;
+	struct omap_opp *opp;
+	int uvdc;
+	char vsel;
 
 	if (!(mpu_opps && l3_opps)) {
 		pr_notice("VSEL values not found\n");
@@ -528,6 +556,10 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
 			nvalue_reciprocal = sr->opp3_nvalue;
 			break;
 		}
+
+		opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
+		if (!opp)
+			return false;
 	} else {
 		switch (target_opp_no) {
 		case 3:
@@ -543,6 +575,10 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
 			nvalue_reciprocal = sr->opp3_nvalue;
 			break;
 		}
+
+		opp = opp_find_by_opp_id(l3_opps, target_opp_no);
+		if (!opp)
+			return false;
 	}
 
 	if (nvalue_reciprocal == 0) {
@@ -558,13 +594,16 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
 			(ERRCONFIG_VPBOUNDINTEN | ERRCONFIG_VPBOUNDINTST),
 			(ERRCONFIG_VPBOUNDINTEN | ERRCONFIG_VPBOUNDINTST));
 
+	uvdc = opp_get_voltage(opp);
+	vsel = omap_twl_uv_to_vsel(uvdc);
+
 	if (sr->srid == SR1) {
 		/* set/latch init voltage */
 		v = prm_read_mod_reg(OMAP3430_GR_MOD,
 				     OMAP3_PRM_VP1_CONFIG_OFFSET);
 		v &= ~(OMAP3430_INITVOLTAGE_MASK | OMAP3430_INITVDD);
-		v |= mpu_opps[target_opp_no].vsel <<
-			OMAP3430_INITVOLTAGE_SHIFT;
+
+		v |= vsel << OMAP3430_INITVOLTAGE_SHIFT;
 		prm_write_mod_reg(v, OMAP3430_GR_MOD,
 				  OMAP3_PRM_VP1_CONFIG_OFFSET);
 		/* write1 to latch */
@@ -581,8 +620,7 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
 		v = prm_read_mod_reg(OMAP3430_GR_MOD,
 				     OMAP3_PRM_VP2_CONFIG_OFFSET);
 		v &= ~(OMAP3430_INITVOLTAGE_MASK | OMAP3430_INITVDD);
-		v |= l3_opps[target_opp_no].vsel <<
-			OMAP3430_INITVOLTAGE_SHIFT;
+		v |= vsel << OMAP3430_INITVOLTAGE_SHIFT;
 		prm_write_mod_reg(v, OMAP3430_GR_MOD,
 				  OMAP3_PRM_VP2_CONFIG_OFFSET);
 		/* write1 to latch */


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux