On Tue, Nov 18, 2014 at 08:28:46PM +0100, Gilles Chanteperdrix wrote:
> 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 ?

Another thing, what if you remove PM_RUNTIME in the kernel
configuration completely? On my omap3 and omap4 boards, this results
in some stupid warnings at boot time, but the system runs just fine.
And maybe this bypasses all that hwmod awful stuff.

-- 
                                            Gilles.

_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai

Reply via email to