On Thu, Aug 06, 2009 at 02:02:09PM +0200, ext Tony Lindgren wrote:
> * Tony Lindgren <[email protected]> [090806 15:00]:
> > * Eduardo Valentin <[email protected]> [090730 16:01]:
> > > From: Eero Nurkkala <[email protected]>
> > > 
> > > This patch enables the smart idle mode while
> > > McBPS is being utilized. Once it's done,
> > > force idle mode is taken instead. Apart of it,
> > > it also configures what signals will wake mcbsp up.
> > > 
> > > Signed-off-by: Eero Nurkkala <[email protected]>
> > > Signed-off-by: Eduardo Valentin <[email protected]>
> > > ---
> > >  arch/arm/plat-omap/include/mach/mcbsp.h |   17 +++++++++++++++
> > >  arch/arm/plat-omap/mcbsp.c              |   35 
> > > +++++++++++++++++++++++++++++++
> > >  2 files changed, 52 insertions(+), 0 deletions(-)
> > > 
> > > diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h 
> > > b/arch/arm/plat-omap/include/mach/mcbsp.h
> > > index 77191c5..758ad5c 100644
> > > --- a/arch/arm/plat-omap/include/mach/mcbsp.h
> > > +++ b/arch/arm/plat-omap/include/mach/mcbsp.h
> > > @@ -134,6 +134,7 @@
> > >  #define OMAP_MCBSP_REG_XCERG     0x74
> > >  #define OMAP_MCBSP_REG_XCERH     0x78
> > >  #define OMAP_MCBSP_REG_SYSCON    0x8C
> > > +#define OMAP_MCBSP_REG_WAKEUPEN  0xA8
> > >  #define OMAP_MCBSP_REG_XCCR      0xAC
> > >  #define OMAP_MCBSP_REG_RCCR      0xB0
> > >  
> > > @@ -249,8 +250,24 @@
> > >  #define RDISABLE         0x0001
> > >  
> > >  /********************** McBSP SYSCONFIG bit definitions 
> > > ********************/
> > > +#define SIDLEMODE(value) ((value)<<3)
> > > +#define ENAWAKEUP                0x0004
> > >  #define SOFTRST                  0x0002
> > >  
> > > +/********************** McBSP WAKEUPEN bit definitions 
> > > *********************/
> > > +#define XEMPTYEOFEN              0x4000
> > > +#define XRDYEN                   0x0400
> > > +#define XEOFEN                   0x0200
> > > +#define XFSXEN                   0x0100
> > > +#define XSYNCERREN               0x0080
> > > +#define RRDYEN                   0x0008
> > > +#define REOFEN                   0x0004
> > > +#define RFSREN                   0x0002
> > > +#define RSYNCERREN               0x0001
> > > +#define WAKEUPEN_ALL             (XEMPTYEOFEN | XRDYEN | XEOFEN | XFSXEN 
> > > | \
> > > +                          XSYNCERREN | RRDYEN | REOFEN | RFSREN | \
> > > +                          RSYNCERREN)
> > > +
> > >  /* we don't do multichannel for now */
> > >  struct omap_mcbsp_reg_cfg {
> > >   u16 spcr2;
> > > diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
> > > index 84cc323..b64896b 100644
> > > --- a/arch/arm/plat-omap/mcbsp.c
> > > +++ b/arch/arm/plat-omap/mcbsp.c
> > > @@ -257,6 +257,23 @@ int omap_mcbsp_request(unsigned int id)
> > >   clk_enable(mcbsp->iclk);
> > >   clk_enable(mcbsp->fclk);
> > >  
> > > +#ifdef CONFIG_ARCH_OMAP34XX
> > > + /*
> > > +  * Enable wakup behavior, smart idle and all wakeups
> > > +  * REVISIT: some wakeups may be unnecessary
> > > +  */
> > > + if (cpu_is_omap34xx()) {
> > > +         u16 syscon;
> > > +
> > > +         syscon = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
> > > +         syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03));
> > > +         syscon |= (ENAWAKEUP | SIDLEMODE(0x02));
> > > +         OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, syscon);
> > > +
> > > +         OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, WAKEUPEN_ALL);
> > > + }
> > > +#endif
> > > +
> > >   /*
> > >    * Make sure that transmitter, receiver and sample-rate generator are
> > >    * not running before activating IRQs.
> > > @@ -295,6 +312,7 @@ EXPORT_SYMBOL(omap_mcbsp_request);
> > >  void omap_mcbsp_free(unsigned int id)
> > >  {
> > >   struct omap_mcbsp *mcbsp;
> > > + u16 wakeupen;
> > >  
> > >   if (!omap_mcbsp_check_valid_id(id)) {
> > >           printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
> > > @@ -305,6 +323,23 @@ void omap_mcbsp_free(unsigned int id)
> > >   if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
> > >           mcbsp->pdata->ops->free(id);
> > >  
> > > +#ifdef CONFIG_ARCH_OMAP34XX
> > > + /*
> > > +  * Disable wakup behavior, smart idle and all wakeups
> > > +  */
> > > + if (cpu_is_omap34xx()) {
> > > +         u16 syscon;
> > > +
> > > +         syscon = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
> > > +         syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03));
> > > +         OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, syscon);
> > > +
> > > +         wakeupen = OMAP_MCBSP_READ(mcbsp->io_base, WAKEUPEN);
> > > +         wakeupen &= ~WAKEUPEN_ALL;
> > > +         OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, wakeupen);
> > > + }
> > > +#endif
> > > +
> > >   clk_disable(mcbsp->fclk);
> > >   clk_disable(mcbsp->iclk);
> > 
> > Looks like you should not need the ifdefs here, cpu_is_omap34xx() already
> > optimizes the code out if not selected.
> 
> Oops, sorry looks like Jarkko already made the same comment.

Yes, no problem, I'll collect all comments and resend the series in its v2.

The ifdefs are needed because I've enclosed the extra omap3 fields of struct 
omap_mcbsp
inside a ifdef (following patch). And that will rise a compilation error for
other arch's if no ifdefs were put here. But I'll remove the ifdefs from
the struct declaration and leave then as extra bytes for arch != omap3.

>  
> > Regards,
> > 
> > Tony
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> > the body of a message to [email protected]
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Eduardo Valentin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to