diff options
author | Nishanth Menon <nm@ti.com> | 2012-02-23 17:35:06 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-06-20 10:27:35 +0800 |
commit | 1709b975ee7742544a4998b1d7c5bc5840278d75 (patch) | |
tree | 7234d9b86c38be4b3572a998e39c9fc4a21681a0 | |
parent | 47e82853a804d1ce19e86078c1bf305907144ac5 (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.c | 22 | ||||
-rw-r--r-- | arch/arm/mach-omap2/vp.h | 1 |
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, ¤t_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); }; /** |