summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2012-02-23 17:35:06 +0800
committerAndy Green <andy.green@linaro.org>2012-06-20 10:27:35 +0800
commit1709b975ee7742544a4998b1d7c5bc5840278d75 (patch)
tree7234d9b86c38be4b3572a998e39c9fc4a21681a0
parent47e82853a804d1ce19e86078c1bf305907144ac5 (diff)
OMAP3+: PM: VP: provide api for arch specific recovery
Provide hook so that we can attempt to populate a arch specific recovery mechanism Signed-off-by: Nishanth Menon <nm@ti.com>
-rw-r--r--arch/arm/mach-omap2/vp.c22
-rw-r--r--arch/arm/mach-omap2/vp.h1
2 files changed, 18 insertions, 5 deletions
diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c
index 073c695bba7..f221df57471 100644
--- a/arch/arm/mach-omap2/vp.c
+++ b/arch/arm/mach-omap2/vp.c
@@ -147,10 +147,12 @@ int omap_vp_update_errorgain(struct voltagedomain *voltdm,
return 0;
}
+#define _MAX_RETRIES_BEFORE_RECOVER 50
#define _MAX_COUNT_ERR 10
static u8 __vp_debug_error_message_count = _MAX_COUNT_ERR;
+static u8 __vp_recover_count = _MAX_RETRIES_BEFORE_RECOVER;
/* Dump with stack the first few messages, tone down severity for the rest */
-#define _vp_controlled_err(ARGS...) \
+#define _vp_controlled_err(vp, voltdm, ARGS...) \
{ \
if (__vp_debug_error_message_count) { \
pr_err(ARGS); \
@@ -159,6 +161,12 @@ static u8 __vp_debug_error_message_count = _MAX_COUNT_ERR;
} else { \
pr_err_ratelimited(ARGS); \
} \
+ if ((vp)->common->ops->recover && !(--__vp_recover_count)) { \
+ pr_err("%s:domain %s recovery count triggered\n", \
+ __func__, (voltdm)->name); \
+ (vp)->common->ops->recover((vp)->id); \
+ __vp_recover_count = _MAX_RETRIES_BEFORE_RECOVER; \
+ } \
}
@@ -180,7 +188,8 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
VP_IDLE_TIMEOUT, timeout);
if (timeout >= VP_IDLE_TIMEOUT)
- _vp_controlled_err("%s: vdd_%s idle timedout forceupdate(v=%d)\n",
+ _vp_controlled_err(vp, voltdm,
+ "%s: vdd_%s idle timedout forceupdate(v=%d)\n",
__func__, voltdm->name, target_volt->volt_nominal);
ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, &current_vsel);
@@ -198,7 +207,8 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
udelay(1);
}
if (timeout >= VP_TRANXDONE_TIMEOUT) {
- _vp_controlled_err("%s: vdd_%s TRANXDONE timeout exceeded."
+ _vp_controlled_err(vp, voltdm,
+ "%s: vdd_%s TRANXDONE timeout exceeded."
"Voltage change aborted target volt=%d,"
"target vsel=0x%02x, current_vsel=0x%02x\n",
__func__, voltdm->name, target_volt->volt_nominal,
@@ -220,7 +230,8 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
omap_test_timeout(vp->common->ops->check_txdone(vp->id),
VP_TRANXDONE_TIMEOUT, timeout);
if (timeout >= VP_TRANXDONE_TIMEOUT)
- _vp_controlled_err("%s: vdd_%s TRANXDONE timeout exceeded. "
+ _vp_controlled_err(vp, voltdm,
+ "%s: vdd_%s TRANXDONE timeout exceeded. "
"TRANXDONE never got set after the voltage update. "
"target volt=%d, target vsel=0x%02x, "
"current_vsel=0x%02x\n",
@@ -242,7 +253,8 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
}
if (timeout >= VP_TRANXDONE_TIMEOUT)
- _vp_controlled_err("%s: vdd_%s TRANXDONE timeout exceeded while trying"
+ _vp_controlled_err(vp, voltdm,
+ "%s: vdd_%s TRANXDONE timeout exceeded while trying"
"to clear the TRANXDONE status\n",
__func__, voltdm->name);
diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h
index 3d55814b327..834bab9d77a 100644
--- a/arch/arm/mach-omap2/vp.h
+++ b/arch/arm/mach-omap2/vp.h
@@ -46,6 +46,7 @@ struct voltagedomain;
struct omap_vp_ops {
u32 (*check_txdone)(u8 vp_id);
void (*clear_txdone)(u8 vp_id);
+ void (*recover)(u8 vp_id);
};
/**