diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index bf86f7e8f91f..2d710f50fca2 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -530,7 +530,7 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v) | |||
530 | if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) | 530 | if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) |
531 | _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v); | 531 | _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v); |
532 | if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) | 532 | if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) |
533 | _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v); | 533 | _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART, v); |
534 | 534 | ||
535 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ | 535 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ |
536 | 536 | ||
@@ -1124,15 +1124,18 @@ static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap | |||
1124 | * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG | 1124 | * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG |
1125 | * @oh: struct omap_hwmod * | 1125 | * @oh: struct omap_hwmod * |
1126 | * | 1126 | * |
1127 | * If module is marked as SWSUP_SIDLE, force the module out of slave | 1127 | * Ensure that the OCP_SYSCONFIG register for the IP block represented |
1128 | * idle; otherwise, configure it for smart-idle. If module is marked | 1128 | * by @oh is set to indicate to the PRCM that the IP block is active. |
1129 | * as SWSUP_MSUSPEND, force the module out of master standby; | 1129 | * Usually this means placing the module into smart-idle mode and |
1130 | * otherwise, configure it for smart-standby. No return value. | 1130 | * smart-standby, but if there is a bug in the automatic idle handling |
1131 | * for the IP block, it may need to be placed into the force-idle or | ||
1132 | * no-idle variants of these modes. No return value. | ||
1131 | */ | 1133 | */ |
1132 | static void _enable_sysc(struct omap_hwmod *oh) | 1134 | static void _enable_sysc(struct omap_hwmod *oh) |
1133 | { | 1135 | { |
1134 | u8 idlemode, sf; | 1136 | u8 idlemode, sf; |
1135 | u32 v; | 1137 | u32 v; |
1138 | bool clkdm_act; | ||
1136 | 1139 | ||
1137 | if (!oh->class->sysc) | 1140 | if (!oh->class->sysc) |
1138 | return; | 1141 | return; |
@@ -1141,8 +1144,16 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1141 | sf = oh->class->sysc->sysc_flags; | 1144 | sf = oh->class->sysc->sysc_flags; |
1142 | 1145 | ||
1143 | if (sf & SYSC_HAS_SIDLEMODE) { | 1146 | if (sf & SYSC_HAS_SIDLEMODE) { |
1144 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | 1147 | clkdm_act = ((oh->clkdm && |
1145 | HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; | 1148 | oh->clkdm->flags & CLKDM_ACTIVE_WITH_MPU) || |
1149 | (oh->_clk && oh->_clk->clkdm && | ||
1150 | oh->_clk->clkdm->flags & CLKDM_ACTIVE_WITH_MPU)); | ||
1151 | if (clkdm_act && !(oh->class->sysc->idlemodes & | ||
1152 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | ||
1153 | idlemode = HWMOD_IDLEMODE_FORCE; | ||
1154 | else | ||
1155 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | ||
1156 | HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; | ||
1146 | _set_slave_idlemode(oh, idlemode, &v); | 1157 | _set_slave_idlemode(oh, idlemode, &v); |
1147 | } | 1158 | } |
1148 | 1159 | ||
@@ -1208,8 +1219,13 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
1208 | sf = oh->class->sysc->sysc_flags; | 1219 | sf = oh->class->sysc->sysc_flags; |
1209 | 1220 | ||
1210 | if (sf & SYSC_HAS_SIDLEMODE) { | 1221 | if (sf & SYSC_HAS_SIDLEMODE) { |
1211 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | 1222 | /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */ |
1212 | HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; | 1223 | if (oh->flags & HWMOD_SWSUP_SIDLE || |
1224 | !(oh->class->sysc->idlemodes & | ||
1225 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | ||
1226 | idlemode = HWMOD_IDLEMODE_FORCE; | ||
1227 | else | ||
1228 | idlemode = HWMOD_IDLEMODE_SMART; | ||
1213 | _set_slave_idlemode(oh, idlemode, &v); | 1229 | _set_slave_idlemode(oh, idlemode, &v); |
1214 | } | 1230 | } |
1215 | 1231 | ||