* chandra shekhar <[EMAIL PROTECTED]> [080625 18:02]:
> From: chandra shekhar [EMAIL PROTECTED]
> 
> This patch provides dynamic allocation for mcbsp device.
> no. of  mcbsp for each cpu is determined at runtime and accordingly memory is
> allocated. id check macro definition has been changed.

Pushing today.

Tony


> Signed-off-by:  chandra shekhar [EMAIL PROTECTED]
> ---
>  arch/arm/mach-omap1/mcbsp.c       |   37 +--
>  arch/arm/mach-omap2/mcbsp.c       |   21 +-
>  arch/arm/plat-omap/devices.c      |    7
>  arch/arm/plat-omap/mcbsp.c        |  359 
> +++++++++++++++++++++-----------------
>  include/asm-arm/arch-omap/mcbsp.h |    9
>  5 files changed, 224 insertions(+), 209 deletions(-)
> 
> Index: linux-omap-2.6/arch/arm/mach-omap1/mcbsp.c
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/mach-omap1/mcbsp.c   2008-06-25
> 15:54:04.000000000 +0530
> +++ linux-omap-2.6/arch/arm/mach-omap1/mcbsp.c        2008-06-25 
> 19:57:26.000000000 +0530
> @@ -103,30 +103,6 @@
>  { }
>  #endif
> 
> -static int omap1_mcbsp_check(unsigned int id)
> -{
> -     /* REVISIT: Check correctly for number of registered McBSPs */
> -     if (cpu_is_omap730()) {
> -             if (id > OMAP_MAX_MCBSP_COUNT - 2) {
> -                    printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n",
> -                             id + 1);
> -                    return -ENODEV;
> -             }
> -             return 0;
> -     }
> -
> -     if (cpu_is_omap15xx() || cpu_is_omap16xx()) {
> -             if (id > OMAP_MAX_MCBSP_COUNT - 1) {
> -                     printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n",
> -                             id + 1);
> -                     return -ENODEV;
> -             }
> -             return 0;
> -     }
> -
> -     return -ENODEV;
> -}
> -
>  static void omap1_mcbsp_request(unsigned int id)
>  {
>       /*
> @@ -151,7 +127,6 @@
>  }
> 
>  static struct omap_mcbsp_ops omap1_mcbsp_ops = {
> -     .check          = omap1_mcbsp_check,
>       .request        = omap1_mcbsp_request,
>       .free           = omap1_mcbsp_free,
>  };
> @@ -263,6 +238,18 @@
>       }
> 
>       if (cpu_is_omap730())
> +             omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
> +     if (cpu_is_omap15xx())
> +             omap_mcbsp_count = OMAP15XX_MCBSP_PDATA_SZ;
> +     if (cpu_is_omap16xx())
> +             omap_mcbsp_count = OMAP16XX_MCBSP_PDATA_SZ;
> +
> +     mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
> +                                                             GFP_KERNEL);
> +     if (!mcbsp_ptr)
> +             return -ENOMEM;
> +
> +     if (cpu_is_omap730())
>               omap_mcbsp_register_board_cfg(omap730_mcbsp_pdata,
>                                               OMAP730_MCBSP_PDATA_SZ);
> 
> Index: linux-omap-2.6/arch/arm/mach-omap2/mcbsp.c
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/mach-omap2/mcbsp.c   2008-06-25
> 15:54:04.000000000 +0530
> +++ linux-omap-2.6/arch/arm/mach-omap2/mcbsp.c        2008-06-25 
> 19:56:14.000000000 +0530
> @@ -117,18 +117,8 @@
>               omap2_mcbsp2_mux_setup();
>  }
> 
> -static int omap2_mcbsp_check(unsigned int id)
> -{
> -     if (id > OMAP_MAX_MCBSP_COUNT - 1) {
> -             printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n", id + 1);
> -             return -ENODEV;
> -     }
> -     return 0;
> -}
> -
>  static struct omap_mcbsp_ops omap2_mcbsp_ops = {
>       .request        = omap2_mcbsp_request,
> -     .check          = omap2_mcbsp_check,
>  };
> 
>  #ifdef CONFIG_ARCH_OMAP24XX
> @@ -196,9 +186,18 @@
>       }
> 
>       if (cpu_is_omap24xx())
> +             omap_mcbsp_count = OMAP24XX_MCBSP_PDATA_SZ;
> +     if (cpu_is_omap34xx())
> +             omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ;
> +
> +     mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
> +                                                             GFP_KERNEL);
> +     if (!mcbsp_ptr)
> +             return -ENOMEM;
> +
> +     if (cpu_is_omap24xx())
>               omap_mcbsp_register_board_cfg(omap24xx_mcbsp_pdata,
>                                               OMAP24XX_MCBSP_PDATA_SZ);
> -
>       if (cpu_is_omap34xx())
>               omap_mcbsp_register_board_cfg(omap34xx_mcbsp_pdata,
>                                               OMAP34XX_MCBSP_PDATA_SZ);
> Index: linux-omap-2.6/arch/arm/plat-omap/devices.c
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/plat-omap/devices.c  2008-06-25
> 15:55:06.000000000 +0530
> +++ linux-omap-2.6/arch/arm/plat-omap/devices.c       2008-06-25 
> 15:55:52.000000000
> +0530
> @@ -160,13 +160,6 @@
>  {
>       int i;
> 
> -     if (size > OMAP_MAX_MCBSP_COUNT) {
> -             printk(KERN_WARNING "Registered too many McBSPs platform_data."
> -                     " Using maximum (%d) available.\n",
> -                     OMAP_MAX_MCBSP_COUNT);
> -             size = OMAP_MAX_MCBSP_COUNT;
> -     }
> -
>       omap_mcbsp_devices = kzalloc(size * sizeof(struct platform_device *),
>                                                               GFP_KERNEL);
>       if (!omap_mcbsp_devices) {
> Index: linux-omap-2.6/arch/arm/plat-omap/mcbsp.c
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/plat-omap/mcbsp.c    2008-06-25
> 15:54:04.000000000 +0530
> +++ linux-omap-2.6/arch/arm/plat-omap/mcbsp.c 2008-06-25 19:24:06.000000000 
> +0530
> @@ -28,43 +28,44 @@
>  #include <asm/arch/dma.h>
>  #include <asm/arch/mcbsp.h>
> 
> -static struct omap_mcbsp mcbsp[OMAP_MAX_MCBSP_COUNT];
> +struct omap_mcbsp **mcbsp_ptr;
> +int omap_mcbsp_count;
> 
> -#define omap_mcbsp_check_valid_id(id)        (mcbsp[id].pdata && \
> -                                     mcbsp[id].pdata->ops && \
> -                                     mcbsp[id].pdata->ops->check && \
> -                                     (mcbsp[id].pdata->ops->check(id) == 0))
> +#define omap_mcbsp_check_valid_id(id)        (id < omap_mcbsp_count)
> +#define id_to_mcbsp_ptr(id)                  mcbsp_ptr[id];
> 
>  static void omap_mcbsp_dump_reg(u8 id)
>  {
> -     dev_dbg(mcbsp[id].dev, "**** McBSP%d regs ****\n", mcbsp[id].id);
> -     dev_dbg(mcbsp[id].dev, "DRR2:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, DRR2));
> -     dev_dbg(mcbsp[id].dev, "DRR1:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, DRR1));
> -     dev_dbg(mcbsp[id].dev, "DXR2:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, DXR2));
> -     dev_dbg(mcbsp[id].dev, "DXR1:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, DXR1));
> -     dev_dbg(mcbsp[id].dev, "SPCR2: 0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, SPCR2));
> -     dev_dbg(mcbsp[id].dev, "SPCR1: 0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, SPCR1));
> -     dev_dbg(mcbsp[id].dev, "RCR2:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, RCR2));
> -     dev_dbg(mcbsp[id].dev, "RCR1:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, RCR1));
> -     dev_dbg(mcbsp[id].dev, "XCR2:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, XCR2));
> -     dev_dbg(mcbsp[id].dev, "XCR1:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, XCR1));
> -     dev_dbg(mcbsp[id].dev, "SRGR2: 0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, SRGR2));
> -     dev_dbg(mcbsp[id].dev, "SRGR1: 0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, SRGR1));
> -     dev_dbg(mcbsp[id].dev, "PCR0:  0x%04x\n",
> -                     OMAP_MCBSP_READ(mcbsp[id].io_base, PCR0));
> -     dev_dbg(mcbsp[id].dev, "***********************\n");
> +     struct omap_mcbsp *mcbsp = id_to_mcbsp_ptr(id);
> +
> +     dev_dbg(mcbsp->dev, "**** McBSP%d regs ****\n", mcbsp->id);
> +     dev_dbg(mcbsp->dev, "DRR2:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, DRR2));
> +     dev_dbg(mcbsp->dev, "DRR1:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, DRR1));
> +     dev_dbg(mcbsp->dev, "DXR2:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, DXR2));
> +     dev_dbg(mcbsp->dev, "DXR1:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, DXR1));
> +     dev_dbg(mcbsp->dev, "SPCR2: 0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, SPCR2));
> +     dev_dbg(mcbsp->dev, "SPCR1: 0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, SPCR1));
> +     dev_dbg(mcbsp->dev, "RCR2:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, RCR2));
> +     dev_dbg(mcbsp->dev, "RCR1:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, RCR1));
> +     dev_dbg(mcbsp->dev, "XCR2:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, XCR2));
> +     dev_dbg(mcbsp->dev, "XCR1:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, XCR1));
> +     dev_dbg(mcbsp->dev, "SRGR2: 0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, SRGR2));
> +     dev_dbg(mcbsp->dev, "SRGR1: 0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, SRGR1));
> +     dev_dbg(mcbsp->dev, "PCR0:  0x%04x\n",
> +                     OMAP_MCBSP_READ(mcbsp->io_base, PCR0));
> +     dev_dbg(mcbsp->dev, "***********************\n");
>  }
> 
>  static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id)
> @@ -127,16 +128,18 @@
>   */
>  void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg 
> *config)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base;
> 
>       if (!omap_mcbsp_check_valid_id(id)) {
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     io_base = mcbsp[id].io_base;
> -     dev_dbg(mcbsp[id].dev, "Configuring McBSP%d  io_base: 0x%8x\n",
> -                     mcbsp[id].id, io_base);
> +     io_base = mcbsp->io_base;
> +     dev_dbg(mcbsp->dev, "Configuring McBSP%d  io_base: 0x%8x\n",
> +                     mcbsp->id, io_base);
> 
>       /* We write the given config */
>       OMAP_MCBSP_WRITE(io_base, SPCR2, config->spcr2);
> @@ -159,23 +162,26 @@
>   */
>  int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type)
>  {
> +     struct omap_mcbsp *mcbsp;
> +
>       if (!omap_mcbsp_check_valid_id(id)) {
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     spin_lock(&mcbsp[id].lock);
> +     spin_lock(&mcbsp->lock);
> 
> -     if (!mcbsp[id].free) {
> -             dev_err(mcbsp[id].dev, "McBSP%d is currently in use\n",
> -                     mcbsp[id].id);
> -             spin_unlock(&mcbsp[id].lock);
> +     if (!mcbsp->free) {
> +             dev_err(mcbsp->dev, "McBSP%d is currently in use\n",
> +                     mcbsp->id);
> +             spin_unlock(&mcbsp->lock);
>               return -EINVAL;
>       }
> 
> -     mcbsp[id].io_type = io_type;
> +     mcbsp->io_type = io_type;
> 
> -     spin_unlock(&mcbsp[id].lock);
> +     spin_unlock(&mcbsp->lock);
> 
>       return 0;
>  }
> @@ -183,53 +189,55 @@
> 
>  int omap_mcbsp_request(unsigned int id)
>  {
> +     struct omap_mcbsp *mcbsp;
>       int err;
> 
>       if (!omap_mcbsp_check_valid_id(id)) {
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     if (mcbsp[id].pdata->ops->request)
> -             mcbsp[id].pdata->ops->request(id);
> +     if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
> +             mcbsp->pdata->ops->request(id);
> 
> -     clk_enable(mcbsp[id].clk);
> +     clk_enable(mcbsp->clk);
> 
> -     spin_lock(&mcbsp[id].lock);
> -     if (!mcbsp[id].free) {
> -             dev_err(mcbsp[id].dev, "McBSP%d is currently in use\n",
> -                     mcbsp[id].id);
> -             spin_unlock(&mcbsp[id].lock);
> +     spin_lock(&mcbsp->lock);
> +     if (!mcbsp->free) {
> +             dev_err(mcbsp->dev, "McBSP%d is currently in use\n",
> +                     mcbsp->id);
> +             spin_unlock(&mcbsp->lock);
>               return -1;
>       }
> 
> -     mcbsp[id].free = 0;
> -     spin_unlock(&mcbsp[id].lock);
> +     mcbsp->free = 0;
> +     spin_unlock(&mcbsp->lock);
> 
> -     if (mcbsp[id].io_type == OMAP_MCBSP_IRQ_IO) {
> +     if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
>               /* We need to get IRQs here */
> -             err = request_irq(mcbsp[id].tx_irq, omap_mcbsp_tx_irq_handler,
> -                                     0, "McBSP", (void *) (&mcbsp[id]));
> +             err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler,
> +                                     0, "McBSP", (void *)mcbsp);
>               if (err != 0) {
> -                     dev_err(mcbsp[id].dev, "Unable to request TX IRQ %d "
> -                                     "for McBSP%d\n", mcbsp[id].tx_irq,
> -                                     mcbsp[id].id);
> +                     dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
> +                                     "for McBSP%d\n", mcbsp->tx_irq,
> +                                     mcbsp->id);
>                       return err;
>               }
> 
> -             init_completion(&(mcbsp[id].tx_irq_completion));
> +             init_completion(&mcbsp->tx_irq_completion);
> 
> -             err = request_irq(mcbsp[id].rx_irq, omap_mcbsp_rx_irq_handler,
> -                                     0, "McBSP", (void *) (&mcbsp[id]));
> +             err = request_irq(mcbsp->rx_irq, omap_mcbsp_rx_irq_handler,
> +                                     0, "McBSP", (void *)mcbsp);
>               if (err != 0) {
> -                     dev_err(mcbsp[id].dev, "Unable to request RX IRQ %d "
> -                                     "for McBSP%d\n", mcbsp[id].rx_irq,
> -                                     mcbsp[id].id);
> -                     free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id]));
> +                     dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
> +                                     "for McBSP%d\n", mcbsp->rx_irq,
> +                                     mcbsp->id);
> +                     free_irq(mcbsp->tx_irq, (void *)mcbsp);
>                       return err;
>               }
> 
> -             init_completion(&(mcbsp[id].rx_irq_completion));
> +             init_completion(&mcbsp->rx_irq_completion);
>       }
> 
>       return 0;
> @@ -238,31 +246,34 @@
> 
>  void omap_mcbsp_free(unsigned int id)
>  {
> +     struct omap_mcbsp *mcbsp;
> +
>       if (!omap_mcbsp_check_valid_id(id)) {
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     if (mcbsp[id].pdata->ops->free)
> -             mcbsp[id].pdata->ops->free(id);
> +     if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
> +             mcbsp->pdata->ops->free(id);
> 
> -     clk_disable(mcbsp[id].clk);
> +     clk_disable(mcbsp->clk);
> 
> -     spin_lock(&mcbsp[id].lock);
> -     if (mcbsp[id].free) {
> -             dev_err(mcbsp[id].dev, "McBSP%d was not reserved\n",
> -                     mcbsp[id].id);
> -             spin_unlock(&mcbsp[id].lock);
> +     spin_lock(&mcbsp->lock);
> +     if (mcbsp->free) {
> +             dev_err(mcbsp->dev, "McBSP%d was not reserved\n",
> +                     mcbsp->id);
> +             spin_unlock(&mcbsp->lock);
>               return;
>       }
> 
> -     mcbsp[id].free = 1;
> -     spin_unlock(&mcbsp[id].lock);
> +     mcbsp->free = 1;
> +     spin_unlock(&mcbsp->lock);
> 
> -     if (mcbsp[id].io_type == OMAP_MCBSP_IRQ_IO) {
> +     if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
>               /* Free IRQs */
> -             free_irq(mcbsp[id].rx_irq, (void *) (&mcbsp[id]));
> -             free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id]));
> +             free_irq(mcbsp->rx_irq, (void *)mcbsp);
> +             free_irq(mcbsp->tx_irq, (void *)mcbsp);
>       }
>  }
>  EXPORT_SYMBOL(omap_mcbsp_free);
> @@ -274,6 +285,7 @@
>   */
>  void omap_mcbsp_start(unsigned int id)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base;
>       u16 w;
> 
> @@ -281,11 +293,11 @@
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> +     io_base = mcbsp->io_base;
> 
> -     io_base = mcbsp[id].io_base;
> -
> -     mcbsp[id].rx_word_length = (OMAP_MCBSP_READ(io_base, RCR1) >> 5) & 0x7;
> -     mcbsp[id].tx_word_length = (OMAP_MCBSP_READ(io_base, XCR1) >> 5) & 0x7;
> +     mcbsp->rx_word_length = (OMAP_MCBSP_READ(io_base, RCR1) >> 5) & 0x7;
> +     mcbsp->tx_word_length = (OMAP_MCBSP_READ(io_base, XCR1) >> 5) & 0x7;
> 
>       /* Start the sample generator */
>       w = OMAP_MCBSP_READ(io_base, SPCR2);
> @@ -311,6 +323,7 @@
> 
>  void omap_mcbsp_stop(unsigned int id)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base;
>       u16 w;
> 
> @@ -319,7 +332,8 @@
>               return;
>       }
> 
> -     io_base = mcbsp[id].io_base;
> +     mcbsp = id_to_mcbsp_ptr(id);
> +     io_base = mcbsp->io_base;
> 
>       /* Reset transmitter */
>       w = OMAP_MCBSP_READ(io_base, SPCR2);
> @@ -338,6 +352,7 @@
>  /* polled mcbsp i/o operations */
>  int omap_mcbsp_pollwrite(unsigned int id, u16 buf)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 base;
> 
>       if (!omap_mcbsp_check_valid_id(id)) {
> @@ -345,7 +360,9 @@
>               return -ENODEV;
>       }
> 
> -     base = mcbsp[id].io_base;
> +     mcbsp = id_to_mcbsp_ptr(id);
> +     base = mcbsp->io_base;
> +
>       writew(buf, base + OMAP_MCBSP_REG_DXR1);
>       /* if frame sync error - clear the error */
>       if (readw(base + OMAP_MCBSP_REG_SPCR2) & XSYNC_ERR) {
> @@ -367,8 +384,8 @@
>                                      (XRST),
>                                      base + OMAP_MCBSP_REG_SPCR2);
>                               udelay(10);
> -                             dev_err(mcbsp[id].dev, "Could not write to"
> -                                     " McBSP%d Register\n", mcbsp[id].id);
> +                             dev_err(mcbsp->dev, "Could not write to"
> +                                     " McBSP%d Register\n", mcbsp->id);
>                               return -2;
>                       }
>               }
> @@ -380,14 +397,16 @@
> 
>  int omap_mcbsp_pollread(unsigned int id, u16 *buf)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 base;
> 
>       if (!omap_mcbsp_check_valid_id(id)) {
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     base = mcbsp[id].io_base;
> +     base = mcbsp->io_base;
>       /* if frame sync error - clear the error */
>       if (readw(base + OMAP_MCBSP_REG_SPCR1) & RSYNC_ERR) {
>               /* clear error */
> @@ -408,8 +427,8 @@
>                                      (RRST),
>                                      base + OMAP_MCBSP_REG_SPCR1);
>                               udelay(10);
> -                             dev_err(mcbsp[id].dev, "Could not read from"
> -                                     " McBSP%d Register\n", mcbsp[id].id);
> +                             dev_err(mcbsp->dev, "Could not read from"
> +                                     " McBSP%d Register\n", mcbsp->id);
>                               return -2;
>                       }
>               }
> @@ -425,6 +444,7 @@
>   */
>  void omap_mcbsp_xmit_word(unsigned int id, u32 word)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base;
>       omap_mcbsp_word_length word_length;
> 
> @@ -433,10 +453,11 @@
>               return;
>       }
> 
> -     io_base = mcbsp[id].io_base;
> -     word_length = mcbsp[id].tx_word_length;
> +     mcbsp = id_to_mcbsp_ptr(id);
> +     io_base = mcbsp->io_base;
> +     word_length = mcbsp->tx_word_length;
> 
> -     wait_for_completion(&(mcbsp[id].tx_irq_completion));
> +     wait_for_completion(&mcbsp->tx_irq_completion);
> 
>       if (word_length > OMAP_MCBSP_WORD_16)
>               OMAP_MCBSP_WRITE(io_base, DXR2, word >> 16);
> @@ -446,6 +467,7 @@
> 
>  u32 omap_mcbsp_recv_word(unsigned int id)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base;
>       u16 word_lsb, word_msb = 0;
>       omap_mcbsp_word_length word_length;
> @@ -454,11 +476,12 @@
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     word_length = mcbsp[id].rx_word_length;
> -     io_base = mcbsp[id].io_base;
> +     word_length = mcbsp->rx_word_length;
> +     io_base = mcbsp->io_base;
> 
> -     wait_for_completion(&(mcbsp[id].rx_irq_completion));
> +     wait_for_completion(&mcbsp->rx_irq_completion);
> 
>       if (word_length > OMAP_MCBSP_WORD_16)
>               word_msb = OMAP_MCBSP_READ(io_base, DRR2);
> @@ -470,6 +493,7 @@
> 
>  int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base;
>       omap_mcbsp_word_length tx_word_length;
>       omap_mcbsp_word_length rx_word_length;
> @@ -479,10 +503,10 @@
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> -
> -     io_base = mcbsp[id].io_base;
> -     tx_word_length = mcbsp[id].tx_word_length;
> -     rx_word_length = mcbsp[id].rx_word_length;
> +     mcbsp = id_to_mcbsp_ptr(id);
> +     io_base = mcbsp->io_base;
> +     tx_word_length = mcbsp->tx_word_length;
> +     rx_word_length = mcbsp->rx_word_length;
> 
>       if (tx_word_length != rx_word_length)
>               return -EINVAL;
> @@ -497,8 +521,8 @@
>                       udelay(10);
>                       OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 | XRST);
>                       udelay(10);
> -                     dev_err(mcbsp[id].dev, "McBSP%d transmitter not "
> -                             "ready\n", mcbsp[id].id);
> +                     dev_err(mcbsp->dev, "McBSP%d transmitter not "
> +                             "ready\n", mcbsp->id);
>                       return -EAGAIN;
>               }
>       }
> @@ -518,8 +542,8 @@
>                       udelay(10);
>                       OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 | RRST);
>                       udelay(10);
> -                     dev_err(mcbsp[id].dev, "McBSP%d receiver not "
> -                             "ready\n", mcbsp[id].id);
> +                     dev_err(mcbsp->dev, "McBSP%d receiver not "
> +                             "ready\n", mcbsp->id);
>                       return -EAGAIN;
>               }
>       }
> @@ -535,6 +559,7 @@
> 
>  int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
>  {
> +     struct omap_mcbsp *mcbsp;
>       u32 io_base, clock_word = 0;
>       omap_mcbsp_word_length tx_word_length;
>       omap_mcbsp_word_length rx_word_length;
> @@ -545,9 +570,11 @@
>               return -ENODEV;
>       }
> 
> -     io_base = mcbsp[id].io_base;
> -     tx_word_length = mcbsp[id].tx_word_length;
> -     rx_word_length = mcbsp[id].rx_word_length;
> +     mcbsp = id_to_mcbsp_ptr(id);
> +     io_base = mcbsp->io_base;
> +
> +     tx_word_length = mcbsp->tx_word_length;
> +     rx_word_length = mcbsp->rx_word_length;
> 
>       if (tx_word_length != rx_word_length)
>               return -EINVAL;
> @@ -562,8 +589,8 @@
>                       udelay(10);
>                       OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 | XRST);
>                       udelay(10);
> -                     dev_err(mcbsp[id].dev, "McBSP%d transmitter not "
> -                             "ready\n", mcbsp[id].id);
> +                     dev_err(mcbsp->dev, "McBSP%d transmitter not "
> +                             "ready\n", mcbsp->id);
>                       return -EAGAIN;
>               }
>       }
> @@ -583,8 +610,8 @@
>                       udelay(10);
>                       OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 | RRST);
>                       udelay(10);
> -                     dev_err(mcbsp[id].dev, "McBSP%d receiver not "
> -                             "ready\n", mcbsp[id].id);
> +                     dev_err(mcbsp->dev, "McBSP%d receiver not "
> +                             "ready\n", mcbsp->id);
>                       return -EAGAIN;
>               }
>       }
> @@ -610,6 +637,7 @@
>  int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer,
>                               unsigned int length)
>  {
> +     struct omap_mcbsp *mcbsp;
>       int dma_tx_ch;
>       int src_port = 0;
>       int dest_port = 0;
> @@ -619,50 +647,51 @@
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     if (omap_request_dma(mcbsp[id].dma_tx_sync, "McBSP TX",
> +     if (omap_request_dma(mcbsp->dma_tx_sync, "McBSP TX",
>                               omap_mcbsp_tx_dma_callback,
> -                             &mcbsp[id],
> +                             mcbsp,
>                               &dma_tx_ch)) {
> -             dev_err(mcbsp[id].dev, " Unable to request DMA channel for "
> +             dev_err(mcbsp->dev, " Unable to request DMA channel for "
>                               "McBSP%d TX. Trying IRQ based TX\n",
> -                             mcbsp[id].id);
> +                             mcbsp->id);
>               return -EAGAIN;
>       }
> -     mcbsp[id].dma_tx_lch = dma_tx_ch;
> +     mcbsp->dma_tx_lch = dma_tx_ch;
> 
> -     dev_err(mcbsp[id].dev, "McBSP%d TX DMA on channel %d\n", mcbsp[id].id,
> +     dev_err(mcbsp->dev, "McBSP%d TX DMA on channel %d\n", mcbsp->id,
>               dma_tx_ch);
> 
> -     init_completion(&(mcbsp[id].tx_dma_completion));
> +     init_completion(&mcbsp->tx_dma_completion);
> 
>       if (cpu_class_is_omap1()) {
>               src_port = OMAP_DMA_PORT_TIPB;
>               dest_port = OMAP_DMA_PORT_EMIFF;
>       }
>       if (cpu_class_is_omap2())
> -             sync_dev = mcbsp[id].dma_tx_sync;
> +             sync_dev = mcbsp->dma_tx_sync;
> 
> -     omap_set_dma_transfer_params(mcbsp[id].dma_tx_lch,
> +     omap_set_dma_transfer_params(mcbsp->dma_tx_lch,
>                                    OMAP_DMA_DATA_TYPE_S16,
>                                    length >> 1, 1,
>                                    OMAP_DMA_SYNC_ELEMENT,
>        sync_dev, 0);
> 
> -     omap_set_dma_dest_params(mcbsp[id].dma_tx_lch,
> +     omap_set_dma_dest_params(mcbsp->dma_tx_lch,
>                                src_port,
>                                OMAP_DMA_AMODE_CONSTANT,
> -                              mcbsp[id].io_base + OMAP_MCBSP_REG_DXR1,
> +                              mcbsp->io_base + OMAP_MCBSP_REG_DXR1,
>                                0, 0);
> 
> -     omap_set_dma_src_params(mcbsp[id].dma_tx_lch,
> +     omap_set_dma_src_params(mcbsp->dma_tx_lch,
>                               dest_port,
>                               OMAP_DMA_AMODE_POST_INC,
>                               buffer,
>                               0, 0);
> 
> -     omap_start_dma(mcbsp[id].dma_tx_lch);
> -     wait_for_completion(&(mcbsp[id].tx_dma_completion));
> +     omap_start_dma(mcbsp->dma_tx_lch);
> +     wait_for_completion(&mcbsp->tx_dma_completion);
> 
>       return 0;
>  }
> @@ -671,6 +700,7 @@
>  int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer,
>                               unsigned int length)
>  {
> +     struct omap_mcbsp *mcbsp;
>       int dma_rx_ch;
>       int src_port = 0;
>       int dest_port = 0;
> @@ -680,50 +710,51 @@
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return -ENODEV;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
> -     if (omap_request_dma(mcbsp[id].dma_rx_sync, "McBSP RX",
> +     if (omap_request_dma(mcbsp->dma_rx_sync, "McBSP RX",
>                               omap_mcbsp_rx_dma_callback,
> -                             &mcbsp[id],
> +                             mcbsp,
>                               &dma_rx_ch)) {
> -             dev_err(mcbsp[id].dev, "Unable to request DMA channel for "
> +             dev_err(mcbsp->dev, "Unable to request DMA channel for "
>                               "McBSP%d RX. Trying IRQ based RX\n",
> -                             mcbsp[id].id);
> +                             mcbsp->id);
>               return -EAGAIN;
>       }
> -     mcbsp[id].dma_rx_lch = dma_rx_ch;
> +     mcbsp->dma_rx_lch = dma_rx_ch;
> 
> -     dev_err(mcbsp[id].dev, "McBSP%d RX DMA on channel %d\n", mcbsp[id].id,
> +     dev_err(mcbsp->dev, "McBSP%d RX DMA on channel %d\n", mcbsp->id,
>               dma_rx_ch);
> 
> -     init_completion(&(mcbsp[id].rx_dma_completion));
> +     init_completion(&mcbsp->rx_dma_completion);
> 
>       if (cpu_class_is_omap1()) {
>               src_port = OMAP_DMA_PORT_TIPB;
>               dest_port = OMAP_DMA_PORT_EMIFF;
>       }
>       if (cpu_class_is_omap2())
> -             sync_dev = mcbsp[id].dma_rx_sync;
> +             sync_dev = mcbsp->dma_rx_sync;
> 
> -     omap_set_dma_transfer_params(mcbsp[id].dma_rx_lch,
> +     omap_set_dma_transfer_params(mcbsp->dma_rx_lch,
>                                       OMAP_DMA_DATA_TYPE_S16,
>                                       length >> 1, 1,
>                                       OMAP_DMA_SYNC_ELEMENT,
>                                       sync_dev, 0);
> 
> -     omap_set_dma_src_params(mcbsp[id].dma_rx_lch,
> +     omap_set_dma_src_params(mcbsp->dma_rx_lch,
>                               src_port,
>                               OMAP_DMA_AMODE_CONSTANT,
> -                             mcbsp[id].io_base + OMAP_MCBSP_REG_DRR1,
> +                             mcbsp->io_base + OMAP_MCBSP_REG_DRR1,
>                               0, 0);
> 
> -     omap_set_dma_dest_params(mcbsp[id].dma_rx_lch,
> +     omap_set_dma_dest_params(mcbsp->dma_rx_lch,
>                                       dest_port,
>                                       OMAP_DMA_AMODE_POST_INC,
>                                       buffer,
>                                       0, 0);
> 
> -     omap_start_dma(mcbsp[id].dma_rx_lch);
> -     wait_for_completion(&(mcbsp[id].rx_dma_completion));
> +     omap_start_dma(mcbsp->dma_rx_lch);
> +     wait_for_completion(&mcbsp->rx_dma_completion);
> 
>       return 0;
>  }
> @@ -738,12 +769,14 @@
>  void omap_mcbsp_set_spi_mode(unsigned int id,
>                               const struct omap_mcbsp_spi_cfg *spi_cfg)
>  {
> +     struct omap_mcbsp *mcbsp;
>       struct omap_mcbsp_reg_cfg mcbsp_cfg;
> 
>       if (!omap_mcbsp_check_valid_id(id)) {
>               printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
>               return;
>       }
> +     mcbsp = id_to_mcbsp_ptr(id);
> 
>       memset(&mcbsp_cfg, 0, sizeof(struct omap_mcbsp_reg_cfg));
> 
> @@ -807,6 +840,7 @@
>  static int __init omap_mcbsp_probe(struct platform_device *pdev)
>  {
>       struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
> +     struct omap_mcbsp *mcbsp;
>       int id = pdev->id - 1;
>       int ret = 0;
> 
> @@ -819,40 +853,47 @@
> 
>       dev_dbg(&pdev->dev, "Initializing OMAP McBSP (%d).\n", pdev->id);
> 
> -     if (id >= OMAP_MAX_MCBSP_COUNT) {
> +     if (id >= omap_mcbsp_count) {
>               dev_err(&pdev->dev, "Invalid McBSP device id (%d)\n", id);
>               ret = -EINVAL;
>               goto exit;
>       }
> 
> -     spin_lock_init(&mcbsp[id].lock);
> -     mcbsp[id].id = id + 1;
> -     mcbsp[id].free = 1;
> -     mcbsp[id].dma_tx_lch = -1;
> -     mcbsp[id].dma_rx_lch = -1;
> +     mcbsp = kzalloc(sizeof(struct omap_mcbsp), GFP_KERNEL);
> +     if (!mcbsp) {
> +             ret = -ENOMEM;
> +             goto exit;
> +     }
> +     mcbsp_ptr[id] = mcbsp;
> 
> -     mcbsp[id].io_base = pdata->virt_base;
> +     spin_lock_init(&mcbsp->lock);
> +     mcbsp->id = id + 1;
> +     mcbsp->free = 1;
> +     mcbsp->dma_tx_lch = -1;
> +     mcbsp->dma_rx_lch = -1;
> +
> +     mcbsp->io_base = pdata->virt_base;
>       /* Default I/O is IRQ based */
> -     mcbsp[id].io_type = OMAP_MCBSP_IRQ_IO;
> -     mcbsp[id].tx_irq = pdata->tx_irq;
> -     mcbsp[id].rx_irq = pdata->rx_irq;
> -     mcbsp[id].dma_rx_sync = pdata->dma_rx_sync;
> -     mcbsp[id].dma_tx_sync = pdata->dma_tx_sync;
> +     mcbsp->io_type = OMAP_MCBSP_IRQ_IO;
> +     mcbsp->tx_irq = pdata->tx_irq;
> +     mcbsp->rx_irq = pdata->rx_irq;
> +     mcbsp->dma_rx_sync = pdata->dma_rx_sync;
> +     mcbsp->dma_tx_sync = pdata->dma_tx_sync;
> 
>       if (pdata->clk_name)
> -             mcbsp[id].clk = clk_get(&pdev->dev, pdata->clk_name);
> -     if (IS_ERR(mcbsp[id].clk)) {
> -             mcbsp[id].free = 0;
> +             mcbsp->clk = clk_get(&pdev->dev, pdata->clk_name);
> +     if (IS_ERR(mcbsp->clk)) {
> +             mcbsp->free = 0;
>               dev_err(&pdev->dev,
>                       "Invalid clock configuration for McBSP%d.\n",
> -                     mcbsp[id].id);
> +                     mcbsp->id);
>               ret = -EINVAL;
>               goto exit;
>       }
> 
> -     mcbsp[id].pdata = pdata;
> -     mcbsp[id].dev = &pdev->dev;
> -     platform_set_drvdata(pdev, &mcbsp[id]);
> +     mcbsp->pdata = pdata;
> +     mcbsp->dev = &pdev->dev;
> +     platform_set_drvdata(pdev, mcbsp);
> 
>  exit:
>       return ret;
> Index: linux-omap-2.6/include/asm-arm/arch-omap/mcbsp.h
> ===================================================================
> --- linux-omap-2.6.orig/include/asm-arm/arch-omap/mcbsp.h     2008-06-25
> 15:54:04.000000000 +0530
> +++ linux-omap-2.6/include/asm-arm/arch-omap/mcbsp.h  2008-06-25
> 16:44:54.000000000 +0530
> @@ -81,9 +81,6 @@
>  #define OMAP_MCBSP_REG_XCERG 0x3A
>  #define OMAP_MCBSP_REG_XCERH 0x3C
> 
> -#define OMAP_MAX_MCBSP_COUNT 3
> -#define MAX_MCBSP_CLOCKS     3
> -
>  #define AUDIO_MCBSP_DATAWRITE        (OMAP1510_MCBSP1_BASE + 
> OMAP_MCBSP_REG_DXR1)
>  #define AUDIO_MCBSP_DATAREAD (OMAP1510_MCBSP1_BASE + OMAP_MCBSP_REG_DRR1)
> 
> @@ -125,9 +122,6 @@
>  #define OMAP_MCBSP_REG_XCERG 0x74
>  #define OMAP_MCBSP_REG_XCERH 0x78
> 
> -#define OMAP_MAX_MCBSP_COUNT 2
> -#define MAX_MCBSP_CLOCKS     2
> -
>  #define AUDIO_MCBSP_DATAWRITE        (OMAP24XX_MCBSP2_BASE + 
> OMAP_MCBSP_REG_DXR1)
>  #define AUDIO_MCBSP_DATAREAD (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR1)
> 
> @@ -311,7 +305,6 @@
>  struct omap_mcbsp_ops {
>       void (*request)(unsigned int);
>       void (*free)(unsigned int);
> -     int (*check)(unsigned int);
>  };
> 
>  struct omap_mcbsp_platform_data {
> @@ -352,6 +345,8 @@
>       struct omap_mcbsp_platform_data *pdata;
>       struct clk *clk;
>  };
> +extern struct omap_mcbsp **mcbsp_ptr;
> +extern int omap_mcbsp_count;
> 
>  int omap_mcbsp_init(void);
>  void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,
> 
> 
> --
> 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
--
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