diff options
| author | Jens Axboe <axboe@kernel.dk> | 2012-07-30 03:03:10 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2012-07-30 03:03:10 -0400 |
| commit | 72ea1f74fcdf874cca6d2c0962379523bbd99e2c (patch) | |
| tree | 4c67be6c73356086ff44ef1b8b1c9479702689ca /arch/arm/mach-omap2/omap_hwmod.c | |
| parent | b1af9be5ef77898c05667bb9dbf3b180d91d3292 (diff) | |
| parent | a73ff3231df59a4b92ccd0dd4e73897c5822489b (diff) | |
Merge branch 'for-jens' of git://git.drbd.org/linux-drbd into for-3.6/drivers
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 | ||
