* [PATCH 05/05] OMAP3: SR: Reset voltage level on SR disable
@ 2009-03-18 9:55 Nayak, Rajendra
0 siblings, 0 replies; only message in thread
From: Nayak, Rajendra @ 2009-03-18 9:55 UTC (permalink / raw)
To: linux-omap; +Cc: Nayak, Rajendra
From: Rajendra Nayak <rnayak@ti.com>
This patch resets the voltage level for each OPP on SR disable.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Jouni Hogander <jouni.hogander@nokia.com>
---
arch/arm/mach-omap2/smartreflex.c | 49 ++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+)
Index: linux-omap-2.6/arch/arm/mach-omap2/smartreflex.c
===================================================================
--- linux-omap-2.6.orig/arch/arm/mach-omap2/smartreflex.c 2009-03-18 13:56:26.106235150 +0530
+++ linux-omap-2.6/arch/arm/mach-omap2/smartreflex.c 2009-03-18 13:56:27.065205965 +0530
@@ -379,6 +379,51 @@ static void sr_configure(struct omap_sr
sr->is_sr_reset = 0;
}
+static int sr_reset_voltage(int srid)
+{
+ u32 target_opp_no, vsel = 0;
+ u32 reg_addr = 0;
+ u32 loop_cnt = 0, retries_cnt = 0;
+ u32 vc_bypass_value;
+
+ if (srid == SR1) {
+ target_opp_no = resource_get_level("vdd1_opp");
+ vsel = mpu_opps[target_opp_no].vsel;
+ reg_addr = R_VDD1_SR_CONTROL;
+ } else if (srid == SR2) {
+ target_opp_no = resource_get_level("vdd2_opp");
+ vsel = l3_opps[target_opp_no].vsel;
+ reg_addr = R_VDD2_SR_CONTROL;
+ }
+
+ vc_bypass_value = (vsel << OMAP3430_DATA_SHIFT) |
+ (reg_addr << OMAP3430_REGADDR_SHIFT) |
+ (R_SRI2C_SLAVE_ADDR << OMAP3430_SLAVEADDR_SHIFT);
+
+ prm_write_mod_reg(vc_bypass_value, OMAP3430_GR_MOD,
+ OMAP3_PRM_VC_BYPASS_VAL_OFFSET);
+
+ vc_bypass_value = prm_set_mod_reg_bits(OMAP3430_VALID, OMAP3430_GR_MOD,
+ OMAP3_PRM_VC_BYPASS_VAL_OFFSET);
+
+ while ((vc_bypass_value & OMAP3430_VALID) != 0x0) {
+ loop_cnt++;
+ if (retries_cnt > 10) {
+ printk(KERN_INFO "Loop count exceeded in check SR I2C"
+ "write\n");
+ return SR_FAIL;
+ }
+ if (loop_cnt > 50) {
+ retries_cnt++;
+ loop_cnt = 0;
+ udelay(10);
+ }
+ vc_bypass_value = prm_read_mod_reg(OMAP3430_GR_MOD,
+ OMAP3_PRM_VC_BYPASS_VAL_OFFSET);
+ }
+ return SR_PASS;
+}
+
static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
{
u32 nvalue_reciprocal, v;
@@ -541,6 +586,8 @@ int sr_stop_vddautocomap(int srid)
sr_disable(sr);
sr_clk_disable(sr);
sr->is_autocomp_active = 0;
+ /* Reset the volatage for current OPP */
+ sr_reset_voltage(srid);
return SR_TRUE;
} else {
printk(KERN_WARNING "SR%d: VDD autocomp is not active\n",
@@ -609,6 +656,8 @@ void disable_smartreflex(int srid)
OMAP3430_GR_MOD,
OMAP3_PRM_VP2_CONFIG_OFFSET);
}
+ /* Reset the volatage for current OPP */
+ sr_reset_voltage(srid);
}
}
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-03-18 9:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-18 9:55 [PATCH 05/05] OMAP3: SR: Reset voltage level on SR disable Nayak, Rajendra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).