aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/omap_hwmod.c
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2010-12-14 14:42:34 -0500
committerPaul Walmsley <paul@pwsan.com>2010-12-21 21:55:11 -0500
commite4dc8f507c3066d6fcece988d99b6d766c46af85 (patch)
tree5548478340c53a1ee79756d9c3c97118bf9abb13 /arch/arm/mach-omap2/omap_hwmod.c
parent4805734bcc5a6b28b527a13a5c1603a2912c9f48 (diff)
OMAP2+: hwmod: allow custom pre-shutdown functions
Some OMAP IP blocks, such as the watchdog timers, cannot be completely shut down via the standard hwmod shutdown mechanism. This patch enables the hwmod data files to supply a pointer to a custom pre-shutdown function via the struct omap_hwmod_class.pre_shutdown function pointer. If the struct omap_hwmod_class.pre_shutdown function pointer is non-null, the function will be executed before the existing hwmod shutdown code runs. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: BenoƮt Cousson <b-cousson@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 5a30658444d0..c051fa493594 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1261,6 +1261,9 @@ int _omap_hwmod_idle(struct omap_hwmod *oh)
1261 */ 1261 */
1262static int _shutdown(struct omap_hwmod *oh) 1262static int _shutdown(struct omap_hwmod *oh)
1263{ 1263{
1264 int ret;
1265 u8 prev_state;
1266
1264 if (oh->_state != _HWMOD_STATE_IDLE && 1267 if (oh->_state != _HWMOD_STATE_IDLE &&
1265 oh->_state != _HWMOD_STATE_ENABLED) { 1268 oh->_state != _HWMOD_STATE_ENABLED) {
1266 WARN(1, "omap_hwmod: %s: disabled state can only be entered " 1269 WARN(1, "omap_hwmod: %s: disabled state can only be entered "
@@ -1270,6 +1273,18 @@ static int _shutdown(struct omap_hwmod *oh)
1270 1273
1271 pr_debug("omap_hwmod: %s: disabling\n", oh->name); 1274 pr_debug("omap_hwmod: %s: disabling\n", oh->name);
1272 1275
1276 if (oh->class->pre_shutdown) {
1277 prev_state = oh->_state;
1278 if (oh->_state == _HWMOD_STATE_IDLE)
1279 _omap_hwmod_enable(oh);
1280 ret = oh->class->pre_shutdown(oh);
1281 if (ret) {
1282 if (prev_state == _HWMOD_STATE_IDLE)
1283 _omap_hwmod_idle(oh);
1284 return ret;
1285 }
1286 }
1287
1273 if (oh->class->sysc) 1288 if (oh->class->sysc)
1274 _shutdown_sysc(oh); 1289 _shutdown_sysc(oh);
1275 1290