diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 65a8e0ae394f..b01da1ed822d 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -211,6 +211,32 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v) | |||
211 | } | 211 | } |
212 | 212 | ||
213 | /** | 213 | /** |
214 | * _set_module_autoidle: set the OCP_SYSCONFIG AUTOIDLE field in @v | ||
215 | * @oh: struct omap_hwmod * | ||
216 | * @autoidle: desired AUTOIDLE bitfield value (0 or 1) | ||
217 | * @v: pointer to register contents to modify | ||
218 | * | ||
219 | * Update the module autoidle bit in @v to be @autoidle for the @oh | ||
220 | * hwmod. The autoidle bit controls whether the module can gate | ||
221 | * internal clocks automatically when it isn't doing anything; the | ||
222 | * exact function of this bit varies on a per-module basis. This | ||
223 | * function does not write to the hardware. Returns -EINVAL upon | ||
224 | * error or 0 upon success. | ||
225 | */ | ||
226 | static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle, | ||
227 | u32 *v) | ||
228 | { | ||
229 | if (!oh->sysconfig || | ||
230 | !(oh->sysconfig->sysc_flags & SYSC_HAS_AUTOIDLE)) | ||
231 | return -EINVAL; | ||
232 | |||
233 | *v &= ~SYSC_AUTOIDLE_MASK; | ||
234 | *v |= autoidle << SYSC_AUTOIDLE_SHIFT; | ||
235 | |||
236 | return 0; | ||
237 | } | ||
238 | |||
239 | /** | ||
214 | * _enable_wakeup: set OCP_SYSCONFIG.ENAWAKEUP bit in the hardware | 240 | * _enable_wakeup: set OCP_SYSCONFIG.ENAWAKEUP bit in the hardware |
215 | * @oh: struct omap_hwmod * | 241 | * @oh: struct omap_hwmod * |
216 | * | 242 | * |
@@ -558,7 +584,13 @@ static void _sysc_enable(struct omap_hwmod *oh) | |||
558 | _set_master_standbymode(oh, idlemode, &v); | 584 | _set_master_standbymode(oh, idlemode, &v); |
559 | } | 585 | } |
560 | 586 | ||
561 | /* XXX OCP AUTOIDLE bit? */ | 587 | if (oh->sysconfig->sysc_flags & SYSC_HAS_AUTOIDLE) { |
588 | idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ? | ||
589 | 0 : 1; | ||
590 | _set_module_autoidle(oh, idlemode, &v); | ||
591 | } | ||
592 | |||
593 | /* XXX OCP ENAWAKEUP bit? */ | ||
562 | 594 | ||
563 | if (oh->flags & HWMOD_SET_DEFAULT_CLOCKACT && | 595 | if (oh->flags & HWMOD_SET_DEFAULT_CLOCKACT && |
564 | oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY) | 596 | oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY) |
@@ -623,7 +655,8 @@ static void _sysc_shutdown(struct omap_hwmod *oh) | |||
623 | if (oh->sysconfig->sysc_flags & SYSC_HAS_MIDLEMODE) | 655 | if (oh->sysconfig->sysc_flags & SYSC_HAS_MIDLEMODE) |
624 | _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v); | 656 | _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v); |
625 | 657 | ||
626 | /* XXX clear OCP AUTOIDLE bit? */ | 658 | if (oh->sysconfig->sysc_flags & SYSC_HAS_AUTOIDLE) |
659 | _set_module_autoidle(oh, 1, &v); | ||
627 | 660 | ||
628 | _write_sysconfig(v, oh); | 661 | _write_sysconfig(v, oh); |
629 | } | 662 | } |