* 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