Pass the EDMA CC instance through Audio platform data. Also, modify the EDMA APIs in audio driver to take EDMA CC instance as argument.
Signed-off-by: Sudhakar Rajashekhara <[email protected]> --- sound/soc/davinci/davinci-evm.c | 2 ++ sound/soc/davinci/davinci-i2s.c | 2 ++ sound/soc/davinci/davinci-pcm.c | 38 ++++++++++++++++++++------------------ sound/soc/davinci/davinci-pcm.h | 2 ++ 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index a3fd627..6e7a209 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c @@ -177,6 +177,7 @@ static struct resource evm_snd_resources[] = { static struct evm_snd_platform_data evm_snd_data = { .tx_dma_ch = DAVINCI_DMA_ASP0_TX, .rx_dma_ch = DAVINCI_DMA_ASP0_RX, + .cc_inst = 0, }; /* DM335 EVM uses ASP1; line-out is a stereo mini-jack */ @@ -191,6 +192,7 @@ static struct resource dm335evm_snd_resources[] = { static struct evm_snd_platform_data dm335evm_snd_data = { .tx_dma_ch = DAVINCI_DMA_ASP1_TX, .rx_dma_ch = DAVINCI_DMA_ASP1_RX, + .cc_inst = 0, }; static struct platform_device *evm_snd_device; diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index 7b482c5..4e00188 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -480,11 +480,13 @@ static int davinci_i2s_probe(struct platform_device *pdev, dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out; dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = pdata->tx_dma_ch; + dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->cc_inst = pdata->cc_inst; dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr = (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in; dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = pdata->rx_dma_ch; + dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->cc_inst = pdata->cc_inst; dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr = (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index 7c983ca..fc3981c 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c @@ -98,11 +98,12 @@ static void davinci_pcm_enqueue_dma(struct snd_pcm_substream *substream) dst_bidx = data_type; } - edma_set_src(lch, src, INCR, W8BIT); - edma_set_dest(lch, dst, INCR, W8BIT); - edma_set_src_index(lch, src_bidx, 0); - edma_set_dest_index(lch, dst_bidx, 0); - edma_set_transfer_params(lch, data_type, count, 1, 0, ASYNC); + edma_set_src(prtd->params->cc_inst, lch, src, INCR, W8BIT); + edma_set_dest(prtd->params->cc_inst, lch, dst, INCR, W8BIT); + edma_set_src_index(prtd->params->cc_inst, lch, src_bidx, 0); + edma_set_dest_index(prtd->params->cc_inst, lch, dst_bidx, 0); + edma_set_transfer_params(prtd->params->cc_inst, lch, data_type, count, + 1, 0, ASYNC); prtd->period++; if (unlikely(prtd->period >= runtime->periods)) @@ -142,7 +143,8 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) prtd->params = dma_data; /* Request master DMA channel */ - ret = edma_alloc_channel(prtd->params->channel, + ret = edma_alloc_channel(prtd->params->cc_inst, + prtd->params->channel, davinci_pcm_dma_irq, substream, EVENTQ_0); if (ret < 0) @@ -150,9 +152,9 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) prtd->master_lch = ret; /* Request parameter RAM reload slot */ - ret = edma_alloc_slot(EDMA_SLOT_ANY); + ret = edma_alloc_slot(prtd->params->cc_inst, EDMA_SLOT_ANY); if (ret < 0) { - edma_free_channel(prtd->master_lch); + edma_free_channel(prtd->params->cc_inst, prtd->master_lch); return ret; } prtd->slave_lch = ret; @@ -166,10 +168,10 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) * the buffer and its length (ccnt) ... use it as a template * so davinci_pcm_enqueue_dma() takes less time in IRQ. */ - edma_read_slot(prtd->slave_lch, &p_ram); + edma_read_slot(prtd->params->cc_inst, prtd->slave_lch, &p_ram); p_ram.opt |= TCINTEN | EDMA_TCC(prtd->master_lch); p_ram.link_bcntrld = prtd->slave_lch << 5; - edma_write_slot(prtd->slave_lch, &p_ram); + edma_write_slot(prtd->params->cc_inst, prtd->slave_lch, &p_ram); return 0; } @@ -185,12 +187,12 @@ static int davinci_pcm_trigger(struct snd_pcm_substream *substream, int cmd) case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - edma_start(prtd->master_lch); + edma_start(prtd->params->cc_inst, prtd->master_lch); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - edma_stop(prtd->master_lch); + edma_stop(prtd->params->cc_inst, prtd->master_lch); break; default: ret = -EINVAL; @@ -211,8 +213,8 @@ static int davinci_pcm_prepare(struct snd_pcm_substream *substream) davinci_pcm_enqueue_dma(substream); /* Copy self-linked parameter RAM entry into master channel */ - edma_read_slot(prtd->slave_lch, &temp); - edma_write_slot(prtd->master_lch, &temp); + edma_read_slot(prtd->params->cc_inst, prtd->slave_lch, &temp); + edma_write_slot(prtd->params->cc_inst, prtd->master_lch, &temp); return 0; } @@ -228,7 +230,7 @@ davinci_pcm_pointer(struct snd_pcm_substream *substream) spin_lock(&prtd->lock); - edma_get_position(prtd->master_lch, &src, &dst); + edma_get_position(prtd->params->cc_inst, prtd->master_lch, &src, &dst); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) count = src - runtime->dma_addr; else @@ -273,10 +275,10 @@ static int davinci_pcm_close(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct davinci_runtime_data *prtd = runtime->private_data; - edma_unlink(prtd->slave_lch); + edma_unlink(prtd->params->cc_inst, prtd->slave_lch); - edma_free_slot(prtd->slave_lch); - edma_free_channel(prtd->master_lch); + edma_free_slot(prtd->params->cc_inst, prtd->slave_lch); + edma_free_channel(prtd->params->cc_inst, prtd->master_lch); kfree(prtd); diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h index 62cb4eb..d2cd332 100644 --- a/sound/soc/davinci/davinci-pcm.h +++ b/sound/soc/davinci/davinci-pcm.h @@ -17,11 +17,13 @@ struct davinci_pcm_dma_params { int channel; /* sync dma channel ID */ dma_addr_t dma_addr; /* device physical address for DMA */ unsigned int data_type; /* xfer data type */ + u8 cc_inst; }; struct evm_snd_platform_data { int tx_dma_ch; int rx_dma_ch; + u8 cc_inst; }; extern struct snd_soc_platform davinci_soc_platform; -- 1.5.6 _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
