|
@@ -1356,13 +1356,26 @@ static void _enable_sysc(struct omap_hwmod *oh)
|
|
|
|
|
|
clkdm = _get_clkdm(oh);
|
|
|
if (sf & SYSC_HAS_SIDLEMODE) {
|
|
|
+ if (oh->flags & HWMOD_SWSUP_SIDLE) {
|
|
|
+ idlemode = HWMOD_IDLEMODE_NO;
|
|
|
+ } else {
|
|
|
+ if (sf & SYSC_HAS_ENAWAKEUP)
|
|
|
+ _enable_wakeup(oh, &v);
|
|
|
+ if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
|
|
|
+ idlemode = HWMOD_IDLEMODE_SMART_WKUP;
|
|
|
+ else
|
|
|
+ idlemode = HWMOD_IDLEMODE_SMART;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * This is special handling for some IPs like
|
|
|
+ * 32k sync timer. Force them to idle!
|
|
|
+ */
|
|
|
clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU);
|
|
|
if (clkdm_act && !(oh->class->sysc->idlemodes &
|
|
|
(SIDLE_SMART | SIDLE_SMART_WKUP)))
|
|
|
idlemode = HWMOD_IDLEMODE_FORCE;
|
|
|
- else
|
|
|
- idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
|
|
|
- HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
|
|
|
+
|
|
|
_set_slave_idlemode(oh, idlemode, &v);
|
|
|
}
|
|
|
|
|
@@ -1391,10 +1404,6 @@ static void _enable_sysc(struct omap_hwmod *oh)
|
|
|
(sf & SYSC_HAS_CLOCKACTIVITY))
|
|
|
_set_clockactivity(oh, oh->class->sysc->clockact, &v);
|
|
|
|
|
|
- /* If slave is in SMARTIDLE, also enable wakeup */
|
|
|
- if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
|
|
|
- _enable_wakeup(oh, &v);
|
|
|
-
|
|
|
_write_sysconfig(v, oh);
|
|
|
|
|
|
/*
|
|
@@ -1430,13 +1439,16 @@ static void _idle_sysc(struct omap_hwmod *oh)
|
|
|
sf = oh->class->sysc->sysc_flags;
|
|
|
|
|
|
if (sf & SYSC_HAS_SIDLEMODE) {
|
|
|
- /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */
|
|
|
- if (oh->flags & HWMOD_SWSUP_SIDLE ||
|
|
|
- !(oh->class->sysc->idlemodes &
|
|
|
- (SIDLE_SMART | SIDLE_SMART_WKUP)))
|
|
|
+ if (oh->flags & HWMOD_SWSUP_SIDLE) {
|
|
|
idlemode = HWMOD_IDLEMODE_FORCE;
|
|
|
- else
|
|
|
- idlemode = HWMOD_IDLEMODE_SMART;
|
|
|
+ } else {
|
|
|
+ if (sf & SYSC_HAS_ENAWAKEUP)
|
|
|
+ _enable_wakeup(oh, &v);
|
|
|
+ if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
|
|
|
+ idlemode = HWMOD_IDLEMODE_SMART_WKUP;
|
|
|
+ else
|
|
|
+ idlemode = HWMOD_IDLEMODE_SMART;
|
|
|
+ }
|
|
|
_set_slave_idlemode(oh, idlemode, &v);
|
|
|
}
|
|
|
|
|
@@ -1455,10 +1467,6 @@ static void _idle_sysc(struct omap_hwmod *oh)
|
|
|
_set_master_standbymode(oh, idlemode, &v);
|
|
|
}
|
|
|
|
|
|
- /* If slave is in SMARTIDLE, also enable wakeup */
|
|
|
- if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
|
|
|
- _enable_wakeup(oh, &v);
|
|
|
-
|
|
|
_write_sysconfig(v, oh);
|
|
|
}
|
|
|
|