Re: [PATCH 2/2] Dynamic allocation for mcbsp devices. and related changes

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

 



* chandra shekhar <x0044955@xxxxxx> [080625 18:02]:
> From: chandra shekhar x0044955@xxxxxx
> 
> 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 x0044955@xxxxxx
> ---
>  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 majordomo@xxxxxxxxxxxxxxx
> 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 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