RE: [PATCH] OMAP3: Fix McBSP poll read and write for 32bit reg access

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > -----Original Message-----
> > From: linux-omap-owner@xxxxxxxxxxxxxxx
> > [mailto:linux-omap-owner@xxxxxxxxxxxxxxx] On Behalf Of vimal singh
> > Sent: Wednesday, October 14, 2009 3:23 PM
> > To: Varadarajan, Charu Latha
> > Cc: linux-omap@xxxxxxxxxxxxxxx; Syed, Rafiuddin
> > Subject: Re: [PATCH] OMAP3: Fix McBSP poll read and write for
> > 32bit reg access
> >
> > On Wed, Oct 14, 2009 at 3:00 PM,  <charu@xxxxxx> wrote:
> > > omap_mcbsp_pollwrite and omap_mcbsp_pollread functions access
> > > McBSP registers as 16-bit registers.
> > >
> > > The McBSP registers (DRR_REG and DXR_REG) are limited to
> > > 32-bit data accesses (L4 Interconnect). 16-bit and 8-bit is
> > > not allowed and can corrupt register content.
> > >
> > > This patch modifies omap_mcbsp_pollwrite and
> > > omap_mcbsp_pollread functions to do 32 bit access for above
> > > mentioned McBSP registers. Data accepted by these
> > > functions is also modified to 32-bit.
> > >
> > > Signed-off-by: Charulatha V <charu@xxxxxx>
> > > Signed-off-by: Syed Rafiuddin <rafiuddin.syed@xxxxxx>
> > > ---
> > >  arch/arm/plat-omap/include/mach/mcbsp.h |    4 +-
> > >  arch/arm/plat-omap/mcbsp.c              |   46
> > ++++++++++++++-----------------
> > >  2 files changed, 23 insertions(+), 27 deletions(-)
> > >
> > > diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h
> > b/arch/arm/plat-omap/include/mach/mcbsp.h
> > > index 7e9cae3..05b0d8d 100644
> > > --- a/arch/arm/plat-omap/include/mach/mcbsp.h
> > > +++ b/arch/arm/plat-omap/include/mach/mcbsp.h
> > > @@ -455,8 +455,8 @@ int
> > omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word);
> > >  void omap_mcbsp_set_spi_mode(unsigned int id, const struct
> > omap_mcbsp_spi_cfg * spi_cfg);
> > >
> > >  /* Polled read/write functions */
> > > -int omap_mcbsp_pollread(unsigned int id, u16 * buf);
> > > -int omap_mcbsp_pollwrite(unsigned int id, u16 buf);
> > > +int omap_mcbsp_pollread(unsigned int id, u32 *buf);
> > > +int omap_mcbsp_pollwrite(unsigned int id, u32 buf);
> > >  int omap_mcbsp_set_io_type(unsigned int id,
> > omap_mcbsp_io_type_t io_type);
> > >
> > >  #endif
> > > diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
> > > index 88ac976..1f278a2 100644
> > > --- a/arch/arm/plat-omap/mcbsp.c
> > > +++ b/arch/arm/plat-omap/mcbsp.c
> > > @@ -613,7 +613,7 @@ void omap_mcbsp_stop(unsigned int id,
> > int tx, int rx)
> > >  EXPORT_SYMBOL(omap_mcbsp_stop);
> > >
> > >  /* polled mcbsp i/o operations */
> > > -int omap_mcbsp_pollwrite(unsigned int id, u16 buf)
> > > +int omap_mcbsp_pollwrite(unsigned int id, u32 buf)
> > >  {
> > >        struct omap_mcbsp *mcbsp;
> > >        void __iomem *base;
> > > @@ -626,26 +626,24 @@ int omap_mcbsp_pollwrite(unsigned int
> > id, u16 buf)
> > >        mcbsp = id_to_mcbsp_ptr(id);
> > >        base = mcbsp->io_base;
> > >
> > > -       writew(buf, base + OMAP_MCBSP_REG_DXR1);
> > > +       OMAP_MCBSP_WRITE(base, DXR, buf);
> > >        /* if frame sync error - clear the error */
> > > -       if (readw(base + OMAP_MCBSP_REG_SPCR2) & XSYNC_ERR) {
> > > +       if (OMAP_MCBSP_READ(base, SPCR2) & XSYNC_ERR) {
> > >                /* clear error */
> > > -               writew(readw(base + OMAP_MCBSP_REG_SPCR2) &
> > (~XSYNC_ERR),
> > > -                      base + OMAP_MCBSP_REG_SPCR2);
> > > +               OMAP_MCBSP_WRITE(base, SPCR2,
> > OMAP_MCBSP_READ(base , SPCR2)
> >
> > remove extra space: 'base ,'
> > checkpatch.pl should catch these kind of issues.
checkpatch.pl has not captured this error....
Anyways, I will modify the same in my next version of patch
> >
> > -vimal
> >
> > > +                                       & (~XSYNC_ERR));
> > >                /* resend */
> > >                return -1;
> > >        } else {
> > >                /* wait for transmit confirmation */
> > >                int attemps = 0;
> > > -               while (!(readw(base + OMAP_MCBSP_REG_SPCR2)
> > & XRDY)) {
> > > +               while (!(OMAP_MCBSP_READ(base, SPCR2) & XRDY)) {
> > >                        if (attemps++ > 1000) {
> > > -                               writew(readw(base +
> > OMAP_MCBSP_REG_SPCR2) &
> > > -                                      (~XRST),
> > > -                                      base + OMAP_MCBSP_REG_SPCR2);
> > > +                               OMAP_MCBSP_WRITE(base, SPCR2,
> > > +
> > OMAP_MCBSP_READ(base, SPCR2) & (~XRST));
> > >                                udelay(10);
> > > -                               writew(readw(base +
> > OMAP_MCBSP_REG_SPCR2) |
> > > -                                      (XRST),
> > > -                                      base + OMAP_MCBSP_REG_SPCR2);
> > > +                               OMAP_MCBSP_WRITE(base, SPCR2,
> > > +
> > OMAP_MCBSP_READ(base, SPCR2) | (XRST));
> > >                                udelay(10);
> > >                                dev_err(mcbsp->dev, "Could
> > not write to"
> > >                                        " McBSP%d
> > Register\n", mcbsp->id);
> > > @@ -658,7 +656,7 @@ int omap_mcbsp_pollwrite(unsigned int
> > id, u16 buf)
> > >  }
> > >  EXPORT_SYMBOL(omap_mcbsp_pollwrite);
> > >
> > > -int omap_mcbsp_pollread(unsigned int id, u16 *buf)
> > > +int omap_mcbsp_pollread(unsigned int id, u32 *buf)
> > >  {
> > >        struct omap_mcbsp *mcbsp;
> > >        void __iomem *base;
> > > @@ -671,24 +669,22 @@ int omap_mcbsp_pollread(unsigned int
> > id, u16 *buf)
> > >
> > >        base = mcbsp->io_base;
> > >        /* if frame sync error - clear the error */
> > > -       if (readw(base + OMAP_MCBSP_REG_SPCR1) & RSYNC_ERR) {
> > > +       if (OMAP_MCBSP_READ(base, SPCR1) & RSYNC_ERR) {
> > >                /* clear error */
> > > -               writew(readw(base + OMAP_MCBSP_REG_SPCR1) &
> > (~RSYNC_ERR),
> > > -                      base + OMAP_MCBSP_REG_SPCR1);
> > > +               OMAP_MCBSP_WRITE(base, SPCR1,
> > OMAP_MCBSP_READ(base, SPCR1)
> > > +                                       & (~RSYNC_ERR));
> > >                /* resend */
> > >                return -1;
> > >        } else {
> > >                /* wait for recieve confirmation */
> > >                int attemps = 0;
> > > -               while (!(readw(base + OMAP_MCBSP_REG_SPCR1)
> > & RRDY)) {
> > > -                       if (attemps++ > 1000) {
> > > -                               writew(readw(base +
> > OMAP_MCBSP_REG_SPCR1) &
> > > -                                      (~RRST),
> > > -                                      base + OMAP_MCBSP_REG_SPCR1);
> > > +               while (!(OMAP_MCBSP_READ(base, SPCR1) & RRDY)) {
> > > +                       if (attemps++ > 10000) {
> > > +                               OMAP_MCBSP_WRITE(base, SPCR1,
> > > +
> > OMAP_MCBSP_READ(base, SPCR1) & (~RRST));
> > >                                udelay(10);
> > > -                               writew(readw(base +
> > OMAP_MCBSP_REG_SPCR1) |
> > > -                                      (RRST),
> > > -                                      base + OMAP_MCBSP_REG_SPCR1);
> > > +                               OMAP_MCBSP_WRITE(base, SPCR1,
> > > +
> > OMAP_MCBSP_READ(base, SPCR1) | (RRST));
> > >                                udelay(10);
> > >                                dev_err(mcbsp->dev, "Could
> > not read from"
> > >                                        " McBSP%d
> > Register\n", mcbsp->id);
> > > @@ -696,7 +692,7 @@ int omap_mcbsp_pollread(unsigned int
> > id, u16 *buf)
> > >                        }
> > >                }
> > >        }
> > > -       *buf = readw(base + OMAP_MCBSP_REG_DRR1);
> > > +       *buf = OMAP_MCBSP_READ(base, DRR);
> > >
> > >        return 0;
> > >  }
> > > --
> > > 1.6.0.4
> > >
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux