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]

 



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.

-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
>



-- 
Regards,
Vimal Singh
--
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