On Tue, Nov 18, 2014 at 02:24:37PM -0500, Lennart Sorensen wrote:
> On Tue, Nov 18, 2014 at 08:00:14PM +0100, Gilles Chanteperdrix wrote:
> > On Tue, Nov 18, 2014 at 01:56:57PM -0500, Lennart Sorensen wrote:
> > > On Tue, Nov 18, 2014 at 07:51:31PM +0100, Gilles Chanteperdrix wrote:
> > > > I would take the simple approach: disable the smartidle in the probe
> > > > function for all GPIO banks if IS_ENABLED(CONFIG_IPIPE)
> > > >
> > > > Otherwise, the enable_irqdesc/disable_irqdesc functions already
> > > > keep track of which bank has real-time irq handlers registered, and
> > > > it is already conditionally compiled only if CONFIG_IPIPE is
> > > > enabled. So, you can add your code there.
> > >
> > > I will consider that after doing my other test. For me adding one flag
> > > to the dtb for our board seems less invasive, but for ipipe overall it
> > > would be better to make ipipe turn of smartidle on the IRQ supporting
> > > gpio banks.
> >
> > RT IRQs only, we do not care about NRT IRQS, they can depend on the
> > dts parameter. Anyway, if you tell me where the code you are talking
> > about can be found, I can propose a patch that you test, and merge
> > it if it works for you.
>
> Hmm, ti,no-idle causes a gpio bank startup failure, so that doesn't work.
>
> The code setting it to idle is in arch/arm/mach-omap2/omap_hwmod.c:
>
> static void _enable_sysc(struct omap_hwmod *oh)
> {
> u8 idlemode, sf;
> u32 v;
> bool clkdm_act;
> struct clockdomain *clkdm;
>
> if (!oh->class->sysc)
> return;
>
> /*
> * Wait until reset has completed, this is needed as the IP
> * block is reset automatically by hardware in some cases
> * (off-mode for example), and the drivers require the
> * IP to be ready when they access it
> */
> if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
> _enable_optional_clocks(oh);
> _wait_softreset_complete(oh);
> if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
> _disable_optional_clocks(oh);
>
> v = oh->_sysc_cache;
> sf = oh->class->sysc->sysc_flags;
>
> clkdm = _get_clkdm(oh);
> if (sf & SYSC_HAS_SIDLEMODE) {
> if (oh->flags & HWMOD_SWSUP_SIDLE ||
> oh->flags & HWMOD_SWSUP_SIDLE_ACT) {
> 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; <- this
> one
> else
> idlemode = HWMOD_IDLEMODE_SMART; <- or this
> one
> }
>
> /*
> * 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;
>
> _set_slave_idlemode(oh, idlemode, &v);
> }
>
> The hwmod for the gpio bank in question is in
> arch/arm/mach-omap2/omap_hwmod_7xx_data.c:
>
> /*
> * 'gpio' class
> *
> */
>
> static struct omap_hwmod_class_sysconfig dra7xx_gpio_sysc = {
> .rev_offs = 0x0000,
> .sysc_offs = 0x0010,
> .syss_offs = 0x0114,
> .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
> SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
> SYSS_HAS_RESET_STATUS),
> .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
> SIDLE_SMART_WKUP),
> .sysc_fields = &omap_hwmod_sysc_type1,
> };
What if you remove SYSC_HAS_SIDLEMODE here ?
--
Gilles.
_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai