On Wed, 7 Jan 2015, Roger Quadros wrote:

> > From: Paul Walmsley <p...@pwsan.com>
> > Date: Mon, 5 Jan 2015 15:49:57 -0700
> > Subject: [PATCH] Only skip ioremap() if IP block does not have OCP header
> >  registers. Experimental.
> > 
> > ---
> >  arch/arm/mach-omap2/omap_hwmod.c | 33 +++++++++++++++++++++------------
> >  1 file changed, 21 insertions(+), 12 deletions(-)
> > 
> > diff --git a/arch/arm/mach-omap2/omap_hwmod.c 
> > b/arch/arm/mach-omap2/omap_hwmod.c
> > index cbb908dc5cf0..03df8833d399 100644
> > --- a/arch/arm/mach-omap2/omap_hwmod.c
> > +++ b/arch/arm/mach-omap2/omap_hwmod.c
> > @@ -1938,6 +1938,8 @@ static int _reset(struct omap_hwmod *oh)
> >     pr_debug("omap_hwmod: %s: resetting\n", oh->name);
> >  
> >     if (oh->class->reset) {
> > +           WARN(!oh->_mpu_rt_va, "Attempt to call custom reset with no MPU 
> > register target ioremapped: %s",
> > +                oh->name);
> 
> Not part of $subject.

Hmm, how do you mean?  If we skip the ioremap(), wouldn't you like to know 
before some custom reset code gets called that pretty much always depends 
on the ioremap() succeeding? :-)

> >             r = oh->class->reset(oh);
> >     } else {
> >             if (oh->rst_lines_cnt > 0) {
> > @@ -2358,15 +2360,19 @@ static int of_dev_hwmod_lookup(struct device_node 
> > *np,
> >  }
> >  
> >  /**
> > - * _init_mpu_rt_base - populate the virtual address for a hwmod
> > + * _init_mpu_rt_base - populate the MPU port and virtual address
> >   * @oh: struct omap_hwmod * to locate the virtual address
> >   * @data: (unused, caller should pass NULL)
> >   * @index: index of the reg entry iospace in device tree
> >   * @np: struct device_node * of the IP block's device node in the DT data
> >   *
> > - * Cache the virtual address used by the MPU to access this IP block's
> > - * registers.  This address is needed early so the OCP registers that
> > - * are part of the device's address space can be ioremapped properly.
> > + * Cache the interconnect target port and the virtual address used by
> > + * the MPU to access this IP block's registers.  The address is needed
> > + * early so the OCP registers that are part of the device's address
> > + * space can be ioremapped properly.  The presence or absence of the
> > + * interconnect target port also indicates whether the hwmod code
> > + * should wait for the IP block to indicate readiness after it is
> > + * enabled.
> >   *
> >   * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and
> >   * -ENXIO on absent or invalid register target address space.
> > @@ -2385,6 +2391,13 @@ static int __init _init_mpu_rt_base(struct 
> > omap_hwmod *oh, void *data,
> >     if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
> >             return -ENXIO;
> >  
> > +   /*
> > +    * If there's no need for the hwmod code to read or write to
> > +    * the IP block registers, bail out early before the ioremap()
> > +    */
> > +   if (!oh->class->sysc)
> > +           return 0;
> > +
> >     mem = _find_mpu_rt_addr_space(oh);
> >     if (!mem) {
> >             pr_debug("omap_hwmod: %s: no MPU register target found\n",
> > @@ -2451,14 +2464,10 @@ static int __init _init(struct omap_hwmod *oh, void 
> > *data)
> >                             oh->name, np->name);
> >     }
> >  
> > -   if (oh->class->sysc) {
> > -           r = _init_mpu_rt_base(oh, NULL, index, np);
> > -           if (r < 0) {
> > -                   WARN(1, "omap_hwmod: %s: doesn't have mpu register 
> > target base\n",
> > -                        oh->name);
> > -                   return 0;
> > -           }
> > -   }
> > +   r = _init_mpu_rt_base(oh, NULL, index, np);
> > +   if (r < 0)
> > +           pr_debug("omap_hwmod: %s: doesn't have mpu register target 
> > base\n",
> > +                    oh->name);
> 
> This is the real piece that fixes the issue.
> 
> >  
> >     r = _init_clocks(oh, NULL);
> >     if (r < 0) {
> > 
> 
> I've tested this patch on am43x-gp-evm, and it seems to fix the issue 
> although with some unpleasant warning messages.

Could you paste those in?


- Paul
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to