aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/omap_hwmod.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/omap_hwmod.c')
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c37
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 */
226static 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}